From e402cdcc7477aa0adaa07b7a1628445b8c84f836 Mon Sep 17 00:00:00 2001 From: Dushyant Baweja Date: Mon, 30 Sep 2024 21:08:43 +0530 Subject: [PATCH 1/6] Add another view bye --- tryHello/urls.py | 4 ++-- tryHello/views.py | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tryHello/urls.py b/tryHello/urls.py index b6cd35ba..4dd712d0 100644 --- a/tryHello/urls.py +++ b/tryHello/urls.py @@ -1,5 +1,5 @@ from django.urls import path - from tryHello import views -urlpatterns = [path('hello/', views.hello_world, name='hello')] +urlpatterns = [path('hello/', views.hello_world, name='hello'), + path('bye/', views.bye, name='bye')] diff --git a/tryHello/views.py b/tryHello/views.py index b73b18e0..18d62879 100644 --- a/tryHello/views.py +++ b/tryHello/views.py @@ -3,5 +3,8 @@ # Create your views here. -def hello_world(request,name): - return HttpResponse("Hello" + name) +def hello_world(request, name): + return HttpResponse("Hello " + name) + +def bye(request): + return HttpResponse("Good Bye!") From ccecf9a3a6502bea856109ce11219e64d03e2a1b Mon Sep 17 00:00:00 2001 From: Dushyant Baweja Date: Fri, 4 Oct 2024 22:33:52 +0530 Subject: [PATCH 2/6] Add library app --- db.sqlite3 | Bin 0 -> 143360 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 223 -> 247 bytes .../current_thread_executor.cpython-312.pyc | Bin 4996 -> 5020 bytes .../asgiref/__pycache__/local.cpython-312.pyc | Bin 5859 -> 5883 bytes .../asgiref/__pycache__/sync.cpython-312.pyc | Bin 22965 -> 22989 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1236 -> 1260 bytes .../__pycache__/shortcuts.cpython-312.pyc | Bin 7653 -> 7677 bytes .../apps/__pycache__/__init__.cpython-312.pyc | Bin 319 -> 343 bytes .../apps/__pycache__/config.cpython-312.pyc | Bin 9227 -> 9251 bytes .../apps/__pycache__/registry.cpython-312.pyc | Bin 18759 -> 18783 bytes .../conf/__pycache__/__init__.cpython-312.pyc | Bin 13052 -> 13076 bytes .../global_settings.cpython-312.pyc | Bin 12659 -> 12683 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8579 -> 8603 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 204 -> 228 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1320 -> 1344 bytes .../admin/__pycache__/actions.cpython-312.pyc | Bin 3414 -> 3438 bytes .../admin/__pycache__/apps.cpython-312.pyc | Bin 1885 -> 1909 bytes .../admin/__pycache__/checks.cpython-312.pyc | Bin 55977 -> 56001 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 3951 -> 3975 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1180 -> 1204 bytes .../admin/__pycache__/filters.cpython-312.pyc | Bin 35128 -> 35152 bytes .../admin/__pycache__/helpers.cpython-312.pyc | Bin 26759 -> 26783 bytes .../admin/__pycache__/models.cpython-312.pyc | Bin 10264 -> 10288 bytes .../admin/__pycache__/options.cpython-312.pyc | Bin 108376 -> 108400 bytes .../admin/__pycache__/sites.cpython-312.pyc | Bin 25992 -> 26016 bytes .../admin/__pycache__/utils.cpython-312.pyc | Bin 27746 -> 27770 bytes .../admin/__pycache__/widgets.cpython-312.pyc | Bin 29221 -> 29245 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 223 -> 247 bytes .../__pycache__/admin_urls.cpython-312.pyc | Bin 2925 -> 2949 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../__pycache__/autocomplete.cpython-312.pyc | Bin 6105 -> 6129 bytes .../auth/__pycache__/__init__.cpython-312.pyc | Bin 11506 -> 11530 bytes .../auth/__pycache__/admin.cpython-312.pyc | Bin 10787 -> 10811 bytes .../auth/__pycache__/apps.cpython-312.pyc | Bin 2017 -> 2041 bytes .../__pycache__/base_user.cpython-312.pyc | Bin 8143 -> 8167 bytes .../auth/__pycache__/checks.cpython-312.pyc | Bin 9724 -> 9748 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 5550 -> 5574 bytes .../auth/__pycache__/forms.cpython-312.pyc | Bin 27818 -> 27842 bytes .../auth/__pycache__/hashers.cpython-312.pyc | Bin 30029 -> 30053 bytes .../auth/__pycache__/models.cpython-312.pyc | Bin 23287 -> 23311 bytes .../password_validation.cpython-312.pyc | Bin 12543 -> 12567 bytes .../auth/__pycache__/signals.cpython-312.pyc | Bin 373 -> 397 bytes .../auth/__pycache__/tokens.cpython-312.pyc | Bin 5889 -> 5913 bytes .../__pycache__/validators.cpython-312.pyc | Bin 1328 -> 1352 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6057 -> 6081 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 241 bytes .../__pycache__/admin.cpython-312.pyc | Bin 5922 -> 5946 bytes .../__pycache__/apps.cpython-312.pyc | Bin 1618 -> 1642 bytes .../__pycache__/checks.cpython-312.pyc | Bin 2473 -> 2497 bytes .../__pycache__/fields.cpython-312.pyc | Bin 41032 -> 41056 bytes .../__pycache__/forms.cpython-312.pyc | Bin 5305 -> 5329 bytes .../__pycache__/models.cpython-312.pyc | Bin 9935 -> 9959 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6278 -> 6302 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 379 -> 403 bytes .../messages/__pycache__/api.cpython-312.pyc | Bin 3763 -> 3787 bytes .../messages/__pycache__/apps.cpython-312.pyc | Bin 1298 -> 1322 bytes .../__pycache__/constants.cpython-312.pyc | Bin 512 -> 536 bytes .../__pycache__/utils.cpython-312.pyc | Bin 615 -> 639 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 761 -> 785 bytes .../storage/__pycache__/base.cpython-312.pyc | Bin 9335 -> 9359 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 213 -> 237 bytes .../sessions/__pycache__/apps.cpython-312.pyc | Bin 596 -> 620 bytes .../__pycache__/base_session.cpython-312.pyc | Bin 3056 -> 3080 bytes .../__pycache__/models.cpython-312.pyc | Bin 2018 -> 2042 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 210 -> 234 bytes .../__pycache__/requests.cpython-312.pyc | Bin 1450 -> 1474 bytes .../__pycache__/shortcuts.cpython-312.pyc | Bin 842 -> 866 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../__pycache__/apps.cpython-312.pyc | Bin 1208 -> 1232 bytes .../__pycache__/checks.cpython-312.pyc | Bin 1356 -> 1380 bytes .../__pycache__/finders.cpython-312.pyc | Bin 14199 -> 14223 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3049 -> 3073 bytes .../core/__pycache__/__init__.cpython-312.pyc | Bin 201 -> 225 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 10569 -> 10593 bytes .../__pycache__/paginator.cpython-312.pyc | Bin 12160 -> 12184 bytes .../core/__pycache__/signals.cpython-312.pyc | Bin 410 -> 434 bytes .../core/__pycache__/signing.cpython-312.pyc | Bin 12363 -> 12387 bytes .../__pycache__/validators.cpython-312.pyc | Bin 28250 -> 28274 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2511 -> 2535 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 18682 -> 18706 bytes .../__pycache__/filebased.cpython-312.pyc | Bin 9670 -> 9694 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1179 -> 1203 bytes .../__pycache__/async_checks.cpython-312.pyc | Bin 874 -> 898 bytes .../checks/__pycache__/caches.cpython-312.pyc | Bin 4120 -> 4144 bytes .../__pycache__/database.cpython-312.pyc | Bin 795 -> 819 bytes .../checks/__pycache__/files.cpython-312.pyc | Bin 940 -> 964 bytes .../__pycache__/messages.cpython-312.pyc | Bin 4951 -> 4975 bytes .../__pycache__/model_checks.cpython-312.pyc | Bin 10598 -> 10622 bytes .../__pycache__/registry.cpython-312.pyc | Bin 4853 -> 4877 bytes .../__pycache__/templates.cpython-312.pyc | Bin 758 -> 782 bytes .../__pycache__/translation.cpython-312.pyc | Bin 3479 -> 3503 bytes .../checks/__pycache__/urls.cpython-312.pyc | Bin 6393 -> 6417 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 222 -> 246 bytes .../__pycache__/django_4_0.cpython-312.pyc | Bin 1013 -> 1037 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 241 bytes .../security/__pycache__/base.cpython-312.pyc | Bin 11682 -> 11706 bytes .../security/__pycache__/csrf.cpython-312.pyc | Bin 3070 -> 3094 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 3533 -> 3557 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 288 -> 312 bytes .../files/__pycache__/base.cpython-312.pyc | Bin 7885 -> 7909 bytes .../files/__pycache__/images.cpython-312.pyc | Bin 3285 -> 3309 bytes .../files/__pycache__/locks.cpython-312.pyc | Bin 4545 -> 4569 bytes .../files/__pycache__/move.cpython-312.pyc | Bin 3177 -> 3201 bytes .../files/__pycache__/temp.cpython-312.pyc | Bin 3492 -> 3516 bytes .../__pycache__/uploadedfile.cpython-312.pyc | Bin 6200 -> 6224 bytes .../__pycache__/uploadhandler.cpython-312.pyc | Bin 9783 -> 9807 bytes .../files/__pycache__/utils.cpython-312.pyc | Bin 5826 -> 5850 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1054 -> 1078 bytes .../storage/__pycache__/base.cpython-312.pyc | Bin 8638 -> 8662 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 12716 -> 12740 bytes .../__pycache__/handler.cpython-312.pyc | Bin 2576 -> 2600 bytes .../__pycache__/memory.cpython-312.pyc | Bin 15344 -> 15368 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 1448 -> 1472 bytes .../mail/__pycache__/__init__.cpython-312.pyc | Bin 5714 -> 5738 bytes .../mail/__pycache__/message.cpython-312.pyc | Bin 21928 -> 21952 bytes .../mail/__pycache__/utils.cpython-312.pyc | Bin 1043 -> 1067 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 20730 -> 20754 bytes .../__pycache__/base.cpython-312.pyc | Bin 31078 -> 31102 bytes .../__pycache__/color.cpython-312.pyc | Bin 4122 -> 4146 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 9461 -> 9485 bytes .../__pycache__/base.cpython-312.pyc | Bin 16564 -> 16588 bytes .../__pycache__/json.cpython-312.pyc | Bin 5937 -> 5961 bytes .../__pycache__/python.cpython-312.pyc | Bin 9761 -> 9785 bytes .../db/__pycache__/__init__.cpython-312.pyc | Bin 1777 -> 1801 bytes .../__pycache__/transaction.cpython-312.pyc | Bin 12079 -> 12103 bytes .../db/__pycache__/utils.cpython-312.pyc | Bin 11553 -> 11577 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 208 -> 232 bytes .../ddl_references.cpython-312.pyc | Bin 15621 -> 15645 bytes .../__pycache__/signals.cpython-312.pyc | Bin 298 -> 322 bytes .../__pycache__/utils.cpython-312.pyc | Bin 15695 -> 15719 bytes .../base/__pycache__/__init__.cpython-312.pyc | Bin 213 -> 237 bytes .../base/__pycache__/base.cpython-312.pyc | Bin 34794 -> 34818 bytes .../base/__pycache__/client.cpython-312.pyc | Bin 1549 -> 1573 bytes .../base/__pycache__/creation.cpython-312.pyc | Bin 17229 -> 17253 bytes .../base/__pycache__/features.cpython-312.pyc | Bin 8548 -> 8572 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 11126 -> 11150 bytes .../__pycache__/operations.cpython-312.pyc | Bin 38965 -> 38989 bytes .../base/__pycache__/schema.cpython-312.pyc | Bin 85157 -> 85181 bytes .../__pycache__/validation.cpython-312.pyc | Bin 1818 -> 1842 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../__pycache__/_functions.cpython-312.pyc | Bin 19397 -> 19421 bytes .../sqlite3/__pycache__/base.cpython-312.pyc | Bin 15732 -> 15756 bytes .../__pycache__/client.cpython-312.pyc | Bin 821 -> 845 bytes .../__pycache__/creation.cpython-312.pyc | Bin 8127 -> 8151 bytes .../__pycache__/features.cpython-312.pyc | Bin 6551 -> 6575 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 17042 -> 17066 bytes .../__pycache__/operations.cpython-312.pyc | Bin 21347 -> 21371 bytes .../__pycache__/schema.cpython-312.pyc | Bin 20358 -> 20382 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 317 -> 341 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2785 -> 2809 bytes .../__pycache__/migration.cpython-312.pyc | Bin 10045 -> 10069 bytes .../__pycache__/state.cpython-312.pyc | Bin 46072 -> 46096 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4949 -> 4973 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 999 -> 1023 bytes .../__pycache__/base.cpython-312.pyc | Bin 7218 -> 7242 bytes .../__pycache__/fields.cpython-312.pyc | Bin 18326 -> 18350 bytes .../__pycache__/models.cpython-312.pyc | Bin 60212 -> 60236 bytes .../__pycache__/special.cpython-312.pyc | Bin 9796 -> 9820 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2642 -> 2666 bytes .../__pycache__/aggregates.cpython-312.pyc | Bin 9976 -> 10000 bytes .../models/__pycache__/base.cpython-312.pyc | Bin 96723 -> 96747 bytes .../__pycache__/constants.cpython-312.pyc | Bin 561 -> 585 bytes .../__pycache__/constraints.cpython-312.pyc | Bin 30767 -> 30791 bytes .../__pycache__/deletion.cpython-312.pyc | Bin 25291 -> 25315 bytes .../models/__pycache__/enums.cpython-312.pyc | Bin 6605 -> 6629 bytes .../__pycache__/expressions.cpython-312.pyc | Bin 102064 -> 102088 bytes .../__pycache__/indexes.cpython-312.pyc | Bin 15409 -> 15433 bytes .../__pycache__/lookups.cpython-312.pyc | Bin 39085 -> 39109 bytes .../__pycache__/manager.cpython-312.pyc | Bin 9236 -> 9260 bytes .../__pycache__/options.cpython-312.pyc | Bin 40514 -> 40538 bytes .../models/__pycache__/query.cpython-312.pyc | Bin 120189 -> 120213 bytes .../__pycache__/query_utils.cpython-312.pyc | Bin 21725 -> 21749 bytes .../__pycache__/signals.cpython-312.pyc | Bin 2268 -> 2292 bytes .../models/__pycache__/utils.cpython-312.pyc | Bin 3458 -> 3482 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 114953 -> 114977 bytes .../fields/__pycache__/files.cpython-312.pyc | Bin 21996 -> 22020 bytes .../__pycache__/generated.cpython-312.pyc | Bin 10097 -> 10121 bytes .../fields/__pycache__/json.cpython-312.pyc | Bin 31336 -> 31360 bytes .../fields/__pycache__/mixins.cpython-312.pyc | Bin 3928 -> 3952 bytes .../fields/__pycache__/proxy.cpython-312.pyc | Bin 1085 -> 1109 bytes .../__pycache__/related.cpython-312.pyc | Bin 83571 -> 83595 bytes .../related_descriptors.cpython-312.pyc | Bin 76299 -> 76323 bytes .../related_lookups.cpython-312.pyc | Bin 10281 -> 10305 bytes .../reverse_related.cpython-312.pyc | Bin 16689 -> 16713 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2517 -> 2541 bytes .../__pycache__/comparison.cpython-312.pyc | Bin 11872 -> 11896 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 17418 -> 17442 bytes .../__pycache__/math.cpython-312.pyc | Bin 9094 -> 9118 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 4045 -> 4069 bytes .../__pycache__/text.cpython-312.pyc | Bin 16503 -> 16527 bytes .../__pycache__/window.cpython-312.pyc | Bin 4804 -> 4828 bytes .../sql/__pycache__/__init__.cpython-312.pyc | Bin 462 -> 486 bytes .../sql/__pycache__/constants.cpython-312.pyc | Bin 562 -> 586 bytes .../datastructures.cpython-312.pyc | Bin 10132 -> 10156 bytes .../sql/__pycache__/query.cpython-312.pyc | Bin 112965 -> 112989 bytes .../__pycache__/subqueries.cpython-312.pyc | Bin 8942 -> 8966 bytes .../sql/__pycache__/where.cpython-312.pyc | Bin 16728 -> 16752 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 523 -> 547 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 19961 -> 19985 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 547 -> 571 bytes .../__pycache__/boundfield.cpython-312.pyc | Bin 18541 -> 18565 bytes .../forms/__pycache__/fields.cpython-312.pyc | Bin 60787 -> 60811 bytes .../forms/__pycache__/forms.cpython-312.pyc | Bin 19108 -> 19132 bytes .../__pycache__/formsets.cpython-312.pyc | Bin 24086 -> 24110 bytes .../forms/__pycache__/models.cpython-312.pyc | Bin 64055 -> 64079 bytes .../__pycache__/renderers.cpython-312.pyc | Bin 5245 -> 5269 bytes .../forms/__pycache__/utils.cpython-312.pyc | Bin 12423 -> 12447 bytes .../forms/__pycache__/widgets.cpython-312.pyc | Bin 52603 -> 52627 bytes .../http/__pycache__/__init__.cpython-312.pyc | Bin 1112 -> 1136 bytes .../http/__pycache__/cookie.cpython-312.pyc | Bin 895 -> 919 bytes .../multipartparser.cpython-312.pyc | Bin 26357 -> 26381 bytes .../http/__pycache__/request.cpython-312.pyc | Bin 34722 -> 34746 bytes .../http/__pycache__/response.cpython-312.pyc | Bin 34125 -> 34149 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 207 -> 231 bytes .../__pycache__/cache.cpython-312.pyc | Bin 8894 -> 8918 bytes .../__pycache__/csrf.cpython-312.pyc | Bin 20317 -> 20341 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1884 -> 1908 bytes .../__pycache__/autoreload.cpython-312.pyc | Bin 3387 -> 3411 bytes .../template/__pycache__/base.cpython-312.pyc | Bin 45305 -> 45329 bytes .../__pycache__/context.cpython-312.pyc | Bin 14096 -> 14120 bytes .../defaultfilters.cpython-312.pyc | Bin 37732 -> 37756 bytes .../__pycache__/defaulttags.cpython-312.pyc | Bin 60086 -> 60110 bytes .../__pycache__/engine.cpython-312.pyc | Bin 9399 -> 9423 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1951 -> 1975 bytes .../__pycache__/library.cpython-312.pyc | Bin 14168 -> 14192 bytes .../__pycache__/loader.cpython-312.pyc | Bin 2715 -> 2739 bytes .../__pycache__/loader_tags.cpython-312.pyc | Bin 16728 -> 16752 bytes .../__pycache__/response.cpython-312.pyc | Bin 6284 -> 6308 bytes .../__pycache__/smartif.cpython-312.pyc | Bin 10818 -> 10842 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4726 -> 4750 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 3626 -> 3650 bytes .../__pycache__/django.cpython-312.pyc | Bin 9574 -> 9598 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 209 -> 233 bytes .../__pycache__/i18n.cpython-312.pyc | Bin 25765 -> 25789 bytes .../__pycache__/static.cpython-312.pyc | Bin 7137 -> 7161 bytes .../urls/__pycache__/__init__.cpython-312.pyc | Bin 1100 -> 1124 bytes .../urls/__pycache__/base.cpython-312.pyc | Bin 6598 -> 6622 bytes .../urls/__pycache__/conf.cpython-312.pyc | Bin 3340 -> 3364 bytes .../__pycache__/converters.cpython-312.pyc | Bin 3188 -> 3212 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 585 -> 609 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 36291 -> 36315 bytes .../urls/__pycache__/utils.cpython-312.pyc | Bin 2350 -> 2374 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 202 -> 226 bytes .../utils/__pycache__/_os.cpython-312.pyc | Bin 2870 -> 2894 bytes .../utils/__pycache__/asyncio.cpython-312.pyc | Bin 1511 -> 1535 bytes .../__pycache__/autoreload.cpython-312.pyc | Bin 32448 -> 32472 bytes .../utils/__pycache__/cache.cpython-312.pyc | Bin 16871 -> 16895 bytes .../utils/__pycache__/choices.cpython-312.pyc | Bin 5808 -> 5832 bytes .../__pycache__/connection.cpython-312.pyc | Bin 5323 -> 5347 bytes .../utils/__pycache__/crypto.cpython-312.pyc | Bin 3494 -> 3518 bytes .../datastructures.cpython-312.pyc | Bin 17346 -> 17370 bytes .../__pycache__/dateformat.cpython-312.pyc | Bin 16233 -> 16257 bytes .../__pycache__/dateparse.cpython-312.pyc | Bin 6554 -> 6578 bytes .../utils/__pycache__/dates.cpython-312.pyc | Bin 2354 -> 2378 bytes .../__pycache__/deconstruct.cpython-312.pyc | Bin 2486 -> 2510 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 8979 -> 9003 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 6662 -> 6686 bytes .../__pycache__/duration.cpython-312.pyc | Bin 1913 -> 1937 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 9173 -> 9197 bytes .../utils/__pycache__/formats.cpython-312.pyc | Bin 10835 -> 10859 bytes .../__pycache__/functional.cpython-312.pyc | Bin 18761 -> 18785 bytes .../__pycache__/hashable.cpython-312.pyc | Bin 1081 -> 1105 bytes .../utils/__pycache__/html.cpython-312.pyc | Bin 20839 -> 20863 bytes .../utils/__pycache__/http.cpython-312.pyc | Bin 14563 -> 14587 bytes .../utils/__pycache__/inspect.cpython-312.pyc | Bin 4599 -> 4623 bytes .../utils/__pycache__/ipv6.cpython-312.pyc | Bin 2036 -> 2060 bytes .../utils/__pycache__/log.cpython-312.pyc | Bin 9702 -> 9726 bytes .../__pycache__/lorem_ipsum.cpython-312.pyc | Bin 5438 -> 5462 bytes .../module_loading.cpython-312.pyc | Bin 4061 -> 4085 bytes .../__pycache__/numberformat.cpython-312.pyc | Bin 3426 -> 3450 bytes .../__pycache__/regex_helper.cpython-312.pyc | Bin 11190 -> 11214 bytes .../__pycache__/safestring.cpython-312.pyc | Bin 3047 -> 3071 bytes .../__pycache__/termcolors.cpython-312.pyc | Bin 7468 -> 7492 bytes .../utils/__pycache__/text.cpython-312.pyc | Bin 21319 -> 21343 bytes .../__pycache__/timesince.cpython-312.pyc | Bin 5830 -> 5854 bytes .../__pycache__/timezone.cpython-312.pyc | Bin 9159 -> 9183 bytes .../utils/__pycache__/tree.cpython-312.pyc | Bin 5885 -> 5909 bytes .../utils/__pycache__/version.cpython-312.pyc | Bin 4877 -> 4901 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 12281 -> 12305 bytes .../__pycache__/reloader.cpython-312.pyc | Bin 2179 -> 2203 bytes .../__pycache__/trans_real.cpython-312.pyc | Bin 27917 -> 27941 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 286 -> 310 bytes .../views/__pycache__/debug.cpython-312.pyc | Bin 29295 -> 29319 bytes .../views/__pycache__/i18n.cpython-312.pyc | Bin 11985 -> 12009 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 213 -> 237 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3709 -> 3733 bytes .../__pycache__/common.cpython-312.pyc | Bin 1114 -> 1138 bytes .../__pycache__/csrf.cpython-312.pyc | Bin 2999 -> 3023 bytes .../__pycache__/debug.cpython-312.pyc | Bin 5360 -> 5384 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1154 -> 1178 bytes .../generic/__pycache__/base.cpython-312.pyc | Bin 12178 -> 12202 bytes .../generic/__pycache__/dates.cpython-312.pyc | Bin 31575 -> 31599 bytes .../__pycache__/detail.cpython-312.pyc | Bin 7795 -> 7819 bytes .../generic/__pycache__/edit.cpython-312.pyc | Bin 12787 -> 12811 bytes .../generic/__pycache__/list.cpython-312.pyc | Bin 9321 -> 9345 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3106 -> 3130 bytes .../sqlparse/__pycache__/cli.cpython-312.pyc | Bin 7435 -> 7459 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 494 -> 518 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 8373 -> 8397 bytes .../__pycache__/keywords.cpython-312.pyc | Bin 51105 -> 51129 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 6799 -> 6823 bytes .../sqlparse/__pycache__/sql.cpython-312.pyc | Bin 32103 -> 32127 bytes .../__pycache__/tokens.cpython-312.pyc | Bin 2289 -> 2313 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4604 -> 4628 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 441 -> 465 bytes .../__pycache__/filter_stack.cpython-312.pyc | Bin 2009 -> 2033 bytes .../__pycache__/grouping.cpython-312.pyc | Bin 25123 -> 25147 bytes .../statement_splitter.cpython-312.pyc | Bin 4006 -> 4030 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1031 -> 1055 bytes .../aligned_indent.cpython-312.pyc | Bin 7977 -> 8001 bytes .../__pycache__/others.cpython-312.pyc | Bin 9340 -> 9364 bytes .../__pycache__/output.cpython-312.pyc | Bin 6536 -> 6560 bytes .../__pycache__/reindent.cpython-312.pyc | Bin 15685 -> 15709 bytes .../__pycache__/right_margin.cpython-312.pyc | Bin 2229 -> 2253 bytes .../__pycache__/tokens.cpython-312.pyc | Bin 2940 -> 2964 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 191 bytes .../__pycache__/settings.cpython-312.pyc | Bin 2564 -> 2597 bytes helloworld/__pycache__/urls.cpython-312.pyc | Bin 1115 -> 1139 bytes helloworld/settings.py | 3 +- helloworld/urls.py | 1 + library/__init__.py | 0 library/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 188 bytes library/__pycache__/admin.cpython-312.pyc | Bin 0 -> 232 bytes library/__pycache__/apps.cpython-312.pyc | Bin 0 -> 496 bytes library/__pycache__/models.cpython-312.pyc | Bin 0 -> 919 bytes library/admin.py | 3 ++ library/apps.py | 6 +++ library/migrations/0001_initial.py | 50 ++++++++++++++++++ library/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 1433 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 199 bytes library/models.py | 10 ++++ library/serializer.py | 8 +++ library/tests.py | 3 ++ library/urls.py | 5 ++ library/views.py | 14 +++++ tryHello/__pycache__/__init__.cpython-312.pyc | Bin 165 -> 189 bytes tryHello/__pycache__/admin.cpython-312.pyc | Bin 209 -> 233 bytes tryHello/__pycache__/apps.cpython-312.pyc | Bin 475 -> 499 bytes tryHello/__pycache__/models.cpython-312.pyc | Bin 206 -> 230 bytes tryHello/__pycache__/urls.cpython-312.pyc | Bin 370 -> 468 bytes tryHello/__pycache__/views.cpython-312.pyc | Bin 426 -> 591 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 176 -> 200 bytes 345 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 library/__init__.py create mode 100644 library/__pycache__/__init__.cpython-312.pyc create mode 100644 library/__pycache__/admin.cpython-312.pyc create mode 100644 library/__pycache__/apps.cpython-312.pyc create mode 100644 library/__pycache__/models.cpython-312.pyc create mode 100644 library/admin.py create mode 100644 library/apps.py create mode 100644 library/migrations/0001_initial.py create mode 100644 library/migrations/__init__.py create mode 100644 library/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 library/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 library/models.py create mode 100644 library/serializer.py create mode 100644 library/tests.py create mode 100644 library/urls.py create mode 100644 library/views.py diff --git a/db.sqlite3 b/db.sqlite3 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..68e1b3d0a512234cdc9ebf6182f18560cbbeacd2 100644 GIT binary patch literal 143360 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 YD3hO;n4_POnv;`Xo?n!cGI4ec09SPx#{d8T diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/current_thread_executor.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/current_thread_executor.cpython-312.pyc index fc452450274a00827051ec6e65ec8645960d53d2..fd7db62812213075b889d59969aa3a9659584a03 100644 GIT binary patch delta 98 zcmZospQFxwnwOW00SI&s{MyJJ#O%?nA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}~2oQ*a{8 delta 74 zcmbQE-lEQZnwOW00SK5MeA~z!#B5NkA6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!h%V`8z)VfdLwF diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/local.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/local.cpython-312.pyc index e60e903facd6c43b7d814399d4308e1352c75ebe..082e3e70a1d5396aa7ead7fe845681c5983dcb31 100644 GIT binary patch delta 98 zcmaE?`&*a$G%qg~0}$vO__dMy7^6p}erR!OQL%nXQet^(R-(R3esXDUYF5&KkyUrt7 delta 74 zcmeyZ`&gIzG%qg~0}wDj__mSz7^6X=erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrF(<2c8&2Jk2 diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc index 2d2f46b64b33e55ef63af48d4de2bf7e4e026504..a61d00de9d9138eabfaa16ed4f3ab15cedd5843f 100644 GIT binary patch delta 100 zcmdnGnepsqM()$Ryj%=GpmX5YMs7iNj|%?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fvk!Y_5CF^x BBX9r! delta 76 zcmX@RnQ`l8M()$Ryj%=G!2ICbMs7iNg9QE1;?$yI{p`e|#5}#EjKq@6M17ak;_Qcgaf3OV1A|%FjwoF4??_S&I<>e4HYG delta 74 zcmaFEd4-evG%qg~0}wDj__mQdpV=T;KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~`vlb%&pOqRV diff --git a/env/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc b/env/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc index 01297ec9a70906bf2e6a192da5b82a6b53481218..986a61410f6683bbac067fda74c08f94a9cf9318 100644 GIT binary patch delta 98 zcmaEA{nwiNG%qg~0}$vQ__dKck=dh0KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4;VX*;5Jtt6w7{ delta 74 zcmexs{nVQKG%qg~0}wDj__mQdk=Yqv b04S56mzblUk(!f}U!Gr-ld^dWv!@gQ!mAp{ diff --git a/env/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc index b6f4cde57b6f4449ae99d3c919f41d4480932f51..7e4e0b48c5c6cc15918b74dc4f5ceb0bf13cef5c 100644 GIT binary patch delta 95 zcmdnbbe)O&G%qg~0}$vO_%)GxrbmN*XmM&$v3^QYVtHy-qP|Oha%paAUP-aOYf5Qy wVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOuW#XG`09e5qJ^%m! diff --git a/env/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc b/env/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc index 15eac897b75ad2a63cb3fac1af2c6e4563251919..6d5e8a0905c7c7417198cababa88c2c63e3fdc36 100644 GIT binary patch delta 98 zcmeD7SnR=lnwOW00SI&s{MyJ}#o|$?A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6};iShm?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^9I)G&H&?~ BBs~BC delta 76 zcmcaViShU(M()$Ryj%=G!2ICbM($EpgAD!9;?$yI{p`e|#5}#EjKq@6M17ak;_Qcgaf3OV1A|%FjwoF4^45QmzL8rokgW delta 74 zcmbP|_9vD5G%qg~0}wDj__mSTi^U*AKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^d(OSv8ZzRVis diff --git a/env/lib/python3.12/site-packages/django/conf/__pycache__/global_settings.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/__pycache__/global_settings.cpython-312.pyc index ed3450bd6a3ca4bf763a56f0d70368e91aed9c33..39a4eb2c71e89faff4094277fb5135b1dddc7f08 100644 GIT binary patch delta 98 zcmeyI)Sb+InwOW00SI&s{MyKE$?eguA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}cgaf3OV1A|%FjwoF4_D;q?-o-jx8gH delta 74 zcmbR3-0aMKnwOW00SK5MeA~#qSHvJ+KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld@Srw3`P2r*RrC diff --git a/env/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc index 29bb0b2f026ced5ca12078f191b58947b80cf8d9..832f940899b7c82862f5aad008d93b2c6747cb6b 100644 GIT binary patch delta 95 zcmX@Z_=J)BG%qg~0}$vO_%)H+*rQoLv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZV07>;3fB*mh diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc index 931f96aafaf76794fef79e3d4614ffe1f032e92b..fcf20b4077c8e571d8665bcb93fe2b798dbfe6e2 100644 GIT binary patch delta 98 zcmZ3%b%2ZeG%qg~0}$vO__dLnkJ+PBKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qKe4h~jLC_*9 delta 74 zcmX@WwStTLG%qg~0}wDj__mRokJ+G5KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IH`9326bfFp0 diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc index adfd4f815dbce3a909d1a22c443c7de0a4f67133..3b277e9ca5e33cbf01328680b722307b7efdd6e7 100644 GIT binary patch delta 98 zcmca6^-hZWG%qg~0}$vO__dLHDyK(>erR!OQL%nXQet^(R-(R3esXDUYFs&NgNMxA+?l diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc index ad428e916b69c82ddc789a8cbd4b7999e2ebf399..930381f576b35c343fd00a3f4934cfd94009c6f7 100644 GIT binary patch delta 98 zcmcc1_mz+PG%qg~0}$vO__dMy7n4V;erR!OQL%nXQet^(R-(R3esXDUYF?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fa~-qxbpY9c BBoY7s delta 76 zcmX@Om3ie>X71Cxyj%=G!2ICbMs8cgaf3OV1A|%FjwoF4@e)lFJPMk8~n# delta 74 zcmZpde=o;qv b04S56mzblUk(!f}U!Gr-ld@TgC6^ljs+SrR diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-312.pyc index 0775b4fbb7c8bc3334034ddb348fc031e6e40998..db93e7fd073bb542a23bd6ecaa3ed82f0a5641bf 100644 GIT binary patch delta 98 zcmbQkxrLMaG%qg~0}$vO__dKciP585KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4;Vn@jnv)Q@qv b04S56mzblUk(!f}U!Gr-ld^d$<9{Xqfgl=v diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/filters.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/filters.cpython-312.pyc index 94b04acdfcde3b0dab07be5db53478a90da4c6af..909f561b4dfd2b4878e787e1671b3bf605c79a12 100644 GIT binary patch delta 100 zcmdlniRr>5ChpU`yj%=GpmX5YMs8s?j}HCN;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fvme{5CIGxn BBl!RT delta 76 zcmcaGiD}0qChpU`yj%=G!2ICbMs8s?g981~;?$yI{p`e|#5}#EjKq@6M17ak;_Qb8&^hpHBllevj}HCN;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fvjl5?G5`X0 BBnkik delta 76 zcmbP#k+Jb8V1DpzBllevg981~;?$yI{p`e|#5}#EjKq@6M17ak;_QxE8?XQX diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc index fad4d53d5038e165cef09c9d11659c92a39f7bba..ba0cec55724dae2ce7771299f70bef7a7ee04004 100644 GIT binary patch delta 98 zcmbOcupxl^G%qg~0}$vO__dLHJBvrVerR!OQL%nXQet^(R-(R3esXDUYFQb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK h1^NX*nf$!O9Q};coSgjf{GyzcW-IRPR@{tca{#E`9YX*B diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/sites.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/sites.cpython-312.pyc index 9f0d9dd575e5f490975d42552e01d89bcf013d43..dcf112a4ddfa4bcb755fe0c2cb340318019bacc9 100644 GIT binary patch delta 100 zcmeA;&A8w+Bll@uUM>b8&^hpHBexHSN1J|VacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#xt)VC768)E BBX0lz delta 76 zcmZ2*nz7?FBll@uUM>b8V1DpzBexHSL7skSacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{COQb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&2p?U=>Rt096ta6 diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/widgets.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/widgets.cpython-312.pyc index 19da55a13e66f8683c22b52ee7f4a062f1553fcf..30aedb30c182920abbf78259910c0fe0a8b41445 100644 GIT binary patch delta 100 zcmZ4bgmLc^M()$Ryj%=GpmX5YMs5Rkj}HCN;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fb2j^~ECBSv BBxwKu delta 76 zcmdn{gmLK;M()$Ryj%=G!2ICbMs5Rkg981~;?$yI{p`e|#5}#EjKq@6M17ak;_QSU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO?`?09Z8{%m4rY diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-312.pyc index 28c08b7cd2e1b2dcd76eaa9df1b9a40ce1259cb8..3ea8ad9fe8e0aab403136b31895b13d87859022d 100644 GIT binary patch delta 98 zcmaDW)+)|@nwOW00SI&s{MyK^#^fcgaf3OV1A|%FjwoF4>&O#KQ>yS?nRd delta 74 zcmZn_e=Ej)nwOW00SK5MeA~#a#$?c-A6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!eV<#KQ>ygy$J$ diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc index 47ec74d25e771118e61139e626036ca6fd288679..dc7c8a6dcb862ee6299d71e46c05a9e4a861c6f3 100644 GIT binary patch delta 95 zcmcb?_<@o8G%qg~0}$vO_%)H+*rQ)Rv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZS08;fCumAu6 diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/autocomplete.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/autocomplete.cpython-312.pyc index 5eb56ba0e8c8754b08bf84075ddd5927ce410efc..84ca5dce540464191d0ce5837e1a7b22dca557e7 100644 GIT binary patch delta 98 zcmcbq|52a&G%qg~0}$vO__dMy1&haI{m|mnqGJ7&q{Q;ntVDg6{N&Qy)Vz{neboy?($xtJI delta 74 zcmeyUe^a0PG%qg~0}wDj__mSz1&cwoerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrW>oy?()`=S> diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/__init__.cpython-312.pyc index 601e6afd31d9669ecc6104518d0e3b0e932baf71..6a60f9c3abc9d0c0a19ac989de26623bbdf380ab 100644 GIT binary patch delta 98 zcmewq*%ifonwOW00SI&s{MyKUm&v0;KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-)>d`lAm#PK7X delta 74 zcmeB*`V`51nwOW00SK5MeA~!qv b04S56mzblUk(!f}U!Gr-ld{=>`IaUC(!?7= diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc index e0b65b5bd5c160ee279a6315659e77d64c2f066f..99cb26bbf181436aee890ee85332ea44eef48fd6 100644 GIT binary patch delta 98 zcmZ1+vO9$PG%qg~0}$vO__dL{p4FpOKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??`HB$uunL#5% delta 74 zcmdlTvN(kMG%qg~0}wDj__mR|p4A{%KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~|Yo-bSw7MGU diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc index 173e98c2aa452d37e356461910428cc048706858..7bda82dd1c20bfd23fbee8d91811192be227c661 100644 GIT binary patch delta 98 zcmaFJ|C68lG%qg~0}$vO__dMyCyPgmerR!OQL%nXQet^(R-(R3esXDUYFiG%qg~0}wDj__mSzCyPOjerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOq_>slrN$=Dk2 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc index 48707458913ae8a9aea722ae5fd002df794144e8..e8ee94349ea09dc706e5ef07e905969512e30657 100644 GIT binary patch delta 98 zcmX?a|J|=C9HK%JCc8 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/checks.cpython-312.pyc index eaa32254792c5fed6a10e896c9a14db2c6c4b1d2..494c967af52bd76ecaf8319cbce46b20e8b583be 100644 GIT binary patch delta 98 zcmez4J;jInG%qg~0}$vO__dMy29rmderR!OQL%nXQet^(R-(R3esXDUYFcgaf3OV1A|%FjwoF4>&H>LvgHX%-?e delta 74 zcmX@6y-u6^G%qg~0}wDj__mQ-m(`$1KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#i)lC2Zk!Km# diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc index 61e523afd52ed802f4d9fd3fa3459a2d9d751307..58919ec60ea24de2380b22e23bb57e81705728b3 100644 GIT binary patch delta 100 zcmZ2=lkw0^M()$Ryj%=GpmX5YM(&5K9Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc%_eMpX#gB*94`O> diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc index 2d2341e3062d41e8d84d3b3f2b4cef5e6b950e6f..e2226abe33bc6fbb9990edec73b5384e3e90398c 100644 GIT binary patch delta 100 zcmX^6it*_yM()$Ryj%=GpmX5YM((@J9_{*}#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc%?2!{g#b9~96ta6 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/models.cpython-312.pyc index e6559472a3116facbd16cb6b83dddd39aee7169e..adef042a34bcd6070d3975fb1936457da9401593 100644 GIT binary patch delta 100 zcmeyqm9c*tBll@uUM>b8&^hpHBR4;bN1J|VacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#*^6au7y#2< BBgFs! delta 76 zcmeC*#`t|JBll@uUM>b8V1DpzBR4;bL7skSacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{CO0A@ diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc index 6a5b1137dbb0eb9b3a58bf583a1294e022c1bd06..5478477f7e1d2709cd886e9b9dfb19adf8a40996 100644 GIT binary patch delta 95 zcmey$)XU6$nwOW00SI&s{F=zU-=keWv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(sFCnwOW00SK5Me4EI<-ymNSU)?lC^1hjDI>8YGg03qwK%&Zzd*kL ZD3hO;n4_POnv;`Xo?n!cGFgbR8US<48Ib@0 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc index 99fd7fec6747eb65d87b8bbd94c35809a900a7b0..f99bb230811f4e7fed5622dfd168590302688a84 100644 GIT binary patch delta 98 zcmZqFo2kcrnwOW00SI&s{MyL9hRLH%KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4_E?NlF9&aB3o{ delta 74 zcmbQK*Qm#RnwOW00SK5MeA~#qhRGmLKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0glavSmm0KE5 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc index b11d021890afc48579c775ee4e1911fdd482d04e..be9c528cf9b2f9ea68dceee0381c09463f15dfdf 100644 GIT binary patch delta 98 zcmdnMb%KlgG%qg~0}$vO__dMSi^-!)KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^45w3-P3TO=ZW delta 74 zcmX@XwSkNKG%qg~0}wDj__mSTi^-r!KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^d((`qIFhSeG* diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc index 68c745711d6d77a9b084be9229207aa2736f23b9..7b05adf7dcfb8cc18b8fd08fcbbe30b751f70c39 100644 GIT binary patch delta 98 zcmZ3fe^8(MG%qg~0}$vO__dK+gUMsEerR!OQL%nXQet^(R-(R3esXDUYFqv b04S56mzblUk(!f}U!Gr-ld`#*$xRdhkkuK} diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc index 72ef28cd7579f2cbee65ff090af0b920e2af6651..4af8d9ef361a457d240d6c3d00f6bd6776d80479 100644 GIT binary patch delta 95 zcmcb~_>qzOG%qg~0}$vO_%)H+*kgizXmM&$v3^QYVtHy-qP|Oha%paAUP-aOYf5Qy wVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOuSU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;Zi08_OYv;Y7A diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc index c6792861cb01efc7532ce0d92570694b81615fc0..ca00681045c0fca03599590441e040a5c719ef4e 100644 GIT binary patch delta 98 zcmZ3aw@Z)vG%qg~0}$vO__dL{oXMkCKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??^sXzn(de0)> delta 74 zcmdm`w@8osG%qg~0}wDj__mR|oXMb6KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~~Q-KHoo!}aT diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/apps.cpython-312.pyc index 76a72e775d0f1643bc8ad3873b69b5757d2cea97..138299ed1b52c93e7750ccc5f71f521a018e51a4 100644 GIT binary patch delta 98 zcmcb_^NNT2G%qg~0}$vO__dLHDYHk9erR!OQL%nXQet^(R-(R3esXDUYFw<{~Blu-_W( diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/checks.cpython-312.pyc index 7a194eac5f60ee840ad1d478ffb52a304f640371..fb79e6fc962879e8bd5b790240b63b1b61a61ea5 100644 GIT binary patch delta 98 zcmZ1}d{CJCG%qg~0}$vO__dK+kjbM@KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qE6w3|(N`E2C delta 74 zcmX>oyi%C^G%qg~0}wDj__mQ-kjbD-KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?I5DV7}oddL}Z diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc index 5b80b0f7be8be2bd0e4492fe376ca69d40cf3da4..969e627d3516ba7dd13fa3a231664a7e2fd0f5e5 100644 GIT binary patch delta 100 zcmX?cfa$>jChpU`yj%=GpmX5YM()3?9)0?u#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc%>irzvj8W%95Mg^ diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc index 4db98e208925a138643feb68f77e88dd2cd8f35e..06b5b2c28ae87b847459cf33bb2f7ff550fcfb01 100644 GIT binary patch delta 98 zcmdm~c~O)5G%qg~0}$vO__dLnh0UW^KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4=6)R>cPZWEUbR delta 74 zcmcbpxl@z-G%qg~0}wDj__mRoh0UN;KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?ISt%?r-jxZU{ diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc index 816c6e166cc0c4489d8b2ef33a3a4107fed90548..72410b12446773c9bf72e5df69c22068a6d19c61 100644 GIT binary patch delta 98 zcmX@_``nlNG%qg~0}$vO__dK+fXSmzKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qO)S?0alHwxG delta 74 zcmaFvd)}A(G%qg~0}wDj__mQ-fXSdtKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IPsYL|cgaf3OV1A|%FjwoF4;Vf>4hi&W^N-3 delta 74 zcmbPd*k;ImnwOW00SK5MeA~#K%w*84A6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!h%O>4hi&j=vhQ diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc index ac6f52a6c9a6c1397746425c59e7d691a11c1c4f..9ff8726a7e7876127e92aaf4c7bfee1efc9e5d2f 100644 GIT binary patch delta 96 zcmey(G?|(EG%qg~0}$vO_%)IHf=7>jXmM&$v3^QYVtHy-qP|Oha%paAUP-aOYf5Qy xVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOuWwJ730RVg98My!e diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc index d541c177fb2c02e9474a16b30c77104cf6855756..3e16cbb1a9b547df94f7f5d4c91acd72706b3ff6 100644 GIT binary patch delta 98 zcmdlids>$JG%qg~0}$vO__dL{nbD(NKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??~@hcAieZwPb delta 74 zcmX>tyIGd|G%qg~0}wDj__mR|nb9C$KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}05<5wO4pj;af diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc index 56c487e1bdfd362f454e428e317bc65aa0a51897..5e9a5b435b904dfd8920c733394a1ad611f1440f 100644 GIT binary patch delta 98 zcmbQlwTg@TG%qg~0}$vO__dL{pV6a3KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4=sF(SsQPSz97z delta 74 zcmZ3*HHnM+G%qg~0}wDj__mR|pV6Q|KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~{qX#npgnSwd diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc index 0f39d30fc54dfe909b8f1aba48260046b826012b..cf57f013dedd0cac738a746c61fa4eadea2a4dca 100644 GIT binary patch delta 97 zcmZo*nZd$+nwOW00SI&s{MyLP#puziA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}cgaf3OV1A|%FjwoF4>&S$ifH!b37sO delta 74 zcmey*@|=bHG%qg~0}wDj__mQ-gVCT+KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#*k%bWenH?FI diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc index 8565b72237c26701ba8e252e2b246493fc42464c..5658bda01bc4e7a645b810a499888378f32aa1e5 100644 GIT binary patch delta 98 zcmey#I+2b0G%qg~0}$vO__dLH52MEv{m|mnqGJ7&q{Q;ntVDg6{N&Qy)Vz{nebqv b04S56mzblUk(!f}U!Gr-ld}0e(*i{R!TTF+ diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc index f8107305c799dfd687f552e233ce6bdad764712a..2108280d30726ea44bde2cd5851440e2f6978e12 100644 GIT binary patch delta 95 zcmcc0_?D6TG%qg~0}$vO_%)H+*rP{3v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;Zk08q6VqyPW_ diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/apps.cpython-312.pyc index cd60988cd107f228d6cfa941094f062037ed47e8..0874d8bce7aedd910db108a5e3145b3b5be727c6 100644 GIT binary patch delta 97 zcmcb@@`i=`G%qg~0}$vO__dK+i_xP)KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}5Ll_#Oa5&LWrq delta 73 zcmaFEa)pKaG%qg~0}wDj__mQ-i_xG!KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQOxM@jU=_ff_yl diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/base_session.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/base_session.cpython-312.pyc index 4b931ce890bb4d7366af792909b40716f1c0bd23..b703b9921d62854d1783d63ab90f2aad82b555b8 100644 GIT binary patch delta 98 zcmew$-XXz#nwOW00SI&s{MyL9n8{;;erR!OQL%nXQet^(R-(R3esXDUYF_#n=GnwOW00SK5MeA~#qn8~0*KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}06lMp8WqTL#0 diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc index 1ef1da5561c3e053b5314f04b9f64681d7182a00..71738a0707f95f8dd68ecc5a692d6f6a949ff3be 100644 GIT binary patch delta 98 zcmaFF|BIjdG%qg~0}$vO__dK+fYGB%KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qOIGqguaY`a) delta 74 zcmeyx|A?RaG%qg~0}wDj__mQ-fYG2xKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IPaXK3Sm@^s- diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/__init__.cpython-312.pyc index c0b9029c7f26432c8425acf81ea6a7080707ca77..0f53756b449e16a1047ba2fc457ea7dac7a81287 100644 GIT binary patch delta 95 zcmcb__==JHG%qg~0}$vO_%)H+*rQWFv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZM08Vuom;e9( diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/requests.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/requests.cpython-312.pyc index 5ef8802092375838d59d7a322bc99fa7b1164e13..c72b5020abb45bd61e7dd8b483d6647b49a6a259 100644 GIT binary patch delta 98 zcmZ3*eTbX;G%qg~0}$vQ__dK+lF6e}KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-Ky6vhkyMx!CV delta 74 zcmX@ay^5RrG%qg~0}wDj__mQ-lF6V@KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?I7DU2Bacb^$! diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/shortcuts.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/shortcuts.cpython-312.pyc index b9fd886db2ff3824f01da51ae381ae3f7964ec94..e9108a58d74d29756d695288194debcf46abce19 100644 GIT binary patch delta 97 zcmX@b_K1!9G%qg~0}$vQ__dLnpUI<3KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE?Mlw#0UU2vLSf@ delta 73 zcmaFFc8ZPrG%qg~0}wDj__mRopUI#|KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-ld?F8i4g#5(HR~9 diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc index b6e8a40353a639417121028288a8a17bce78deac..29e0fb30e17e2f5aa25d93734d8ee2e51379f978 100644 GIT binary patch delta 95 zcmcb?_<@o8G%qg~0}$vQ_%)H+*rQ)Rv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZS08;fCumAu6 diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/apps.cpython-312.pyc index ff1414ab3931eac3bdc98aac751a822305eba214..a7f447233ea60d0d94ab7f9f565c132d987cfbad 100644 GIT binary patch delta 98 zcmdnNd4ZGrG%qg~0}$vQ__dL{g2|&>KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4?@9iIoWeZsHxr3AYG%qg~0}wDj__mR|g2|v*KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0V6Dtz{l!h7U diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc index e39da5254d6806f24568726cb92ff231668d4b97..50f1f7f1980adff54bcd9a5b7ed345b0da1d0f6c 100644 GIT binary patch delta 98 zcmX@Z^@NN2G%qg~0}$vQ__dMSmC2)5KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^3`bcP84a5f^* delta 74 zcmaFDb%u-kG%qg~0}wDj__mSTmC2w~KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dR(-|fJmVz2~ diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc index 56dc9a67ffa5fb0be58600145ef0f2bbab048536..ba2dedf3e294d129a2cef4b325ba3019b3862ba6 100644 GIT binary patch delta 98 zcmeyK*PqXQnwOW00SI&t{MyJJ$?VamA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}cgaf3OV1A|%FjwoF4=6!w1E=qv b04S56mzblUk(!f}U!Gr-ld?IGX#*z!uw)vh diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc index 5fdb724cfa6da985281bf7d81b1deb6d44f02da5..b0466a761a0288890eddde1ec3d2aebd286cc233 100644 GIT binary patch delta 95 zcmX@f_>htNG%qg~0}$vQ_%)H+*rP!|v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(PX&j0`b delta 71 zcmaFJc#@I(G%qg~0}wDj_%@N-*dRkcv^ce>SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;Zh07tbMbN~PV diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc index 96346620d78cb6e8be38ecd2557410e5d117cb26..67c00029924e51a66e502cf1054586adbf311128 100644 GIT binary patch delta 98 zcmX>Z^e~9~G%qg~0}$vQ__dK+nc1UBKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-K%{8|+NmMkMs delta 74 zcmaDDbTWwhG%qg~0}wDj__mQ-nb{yqKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#t`L!wlv#1*N diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc index 82e776c741b447ea48bbb0396ae7230ebb8d5a3c..9f2b1fff3ef23a7e37dcbb4225191a431ed96c30 100644 GIT binary patch delta 98 zcmZpOpApY}nwOW00SI&t{MyKUkcgaf3OV1A|%FjwoF4@e(RH6$2o8BV9 delta 74 zcmbOc-w@AznwOW00SK5MeA~!qv b04S56mzblUk(!f}U!Gr-ld@TbsYDk5w2~TT diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc index 60ffec68914d61c6eb36f07447d344661049958c..053ac72a0813cc181768e2a73cbbda0975180a3e 100644 GIT binary patch delta 96 zcmbQmyos6nG%qg~0}$vQ_%)IHiATMDXmM&$v3^QYVtHy-qP|Oha%paAUP-aOYf5Qy xVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOuWwJSAH2`cg8J++D diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc index 339e33d775985cb308d859e1b34344b92706527c..69e2d5d1b1e9ff6d2ba3fe67ac14c8212711f1e4 100644 GIT binary patch delta 98 zcmX?|@Hm0{G%qg~0}$vQ__dLnhr^>@KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qP!J+{GnT#T3 delta 74 zcmaEya5{neG%qg~0}wDj__mRohr=LUKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IUgGB=Xwg4Im diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc index 2d601caf88922fd34debcbcf8d08f11c872d772d..9857ddbec895589a98c7fcfe1ae39a58627b4e3a 100644 GIT binary patch delta 100 zcmcb0hw;-LM()$Ryj%=GpnKrgM($=dk0$-l;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^FFpY=>Raa BB|!iH delta 76 zcmex#hw;`OM()$Ryj%=G!2ICbM($=dgDm~f;?$yI{p`e|#5}#EjKq@6M17ak;_Qv{9Ks(G%qg~0}$vQ__dMyA*)B5erR!OQL%nXQet^(R-(R3esXDUYFSU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZS08;fCumAu6 diff --git a/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/base.cpython-312.pyc index 13f907852dcdb2c1fb04e10e73262d8eb6ec8b6a..e2ae700023a5e14cb4619cfc2067aa95af1049d2 100644 GIT binary patch delta 100 zcmex0k#W)_M()$Ryj%=GpnKrgM()#$9^Lw(#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&2mg%+yM8u8`uB< diff --git a/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/filebased.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/filebased.cpython-312.pyc index 3d5c65e8afdb750f94d82c085b0c75905e13f775..3ad0119fa67b7e595cb083ac0a073c4116bb4eff 100644 GIT binary patch delta 98 zcmX@+eb1ZwG%qg~0}$vQ__dMy3zNqL{m|mnqGJ7&q{Q;ntVDg6{N&Qy)Vz{nebNu(sm=1 delta 74 zcmccTeaxHtG%qg~0}wDj__mSz3zI>GerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrc^K>Nu-2xjq diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/__init__.cpython-312.pyc index 9efd86c60da92d5944c18b0764f065e279ed57e2..f4cd2ecbda9fa2419c1dc620a7a2bd10b48368ae 100644 GIT binary patch delta 97 zcmbQuxtWvuG%qg~0}$vQ__dLHE3-$terR!OQL%nXQet^(R-(R3esXDUYFcgaf3OV1A|%FjwoF4;Vvsgf4}V0R*e delta 74 zcmdm>Fhha+G%qg~0}wDj__mQdg~=dSKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^d`Qzb6|iaQ!8 diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc index 072cbb12d621694eec2e9b222cc31fb91a9b6c86..78611d73d59a4e53874de9a071fe918d18cc5ff2 100644 GIT binary patch delta 98 zcmbQuwwaClG%qg~0}$vQ__dLHE~7`gerR!OQL%nXQet^(R-(R3esXDUYFoMrTFcgaf3OV1A|%FjwoF4-K&6wL?#Lb4&U delta 74 zcmX@YzJ{IqG%qg~0}wDj__mQ-jL9HJKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IJDVh-gbj}%9 diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/messages.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/messages.cpython-312.pyc index a2442bba47a630ac17818aabfc4428a0bf299b12..4fb765e9c1a508f23713e29a676af62f98f2e342 100644 GIT binary patch delta 98 zcmcbv_Fj$qG%qg~0}$vQ__dKcmdT@CKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4;VTX}qv b04S56mzblUk(!f}U!Gr-ld^dO(|!Q}u-+Q) diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc index 83c939f24526fe57570536688946f571d01f28b4..00f61a02a955d7ec909a9e192753164de6ce82e7 100644 GIT binary patch delta 98 zcmaDB^e>3}G%qg~0}$vQ__dMyCx=J3erR!OQL%nXQet^(R-(R3esXDUYFcgaf3OV1A|%FjwoF4=sANl^d*jA0_* delta 74 zcmeBG`>M))nwOW00SK5MeA~!9lgS`oKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~@lcE3ssfQYb diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc index 96f7a7b3f3842f511d9a63009fe22b6fc51379aa..c39d35b25ee4b6e485ee0f86922f4aa2eecb0136 100644 GIT binary patch delta 98 zcmeyy+Q-IynwOW00SI&t{MyL9kcgaf3OV1A|%FjwoF4_Esk&6)ke8D2B delta 74 zcmeBU`^L(BnwOW00SK5MeA~#qkqv b04S56mzblUk(!f}U!Gr-ld_qGiHi{cnR*#e diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc index 8e39d7f098261c371d316175a77536348781dd64..7e8201a45d56f359b1fadb4673549125708805b3 100644 GIT binary patch delta 98 zcmbO(ycgaf3OV1A|%FjwoF4^qD8q5IzKtCa& delta 74 zcmZ24JzbjnG%qg~0}wDj__mRolhvR|KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?I6HJAeca_bpJ diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc index 2f625f28c63d0593642af82d792221d585e41bce..9e0776fa82e1ef3b662fa20ac1429cfda07d3ce1 100644 GIT binary patch delta 98 zcmexqIMImvG%qg~0}$vQ__dLHDw9XEerR!OQL%nXQet^(R-(R3esXDUYFsCQUH_u;Ch} diff --git a/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc index 1eee70a2f4e89c4c52c9ee1b29b22a7022d5b9bb..6984a64eede445343d2ce9ec7666fce1799d87b1 100644 GIT binary patch delta 95 zcmcb|_>GbKG%qg~0}$vQ_%)H+*kh`GXmM&$v3^QYVtHy-qP|Oha%paAUP-aOYf5Qy wVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOuSU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO?`y09SPx$N&HU diff --git a/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc index 915f59ad8e1f48f4efb86db31429f76692f64448..61a637e7ea1bd1b7bce369bb692335642a2d090a 100644 GIT binary patch delta 98 zcmey$-pj##nwOW00SI&t{MyJJ&g3y&KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4;VZDVY%fWqu-J delta 74 zcmeC>_{z?GnwOW00SK5MeA~z!&SX%pA6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!h%LDVY%fjPx1@ diff --git a/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc index e6c4cbcb902b3f434ddd7cf38ab593733f09a7b6..ce2da3a106bcd005b9457151f030086f4421b6ae 100644 GIT binary patch delta 95 zcmcb~_>qzOG%qg~0}$vQ_%)H+*kgizXmM&$v3^QYVtHy-qP|Oha%paAUP-aOYf5Qy wVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOuSU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;Zi08_OYv;Y7A diff --git a/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc index 2fcf7094203ce727c09a19c76e3c8c01feb58efa..e69e665d09704565a8d82c3b7cddcc8775e43c7b 100644 GIT binary patch delta 98 zcmZ1!y(^mgG%qg~0}$vQ__dMyvyexRerR!OQL%nXQet^(R-(R3esXDUYFr{ZyL!G%qg~0}$vQ__dKcjmcwzerR!OQL%nXQet^(R-(R3esXDUYFr delta 74 zcmaDVeO8+LG%qg~0}wDj__mQdjme-wKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dylMXikr^p&e diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc index 19c17be12b32a21f66e92caf2d1fd49f8b4ced00..d72d5635c041cd31114bcca32947c0ed83f02809 100644 GIT binary patch delta 95 zcmZ3$w1bKJG%qg~0}$vQ_%)Hc%A-v`v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGVyFS076z7$N&HU diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc index 906d90bd05d77977c997e6de1077268cd9d6ad21..256d28145fd10b7c8e0fd0e9c3df3e55b9e30b63 100644 GIT binary patch delta 98 zcmX?W`_z{EG%qg~0}$vQ__dKcoyns~KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??@Nm~X0o#`U$ delta 74 zcmaEAd)AiwG%qg~0}wDj__mQdoyj0eKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dileP>1xJ??6 diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/images.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/images.cpython-312.pyc index 3e2c3189b6c36029247a63a26bb38567fc71977e..42828d96f0421765455971c1b60135b446f683b2 100644 GIT binary patch delta 98 zcmcaA`BswqG%qg~0}$vQ__dK+n8~9>KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qI)XoI}ZmA+y delta 74 zcmaDWc~z48G%qg~0}wDj__mQ-n8_eVKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IDshtY|mHip~ diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/locks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/locks.cpython-312.pyc index bb4f22dcaa08e817098221425e3649034a81bec8..997e06e28d63db9395f32165f3586af9d35a978d 100644 GIT binary patch delta 98 zcmX@8d{deGG%qg~0}$vQ__dMyAgf2SerR!OQL%nXQet^(R-(R3esXDUYFrrk1p+6(z delta 74 zcmcbqd{CMDG%qg~0}wDj__mSzAge*PerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOq;+fi-+we}i` diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/move.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/move.cpython-312.pyc index 01e9341ca53405ab84450e95f2addc8d77a5aed3..e1ac6846b9185141d274c711b61d8bba014b7898 100644 GIT binary patch delta 98 zcmaDU(J0A%nwOW00SI&t{MyL9io>HxKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4_E)qlFm&fI%ZH delta 74 zcmZpad?~?wnwOW00SK5MeA~#qio+mFKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0QM+-9mpl2G< diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/temp.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/temp.cpython-312.pyc index 6d1f7d38a748490acd3c3c0df489f6dbfc0ef87d..ddedba505ad644e882e109a899f6ea7c28981bc7 100644 GIT binary patch delta 98 zcmZ1?y+@k+G%qg~0}$vQ__dK+joqV3KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4>&O?#u=NQMV!A delta 74 zcmdlZy+oS(G%qg~0}wDj__mQ-jolziKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#z-I)ylf6Ez! diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/uploadedfile.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/uploadedfile.cpython-312.pyc index f588b6c5e3a2e385e6831789b4ed968cc2b285ed..d7aec1d8c1a019f9ec43340dbd06a219013d2518 100644 GIT binary patch delta 98 zcmdmCaKV84G%qg~0}$vQ__dK+fW@OrKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qO@>UoCY&s&o delta 74 zcmca$u)~1+G%qg~0}wDj__mQ-fW@FlKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IP<*hIPlr|b; diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/uploadhandler.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/uploadhandler.cpython-312.pyc index 5a8a5107c477570043e7569316c274d992033a1f..fa447c65cef0e38783bddefd433b89fa548e368b 100644 GIT binary patch delta 98 zcmdn)bKZyhG%qg~0}$vQ__dMy6_ZD|erR!OQL%nXQet^(R-(R3esXDUYF6 diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/utils.cpython-312.pyc index 466c51e5dde612a78b57073606eaa9042d543575..c3171bc906213dea17c643a4e9f5f0dcdae8e2a4 100644 GIT binary patch delta 98 zcmX@4drO!5G%qg~0}$vQ__dK+i`k=DKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4>&Q94ia}c8MZq delta 74 zcmcbmdq|i2G%qg~0}wDj__mQ-i`gJsKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#%IaU||n}r$- diff --git a/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/__init__.cpython-312.pyc index d69239ae4602486f53741f274de07be2aecdf9ce..865dcae0ada71e9854ad034aee185bab93f454d7 100644 GIT binary patch delta 98 zcmbQov5kZKG%qg~0}$vQ__dK+l*yw{KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-KwbdC`KJZd5n delta 74 zcmdnSF^_}$G%qg~0}wDj__mQ-l*yn>KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?I3=^P^fa2^@B diff --git a/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc index 509e463d4ac17f7751afa9097d7c15ab3e1bfc98..af3ec834fb04831b0c063b10884b5c744038c2b2 100644 GIT binary patch delta 98 zcmdnze9f8rG%qg~0}$vQ__dLHHIqk|erR!OQL%nXQet^(R-(R3esXDUYFqv b04S56mzblUk(!f}U!Gr-ld?IAJxdD!sP7s- diff --git a/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc index 70b3623471fec52bac43918e089cc696a50806e8..c45ea62b84ce80385a1bb954e3d15d25ad3c91aa 100644 GIT binary patch delta 98 zcmbOrvOcgaf3OV1A|%FjwoF4GC_pqv b04S56mzblUk(!f}U!Gr-ld`#+aV`e{c1#(~ diff --git a/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/memory.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/memory.cpython-312.pyc index b0a2fd3ce151640a6c1815d1c4ff126f55f0928d..6f5ea4d233883d734e0d55e74bb9674564d32eda 100644 GIT binary patch delta 98 zcmexR-ciAQnwOW00SI&t{MyJ}%k0skA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}jvOyxX delta 74 zcmaE*b4iE$G%qg~0}wDj__mSz1hYY|erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrVi@y*6#cdi| diff --git a/env/lib/python3.12/site-packages/django/core/mail/__pycache__/message.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/mail/__pycache__/message.cpython-312.pyc index da81b65345dfce8864800b9d6a872f9d74734360..3ea318354c3090337440f250392636eb2d4e98cb 100644 GIT binary patch delta 100 zcmZ3nn(@GDM()$Ryj%=GpnKrgMs8LXj~4yV;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fvja;;AOO1f BBQpR1 delta 76 zcmX@GnsLQyM()$Ryj%=G!2ICbMs8LXgB<cgaf3OV1A|%FjwoF4^41*vkX}L0uvn delta 74 zcmZ3@F`0w=G%qg~0}wDj__mSTo6#UkKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dpV=of`b4eM% diff --git a/env/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc index 96ff2dc01ee5c2ba65d7ece6d2bc08ec681d2d51..e76ada4d97f9a6c85b207b3102a2bb95de7618af 100644 GIT binary patch delta 100 zcmeyhka5x?M()$Ryj%=GpnKrgMs67vk8b_Y;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fb2!Ul9{|j3 BBd-7e delta 76 zcmbQVi1F7#M()$Ryj%=G!2ICbMs67vgJS*A;?$yI{p`e|#5}#EjKq@6M17ak;_Q?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^HSD>#Q;PD BC5He2 delta 76 zcmezOiSgMdM()$Ryj%=G!2ICbM(!+DgM9ta;?$yI{p`e|#5}#EjKq@6M17ak;_Qcgaf3OV1A|%FjwoF4^3`I*SVcS?eNj delta 74 zcmdm_FiU~^G%qg~0}wDj__mSTmDQj?KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dR>ntt+g{K-7 diff --git a/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/__init__.cpython-312.pyc index 0096b1cc9d2a0893f98c85d308cfe2e000401bd5..6a547d4c3988529b84ff06a7bd5a6b60a48dd12f 100644 GIT binary patch delta 98 zcmezB+3Ur9nwOW00SI&t{MyJZ%<9pjA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}cgaf3OV1A|%FjwoF4>&Ka$X1kY#}1K delta 74 zcmX@9w^5J#G%qg~0}wDj__mQ-oyDL)KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#r<-8C8lhqnt diff --git a/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/python.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/python.cpython-312.pyc index 521837b2dda604d8c59c4025a001d938a39c7cec..8cac9ccd68f1e60e5da5f1d048bc64b90f6a7ba2 100644 GIT binary patch delta 98 zcmZ4Jv(tzBG%qg~0}$vQ__dLH9g|0werR!OQL%nXQet^(R-(R3esXDUYFp{65S delta 74 zcmdn#v(Sh8G%qg~0}wDj__mRI9g{(kerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuK7uvxPDMwiOxy diff --git a/env/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc index e2f95b2aa7ffa8d08b9625393decfb44d67e90b9..66cb2a9fcbc92a7a732cbddd6dd9aeb548ab6418 100644 GIT binary patch delta 98 zcmey!+sVg$nwOW00SI&t{MyL9nc1UGKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4_E!nVA^?eKjJf delta 74 zcmeC=`^d|EnwOW00SK5MeA~#qnb{ysKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld_qOg_#)uneG`+ diff --git a/env/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc index b535d2a6aa045791336e01fe3ad0a1bb36bcfdf0..a45c23d0d6641f0d18510e049b59ee04e9ae4952 100644 GIT binary patch delta 98 zcmZ1cgaf3OV1A|%FjwoF4-K%bWsNYimW3Z delta 74 zcmX>ew?2;hG%qg~0}wDj__mQ-naLniKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#t>7ot*s`whi diff --git a/env/lib/python3.12/site-packages/django/db/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/__pycache__/utils.cpython-312.pyc index 509ff9b04b5a47dc2324dec4af6f84f2449a8c9a..e6a4fd79bde659f0d3ed977d0bcf503b940eb65a 100644 GIT binary patch delta 98 zcmZ1&wKIzQG%qg~0}$vQ__dLHE|W*KerR!OQL%nXQet^(R-(R3esXDUYFoCQmH@y965p diff --git a/env/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc index 6d5a393c7cf162775443995e6af01c9bd2ce8228..6b7c25868c83acc867546a4361446ad486044f09 100644 GIT binary patch delta 95 zcmcb>_=1u9G%qg~0}$vQ_%)H+*rQ!Pv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(i_@% delta 71 zcmaFCc!81oG%qg~0}wDj_%@N-*dSj&v^ce>SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZQ08I56kN^Mx diff --git a/env/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc index 30b15e857f09542691d4e56631724b8dddac3f48..351a7a5e6ae4beee080fab4802352076cb9902fa 100644 GIT binary patch delta 98 zcmZpznp?$vnwOW00SI&t{MyL9j>)4}KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4_E&NyZ8Que2k5 delta 74 zcmbPR)mp`UnwOW00SK5MeA~#qj>(`@KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld_qSS;h(gzSU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGVxjt07cgaf3OV1A|%FjwoF4?@BX^Is9*6SoB delta 74 zcmaD}b-s%GG%qg~0}wDj__mR|fyp38KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0T(-bQJ;`bZL diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/__init__.cpython-312.pyc index 7f894689c3e51d3cbc5edb57f3a5a0f09f33d81b..4aa845e897b7cd980fae5eae5f32f8003d11e8f4 100644 GIT binary patch delta 95 zcmcc0_?D6TG%qg~0}$vQ_%)H+*rP{3v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;Zk08q6VqyPW_ diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc index 057f096a037e8a47d0ef59938885b525d012bed7..ab4e9ff9378139de4ab9dfe3b64a01d7f30104cd 100644 GIT binary patch delta 100 zcmaFW&(t)5iTgA!FBbz4=pOjBk=vBpqeDNmIJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`=T)S<1tGnwOW00SI&t{MyLv!syYZA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}|+4{Kk*_I delta 74 zcmZ3=)62tsnwOW00SK5MeA~$F!e~&WA6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!dJ|v5y4+awQqL diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc index 119502b51a659f14748fb3ccba3c83ef389c1966..a2565e889afa8677cd040b8c04fe3108c80fc6a4 100644 GIT binary patch delta 100 zcmX@x#`v_2k^3|+FBbz4=pOjBk$WMv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#`5aTd0|4v0 BBv}9e delta 76 zcmaFb#(1`kk^3|+FBbz4FhBUVk$Wcgaf3OV1A|%FjwoF4-K;$}0l^o;Mqv b04S56mzblUk(!f}U!Gr-ld?IVl~)D;xhonZ diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/introspection.cpython-312.pyc index 9f196c3f84fc1b552a6bf085d0b09bf6f0a72d2c..9221f23bb776fc2ffacb4bde59885b91664e37bb 100644 GIT binary patch delta 98 zcmews))&rwnwOW00SI&t{MyK^&EzprKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4>&MB%lcZki;T+ delta 74 zcmeAR{}#r5nwOW00SK5MeA~#a&16uiA6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!eV-B%lcZt?C*c diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/operations.cpython-312.pyc index cae9f65ad49b80e5b3e411d323a255b475fb63b1..90df2be73381c0d7d695dc1078bd5fe09e5b467b 100644 GIT binary patch delta 100 zcmdnGf$8i9ChpU`yj%=GpnKrgM(zwYk3Rj-;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^J2D169Mi& BB$ogH delta 76 zcmX@RfobaoChpU`yj%=G!2ICbM(zwYgEIZl;?$yI{p`e|#5}#EjKq@6M17ak;_QQb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK h1^NX*nf$!O9Q};coSgjf{GyzcW(k(<5-f~MJpf)u91{Ql diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc index 9ecbf8dec94099182030d56ef86128fa469af32a..0304f056515e1dc7ac06d6d1f120f542fe981156 100644 GIT binary patch delta 98 zcmbQmw~3GYG%qg~0}$vQ__dLno6)0BKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qHc!d=JI#?nL delta 74 zcmdnQH;a$^G%qg~0}wDj__mRoo6(?5KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IE@d_&dZnPP& diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/__init__.cpython-312.pyc index 7ec107dc2f66e669faead631fd9f3b8cd3a7a78b..684620eecd7aec63e528846896d316f71c356528 100644 GIT binary patch delta 95 zcmcb?_<@o8G%qg~0}$vQ_%)H+*rQ)Rv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZS08;fCumAu6 diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/_functions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/_functions.cpython-312.pyc index 469a04df3f5aa6530b550d1d097abbe982aacf9b..a248f44e04f0c96c9b8bee7eb7bd6b950015d788 100644 GIT binary patch delta 100 zcmX>)o$>B;M()$Ryj%=GpnKrgM((@(9uxILi&Kk=^;41(%Tu!w^fsA~Yti-(Z{D7kTtkmR^%@P7@tpN<; BBuD@N delta 76 zcmcaRo$=^&M()$Ryj%=G!2ICbM((@(29^4u#i>Qb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc%?1K%tpN%i8|?r9 diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc index 67e21c3e847c103131ec466d5c3dd718ce825fea..3cb77aa943efa7e3faf12701129904f366e4267f 100644 GIT binary patch delta 98 zcmexT)lcgaf3OV1A|%FjwoF4=sUb)h)`&Rirm delta 74 zcmeCF{!+z#nwOW00SK5MeA~!9gVmr|KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0W>q2t?+cF#5 diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/client.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/client.cpython-312.pyc index 139e1814981aa26fe99500d7f460c045dc63b575..435dca2c574e016b5879d295920b313460237216 100644 GIT binary patch delta 98 zcmdnWc9xC%G%qg~0}$vQ__dMSpV6aNKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^40xSA0FUV9>o delta 74 zcmX@hwv~qv b04S56mzblUk(!f}U!Gr-ld^dc<7!3#i2oWe diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/creation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/creation.cpython-312.pyc index 0ae4f6b805f0a6c518dcc4718b5d056312ac79d9..c41a10635718cfde2f9c5e865b62caa960ec2559 100644 GIT binary patch delta 98 zcmdmQf8Cz@G%qg~0}$vQ__dMyI-^IwerR!OQL%nXQet^(R-(R3esXDUYFo%P<<} diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/features.cpython-312.pyc index 90628f7a4b34998ca269cc661a8b6569dbf79b80..dc56d8ef715b6c814b6a5fe3d598725f7495c61a 100644 GIT binary patch delta 98 zcmbPkyxy4mG%qg~0}$vQ__dMy61PXcerR!OQL%nXQet^(R-(R3esXDUYFMv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#`3TcFdjP#o BBqIO- delta 76 zcmZ40$~dW&k^3|+FBbz4FhBUVk-L-0phiEmIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj dK)(Pelb@HEqo0wQlapVbUzC%w`3}=LdjQZ%8^{0v diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/operations.cpython-312.pyc index e7d300a513a37936a640148e9931a645ca9ae6dd..91866802b934c892e1172523a69b3cfcb0e00890 100644 GIT binary patch delta 100 zcmaF7jPds}M()$Ryj%=GpnKrgM()+D9uxILi&Kk=^;41(%Tu!w^fsA~Yti-(Z{D7kTtkmR^&CghCeE}bM BB?|xm delta 76 zcmeypjPda@M()$Ryj%=G!2ICbM()+D29^4u#i>Qb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&Hq?yeE}Kd9IyZY diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/schema.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/schema.cpython-312.pyc index f1da45336c1cbc738f8ee9143d2c647467f1bba8..0341b0699254eec40aa38c841a1ae454d97d603d 100644 GIT binary patch delta 100 zcmZph&p2;BBll@uUM>b8&^_>LBlkWQk6!)I;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^G}vuF96q8 BBya!# delta 76 zcmbO?pRsK|Bll@uUM>b8V1DpzBlkWQgHrv_;?$yI{p`e|#5}#EjKq@6M17ak;_Q)8x{Zn diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/__init__.cpython-312.pyc index 850e85b1fc2a03d4cecb1688d7a28a13db511ad4..5f434492b5fde3d3ed591d6480b6f441d3759335 100644 GIT binary patch delta 95 zcmdnXbd`zwG%qg~0}$vQ_%)GxhDWDW#a2B09ia5KmY&$ diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc index 9d9198f41144eda64b30aa04b3ff2c93379ea41e..617eed587a4d64fedf9791e4e03aa74bd8e75b77 100644 GIT binary patch delta 98 zcmaDT`cstqG%qg~0}$vQ__dLHBcn&RerR!OQL%nXQet^(R-(R3esXDUYF?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^CFh8^#B*> BB;Wu5 delta 76 zcmbR6g6YR|ChpU`yj%=G!1CbRM(%VLgFOAv;?$yI{p`e|#5}#EjKq@6M17ak;_Qj4xj9EJb@ diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/utils.cpython-312.pyc index bb0c8a2ace5ba389e41e2c392ef35400978d63b5..ccf1f212f6d5c4deb8788642696b8b8b35ee9d61 100644 GIT binary patch delta 98 zcmcbr_EwGiG%qg~0}$vQ__dMyEu%-9erR!OQL%nXQet^(R-(R3esXDUYFc2$l0G%qg~0}!x0__mSzEu%r6erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOq(ldd2D%qSXp diff --git a/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc index 48ab51e9e1ca38029e9c3d487f74731725d21a37..ea8f1535c93db9776fc29ee44168f66a239d5c10 100644 GIT binary patch delta 97 zcmaFP{-2%uG%qg~0}$vQ__dLnkJ)32erR!OQL%nXQet^(R-(R3esXDUYFqv a04S56mzblUk(!f}U!Gr-lQKDxc^&|MP8sq5 diff --git a/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc index 178c4df9a82aa367e82774ce355bf5549e0e9540..925f2da1a6f96c0a5c705f257b8942ce2acda58d 100644 GIT binary patch delta 98 zcmdmFams@GG%qg~0}$vQ__dKcfYD=uerR!OQL%nXQet^(R-(R3esXDUYFqv b04S56mzblUk(!f}U!Gr-ld^d+<8mngq>>t` diff --git a/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc index b5c344d45a77b85d0a00b37b91eac5215ea79245..724360d9b3fc15b6505f6211cf5d100faf726443 100644 GIT binary patch delta 100 zcmbQ%&$zCik^3|+FBbz4=pOjBk=v5VW0HPoacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#xr9l{6#%Q$ BBKH6Q delta 76 zcmZ42&p550k^3|+FBbz4usry-k=v5Vph`cqIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj dK)(Pelb@HEqo0wQlapVbUzC%wxra%~6#&E?8l3Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQqv b04S56mzblUk(!f}U!Gr-ld?I2nMD}@s8|`y diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc index c487ff90f6c02448b0e153d4335567f34d60b1de..ee3275d43bbccc585a5a4a27bb959c97bfbb84e2 100644 GIT binary patch delta 98 zcmca4@=ApJG%qg~0}$vQ__dLngVUo`KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qN$qv b04S56mzblUk(!f}U!Gr-ld?IQlb;a)kMbF1 diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc index 7ca68028417c03d9d19d530cab076cf78ae5fc3b..8c69a57b3c139cc45bcd8cd19964bb8dfc5429cb 100644 GIT binary patch delta 98 zcmez2JHe0pG%qg~0}$vQ__dL{g4Ls4KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4?@9)m0Gyqaq_N delta 74 zcmbQ>_rsU_G%qg~0}!x0__mR|g4G~jKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0VtE(aayG0t* diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/base.cpython-312.pyc index b9d005da24962f59b9b0595a5bfaa6df79a9c7d4..696c77f74776d9542392e47632deda65db0226aa 100644 GIT binary patch delta 104 zcmcconf3K&R_@chyj%=GpnKrgM(+Kr9*z2;#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQ G76Sn8a3`(+ delta 80 zcmaF;nf3B#R_@chyj%=G!1CbRM(+Kr2ATSy#i>Qb`q_y^iFtZS8HpvCiTW<7#n~nK h1^NX*nf$!O9Q};coSgjf{GyzcW+AriLTrpTivg~r9c};s diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc index cc03100e62b7da00f12cb6f8d4589c55cfe76c0e..e4f069563ce7940c726773d735003f39d726bb7a 100644 GIT binary patch delta 97 zcmdnUa*~DnG%qg~0}$vQ__dK+g3+T*KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}0z6cn<(0bs`)9 delta 73 zcmX@fvXO=RG%qg~0}!x0__mQ-g3%yPKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQKD*@g4wOfEmI7 diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc index 3ef26e9ec6c033d82b568efbc5392cd115378047..39531bd825c9bdbf0d30bea06e8af1ae70f5375f 100644 GIT binary patch delta 100 zcmZ4gf${hUM()$Ryj%=GpnKrgMs9yLj}HCN;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fa~IpvLI4l5 BB*Xv! delta 76 zcmX^9fpPr@M()$Ryj%=G!1CbRMs9yLg981~;?$yI{p`e|#5}#EjKq@6M17ak;_QQb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK c1^NX*nf$!O9Q};coSgjf{Gyzc#gCa10QZ#}{Qv*} diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/enums.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/enums.cpython-312.pyc index 2a242c719e1e8a849c0f80ac353139ee5ffe7115..456679acc1002294d471122ef7e3ff8a1979c2e4 100644 GIT binary patch delta 98 zcmX?W{M4BHG%qg~0}$vQ__dLHA(KawerR!OQL%nXQet^(R-(R3esXDUYFA?s`n%d delta 74 zcmaEAeAbxzG%qg~0}!x0__mRIA(KIterR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuQ>&rjKF(!U!9& diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc index d2eaa517b6b859ba649fae1d43c6a62ed6bf6bf7..7d55cb456e6f3e1134e7e7bd2170f68f783b9965 100644 GIT binary patch delta 104 zcmdlmm+iz{Hty5Byj%=GpnKrgM(&+L9v%9j#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQxmuQb`q_y^iFtZS8HpvCiTW<7#n~nK h1^NX*nf$!O9Q};coSgjf{GyzcW**_~Ji?57ssU)}9EAV? diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc index b79b0eb8e727dc9e42739bbb178e1998ef052cbc..92df36cc2380647fe66697c27f533ef4533c2655 100644 GIT binary patch delta 98 zcmdm3ak7H@G%qg~0}$vQ__dLH5{E~NerR!OQL%nXQet^(R-(R3esXDUYFQb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK e1^NX*nf$!O9Q};coSgjf{Gyzc%|Ch0bOQhYDjeYe diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc index b1decfc91cf46ab8edb88d3b17030a46065c7b1f..223db06332a9841dd04d8749470ce7f32069196e 100644 GIT binary patch delta 98 zcmbQ@vBrb@G%qg~0}$vQ__dLH0+UCJerR!OQL%nXQet^(R-(R3esXDUYF?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^JKR5(*gNn BB*Fjy delta 76 zcmcb$hw0EBChpU`yj%=G!1CbRM(zkUgB<yj%=GpnKrgM(&-g9!>h8#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQyj%=G!1CbRM(&-g23h){#i>Qb`q_y^iFtZS8HpvCiTW<7#n~nK h1^NX*nf$!O9Q};coSgjf{GyzcW*)ZfJZy}e=K*u`9IyZY diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/query_utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/query_utils.cpython-312.pyc index 6016cae200a2370cb44363801668182aaf7e0bb5..ce11161c6c6c1320f269cbe61aed5967d3f48ee5 100644 GIT binary patch delta 100 zcmcb+lJV?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fvn|Vl0083R BBhCN- delta 76 zcmeymlJV|JM()$Ryj%=G!1CbRMs6k+g981~;?$yI{p`e|#5}#EjKq@6M17ak;_Q= diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/utils.cpython-312.pyc index 0a1819af60cb1fa12f6e8f578c572269de4dbdf0..f2136d15bf8d5e169acefa73c32efb959150f7f4 100644 GIT binary patch delta 98 zcmZpYo+ZtFnwOW00SI&t{MyLcgaf3OV1A|%FjwoF4?TY62}Pua^oU6 delta 74 zcmbOw-6YL@nwOW00SH(geA~$VlGz|jKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld{={C5{sSm8==w diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/__init__.cpython-312.pyc index c6b3d64f13813b9a616064e8832cd8a3fec247e9..fcaa5a56c1bc8253f3d82558f475f83fb67683f9 100644 GIT binary patch delta 104 zcmeBdVqe(A&V8Dfmx}=ibPxR6$Sud|(W4()oLW?@pOTbVo|=`Y?~&wb8&^_>LBX=Z=N2h*hacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#c?wHJAOPGQ BBiR4| delta 76 zcmZo!!}w-3Bll@uUM>b8V0rLuBX=Z=L7{$VacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{COcgaf3OV1A|%FjwoF4@e-nydr>x-266 delta 74 zcmeD5|LDhknwOW00SH(geA~!qv b04S56mzblUk(!f}U!Gr-ld@TjHCYJ&%5NH? diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/json.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/json.cpython-312.pyc index b1953c7305c2b8696e76b71938fa198db17fbcf7..0994fa93ab22a63755047c4cb23c82e01211ddea 100644 GIT binary patch delta 100 zcmaFyg|Xo)Bll@uUM>b8&^_>LBlje3j}HCN;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^I7iMc>pE* BB|-oI delta 76 zcmZqp%J||7Bll@uUM>b8V0rLuBlje3g981~;?$yI{p`e|#5}#EjKq@6M17ak;_QKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4qv b04S56mzblUk(!f}U!Gr-ld`#o=?M=2rJ@?X diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc index c1827e58d4b2c3a1d4785026ac657c3ee4d9f759..4468ed95a4e31b575ff2ebece332decb283bc511 100644 GIT binary patch delta 98 zcmdnXag~GnG%qg~0}$vQ__dL{h{>Zcgaf3OV1A|%FjwoF4?@6X#yhvaBm{W delta 74 zcmcc0v6qAUG%qg~0}!x0__mR|h{>Q(KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0J(*#BUmQWgQ diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc index 555afd28366f812c660bcf89890c790724751378..c1503e717f30b6bb1b5eb5ad02bed8c6af09659f 100644 GIT binary patch delta 104 zcmey|!`j`;%6*!bmx}=ibPxR6$lb`{(XAg^oLW?@pOTbVo|=`Y?~&wb8&^_>LBew>>$8`PB;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b>KIhlWZGC$)A FDFAF5B*Opz delta 80 zcmZ2{g{Aun3-@VWUM>b8V0rLuBew>>LA`!xacWVqes*F}VxC@7Mq){3qP|ONadt_5 hfqnr{CO-TG%qg~0}$vQ__dLH6_dwg{m|mnqGJ7&q{Q;ntVDg6{N&Qy)Vz{nebYurh%AG%qg~0}!x0__mRI6_Y`=erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuQ?rCKpuz!X_Ii diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc index 024a2f5ee641c4f7b9ba6f56567c2520a422dd48..089ec298d83d748c523bca86dda58006aef68eaf 100644 GIT binary patch delta 100 zcmdnk#CWoak^3|+FBbz4=pOjBk-Lq}W3ql|acWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#`5;??6#&v6 BBl!RT delta 76 zcmX@v#JI7Ek^3|+FBbz4usry-k-Lq}pjtn)IJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj dK)(Pelb@HEqo0wQlapVbUzC%w`6gR|6#(ED8=n9G diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc index 95e2e14697895aa771c5ad61d91d25dbd6947dd1..db79b4863369716268533f591cc568ea0a94c39e 100644 GIT binary patch delta 97 zcmcaA{8pIzG%qg~0}$vQ__dLH5r;>=erR!OQL%nXQet^(R-(R3esXDUYFYKerR!OQL%nXQet^(R-(R3esXDUYFwZr#~W{ delta 74 zcmewn^B{)%G%qg~0}!x0__mRoiP@l1KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IKSy>wZz<3%% diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc index 35a8733e83a96ee542a20b6ff839e5d831333874..4b231604ac878956719c84c63753aca84d79667d 100644 GIT binary patch delta 100 zcmeC`U|iI}$bFiZmx}=ibPxR6$lcB1(XSs`oLW?@pOTbVo|=`Y?~&wTe2>G$8UW2p8$192 diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc index 6d71d5f605a0bfbe9c816782995e82f0d97d3a45..795da79f8edbe15be9f049eee152894de174d730 100644 GIT binary patch delta 98 zcmZp3pXbhfnwOW00SI&t{MyJpmD!_PKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4=s6d7C@{g3}{r delta 74 zcmbQ|-saAInwOW00SH(geA~!9mD!+JKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~*^EP<^qof-Q diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc index 95e355562102116f4f93f1dfbc7a5d08f6deb004..a7766a1b1dbb00baa118e9de1cd721bbcd94c104 100644 GIT binary patch delta 98 zcmX>r|5Tp)G%qg~0}$vQ__dKcirJ%AKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4;Vl*@6cEhR`CP delta 74 zcmaDVe^#FRG%qg~0}!x0__mQdirJu4KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^d&vjqcgaf3OV1A|%FjwoE}0z0SOEYz>mm05 delta 73 zcmaFHe2$s>G%qg~0}!x0__mQ-n$e(8KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQKDvu>t^YCK;Uo diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc index dfdaec7032d718187c01bd7696c3841da360e72d..70b34bafa6e91f063f2f9e6b5e8d25b073700db4 100644 GIT binary patch delta 97 zcmdnQa*BofG%qg~0}$vQ__dKcgwdl*KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}7iVxEKI9Vj^Dv delta 73 zcmX@bvWbQJG%qg~0}!x0__mQdgwdc#KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQMZZ<6;18JsJf7 diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc index bfc952f783407f59cd436e1c2230bd5aae9bff43..85be2d0e20ac4c38c78f45b7b86939f4b17e7549 100644 GIT binary patch delta 98 zcmbQ@zs8^YG%qg~0}$vQ__dLHE0agRerR!OQL%nXQet^(R-(R3esXDUYFG%qg~0}!x0__mRIE0aOFerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuK7S^AZ&Rv>qC6 diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc index 0c266e0f146b6091af1b8e7b9eeb107637bb6b6b..1666e997e50a8ce54d4ed34a113e3341c19b6091 100644 GIT binary patch delta 104 zcmX^5iS6zuHty5Byj%=GpnKrgMs7cLk2d|#;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b>Kxs!c+Cp+Vw FjR3m5CTjoy delta 80 zcmccniS6hoHty5Byj%=G!1CbRMs7cLgFOAv;?$yI{p`e|#5}#EjKq@6M17ak;_QYy<$5bsi}I diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/subqueries.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/subqueries.cpython-312.pyc index 49bf36f55659a33a0c6734b4de64cf1f07ad8644..29124db7b89817c98c29adb65c8a2a3be387c80e 100644 GIT binary patch delta 98 zcmaFo+UCZ6nwOW00SI&t{MyJJ#_Z9pA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#`2}}@DFFJJ BB#i(7 delta 75 zcmey+#CW5Lk^3|+FBbz4usry-k$Ww-L7skSacWVqes*F}VxC@7Mq){3qP|ONadt_5 cfqnr{COUdGXMYp diff --git a/env/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc index a2d5808f1432d1189ae289a2f22b14339acfb53a..d476fddc642a716b55223b7cc3af706aa39226ad 100644 GIT binary patch delta 97 zcmeBXS?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fvpv%;ZveeL BBYpq? delta 76 zcmbO@hwcgaf3OV1A|%FjwoE}6WVu>t@yLn1{0 delta 73 zcmdnZvY3VYG%qg~0}!x0__mR|fYBgRKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQQ`*V+8Ah diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc index ef4dee86e287495cd57138be2b6f6f422b5158bb..91377fe1749f6bac6fb98a8c191b69b49a742a7a 100644 GIT binary patch delta 100 zcmaDmfw6TWBll@uUM>b8&^_>LBexQ(N3(utacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#IhIwx8342^ BBHaK0 delta 76 zcmZpj$oO^wBll@uUM>b8V0rLuBexQ(LAHKqacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{COb8&^_>LBX=gBN4Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#c?sY7djJi~ BC3gS- delta 76 zcmeCa&HVWmGxup;UM>b8V0rLuBX=gBLAriuacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{CO?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^JG>*R{+2$ BBR&8C delta 76 zcmdlpm2t^bM()$Ryj%=G!1CbRM(zk!gEaln;?$yI{p`e|#5}#EjKq@6M17ak;_QQb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&DyNYkpTPv8y)}v diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc index bbe2f5ad9b857cbc00543e216697674d74c727d4..183062bb98d6b598f09182288883c616ce575027 100644 GIT binary patch delta 100 zcmdn~h57s!X71Cxyj%=GpnKrgM()d89`*X6#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&1&45?*TD39FPD2 diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc index 74369d5340a9affcd30b7413c170391d4d6aaad6..96a1180e6fae043c4d396dc16897787cc222e341 100644 GIT binary patch delta 98 zcmeyXF;$cMG%qg~0}$vQ__dKcoXMj}KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4;VZ>9rsLe;p$? delta 74 zcmbQL`B#JcG%qg~0}!x0__mQdoXH?dKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dg(`!Khp%@z7 diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc index cbf434f860545ccfa077101c5d319ca44a47a6cf..b9dc74d14f26a5b4ba32e6dc619b2e1220e4a0b0 100644 GIT binary patch delta 98 zcmZoqoS(>jnwOW00SI&t{MyJ}!Q@e=A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}547@sc9P} diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/widgets.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/widgets.cpython-312.pyc index 4a97f4b010098c885a6ea3e47883272d296aed45..af5299bce184a5598bec7fe5bfde77c806ee7a6f 100644 GIT binary patch delta 99 zcmex8i+S>FX71Cxyj%=GpnKrgM((3*9u4}T#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc%@XX@#{m1-8|wf7 diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc index ad1be2b13c659e187434853d1e7656c42939ea75..01a2dcb10d481d6555433975c60544c61599642d 100644 GIT binary patch delta 97 zcmcb?@qvT;G%qg~0}$vQ__dLHDzis}erR!OQL%nXQet^(R-(R3esXDUYFcgaf3OV1A|%FjwoF4^qHWXT8sONk+w delta 74 zcmbQv{-2HeG%qg~0}!x0__mRoo5>(eKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IE$&wKOdjuIj diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc index d8ef8e97647fe9387ec62aba513a080292e6071d..a3e259b4ee7e45c3933b6bfd7e44b7c94217319a 100644 GIT binary patch delta 100 zcmex*ma+F7Bll@uUM>b8&^_>LBliMkk9Pgg;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^KE9SWB?NN BB#i(7 delta 76 zcmeA@$N2RuBll@uUM>b8V0rLuBliMkgM9ta;?$yI{p`e|#5}#EjKq@6M17ak;_QIJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`=9K;gP3;?Du BBPsv@ delta 76 zcmdnh&$OtYiTgA!FBbz4usry-kz1U_AYDJSIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj dK)(Pelb@HEqo0wQlapVbUzC%wIg2Hr834f18qfd$ diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc index 124eb43f15b22d5e227d7cbb42547f0210bf245f..7cd2bc9aa13e18d43c2128edb0d4f890020a1638 100644 GIT binary patch delta 100 zcmX@x#q_j`iTgA!FBbz4=pOjBk-L-Cqd`BkIJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`=e1x^L9sud> BB$5CC delta 76 zcmaFb#dNldiTgA!FBbz4usry-k-L-CAVWX2IJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj dK)(Pelb@HEqo0wQlapVbUzC%w`3`GmJpl5K95?^~ diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc index ef4f5b71a398e95dee6bed31654b48690bd8d86c..9fe54b04861335630ee6a77e991cd59708c79129 100644 GIT binary patch delta 95 zcmX@l_?(gZG%qg~0}$vQ_%)H+*rQE9v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZY08DQgjQ{`u diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc index 3fb13971e9de334033f9a58a38e20a83d95e4039..ae202a63701e492e2bd6afd7354cdddb2fe6985e 100644 GIT binary patch delta 98 zcmdnzdd-#lG%qg~0}$vQ__dLH8n;KYerR!OQL%nXQet^(R-(R3esXDUYF?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fvm2YZCji?r BBRBv6 delta 76 zcmex5kMZt2M()$Ryj%=G!1CbRMs994gDm~f;?$yI{p`e|#5}#EjKq@6M17ak;_Qcgaf3OV1A|%FjwoE}6WAZ3O^o^&=Vp delta 73 zcmeyucZZMrG%qg~0}!x0__mR|lFcATKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQQ`X+X?`Yuo}Ps diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc index bf2bb8fb478b17739396fea170cb45eb81348204..eebb806091f3e3dab48b8c9feca13510caaaef07 100644 GIT binary patch delta 98 zcmdljbycgaf3OV1A|%FjwoF4;Vfc`hdacMKxl delta 74 zcmcaCwOfk&G%qg~0}!x0__mQdnb{yuKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dm^IT2?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fb2D$*VgL&_ BB)9+o delta 76 zcmbREi0S7;ChpU`yj%=G!1CbRMs5#YgAD!9;?$yI{p`e|#5}#EjKq@6M17ak;_Q?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^Jc+~jQ|px BB_aR- delta 76 zcmeyfjOocTChpU`yj%=G!1CbRM(zqhgChOV;?$yI{p`e|#5}#EjKq@6M17ak;_QQb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&3;@B4*)7b9PR)B diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/engine.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/engine.cpython-312.pyc index 1c964b867f5c089176364ed47460f52382d13315..462aaf69b58f3cee548e374d79b9d9cdaeb6402f 100644 GIT binary patch delta 98 zcmdn)dES%zG%qg~0}$vQ__dMyE2~G7erR!OQL%nXQet^(R-(R3esXDUYFcgaf3OV1A|%FjwoF4=6yBxMQ!s&gWw delta 74 zcmey6cO#GcG%qg~0}!x0__mRonaLnqKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?ICNy-!e!yFn) diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/loader.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/loader.cpython-312.pyc index c695dbb96ce76ed0a7828d7cd34b1c778e3cd952..4bb62cf1f2055ecb1b2f895aadc65818255bf950 100644 GIT binary patch delta 98 zcmbO&x>=O_G%qg~0}$vQ__dMSj>)4*KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4#ZPKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dtlM)92d&C)T diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc index 1c43d83fe66c5a97b67da293fec964296479c758..5dbc2e5de3dd758cd52e6e20050c260ba33bdd43 100644 GIT binary patch delta 100 zcmcc7#Q33!k^3|+FBbz4=pOjBk$V@DN4tJ#acWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#`72Yh9RU0{ BB$5CC delta 76 zcmey+#CW5Lk^3|+FBbz4usry-k$V@DLB4)yacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{CO~ diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc index 678e69268bfb0a0350bac0ac11a71962cbeb4f12..dc55f1ae1c72764e5d527155d829f1b510a68e69 100644 GIT binary patch delta 98 zcmeA%Tw=(5nwOW00SI&t{MyK^$LP_bA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}Uaw~-UG%qg~0}$vQ__dL{l-Z+MKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??+d6F6ctl}e+ delta 74 zcmcZ=awvrRG%qg~0}!x0__mR|l-VF#KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~)^CUF@!^0an diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc index c336699a1430176185120f6bc65de88807dc4e51..1af227b6dcd6dc833bab482247049ed80268b22d 100644 GIT binary patch delta 98 zcmeyS(x=LOnwOW00SI&t{MyL9n$e?CKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4_Eyae@Eqv b04S56mzblUk(!f}U!Gr-ld}0A;{*W!tz;Vz diff --git a/env/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc index c76bc186a4494ce194fa3d08d279b3500ca819b8..54b50d25df6c64e3fb3e6c8baa8ea3934f71fa62 100644 GIT binary patch delta 95 zcmcb{_>PhLG%qg~0}$vQ_%)H+*rQiJv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZK08y_QsQ>@~ diff --git a/env/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc index d8ccc910f8358b0d383818e08a119a64e841b123..18d4eddc190627704163fe05ec6824fa93eaf207 100644 GIT binary patch delta 98 zcmZ1_b4Z5!G%qg~0}$vQ__dKco7tmNKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??{xrGY=ZvY~@ delta 74 zcmX>kvr2~hG%qg~0}!x0__mQdo7tdHKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dqa|;&$l|dR| diff --git a/env/lib/python3.12/site-packages/django/template/backends/__pycache__/django.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/backends/__pycache__/django.cpython-312.pyc index 69348470cc7e1fb20880d3fc9faad1e437c6f5f7..6c82f2beddb404ea7dbf4c85f0e6792562679f48 100644 GIT binary patch delta 98 zcmaFn_0Nm@G%qg~0}$vQ__dMyGK)vIerR!OQL%nXQet^(R-(R3esXDUYFz(PG%qg~0}$vQ_%)H+*rP)~v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;Zg08Q^1l>h($ diff --git a/env/lib/python3.12/site-packages/django/templatetags/__pycache__/i18n.cpython-312.pyc b/env/lib/python3.12/site-packages/django/templatetags/__pycache__/i18n.cpython-312.pyc index 450bbee79ec38b8208331bcd8759d26be6e5f008..ed274001aca27c7f605427587e3ea3d14ca11ab7 100644 GIT binary patch delta 100 zcmZ2_l5y`zM()$Ryj%=GpnKrgM(!6Z9xeKz#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&DN|<@ccgaf3OV1A|%FjwoF4??^Nna8GuL>h9 delta 74 zcmexq{?MHJG%qg~0}!x0__mR|oXH?hKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~~lfEPX#VZ=p diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc index 1d2fb30c00c7670145908fcf6af40b50317f64e3..c8a94b315ec50c9338a55b95849ea990e7c5d0b2 100644 GIT binary patch delta 97 zcmX@Z@q~l>G%qg~0}$vQ__dL{j@hF@KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}6WOc`^W5<|5eu delta 73 zcmaFDafXBYG%qg~0}!x0__mR|j@ckXKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQQ`t^JD;o@fv>s diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc index b8611eea29a4b71217d904308b9d2ab5aabdaf41..8f56b994eb3ff08e2575e9546521e28680b43504 100644 GIT binary patch delta 98 zcmX?Re9xHsG%qg~0}$vQ__dMSpUI;}KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^40WFrm$hl(Pf delta 74 zcmca-e9V~pG%qg~0}!x0__mSTpUEIaKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dclZ`k4s4E&p diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc index 5614347860b66ea8ba01b583a4b1442c67946dc0..6f7d5fc96986753abac3ef4363f51a71d1796dc7 100644 GIT binary patch delta 98 zcmeB?S|Y`LnwOW00SI&t{MyLcgaf3OV1A|%FjwoF4?TY_JR!nd7dKA delta 74 zcmZ1?)g#4ynwOW00SH(geA~$VlGPwZKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld{={?FAbEn->~& diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc index d063520eeeb68c17874ba394535d055471749486..a17614f65719e4b9b72e26c6674647dd941fd97c 100644 GIT binary patch delta 98 zcmew&(Id%ynwOW00SI&t{MyLcgaf3OV1A|%FjwoF4-*46v_nvl?@_+ delta 74 zcmeB?{35}9nwOW00SH(geA~$VgwY^NKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld{>IDU=HUu9zAp diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc index b2faa1480464fa7d8895bf7d5c351b8ff9fd7607..c1db45b2ad27310c12fd70a8b22ce89a8614ed4d 100644 GIT binary patch delta 97 zcmX@f@{oo5G%qg~0}$vQ_%)IHqDPZ{XmM&$v3^QYVtHy-qP|Oha%paAUP-aOYf5Qy yVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOu delta 73 zcmaFJa*~DnG%qg~0}!x0_%@OIqCu8^XmM&$v3_=9QDUB6QbuA)W}?1JYH@Z+et~`g aP$oYwF-JcmH76&(JijO>WwQ#SEh7M(ZW+G- diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc index 286b3a67f3403b882a2ba25481510c047926db8e..f642205c8523f1e3b704d4ce767844a56ac474ec 100644 GIT binary patch delta 100 zcmX>+o9Xs!ChpU`yj%=GpnKrgMs9CTk4F8_;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fa~r2^3jo{L BBjx}A delta 76 zcmcaTo9XauChpU`yj%=G!1CbRMs9CTgG~L<;?$yI{p`e|#5}#EjKq@6M17ak;_Qcgaf3OV1A|%FjwoF4?@6wUHSBY0o07 delta 74 zcmX>mv`&coG%qg~0}!x0__mR|h}9rfKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0JYa=rNk$4(W diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc index fc68ed26845be08282d661369cf98a699bbf4fff..1b4ebc5527c1332c8e3a4b7674aa5d6a2ad66027 100644 GIT binary patch delta 95 zcmX@b_=u7FG%qg~0}$vQ_%)H+*rQQDv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;ZN07$PHc>n+a diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc index 64593d93076c5a0707501df1c2025fa5354df554..a0816576f328e0dabd07321875eaca984541398c 100644 GIT binary patch delta 98 zcmdlcc211@G%qg~0}$vQ__dMyBC|)0erR!OQL%nXQet^(R-(R3esXDUYFnwoQ!tG%qg~0}!x0__mSzBC|n?erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOq=ixxWosXQ6b diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/asyncio.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/asyncio.cpython-312.pyc index d941ee191c163b9f587bfda97299d45a267c684b..9ee3b28975cb2555d892a27f7ba0e1a4b2424e50 100644 GIT binary patch delta 98 zcmaFP{hyorG%qg~0}$vQ__dLnk=dg`KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4=6uyqXCBYeOPc delta 74 zcmey*{hXWoG%qg~0}!x0__mRok=Yqv b04S56mzblUk(!f}U!Gr-ld?I4c{LLNlnfdB diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/autoreload.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/autoreload.cpython-312.pyc index 16edc3a49870227ee3c78d7f6271a3c323a906d1..205345835df732373df1f329cf9dbc71b2066bfd 100644 GIT binary patch delta 100 zcmX@`m+{75M()$Ryj%=GpnKrgM()?l9?klp#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQsRRB|7 BB`g2{ delta 76 zcmccdm+`<~M()$Ryj%=G!1CbRM()?l2HEQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&2}uassKO79MS*) diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc index c0c4e4f21e100256de85f51db2b368051e3028e9..2c66411ae6e38f354fd1ef9ce8c655f94a80d6b4 100644 GIT binary patch delta 100 zcmaFf%=o{Vk^3|+FBbz4=pOjBk^4KBN1c9XacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#*@%0q82}j) BBz^z@ delta 76 zcmez0%=o;Sk^3|+FBbz4usry-k^4KBL7IMOacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{COdqS7{G%qg~0}$vQ__dMyCzD5merR!OQL%nXQet^(R-(R3esXDUYF delta 74 zcmX@1yFr)xG%qg~0}!x0__mSzCzC;jerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOq_bB!Kj^ delta 74 zcmaE?d0LbEG%qg~0}!x0__mSz1EWEcgaf3OV1A|%FjwoF4=s7@g6q-b8jO; delta 74 zcmdldy-b?>G%qg~0}!x0__mR|m(d_yKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld|~%<2`Nwn2;Li diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/datastructures.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/datastructures.cpython-312.pyc index f9c478848e989e0bee968c4fbd22fc0d37bd09ba..0a95e3154ae3cf079762b89c261b47a62887cd12 100644 GIT binary patch delta 100 zcmX@q&UmYxk^3|+FBbz4=pOjBk(-~%qg_9=IJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`=?8Q{!2mrS! BBQgL0 delta 76 zcmccB&UmPuk^3|+FBbz4usry-k(-~%AYVVUIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj dK)(Pelb@HEqo0wQlapVbUzC%wIf<#l5dh7q8rT2; diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc index 48c6910461ac7d236c4b347937e0075f74d5d110..d2164b0864dc48f5449d815eaeeb780a152de5a2 100644 GIT binary patch delta 98 zcmaD^*I3VenwOW00SI&t{MyK^$>!0lA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}bTp-v*I delta 74 zcmZpye_6+UnwOW00SH(geA~#a$!3tPA6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!eV(#%c)wy1^Py diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc index cc8014ce6851c2b84ecb9ddd862f627939e09b90..db44abc479f039126a98f2f3a6caaf802265ecdb 100644 GIT binary patch delta 98 zcmbPbyvdmRG%qg~0}$vQ__dLH51U7merR!OQL%nXQet^(R-(R3esXDUYFs diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc index ea235cdf7d0afc6b6779f34ef233d2f7d9ba8055..77582a70293bfa2dfec9ec32ede1e5a6c604a9f6 100644 GIT binary patch delta 98 zcmdlabV`W(G%qg~0}$vQ__dKcmCd70KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??*Z4wgzX;UJs delta 74 zcmX>lv`L8jG%qg~0}!x0__mQdmCYbcKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dS+ax9ckwh9& diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc index b771e9858095c0e1d773225f26852ea93a2272c5..92e19431e737c6469f098f0902bd8ca934db19cc 100644 GIT binary patch delta 98 zcmdlcd`_7AG%qg~0}$vQ__dKcoyns`KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??@NrW8$ZBimX delta 74 zcmX>nyiJ(qv b04S56mzblUk(!f}U!Gr-ld^dilL$Kilk*wn diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc index 42e94ebe9fa08f9f394c0f2810f9d6f0e5f557de..13b47b61fb5ae7a1f52bbaf6a0fc0a5d8e4c7ac5 100644 GIT binary patch delta 98 zcmbR2w%U#RG%qg~0}$vQ__dMSpUIcgaf3OV1A|%FjwoF4^40)TsafapEGp delta 74 zcmZ4OHrb8)G%qg~0}!x0__mSTpUEIwKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^dcQ>Ov|m)ja* diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc index 0db4b6efe64971e81a1d296ed8f36b6e695246a3..e5a7882cbbe6b9eabc09d9875c2379966f28fcb1 100644 GIT binary patch delta 98 zcmZoOnP>OYg;0n delta 74 zcmbPd(q_VanwOW00SH(geA~#~!f24AA6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- b0F=qkOU%*FNX^N~FV8Q^N!fgz(Om)nk}MiS diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc index c5c583f7a8898406b1d89a898861f9fbbd5d3d55..c5a3bbf1477f357130426c7af776a5b7b71da92e 100644 GIT binary patch delta 98 zcmey#H<6$FG%qg~0}$vQ__dMSnbD(BKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4qv b04S56mzblUk(!f}U!Gr-ld^dl<8M{~izOO* diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/encoding.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/encoding.cpython-312.pyc index d146073c6ec51baa4b4d61629e5093266d39843c..891f4bf5d344d3a10effe5f069a0090fefd64941 100644 GIT binary patch delta 98 zcmccW{??uQG%qg~0}$vQ__dMyEwe|XerR!OQL%nXQet^(R-(R3esXDUYFcgaf3OV1A|%FjwoF4mrBq|hUT delta 74 zcmaDIayf+iG%qg~0}!x0__mSTl*J%JKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#k<*_ONzOfrB diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/functional.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/functional.cpython-312.pyc index 649e3edea49309df7d040ce78616bc74ee44d57b..c8c65aacbe0ae756e826abb179688ba061c94a41 100644 GIT binary patch delta 100 zcmX>(iSgkiM()$Ryj%=GpnKrgM(#IE9?klp#i>Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&GyVnZU6>x8)5(e diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc index ed8b779a5448d5c7f7668e1716329852225aa64f..0539cb09f9e1b7bb3611a6db3208f1e277be0e2f 100644 GIT binary patch delta 98 zcmdnVagl@jG%qg~0}$vQ__dLHEt5y1erR!OQL%nXQet^(R-(R3esXDUYFRbQzTZ diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/html.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/html.cpython-312.pyc index 632e91a5754a5baca7dee1b1552857eb82f738f4..ffb29c41efc3b9417a9f0749b47ed4ab5fba0f82 100644 GIT binary patch delta 100 zcmaF9i1Gg-M()$Ryj%=GpnKrgM($oVk6QiE;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^9i>3UH}j` BB-{W1 delta 76 zcmeyri1GO%M()$Ryj%=G!1CbRM($oVgH-*{;?$yI{p`e|#5}#EjKq@6M17ak;_Qcgaf3OV1A|%FjwoF4>&MQELDI!w4gE delta 74 zcmexe__&b!G%qg~0}!x0__mQ-o5LVgKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#vqt*Zb)lnN7 diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/inspect.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/inspect.cpython-312.pyc index 62849962fa08b332d8626c278958702aabfc1281..933b9f1223c2ead18c5656ed30a2bc06b85c1583 100644 GIT binary patch delta 98 zcmeya+^@oYnwOW00SI&t{MyK^!{pJRA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}cgaf3OV1A|%FjwoF4@e-`iuzxiAW;X delta 74 zcmeAX_`=V9nwOW00SH(geA~!qv b04S56mzblUk(!f}U!Gr-ld@Tj^%)ZYrb`-q diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/log.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/log.cpython-312.pyc index ebb6a417e3b688b8736af3cda5bc72641349886f..9fef2fc6aebe398e277e588105dfbad0e64ee164 100644 GIT binary patch delta 98 zcmaFn{m+~GG%qg~0}$vQ__dL{fYqZ$KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4?@A)mi}ny_+Ln delta 74 zcmez8{mh&DG%qg~0}!x0__mR|fYl&HKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0RtF;0E&|Dh@ diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/lorem_ipsum.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/lorem_ipsum.cpython-312.pyc index 1f82fde06469983fc4f248c0e61156a76b27d984..219a8dc3d8407cdd17deec3a9b48a158149259f9 100644 GIT binary patch delta 98 zcmdm|bxn)=G%qg~0}$vQ__dLHDz`_AerR!OQL%nXQet^(R-(R3esXDUYFs?mSKavilnC diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/module_loading.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/module_loading.cpython-312.pyc index 770a536a94e19d7da2b49cc50936fd10f53e11cf..a579549ddf012064e6736afc8eb6193f6f5ca179 100644 GIT binary patch delta 98 zcmcaB|5cv*G%qg~0}$vQ__dMy5~D}EerR!OQL%nXQet^(R-(R3esXDUYFjhRwGtyg delta 74 zcmew=e^;LSG%qg~0}!x0__mSz5~D%BerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrL(*<4t$Lkv9 diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc index bc1a4c8241d54a07a14ec8c8e950857ceb5cd832..eed1f22b7fe8eb109c9127dd557d1d0143d12b64 100644 GIT binary patch delta 98 zcmaDP^-GHTG%qg~0}$vQ__dKci_@c3KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4?@4b1yRhn7<=m delta 74 zcmew*^+<~QG%qg~0}!x0__mQdi_;)iKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^d)=U!$2w8$F; diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/regex_helper.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/regex_helper.cpython-312.pyc index 53b14e2a128d8b51de0c3827ac9001657e764d79..ebf3d5f11e912d1cd733948ab3abe587a2082d14 100644 GIT binary patch delta 98 zcmdlMelDE*G%qg~0}$vQ__dMy5|c-(erR!OQL%nXQet^(R-(R3esXDUYFXzAc>lG%qg~0}!x0__mSz5|cr$erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrL^GXc>(8?P7 diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/safestring.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/safestring.cpython-312.pyc index 6122f59b27b43753230d86a0ab43a767272c664c..eb71370c8cd44e6de9ff2c706830a843e89794ac 100644 GIT binary patch delta 97 zcmaDZ{$HH?G%qg~0}$vQ__dIm*`rxMv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; yu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL aD3hO;n4_POnv;`Xo?n!cvN@P}4F>>{0vZbd diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/termcolors.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/termcolors.cpython-312.pyc index d5adf72f4f472b6db73d98b4de440b1f4ddaf02f..d6af6d6661d6fe596f51852e8a8b7b9d53de7a5b 100644 GIT binary patch delta 98 zcmZ2ub;OGMG%qg~0}$vQ__dK+k<+7DKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-Kzc|jNeZ+jxb delta 74 zcmX?NwZ@A3G%qg~0}!x0__mQ-k<%bsKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#l^MWt{maH0R diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/text.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/text.cpython-312.pyc index 50d8e23afa276c676f431c084089df843f356bfc..668967ee7c099876f45ab3e15b8fd5103e215761 100644 GIT binary patch delta 100 zcmX@UjPd?5M()$Ryj%=GpnKrgMs7nEk6QiE;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fa}LXGKLFf3 BBq#s? delta 76 zcmcb=jPdv~M()$Ryj%=G!1CbRMs7nEgH-*{;?$yI{p`e|#5}#EjKq@6M17ak;_Q8_oa# diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc index 029d8e4ec71a1a6a72ad3d4de31c8df98ee07859..6319ae942de3c50a413dec50c8de300aa684921f 100644 GIT binary patch delta 98 zcmX@6drz19G%qg~0}$vQ__dL{Ou(Z_KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??MK$HytmBAv* delta 74 zcmcbodrX)6G%qg~0}!x0__mR|Ou!&ZKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}1wfG8UPvHBWu diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc index 19dd27762339848e80c217ce7c7577e5551caad4..3e015c500f8a38d8c48fab4607117d158487c07a 100644 GIT binary patch delta 98 zcmX@^e&3z@G%qg~0}$vQ__dK+g~g*$KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-Kqv b04S56mzblUk(!f}U!Gr-ld`#-B|{zntHv5u diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc index ec19fd3c4d52d040c217a2d7df83761e153c7400..f5bb0b3dfd3d37cdbdf36aac865a04471255b266 100644 GIT binary patch delta 98 zcmeyXJ5`VSG%qg~0}$vQ__dK+h}ol7KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4^qMyg?WMYL+5< delta 74 zcmbQL_g9zuG%qg~0}!x0__mQ-h}j@jKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?ILd4n(jl6e{- diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/version.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/version.cpython-312.pyc index 31c6a6cb54e0eee42416bd169700e3b5947f81cc..9c998b98e8f08d3c387723a85d7aa97c47cde0d9 100644 GIT binary patch delta 98 zcmeBGTdKx=nwOW00SI&t{MyLKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4?Te@`eupg9IY) delta 74 zcmZ3g)~m*SnwOW00SH(geA~$VjM*SVKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld{>8cgaf3OV1A|%FjwoF4-)>oXrXVYe*s> delta 74 zcmbO&*eu9>nwOW00SH(geA~!qv b04S56mzblUk(!f}U!Gr-ld{=>Ihz##kMSAC diff --git a/env/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_real.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_real.cpython-312.pyc index f1745e4eb9ca6ae5caa508d49131a16742bb6561..cb3b808487381d4039ab9367913c4ac3c9d6d7f2 100644 GIT binary patch delta 100 zcmeCZ#klkqBll@uUM>b8&^_>LBlmJPkAD5o;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^CLFxGynp_ BB!&P0 delta 76 zcmZ2_i?R0>Bll@uUM>b8V0rLuBlmJPgL3`Q;?$yI{p`e|#5}#EjKq@6M17ak;_QSU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(?hSU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGVwwh06`fU!2kdN diff --git a/env/lib/python3.12/site-packages/django/views/__pycache__/debug.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/__pycache__/debug.cpython-312.pyc index 1e19ef6b436b7188eb877a709c23a637de22bce9..408492b37a3e72969581e25a126ff48bb780737e 100644 GIT binary patch delta 100 zcmaF=gt7f8Bll@uUM>b8&^_>LBX<^yN1c9XacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}|#c`3`OTmTI# BB=!IR delta 76 zcmZpF%J}{XBll@uUM>b8V0rLuBX<^yL7IMOacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{COcgaf3OV1A|%FjwoF4;VZ*qv b04S56mzblUk(!f}U!Gr-ld^dgv%NL|$a)&t diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc index c45ad9b7cd0f39a52bfce5c05a13a06000dcc4aa..36c9bdda7a5e65845de0656f0ca3acffc6805d40 100644 GIT binary patch delta 95 zcmcc0_?D6TG%qg~0}$vQ_%)H+*rP{3v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO;Zk08sB4r2qf` diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc index 90e8d4e921ab2865dc59ea603757f7e6100250ed..6ade3aa0f529a89ff1022d7ec7f276617d37b62d 100644 GIT binary patch delta 98 zcmew>GgX%RG%qg~0}$vQ__dLniN&K+KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4=6$;=ly}Tbm)y delta 74 zcmbO#`&WkhG%qg~0}!x0__mRoiN&B$KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IK#eoX|hV~hB diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc index fd9807091864a5d902884088a77fcc353974af73..3cfd4b64bada593a0bc696194a7db8e87a24f9dc 100644 GIT binary patch delta 98 zcmcb`@ri@`G%qg~0}$vQ__dMyG^0nCerR!OQL%nXQet^(R-(R3esXDUYF=sk diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/csrf.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/csrf.cpython-312.pyc index f223503c1877d3ce2244c0d93a6e9774cd24f2b6..b1c79b7a540e20dd605b62306b6fe700b3750909 100644 GIT binary patch delta 98 zcmdlkeqNmWG%qg~0}$vQ__dMy5|c-VerR!OQL%nXQet^(R-(R3esXDUYFvzFnOAG%qg~0}!x0__mSz5|crJerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrL^C}Jit=$@7 diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc index b9defa3531f323100149ca6cb209e40f47aeb6a5..cab3fd1c9e36ee461ced390a200365459fd1aa4b 100644 GIT binary patch delta 98 zcmeyM*`dXKnwOW00SI&t{MyLv!S2ziA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}Qb`YB0?<*8YT`Y!p&rManjCB^!# zDW%DYC7Jno`oYPGIjKboj>(BBskxQQb`q_y^iFtZS8HpvCiTW<7#n~nK d1^NX*nf$!O9Q};coSgjf{Gyzc&Bm-YWdKI19De`+ diff --git a/env/lib/python3.12/site-packages/django/views/generic/__pycache__/detail.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/generic/__pycache__/detail.cpython-312.pyc index 4b4da77c9c223dfb28414e0efbbb6939daefcabc..26149b04ea1c79e195b083c8dfd771ea765b1c57 100644 GIT binary patch delta 98 zcmext({0OrnwOW00SI&t{MyLcgaf3OV1A|%FjwoF4?Tg?k5fav|S?T delta 74 zcmeCS{cOX1nwOW00SH(geA~$Vip?NjKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld{>C-A^0<#n>8- diff --git a/env/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc index 9878e97a5183451598c0586d2c641a9b23c65ea9..9079b60287a310caf468349ee0b0cb08014bfd0a 100644 GIT binary patch delta 98 zcmeyI+?~RGnwOW00SI&t{MyKUfZ3x}KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4_E>`G+n5$E+lo delta 74 zcmeB9`JBvsnwOW00SH(geA~!qv b04S56mzblUk(!f}U!Gr-ld@Tu<%cc+(n1?R diff --git a/env/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc index 7ce7addbd7d2e1b308ace0f6f6afeac5c9ab037d..a2d9043f0a67a9fe8d6c739be450cbb578fe6ddb 100644 GIT binary patch delta 98 zcmaFq(dfy2nwOW00SI&t{MyKUjMbx6KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4@e;mLUfKsYoKh delta 74 zcmZqleCfe`nwOW00SH(geA~!qv b04S56mzblUk(!f}U!Gr-ld@ToEkh0fz6%;> diff --git a/env/lib/python3.12/site-packages/sqlparse/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/__pycache__/__init__.cpython-312.pyc index 8c2021196555e003b71f42b1242f823ed201cea0..604fcbefa3ed846bc5ba68acc882d9a15a062151 100644 GIT binary patch delta 98 zcmZ1^u}gycG%qg~0}$vQ__dL{gUO>-KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4=sTDV`GmYda#T delta 74 zcmdlbu}FgZG%qg~0}wDj__mR|gUKLOKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld}0XQ#>aCk^dS_ diff --git a/env/lib/python3.12/site-packages/sqlparse/__pycache__/cli.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/__pycache__/cli.cpython-312.pyc index 2a5e400c73c192799c856478878ace4d53d80323..e136b72db53a77f43e6a6dbe2973eafc5d76df64 100644 GIT binary patch delta 98 zcmeCST5QFAnwOW00SI&t{MyJJ#OYC?A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}SU)8xu{<>^QQsv$ximL5ucTPtHKjB; xu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL ZD3hO;n4_POnv;`Xo?n!cGC7EG3jlpi8a4m` diff --git a/env/lib/python3.12/site-packages/sqlparse/__pycache__/formatter.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/__pycache__/formatter.cpython-312.pyc index 413322809035e4e4f8d91bf742b41fdaeccf1021..8a3448ee5e15045d154029e6de9067b0a0606cd1 100644 GIT binary patch delta 98 zcmdn$c-E2oG%qg~0}$vQ__dMyH?K#XerR!OQL%nXQet^(R-(R3esXDUYFxYd#SG%qg~0}wDj__mSzH?KjOerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT b0Z=ACFEK|yBQ+-{zdXMvCuOrAU%e0j&Da|4 diff --git a/env/lib/python3.12/site-packages/sqlparse/__pycache__/keywords.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/__pycache__/keywords.cpython-312.pyc index 9b6f43365efa62e2b19b29f1fde955c95efcbcef..c70713e66ccd7432b1d0c63ac28767383627746b 100644 GIT binary patch delta 100 zcmZ43&%Cprnfo*^FBbz4=pOjBkz2dNqgFq(IJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`=oYrA&4*=Et BBmV#Z delta 76 zcmdnl&%Cgonfo*^FBbz4FhBUVkz2dNAXPuKIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj dK)(Pelb@HEqo0wQlapVbUzC%wxvs<79suG{8>9dL diff --git a/env/lib/python3.12/site-packages/sqlparse/__pycache__/lexer.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/__pycache__/lexer.cpython-312.pyc index 2a31a1b258a69ba93876b1f5fed2da423d1132b1..9b64e0c7d05b9da08cccc1bc8a9ef1f5427f7b92 100644 GIT binary patch delta 98 zcmeA-U2e*KnwOW00SI&t{MyLv!0b__A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=f^D36T6#z%9 BC6fRE delta 76 zcmezWi}Cp{M()$Ryj%=G!2ICbM(%tTg9QE1;?$yI{p`e|#5}#EjKq@6M17ak;_Qcgaf3OV1A|%FjwoF4?@CC6pHcev2Zv delta 74 zcmbQD@<*BbG%qg~0}wDj__mQdhs7XCKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^d~ODHb@paB|O diff --git a/env/lib/python3.12/site-packages/sqlparse/engine/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/engine/__pycache__/__init__.cpython-312.pyc index 99dbddd546048e90a8f0a9ed089a2cf391acca3a..fb149f6c9f2b544f5c0d368348b16a0fb3a95940 100644 GIT binary patch delta 97 zcmdnVe36;^G%qg~0}$vQ__dLnm(im|KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}87XSO@?lEFq-; delta 73 zcmcb}ypx&xG%qg~0}wDj__mRom(d_cKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQKDhu@C@V;~7c- diff --git a/env/lib/python3.12/site-packages/sqlparse/engine/__pycache__/filter_stack.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/engine/__pycache__/filter_stack.cpython-312.pyc index dfb6839d1ac46a79916fc186de865ecbc11a6eb3..9018ff7f7882ca2bd0daa2eac91cda1d3dbf035a 100644 GIT binary patch delta 98 zcmcb~|B;{jG%qg~0}$vQ__dK+jLD-zKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-K&)WHe>Y+fQ! delta 74 zcmey!f0Lj4G%qg~0}wDj__mQ-jLD!tKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?IJse=^&lqwna diff --git a/env/lib/python3.12/site-packages/sqlparse/engine/__pycache__/grouping.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/engine/__pycache__/grouping.cpython-312.pyc index feb68bc34df42deaabb7ae5ad11d8a25e0bfa2c4..29f7584b1a630c2b0bdac2aef954ddb939edc551 100644 GIT binary patch delta 100 zcmZ2{gmL!~M()$Ryj%=GpnKrgM($uXj~4yV;?$yI{gkA{^3<$EeV6>?(%jU%l45<= zl+xtHlFa-({ov%poYW!($K=G6)Z9vaA0HQeAS2%;D={xUKcFZ-D>b=fb06E(XaMBO BBr*U1 delta 76 zcmdmegmLi^M()$Ryj%=G!2ICbM($uXgB<cgaf3OV1A|%FjwoF4qv b04S56mzblUk(!f}U!Gr-ld^dVqZS_kig_8e diff --git a/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/__init__.cpython-312.pyc index c5301edf980d7b1a086714894f6380af435cd4d6..e7f20b101cc10b040a002236d64dd4132e189808 100644 GIT binary patch delta 97 zcmZqYn9sp|nwOW00SI&t{MyKE!|c(jA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}df diff --git a/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/aligned_indent.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/aligned_indent.cpython-312.pyc index 9609fdd1986b41388ee0edc81ed079c245d55a51..c0e582ab485b788af4a722e5a1840c125e47fb1d 100644 GIT binary patch delta 98 zcmZ2!chHXeG%qg~0}$vQ__dLH8cgaf3OV1A|%FjwoF4^44@>w1Lly)P2 delta 74 zcmbQ@`NxC%G%qg~0}wDj__mSTkHsKcKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^ds%V&82u=E=v diff --git a/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/output.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/output.cpython-312.pyc index d47b13c3250a45fbc532dc56e0e3a5beaadcae9d..ed77db3a23008d454663c8f86340f5544ae0b869 100644 GIT binary patch delta 98 zcmeA$USQ09nwOW00SI&t{MyK!!|2hhA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}xUZs diff --git a/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/right_margin.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/right_margin.cpython-312.pyc index 405cc55297967fe90b2b32d26acef9752fd35a29..cafc381aecda0569dafd3a5478daf237085852c7 100644 GIT binary patch delta 98 zcmdlgcvg`6G%qg~0}$vQ__dK+j?tr2KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-K(7{d+#RNEo) delta 74 zcmX>rxK)t*G%qg~0}wDj__mQ-j?th{KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld`#xF@_xgf=3yb diff --git a/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/tokens.cpython-312.pyc b/env/lib/python3.12/site-packages/sqlparse/filters/__pycache__/tokens.cpython-312.pyc index 9f77647c6fcfe3efd12316f42098b170d920cf0b..6a083b571f1669539be67d95185c8694c8873cae 100644 GIT binary patch delta 98 zcmew(HbtEKG%qg~0}$vQ__dKclhLDDKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4??<@dhUVc90_( delta 74 zcmbOt{zr`aG%qg~0}wDj__mQdlhGhsKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld^da;|)##nl2i? diff --git a/helloworld/__pycache__/__init__.cpython-312.pyc b/helloworld/__pycache__/__init__.cpython-312.pyc index 77dfa84ab247bc641a30baa9e1accb338705d549..bf50d0187dab99e470b058d6ac8134217082dd8f 100644 GIT binary patch delta 95 zcmZ3^xSx^xG%qg~0}$vQ_%)H+*dtCqv^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(Wn!Bp09zXwvH$=8 diff --git a/helloworld/__pycache__/settings.cpython-312.pyc b/helloworld/__pycache__/settings.cpython-312.pyc index 549568b8a0a2cadb758cdba42c52cb1d6b6dbc32..5cfec23ed1f4051ae60315a91fa45ac186149363 100644 GIT binary patch delta 162 zcmZn>St`PNnwOW00SJ~!F{B^Z$UB*dkz?{grUjh0*mE+IiV}+|H#;(aXJX?8Dyj0A z#3C|TmR)3X8k+@^N1T3WacWVqeo9hed1_XozDs^`X>Mv>NwL0bN@;RpNoIbYesFSP zPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}{K`5cE5qsHWq9D(edLQD;OpTs76 La&Bi)1KJ1x*6K3g delta 125 zcmZ1~(jvlpnwOW00SL4oeM{T8k#{l^Bm3lqOba%9F@I-b;{i%kc}$+jrm;Dn&4S6m zO+U0awWwG>JFzG+PcJDWu_QB5-zBv;yClCrzW^wcpO=`UpOKoAlV6@+l#?>~J%aJ3$uZferR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT a0Z=ACFEK|yBQ+-{zdXMvCuK4_OAY|2{2DC) diff --git a/helloworld/settings.py b/helloworld/settings.py index 42170ec0..4ada6bff 100644 --- a/helloworld/settings.py +++ b/helloworld/settings.py @@ -37,7 +37,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'tryHello' + 'tryHello', + 'library' ] MIDDLEWARE = [ diff --git a/helloworld/urls.py b/helloworld/urls.py index 2673d853..e5b36332 100644 --- a/helloworld/urls.py +++ b/helloworld/urls.py @@ -20,4 +20,5 @@ urlpatterns = [ path('admin/', admin.site.urls), path('', include('tryHello.urls')), + path('api/', include('library.urls')) ] diff --git a/library/__init__.py b/library/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/library/__pycache__/__init__.cpython-312.pyc b/library/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794edd5af5f6f5079748681672ffd87f9ffc78d4 GIT binary patch literal 188 zcmX@j%ge<81eYWk(n0iN5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!iq;P;PAw|dPf1EF zPt8iycgasK%}vcKDb{yQDNRl+$;{8w4^B?ZNi9-vOioNm&8^h;@o~`yGV)!r67$mY z1B&vqQj<&cb25{P5{oMJ}`4E(S3^Ff%eT-eXWGVgqsjb7(#u literal 0 HcmV?d00001 diff --git a/library/__pycache__/apps.cpython-312.pyc b/library/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..177472363657d983f4be83aa7e306fee09bc1676 GIT binary patch literal 496 zcmXv~ze~eF6uwJRt!*PBRp=n-B4o*}4kA>eB9tPC2w9G6?iy0^%S(d9P3RvWF8v$C zKgGpKO2Em*l8UUj_%#Cz`n_etbWS^U374Ho+X%m4)x`XGQd zgg^o3fGSf!RR&+wN@pv%W;DKJVZdUoAIB$AIQCqpqN@n&V$l^~1{km*1-3$=ty0C- za@EiZec+8a;d#}5ze6V^bR(0F%pju7Pt0S_?PqCp<}sfZtA3>(8jYffaYzD&anZt9 zh%;Z}4#u|`@oQ$2vN6g06caH5kINaF`f$qx;+XxCTEW-cAB+B*`J!gYa`&BN--BfcR@X>KBo{Z=7_A7JliMS)w7 K7r#KHvg;4x@q!}& literal 0 HcmV?d00001 diff --git a/library/__pycache__/models.cpython-312.pyc b/library/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05ef10c6b32619a17106e4429e300f2aaf78054c GIT binary patch literal 919 zcmb7CIcpn16rR~j*IEuCl_gNBfD)mF6s|--*5M+K2$%%27?#n_L`U{WW>+NJ+2BI1 zT)K4`BNs`PACXERkQqpo%3VN8<0><|7LMJ7yyES*Z{9KUeee6)S{88I-vGUJ2*6MA zvoiG>EHDQr00Rsi;6f8ZAc1Xwr9*&a0*A_~;O0A#6Ku+HrouDTe`G3=R!&`tvNB|v z>to^s_Dx3su3Lh|Qyx751eg#5Q<4CYhv~l)6O7@xG~rJYW~z}~R+v^Fg?*o1iuasB zmUYo5%OPGb?03o2opClc6OQu2Yz#iyq^D( z`a@!ehBN3=L?a_1q53|eLWM^QCFNbgF%M^sV}}I?LA&wv$GpM~B}&gJWf? zxSMFNz7UI<=n>DkJ^LzMOE%{j-QXR>`UQ`<`z1pNe}LjrgRnAweY|(Hw*(w6H3@FP P@#b;usP-EO9FPA4UBA8l literal 0 HcmV?d00001 diff --git a/library/admin.py b/library/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/library/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/library/apps.py b/library/apps.py new file mode 100644 index 00000000..82ef46af --- /dev/null +++ b/library/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LibraryConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "library" diff --git a/library/migrations/0001_initial.py b/library/migrations/0001_initial.py new file mode 100644 index 00000000..70724953 --- /dev/null +++ b/library/migrations/0001_initial.py @@ -0,0 +1,50 @@ +# Generated by Django 5.1.1 on 2024-10-04 16:41 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Author", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name="Book", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=100)), + ( + "authors", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="library.author" + ), + ), + ], + ), + ] diff --git a/library/migrations/__init__.py b/library/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/library/migrations/__pycache__/0001_initial.cpython-312.pyc b/library/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd305bc390c3827c0669abd7606c2177b25982d9 GIT binary patch literal 1433 zcmb7Ey>Ht_6h9t6BvP^>t8@|xt&<2=Y&wAGWNTa$aHJ^xaDoC(fIs{QzMvv}QZft}p|~KX3^%0t zy2aBQG9N+2v$>pGK4XqU91@UtC>;pd>@GyPbamy7)%ipDfN>{n7uxVpIe;1ZPwvA1 z(>U|p(ivm5GsZsr_ZTW2o}1Uns^;HSZNu)lVOd+G^4g-W{)_E1QLTS4%Uijfm}nC2J};|`ycJf}w( zM>88>;*ta3V2Z*KrZ5WbX=R!>QYOQoieWIh4Lr>JqG3E5m|nupP|oq4h~-C%2=8Mb zVc&9aND}?hLMtukZX#5YsD~DBIX0_4=p?C8xwU7K%vCx8!H(^J$tsqRYx;ITA?ne5 znh_H`&9%06T3hYgR0;O+>=FC|j#*Uj*3}=dQwnv|Grz&EskZ}b(8qoh>bKFrN*|2A zW0@W%m$xhv;r>wH-frv63EC;wS0r$;73s4>(cir@ePd(ex-l!Vxj!TlBTP+>IpLqo zJOf9i%F{bXA1poHo=QNz^u039FUR@i$zqk^rRqdoecl@R;CqDxj3q7FV2svT3pp$?!2mgJSyLuE)~?$iCB`A>GD6~UU>hw)lqHz#no|b zJ+7_4v|iP2j>?-y>PHi`k>u2f)yAa0_OterHm=`@>o>;r&A7ffuD9ZPYxLRICp=7Y z6j_cJ7L#05mdlk!Mf&awa&>+ZnnbJFoi$Ofnf*)6`NfgTY#EjRo=>Hbsv$edMiM0r ywaUD=`A;&TeM;6DOumxv5;IetSU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO^7Z04>)T=>Px# diff --git a/tryHello/__pycache__/admin.cpython-312.pyc b/tryHello/__pycache__/admin.cpython-312.pyc index fc429e0f4febc73809e10aee504e14c87d9a45a1..3c73c97cbfb4a4abf1a76a630be2edd4ca0d526b 100644 GIT binary patch delta 95 zcmcb}_>z(PG%qg~0}$vQ_%)F`-Xl^!v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(;M1& delta 71 zcmaFKc#)C&G%qg~0}yaL_%@L{-oQ~mv^ce>SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGI5hR08YXgmH+?% diff --git a/tryHello/__pycache__/apps.cpython-312.pyc b/tryHello/__pycache__/apps.cpython-312.pyc index ddde02ce72d1ba239fbcba928905c10cdb0a6c5e..92132d8e6ea2ab3a9050b8e5f33f0d6fa85425a6 100644 GIT binary patch delta 97 zcmcc3{F#~iG%qg~0}$vQ__dLno6#deKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}87cI28ae93kBR delta 73 zcmey&e4Cm3G%qg~0}yaL__mRoo6*2QKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQKDuaVh|4?-_>x diff --git a/tryHello/__pycache__/models.cpython-312.pyc b/tryHello/__pycache__/models.cpython-312.pyc index b96284dc3a578512a7337a05827810cdcbc7e396..10e77d4f5b9bdd8c90c02e743a56507049b65752 100644 GIT binary patch delta 95 zcmX@d_>7VJG%qg~0}$vQ_%)F`+9OIov^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGI5;+08DlniU0rr diff --git a/tryHello/__pycache__/urls.cpython-312.pyc b/tryHello/__pycache__/urls.cpython-312.pyc index 6a1c9299e7f3f8f7cb909d3dd22cc2da447650a8..519f85c547e9ea7ae3c2a06020689e02cd7f61c1 100644 GIT binary patch delta 292 zcmeywbcI>{G%qg~0}xC<`YUZakbVr}zyKSR@ws54x~l;bLn>nmTPkxFSOZKAgic{! z!@8Oo!cJ$3VyooP;rF=7FFe6*hU- z^;~apmlov|B$kw<7UdPMWcUnH|I0x?v^ce>SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL zD3hO;n4_POnv;`Xo?n!cGP#gZ#*`1JlM#rEm4UW3Dm78UEKBqf%oW+m#o$|3uCMT9;=I7}LCnx5l7AZI;C#Iz4 zR_gosxab2J`7T+BdFlB9Mfq8&$t4s2D%684W&`44K_JnAd zdZu7TZlX-=wL5y<%@hxr5L|#corHSgwER`&ptP?|`*l)3Vq~_%0PuwPF;HV#3 zoLW?@pPg8gn5UPNkyw(MsPB?moL!P%pkDx#$mMuu>N`@jHAXNl%(Jv00-29Z% joK(9a0U(zVh>Jmt56p~=jCUDS?lLHU=3r#h0P6q%PT)3l diff --git a/tryHello/migrations/__pycache__/__init__.cpython-312.pyc b/tryHello/migrations/__pycache__/__init__.cpython-312.pyc index e36e3ccd6167207ba501bc4815cb490067f92cec..db9bde35b0509009d87736fecb0f29da1aaad8a5 100644 GIT binary patch delta 95 zcmdnMc!H7pG%qg~0}$vQ_%)H+*dtv(v^ce>SU)8xu{<>^QQsv$ximL5ucTPtHKjB; wu_QA;Pd_+0F(SU)?lC^1hjDI>8YGg03qwK%&Zzd*kL YD3hO;n4_POnv;`Xo?n!cGO^7G05%sH6#xJL From 494a264775d696f0d0c4d2059d9b52517b8a8d1f Mon Sep 17 00:00:00 2001 From: Dushyant Baweja Date: Fri, 4 Oct 2024 22:57:47 +0530 Subject: [PATCH 3/6] Add create_author functionality --- library/urls.py | 3 ++- library/views.py | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/library/urls.py b/library/urls.py index 882f0879..58704f53 100644 --- a/library/urls.py +++ b/library/urls.py @@ -1,5 +1,6 @@ from django.urls import path urlpatters = [ - path('createbook/' views.create_book, name='createbook') + path('createbook/', views.create_book, name='createbook') + path('createauthor/', views.create_author, name='createauthor') ] \ No newline at end of file diff --git a/library/views.py b/library/views.py index a56a5767..90ec6e8a 100644 --- a/library/views.py +++ b/library/views.py @@ -1,8 +1,9 @@ from django.shortcuts import render from rest_framework import status from rest_framework.decorators import api_view -from rest_framework.respnose import Response +from rest_framework.response import Response from library.serializer import BookSerializer +from library.serializer import AuthorSerializer # Create your views here. @api_view(['POST']) @@ -11,4 +12,12 @@ def create_book(request): if book_serializer.is_valid(): book_serializer.save() - return Response(book_serializer.data, status = status.HTTP_201_CREATED) \ No newline at end of file + return Response(book_serializer.data, status = status.HTTP_201_CREATED) + +@api_view(['POST']) +def create_author(request): + author_serializer = AuthorSerializer(data = request.data) + + if author_serializer.is_valid(): + author_serializer.save() + return Response(author_serializer.data, status = status.HTTP_201_CREATED) \ No newline at end of file From 5c0c2ab0c219b193a22e497700c4028bb53bdd65 Mon Sep 17 00:00:00 2001 From: Dushyant Baweja Date: Sat, 5 Oct 2024 14:38:52 +0530 Subject: [PATCH 4/6] bugfix library app --- db.sqlite3 | Bin 143360 -> 143360 bytes env/bin/activate | 4 +- env/bin/activate.csh | 2 +- env/bin/activate.fish | 2 +- env/bin/django-admin | 4 +- env/bin/pip | 4 +- env/bin/pip3 | 4 +- env/bin/pip3.12 | 4 +- env/bin/sqlformat | 4 +- .../Django-5.1.1.dist-info/RECORD | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 247 -> 247 bytes .../__pycache__/compatibility.cpython-312.pyc | Bin 1807 -> 1831 bytes .../current_thread_executor.cpython-312.pyc | Bin 5020 -> 5020 bytes .../asgiref/__pycache__/local.cpython-312.pyc | Bin 5883 -> 5852 bytes .../__pycache__/server.cpython-312.pyc | Bin 7976 -> 7990 bytes .../asgiref/__pycache__/sync.cpython-312.pyc | Bin 22989 -> 22960 bytes .../__pycache__/testing.cpython-312.pyc | Bin 6112 -> 6111 bytes .../__pycache__/timeout.cpython-312.pyc | Bin 4906 -> 4930 bytes .../__pycache__/typing.cpython-312.pyc | Bin 9920 -> 9944 bytes .../asgiref/__pycache__/wsgi.cpython-312.pyc | Bin 7330 -> 7334 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1260 -> 1260 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 485 -> 509 bytes .../__pycache__/shortcuts.cpython-312.pyc | Bin 7677 -> 7677 bytes .../apps/__pycache__/__init__.cpython-312.pyc | Bin 343 -> 343 bytes .../apps/__pycache__/config.cpython-312.pyc | Bin 9251 -> 9256 bytes .../apps/__pycache__/registry.cpython-312.pyc | Bin 18783 -> 18734 bytes .../conf/__pycache__/__init__.cpython-312.pyc | Bin 13076 -> 13061 bytes .../global_settings.cpython-312.pyc | Bin 12683 -> 12683 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8603 -> 8603 bytes .../ar/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ar/__pycache__/formats.cpython-312.pyc | Bin 451 -> 475 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../ar_DZ/__pycache__/formats.cpython-312.pyc | Bin 759 -> 783 bytes .../az/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../az/__pycache__/formats.cpython-312.pyc | Bin 806 -> 830 bytes .../bg/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../bg/__pycache__/formats.cpython-312.pyc | Bin 407 -> 431 bytes .../bn/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../bn/__pycache__/formats.cpython-312.pyc | Bin 695 -> 719 bytes .../bs/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../bs/__pycache__/formats.cpython-312.pyc | Bin 481 -> 505 bytes .../ca/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ca/__pycache__/formats.cpython-312.pyc | Bin 828 -> 852 bytes .../ckb/__pycache__/__init__.cpython-312.pyc | Bin 212 -> 236 bytes .../ckb/__pycache__/formats.cpython-312.pyc | Bin 579 -> 603 bytes .../cs/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../cs/__pycache__/formats.cpython-312.pyc | Bin 944 -> 968 bytes .../cy/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../cy/__pycache__/formats.cpython-312.pyc | Bin 853 -> 877 bytes .../da/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../da/__pycache__/formats.cpython-312.pyc | Bin 732 -> 756 bytes .../de/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../de/__pycache__/formats.cpython-312.pyc | Bin 747 -> 771 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../de_CH/__pycache__/formats.cpython-312.pyc | Bin 754 -> 778 bytes .../el/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../el/__pycache__/formats.cpython-312.pyc | Bin 840 -> 864 bytes .../en/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../en/__pycache__/formats.cpython-312.pyc | Bin 1015 -> 1039 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../en_AU/__pycache__/formats.cpython-312.pyc | Bin 856 -> 880 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../en_CA/__pycache__/formats.cpython-312.pyc | Bin 803 -> 827 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../en_GB/__pycache__/formats.cpython-312.pyc | Bin 856 -> 880 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../en_IE/__pycache__/formats.cpython-312.pyc | Bin 898 -> 922 bytes .../eo/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../eo/__pycache__/formats.cpython-312.pyc | Bin 1015 -> 1039 bytes .../es/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../es/__pycache__/formats.cpython-312.pyc | Bin 845 -> 869 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../es_AR/__pycache__/formats.cpython-312.pyc | Bin 809 -> 833 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../es_CO/__pycache__/formats.cpython-312.pyc | Bin 846 -> 870 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../es_MX/__pycache__/formats.cpython-312.pyc | Bin 846 -> 870 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../es_NI/__pycache__/formats.cpython-312.pyc | Bin 846 -> 870 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../es_PR/__pycache__/formats.cpython-312.pyc | Bin 844 -> 868 bytes .../et/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../et/__pycache__/formats.cpython-312.pyc | Bin 409 -> 433 bytes .../eu/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../eu/__pycache__/formats.cpython-312.pyc | Bin 606 -> 630 bytes .../fa/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../fa/__pycache__/formats.cpython-312.pyc | Bin 572 -> 596 bytes .../fi/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../fi/__pycache__/formats.cpython-312.pyc | Bin 887 -> 911 bytes .../fr/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../fr/__pycache__/formats.cpython-312.pyc | Bin 748 -> 772 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../fr_BE/__pycache__/formats.cpython-312.pyc | Bin 822 -> 846 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../fr_CA/__pycache__/formats.cpython-312.pyc | Bin 830 -> 854 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../fr_CH/__pycache__/formats.cpython-312.pyc | Bin 822 -> 846 bytes .../fy/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../fy/__pycache__/formats.cpython-312.pyc | Bin 210 -> 234 bytes .../ga/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ga/__pycache__/formats.cpython-312.pyc | Bin 403 -> 427 bytes .../gd/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../gd/__pycache__/formats.cpython-312.pyc | Bin 519 -> 543 bytes .../gl/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../gl/__pycache__/formats.cpython-312.pyc | Bin 590 -> 614 bytes .../he/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../he/__pycache__/formats.cpython-312.pyc | Bin 531 -> 555 bytes .../hi/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../hi/__pycache__/formats.cpython-312.pyc | Bin 405 -> 429 bytes .../hr/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../hr/__pycache__/formats.cpython-312.pyc | Bin 1036 -> 1060 bytes .../hu/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../hu/__pycache__/formats.cpython-312.pyc | Bin 806 -> 830 bytes .../id/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../id/__pycache__/formats.cpython-312.pyc | Bin 1031 -> 1055 bytes .../ig/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ig/__pycache__/formats.cpython-312.pyc | Bin 807 -> 831 bytes .../is/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../is/__pycache__/formats.cpython-312.pyc | Bin 468 -> 492 bytes .../it/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../it/__pycache__/formats.cpython-312.pyc | Bin 1008 -> 1032 bytes .../ja/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ja/__pycache__/formats.cpython-312.pyc | Bin 582 -> 606 bytes .../ka/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ka/__pycache__/formats.cpython-312.pyc | Bin 1006 -> 1030 bytes .../km/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../km/__pycache__/formats.cpython-312.pyc | Bin 536 -> 560 bytes .../kn/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../kn/__pycache__/formats.cpython-312.pyc | Bin 338 -> 362 bytes .../ko/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ko/__pycache__/formats.cpython-312.pyc | Bin 1077 -> 1101 bytes .../ky/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ky/__pycache__/formats.cpython-312.pyc | Bin 836 -> 860 bytes .../lt/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../lt/__pycache__/formats.cpython-312.pyc | Bin 1042 -> 1066 bytes .../lv/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../lv/__pycache__/formats.cpython-312.pyc | Bin 1050 -> 1074 bytes .../mk/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../mk/__pycache__/formats.cpython-312.pyc | Bin 947 -> 971 bytes .../ml/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ml/__pycache__/formats.cpython-312.pyc | Bin 859 -> 883 bytes .../mn/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../mn/__pycache__/formats.cpython-312.pyc | Bin 305 -> 329 bytes .../ms/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ms/__pycache__/formats.cpython-312.pyc | Bin 899 -> 923 bytes .../nb/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../nb/__pycache__/formats.cpython-312.pyc | Bin 869 -> 893 bytes .../nl/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../nl/__pycache__/formats.cpython-312.pyc | Bin 1380 -> 1404 bytes .../nn/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../nn/__pycache__/formats.cpython-312.pyc | Bin 869 -> 893 bytes .../pl/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../pl/__pycache__/formats.cpython-312.pyc | Bin 753 -> 777 bytes .../pt/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../pt/__pycache__/formats.cpython-312.pyc | Bin 900 -> 924 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../pt_BR/__pycache__/formats.cpython-312.pyc | Bin 842 -> 866 bytes .../ro/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ro/__pycache__/formats.cpython-312.pyc | Bin 849 -> 873 bytes .../ru/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ru/__pycache__/formats.cpython-312.pyc | Bin 826 -> 850 bytes .../sk/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../sk/__pycache__/formats.cpython-312.pyc | Bin 755 -> 779 bytes .../sl/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../sl/__pycache__/formats.cpython-312.pyc | Bin 1019 -> 1043 bytes .../sq/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../sq/__pycache__/formats.cpython-312.pyc | Bin 437 -> 461 bytes .../sr/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../sr/__pycache__/formats.cpython-312.pyc | Bin 969 -> 993 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../__pycache__/formats.cpython-312.pyc | Bin 974 -> 998 bytes .../sv/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../sv/__pycache__/formats.cpython-312.pyc | Bin 866 -> 890 bytes .../ta/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ta/__pycache__/formats.cpython-312.pyc | Bin 340 -> 364 bytes .../te/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../te/__pycache__/formats.cpython-312.pyc | Bin 338 -> 362 bytes .../tg/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../tg/__pycache__/formats.cpython-312.pyc | Bin 836 -> 860 bytes .../th/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../th/__pycache__/formats.cpython-312.pyc | Bin 818 -> 842 bytes .../tk/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../tk/__pycache__/formats.cpython-312.pyc | Bin 836 -> 860 bytes .../tr/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../tr/__pycache__/formats.cpython-312.pyc | Bin 748 -> 772 bytes .../ug/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../ug/__pycache__/formats.cpython-312.pyc | Bin 542 -> 566 bytes .../uk/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../uk/__pycache__/formats.cpython-312.pyc | Bin 887 -> 911 bytes .../uz/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../uz/__pycache__/formats.cpython-312.pyc | Bin 848 -> 872 bytes .../vi/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../vi/__pycache__/formats.cpython-312.pyc | Bin 576 -> 600 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../__pycache__/formats.cpython-312.pyc | Bin 992 -> 1016 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../__pycache__/formats.cpython-312.pyc | Bin 992 -> 1016 bytes .../urls/__pycache__/__init__.cpython-312.pyc | Bin 597 -> 621 bytes .../urls/__pycache__/i18n.cpython-312.pyc | Bin 1713 -> 1730 bytes .../urls/__pycache__/static.cpython-312.pyc | Bin 1311 -> 1335 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 228 -> 228 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1344 -> 1344 bytes .../admin/__pycache__/actions.cpython-312.pyc | Bin 3438 -> 3438 bytes .../admin/__pycache__/apps.cpython-312.pyc | Bin 1909 -> 1909 bytes .../admin/__pycache__/checks.cpython-312.pyc | Bin 56001 -> 56026 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 3975 -> 3975 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1204 -> 1204 bytes .../admin/__pycache__/filters.cpython-312.pyc | Bin 35152 -> 35122 bytes .../admin/__pycache__/forms.cpython-312.pyc | Bin 1719 -> 1743 bytes .../admin/__pycache__/helpers.cpython-312.pyc | Bin 26783 -> 26730 bytes .../admin/__pycache__/models.cpython-312.pyc | Bin 10288 -> 10301 bytes .../admin/__pycache__/options.cpython-312.pyc | Bin 108400 -> 108292 bytes .../admin/__pycache__/sites.cpython-312.pyc | Bin 26016 -> 25983 bytes .../admin/__pycache__/tests.cpython-312.pyc | Bin 12050 -> 12043 bytes .../admin/__pycache__/utils.cpython-312.pyc | Bin 27770 -> 27705 bytes .../admin/__pycache__/widgets.cpython-312.pyc | Bin 29245 -> 29255 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 2459 -> 2483 bytes ...2_logentry_remove_auto_add.cpython-312.pyc | Bin 926 -> 950 bytes ...ry_add_action_flag_choices.cpython-312.pyc | Bin 922 -> 946 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 245 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 247 -> 247 bytes .../__pycache__/admin_list.cpython-312.pyc | Bin 20957 -> 20958 bytes .../__pycache__/admin_modify.cpython-312.pyc | Bin 5436 -> 5435 bytes .../__pycache__/admin_urls.cpython-312.pyc | Bin 2949 -> 2949 bytes .../__pycache__/base.cpython-312.pyc | Bin 2116 -> 2140 bytes .../__pycache__/log.cpython-312.pyc | Bin 3178 -> 3202 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 240 -> 240 bytes .../__pycache__/autocomplete.cpython-312.pyc | Bin 6129 -> 6134 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 1016 -> 1041 bytes .../views/__pycache__/main.cpython-312.pyc | Bin 25437 -> 25378 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../__pycache__/apps.cpython-312.pyc | Bin 621 -> 645 bytes .../__pycache__/middleware.cpython-312.pyc | Bin 1996 -> 2020 bytes .../__pycache__/urls.cpython-312.pyc | Bin 1910 -> 1934 bytes .../__pycache__/utils.cpython-312.pyc | Bin 9051 -> 9046 bytes .../__pycache__/views.cpython-312.pyc | Bin 20520 -> 20472 bytes .../auth/__pycache__/__init__.cpython-312.pyc | Bin 11530 -> 11515 bytes .../auth/__pycache__/admin.cpython-312.pyc | Bin 10811 -> 10805 bytes .../auth/__pycache__/apps.cpython-312.pyc | Bin 2041 -> 2041 bytes .../auth/__pycache__/backends.cpython-312.pyc | Bin 12194 -> 12224 bytes .../__pycache__/base_user.cpython-312.pyc | Bin 8167 -> 8160 bytes .../auth/__pycache__/checks.cpython-312.pyc | Bin 9748 -> 9730 bytes .../context_processors.cpython-312.pyc | Bin 3402 -> 3426 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 5574 -> 5572 bytes .../auth/__pycache__/forms.cpython-312.pyc | Bin 27842 -> 27831 bytes .../auth/__pycache__/hashers.cpython-312.pyc | Bin 30053 -> 30052 bytes .../__pycache__/middleware.cpython-312.pyc | Bin 8767 -> 8789 bytes .../auth/__pycache__/mixins.cpython-312.pyc | Bin 7021 -> 7045 bytes .../auth/__pycache__/models.cpython-312.pyc | Bin 23311 -> 23295 bytes .../password_validation.cpython-312.pyc | Bin 12567 -> 12527 bytes .../auth/__pycache__/signals.cpython-312.pyc | Bin 397 -> 397 bytes .../auth/__pycache__/tokens.cpython-312.pyc | Bin 5913 -> 5908 bytes .../auth/__pycache__/urls.cpython-312.pyc | Bin 1572 -> 1596 bytes .../__pycache__/validators.cpython-312.pyc | Bin 1352 -> 1352 bytes .../auth/__pycache__/views.cpython-312.pyc | Bin 18815 -> 18839 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 218 -> 242 bytes .../__pycache__/modwsgi.cpython-312.pyc | Bin 2367 -> 2397 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6081 -> 6062 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 229 -> 253 bytes .../changepassword.cpython-312.pyc | Bin 3733 -> 3757 bytes .../createsuperuser.cpython-312.pyc | Bin 14595 -> 14618 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 4819 -> 4843 bytes ...permission_name_max_length.cpython-312.pyc | Bin 817 -> 841 bytes ...lter_user_email_max_length.cpython-312.pyc | Bin 864 -> 888 bytes ...4_alter_user_username_opts.cpython-312.pyc | Bin 1158 -> 1182 bytes ...alter_user_last_login_null.cpython-312.pyc | Bin 849 -> 873 bytes ..._require_contenttypes_0002.cpython-312.pyc | Bin 636 -> 660 bytes ...idators_add_error_messages.cpython-312.pyc | Bin 1167 -> 1191 bytes ...r_user_username_max_length.cpython-312.pyc | Bin 1173 -> 1197 bytes ..._user_last_name_max_length.cpython-312.pyc | Bin 865 -> 889 bytes ...lter_group_name_max_length.cpython-312.pyc | Bin 844 -> 868 bytes ...1_update_proxy_permissions.cpython-312.pyc | Bin 3990 -> 3997 bytes ...user_first_name_max_length.cpython-312.pyc | Bin 862 -> 886 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 220 -> 244 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 241 -> 241 bytes .../__pycache__/admin.cpython-312.pyc | Bin 5946 -> 5944 bytes .../__pycache__/apps.cpython-312.pyc | Bin 1642 -> 1642 bytes .../__pycache__/checks.cpython-312.pyc | Bin 2497 -> 2478 bytes .../__pycache__/fields.cpython-312.pyc | Bin 41056 -> 40998 bytes .../__pycache__/forms.cpython-312.pyc | Bin 5329 -> 5329 bytes .../__pycache__/models.cpython-312.pyc | Bin 9959 -> 9936 bytes .../__pycache__/prefetch.cpython-312.pyc | Bin 2071 -> 2085 bytes .../__pycache__/views.cpython-312.pyc | Bin 3489 -> 3503 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6302 -> 6278 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 237 -> 261 bytes .../remove_stale_contenttypes.cpython-312.pyc | Bin 5209 -> 5211 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 1695 -> 1719 bytes ...2_remove_content_type_name.cpython-312.pyc | Bin 2047 -> 2066 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 228 -> 252 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../__pycache__/admin.cpython-312.pyc | Bin 1090 -> 1114 bytes .../__pycache__/apps.cpython-312.pyc | Bin 659 -> 683 bytes .../__pycache__/forms.cpython-312.pyc | Bin 3946 -> 3965 bytes .../__pycache__/middleware.cpython-312.pyc | Bin 1138 -> 1162 bytes .../__pycache__/models.cpython-312.pyc | Bin 3044 -> 3063 bytes .../__pycache__/sitemaps.cpython-312.pyc | Bin 1231 -> 1255 bytes .../__pycache__/urls.cpython-312.pyc | Bin 462 -> 486 bytes .../__pycache__/views.cpython-312.pyc | Bin 2828 -> 2852 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 2093 -> 2117 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 225 -> 249 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 227 -> 251 bytes .../__pycache__/flatpages.cpython-312.pyc | Bin 4168 -> 4192 bytes .../gis/__pycache__/__init__.cpython-312.pyc | Bin 208 -> 232 bytes .../gis/__pycache__/apps.cpython-312.pyc | Bin 969 -> 993 bytes .../gis/__pycache__/feeds.cpython-312.pyc | Bin 7594 -> 7619 bytes .../gis/__pycache__/geoip2.cpython-312.pyc | Bin 11586 -> 11606 bytes .../gis/__pycache__/geometry.cpython-312.pyc | Bin 834 -> 858 bytes .../gis/__pycache__/measure.cpython-312.pyc | Bin 14557 -> 14582 bytes .../gis/__pycache__/ptr.cpython-312.pyc | Bin 1904 -> 1928 bytes .../gis/__pycache__/shortcuts.cpython-312.pyc | Bin 1911 -> 1924 bytes .../gis/__pycache__/views.cpython-312.pyc | Bin 1270 -> 1294 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 648 -> 672 bytes .../admin/__pycache__/options.cpython-312.pyc | Bin 1491 -> 1515 bytes .../db/__pycache__/__init__.cpython-312.pyc | Bin 211 -> 235 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 220 -> 244 bytes .../__pycache__/utils.cpython-312.pyc | Bin 1534 -> 1558 bytes .../base/__pycache__/__init__.cpython-312.pyc | Bin 225 -> 249 bytes .../base/__pycache__/adapter.cpython-312.pyc | Bin 1620 -> 1644 bytes .../base/__pycache__/features.cpython-312.pyc | Bin 4996 -> 5020 bytes .../base/__pycache__/models.cpython-312.pyc | Bin 6266 -> 6290 bytes .../__pycache__/operations.cpython-312.pyc | Bin 8265 -> 8289 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 226 -> 250 bytes .../mysql/__pycache__/base.cpython-312.pyc | Bin 821 -> 845 bytes .../__pycache__/features.cpython-312.pyc | Bin 1317 -> 1341 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 1982 -> 1997 bytes .../__pycache__/operations.cpython-312.pyc | Bin 6670 -> 6694 bytes .../mysql/__pycache__/schema.cpython-312.pyc | Bin 4913 -> 4932 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 227 -> 251 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 3789 -> 3804 bytes .../oracle/__pycache__/base.cpython-312.pyc | Bin 827 -> 851 bytes .../__pycache__/features.cpython-312.pyc | Bin 1473 -> 1497 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 2240 -> 2259 bytes .../oracle/__pycache__/models.cpython-312.pyc | Bin 3480 -> 3504 bytes .../__pycache__/operations.cpython-312.pyc | Bin 10445 -> 10469 bytes .../oracle/__pycache__/schema.cpython-312.pyc | Bin 6246 -> 6265 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 228 -> 252 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 3144 -> 3168 bytes .../postgis/__pycache__/base.cpython-312.pyc | Bin 8552 -> 8554 bytes .../postgis/__pycache__/const.cpython-312.pyc | Bin 813 -> 837 bytes .../__pycache__/features.cpython-312.pyc | Bin 798 -> 822 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 3555 -> 3563 bytes .../__pycache__/models.cpython-312.pyc | Bin 3584 -> 3608 bytes .../__pycache__/operations.cpython-312.pyc | Bin 18685 -> 18705 bytes .../__pycache__/pgraster.cpython-312.pyc | Bin 4271 -> 4290 bytes .../__pycache__/schema.cpython-312.pyc | Bin 3762 -> 3786 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 231 -> 255 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 868 -> 892 bytes .../__pycache__/base.cpython-312.pyc | Bin 3536 -> 3549 bytes .../__pycache__/client.cpython-312.pyc | Bin 524 -> 548 bytes .../__pycache__/features.cpython-312.pyc | Bin 1544 -> 1568 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 3245 -> 3259 bytes .../__pycache__/models.cpython-312.pyc | Bin 3547 -> 3571 bytes .../__pycache__/operations.cpython-312.pyc | Bin 10866 -> 10890 bytes .../__pycache__/schema.cpython-312.pyc | Bin 8189 -> 8178 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 840 -> 864 bytes .../__pycache__/aggregates.cpython-312.pyc | Bin 5008 -> 5027 bytes .../models/__pycache__/fields.cpython-312.pyc | Bin 17780 -> 17804 bytes .../__pycache__/functions.cpython-312.pyc | Bin 29463 -> 29491 bytes .../__pycache__/lookups.cpython-312.pyc | Bin 17870 -> 17894 bytes .../models/__pycache__/proxy.cpython-312.pyc | Bin 3425 -> 3449 bytes .../sql/__pycache__/__init__.cpython-312.pyc | Bin 368 -> 392 bytes .../__pycache__/conversion.cpython-312.pyc | Bin 3858 -> 3882 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 603 -> 627 bytes .../forms/__pycache__/fields.cpython-312.pyc | Bin 6004 -> 6028 bytes .../forms/__pycache__/widgets.cpython-312.pyc | Bin 5743 -> 5758 bytes .../gdal/__pycache__/__init__.cpython-312.pyc | Bin 2012 -> 2036 bytes .../gis/gdal/__pycache__/base.cpython-312.pyc | Bin 554 -> 578 bytes .../__pycache__/datasource.cpython-312.pyc | Bin 5749 -> 5773 bytes .../gdal/__pycache__/driver.cpython-312.pyc | Bin 3387 -> 3411 bytes .../gdal/__pycache__/envelope.cpython-312.pyc | Bin 9332 -> 9360 bytes .../gdal/__pycache__/error.cpython-312.pyc | Bin 1869 -> 1893 bytes .../gdal/__pycache__/feature.cpython-312.pyc | Bin 6385 -> 6416 bytes .../gdal/__pycache__/field.cpython-312.pyc | Bin 11155 -> 11189 bytes .../__pycache__/geometries.cpython-312.pyc | Bin 40416 -> 40450 bytes .../gdal/__pycache__/geomtype.cpython-312.pyc | Bin 6411 -> 6436 bytes .../gdal/__pycache__/layer.cpython-312.pyc | Bin 12435 -> 12487 bytes .../gdal/__pycache__/libgdal.cpython-312.pyc | Bin 3899 -> 3918 bytes .../gis/gdal/__pycache__/srs.cpython-312.pyc | Bin 18652 -> 18676 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 248 bytes .../prototypes/__pycache__/ds.cpython-312.pyc | Bin 6149 -> 6173 bytes .../__pycache__/errcheck.cpython-312.pyc | Bin 4902 -> 4926 bytes .../__pycache__/generation.cpython-312.pyc | Bin 5800 -> 5824 bytes .../__pycache__/geom.cpython-312.pyc | Bin 7767 -> 7787 bytes .../__pycache__/raster.cpython-312.pyc | Bin 5415 -> 5439 bytes .../__pycache__/srs.cpython-312.pyc | Bin 4395 -> 4419 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 220 -> 244 bytes .../raster/__pycache__/band.cpython-312.pyc | Bin 11400 -> 11420 bytes .../raster/__pycache__/base.cpython-312.pyc | Bin 2796 -> 2805 bytes .../raster/__pycache__/const.cpython-312.pyc | Bin 2047 -> 2071 bytes .../raster/__pycache__/source.cpython-312.pyc | Bin 23304 -> 23325 bytes .../geos/__pycache__/__init__.cpython-312.pyc | Bin 999 -> 1023 bytes .../gis/geos/__pycache__/base.cpython-312.pyc | Bin 554 -> 578 bytes .../__pycache__/collections.cpython-312.pyc | Bin 5719 -> 5745 bytes .../geos/__pycache__/coordseq.cpython-312.pyc | Bin 12156 -> 12179 bytes .../geos/__pycache__/error.cpython-312.pyc | Bin 474 -> 498 bytes .../geos/__pycache__/factory.cpython-312.pyc | Bin 1496 -> 1511 bytes .../geos/__pycache__/geometry.cpython-312.pyc | Bin 40101 -> 40125 bytes .../gis/geos/__pycache__/io.cpython-312.pyc | Bin 1483 -> 1507 bytes .../geos/__pycache__/libgeos.cpython-312.pyc | Bin 5818 -> 5837 bytes .../__pycache__/linestring.cpython-312.pyc | Bin 8423 -> 8430 bytes .../__pycache__/mutable_list.cpython-312.pyc | Bin 13945 -> 13937 bytes .../geos/__pycache__/point.cpython-312.pyc | Bin 7788 -> 7807 bytes .../geos/__pycache__/polygon.cpython-312.pyc | Bin 8886 -> 8902 bytes .../geos/__pycache__/prepared.cpython-312.pyc | Bin 3462 -> 3486 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1970 -> 1994 bytes .../__pycache__/coordseq.cpython-312.pyc | Bin 3737 -> 3761 bytes .../__pycache__/errcheck.cpython-312.pyc | Bin 3093 -> 3117 bytes .../__pycache__/geom.cpython-312.pyc | Bin 3280 -> 3304 bytes .../prototypes/__pycache__/io.cpython-312.pyc | Bin 15156 -> 15180 bytes .../__pycache__/misc.cpython-312.pyc | Bin 1515 -> 1539 bytes .../__pycache__/predicates.cpython-312.pyc | Bin 2252 -> 2276 bytes .../__pycache__/prepared.cpython-312.pyc | Bin 1564 -> 1588 bytes .../__pycache__/threadsafe.cpython-312.pyc | Bin 3619 -> 3643 bytes .../__pycache__/topology.cpython-312.pyc | Bin 2607 -> 2631 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 243 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 228 -> 252 bytes .../__pycache__/inspectdb.cpython-312.pyc | Bin 1121 -> 1145 bytes .../__pycache__/ogrinspect.cpython-312.pyc | Bin 6828 -> 6864 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 220 -> 244 bytes .../__pycache__/geojson.cpython-312.pyc | Bin 4940 -> 4959 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 344 -> 368 bytes .../sitemaps/__pycache__/kml.cpython-312.pyc | Bin 3532 -> 3539 bytes .../__pycache__/views.cpython-312.pyc | Bin 2986 -> 3005 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 828 -> 852 bytes .../__pycache__/layermapping.cpython-312.pyc | Bin 25496 -> 25481 bytes .../utils/__pycache__/ogrinfo.cpython-312.pyc | Bin 2656 -> 2665 bytes .../__pycache__/ogrinspect.cpython-312.pyc | Bin 8916 -> 8936 bytes .../gis/utils/__pycache__/srs.cpython-312.pyc | Bin 3324 -> 3351 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 213 -> 237 bytes .../humanize/__pycache__/apps.cpython-312.pyc | Bin 596 -> 620 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 226 -> 250 bytes .../__pycache__/humanize.cpython-312.pyc | Bin 12299 -> 12306 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 403 -> 403 bytes .../messages/__pycache__/api.cpython-312.pyc | Bin 3787 -> 3787 bytes .../messages/__pycache__/apps.cpython-312.pyc | Bin 1322 -> 1322 bytes .../__pycache__/constants.cpython-312.pyc | Bin 536 -> 536 bytes .../context_processors.cpython-312.pyc | Bin 658 -> 682 bytes .../__pycache__/middleware.cpython-312.pyc | Bin 1488 -> 1512 bytes .../messages/__pycache__/test.cpython-312.pyc | Bin 897 -> 921 bytes .../__pycache__/utils.cpython-312.pyc | Bin 639 -> 639 bytes .../__pycache__/views.cpython-312.pyc | Bin 1230 -> 1254 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 785 -> 785 bytes .../storage/__pycache__/base.cpython-312.pyc | Bin 9359 -> 9357 bytes .../__pycache__/cookie.cpython-312.pyc | Bin 11843 -> 11880 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 2607 -> 2626 bytes .../__pycache__/session.cpython-312.pyc | Bin 2927 -> 2951 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 213 -> 237 bytes .../postgres/__pycache__/apps.cpython-312.pyc | Bin 4737 -> 4756 bytes .../__pycache__/constraints.cpython-312.pyc | Bin 13399 -> 13408 bytes .../__pycache__/expressions.cpython-312.pyc | Bin 1121 -> 1145 bytes .../__pycache__/functions.cpython-312.pyc | Bin 786 -> 810 bytes .../__pycache__/indexes.cpython-312.pyc | Bin 12641 -> 12666 bytes .../__pycache__/lookups.cpython-312.pyc | Bin 3965 -> 3993 bytes .../__pycache__/operations.cpython-312.pyc | Bin 20221 -> 20240 bytes .../__pycache__/search.cpython-312.pyc | Bin 17298 -> 17335 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 870 -> 894 bytes .../__pycache__/signals.cpython-312.pyc | Bin 3401 -> 3406 bytes .../__pycache__/utils.cpython-312.pyc | Bin 1485 -> 1511 bytes .../__pycache__/validators.cpython-312.pyc | Bin 4222 -> 4246 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 278 -> 302 bytes .../__pycache__/general.cpython-312.pyc | Bin 2850 -> 2874 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 2791 -> 2810 bytes .../__pycache__/statistics.cpython-312.pyc | Bin 3200 -> 3224 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 330 -> 354 bytes .../fields/__pycache__/array.cpython-312.pyc | Bin 19288 -> 19297 bytes .../fields/__pycache__/citext.cpython-312.pyc | Bin 1595 -> 1619 bytes .../fields/__pycache__/hstore.cpython-312.pyc | Bin 5968 -> 5983 bytes .../fields/__pycache__/jsonb.cpython-312.pyc | Bin 707 -> 731 bytes .../fields/__pycache__/ranges.cpython-312.pyc | Bin 19441 -> 19453 bytes .../fields/__pycache__/utils.cpython-312.pyc | Bin 575 -> 599 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 288 -> 312 bytes .../forms/__pycache__/array.cpython-312.pyc | Bin 12776 -> 12782 bytes .../forms/__pycache__/hstore.cpython-312.pyc | Bin 2421 -> 2440 bytes .../forms/__pycache__/ranges.cpython-312.pyc | Bin 5582 -> 5606 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../__pycache__/admin.cpython-312.pyc | Bin 793 -> 817 bytes .../__pycache__/apps.cpython-312.pyc | Bin 658 -> 682 bytes .../__pycache__/middleware.cpython-312.pyc | Bin 2671 -> 2695 bytes .../__pycache__/models.cpython-312.pyc | Bin 1873 -> 1897 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 1721 -> 1745 bytes ...edirect_new_path_help_text.cpython-312.pyc | Bin 994 -> 1018 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 225 -> 249 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 237 -> 237 bytes .../sessions/__pycache__/apps.cpython-312.pyc | Bin 620 -> 620 bytes .../__pycache__/base_session.cpython-312.pyc | Bin 3080 -> 3080 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 929 -> 953 bytes .../__pycache__/middleware.cpython-312.pyc | Bin 4191 -> 4215 bytes .../__pycache__/models.cpython-312.pyc | Bin 2042 -> 2042 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 306 -> 330 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 222 -> 246 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 25984 -> 26008 bytes .../__pycache__/cache.cpython-312.pyc | Bin 7230 -> 7244 bytes .../__pycache__/cached_db.cpython-312.pyc | Bin 7233 -> 7257 bytes .../backends/__pycache__/db.cpython-312.pyc | Bin 11114 -> 11120 bytes .../backends/__pycache__/file.cpython-312.pyc | Bin 10208 -> 10222 bytes .../signed_cookies.cpython-312.pyc | Bin 4896 -> 4920 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 248 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 233 -> 257 bytes .../__pycache__/clearsessions.cpython-312.pyc | Bin 1265 -> 1289 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 1431 -> 1455 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 248 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8348 -> 8361 bytes .../sitemaps/__pycache__/apps.cpython-312.pyc | Bin 655 -> 679 bytes .../__pycache__/views.cpython-312.pyc | Bin 5283 -> 5292 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 234 -> 234 bytes .../sites/__pycache__/admin.cpython-312.pyc | Bin 665 -> 689 bytes .../sites/__pycache__/apps.cpython-312.pyc | Bin 1242 -> 1266 bytes .../sites/__pycache__/checks.cpython-312.pyc | Bin 774 -> 798 bytes .../__pycache__/management.cpython-312.pyc | Bin 1921 -> 1931 bytes .../__pycache__/managers.cpython-312.pyc | Bin 3356 -> 3380 bytes .../__pycache__/middleware.cpython-312.pyc | Bin 815 -> 839 bytes .../sites/__pycache__/models.cpython-312.pyc | Bin 5823 -> 5850 bytes .../__pycache__/requests.cpython-312.pyc | Bin 1474 -> 1474 bytes .../__pycache__/shortcuts.cpython-312.pyc | Bin 866 -> 866 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 1518 -> 1542 bytes .../0002_alter_domain_unique.cpython-312.pyc | Bin 1056 -> 1080 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 245 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 240 -> 240 bytes .../__pycache__/apps.cpython-312.pyc | Bin 1232 -> 1232 bytes .../__pycache__/checks.cpython-312.pyc | Bin 1380 -> 1375 bytes .../__pycache__/finders.cpython-312.pyc | Bin 14223 -> 14162 bytes .../__pycache__/handlers.cpython-312.pyc | Bin 6676 -> 6696 bytes .../__pycache__/storage.cpython-312.pyc | Bin 21349 -> 21295 bytes .../__pycache__/testing.cpython-312.pyc | Bin 841 -> 865 bytes .../__pycache__/urls.cpython-312.pyc | Bin 823 -> 847 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3073 -> 3064 bytes .../__pycache__/views.cpython-312.pyc | Bin 1864 -> 1888 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 227 -> 251 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 236 -> 260 bytes .../__pycache__/collectstatic.cpython-312.pyc | Bin 15675 -> 15671 bytes .../__pycache__/findstatic.cpython-312.pyc | Bin 2544 -> 2575 bytes .../__pycache__/runserver.cpython-312.pyc | Bin 1911 -> 1935 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 240 bytes .../__pycache__/apps.cpython-312.pyc | Bin 609 -> 633 bytes .../__pycache__/views.cpython-312.pyc | Bin 10467 -> 10486 bytes .../core/__pycache__/__init__.cpython-312.pyc | Bin 225 -> 225 bytes .../core/__pycache__/asgi.cpython-312.pyc | Bin 727 -> 751 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 10593 -> 10566 bytes .../__pycache__/paginator.cpython-312.pyc | Bin 12184 -> 12179 bytes .../core/__pycache__/signals.cpython-312.pyc | Bin 434 -> 434 bytes .../core/__pycache__/signing.cpython-312.pyc | Bin 12387 -> 12377 bytes .../__pycache__/validators.cpython-312.pyc | Bin 28274 -> 28281 bytes .../core/__pycache__/wsgi.cpython-312.pyc | Bin 729 -> 753 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2535 -> 2535 bytes .../cache/__pycache__/utils.cpython-312.pyc | Bin 830 -> 849 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 240 -> 240 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 18706 -> 18667 bytes .../backends/__pycache__/db.cpython-312.pyc | Bin 13486 -> 13456 bytes .../__pycache__/dummy.cpython-312.pyc | Bin 2061 -> 2085 bytes .../__pycache__/filebased.cpython-312.pyc | Bin 9694 -> 9662 bytes .../__pycache__/locmem.cpython-312.pyc | Bin 7527 -> 7487 bytes .../__pycache__/memcached.cpython-312.pyc | Bin 9538 -> 9558 bytes .../__pycache__/redis.cpython-312.pyc | Bin 13397 -> 13428 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1203 -> 1203 bytes .../__pycache__/async_checks.cpython-312.pyc | Bin 898 -> 898 bytes .../checks/__pycache__/caches.cpython-312.pyc | Bin 4144 -> 4126 bytes .../__pycache__/database.cpython-312.pyc | Bin 819 -> 814 bytes .../checks/__pycache__/files.cpython-312.pyc | Bin 964 -> 964 bytes .../__pycache__/messages.cpython-312.pyc | Bin 4975 -> 4975 bytes .../__pycache__/model_checks.cpython-312.pyc | Bin 10622 -> 10581 bytes .../__pycache__/registry.cpython-312.pyc | Bin 4877 -> 4873 bytes .../__pycache__/templates.cpython-312.pyc | Bin 782 -> 777 bytes .../__pycache__/translation.cpython-312.pyc | Bin 3503 -> 3513 bytes .../checks/__pycache__/urls.cpython-312.pyc | Bin 6417 -> 6400 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 246 -> 246 bytes .../__pycache__/django_4_0.cpython-312.pyc | Bin 1037 -> 1032 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 241 -> 241 bytes .../security/__pycache__/base.cpython-312.pyc | Bin 11706 -> 11704 bytes .../security/__pycache__/csrf.cpython-312.pyc | Bin 3094 -> 3094 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 3557 -> 3557 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 312 -> 312 bytes .../files/__pycache__/base.cpython-312.pyc | Bin 7909 -> 7899 bytes .../files/__pycache__/images.cpython-312.pyc | Bin 3309 -> 3309 bytes .../files/__pycache__/locks.cpython-312.pyc | Bin 4569 -> 4569 bytes .../files/__pycache__/move.cpython-312.pyc | Bin 3201 -> 3192 bytes .../files/__pycache__/temp.cpython-312.pyc | Bin 3516 -> 3516 bytes .../__pycache__/uploadedfile.cpython-312.pyc | Bin 6224 -> 6224 bytes .../__pycache__/uploadhandler.cpython-312.pyc | Bin 9807 -> 9807 bytes .../files/__pycache__/utils.cpython-312.pyc | Bin 5850 -> 5838 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1078 -> 1078 bytes .../storage/__pycache__/base.cpython-312.pyc | Bin 8662 -> 8662 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 12740 -> 12725 bytes .../__pycache__/handler.cpython-312.pyc | Bin 2600 -> 2600 bytes .../__pycache__/memory.cpython-312.pyc | Bin 15368 -> 15358 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 1472 -> 1472 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 210 -> 234 bytes .../handlers/__pycache__/asgi.cpython-312.pyc | Bin 16727 -> 16683 bytes .../handlers/__pycache__/base.cpython-312.pyc | Bin 13630 -> 13622 bytes .../__pycache__/exception.cpython-312.pyc | Bin 6660 -> 6684 bytes .../handlers/__pycache__/wsgi.cpython-312.pyc | Bin 9545 -> 9572 bytes .../mail/__pycache__/__init__.cpython-312.pyc | Bin 5738 -> 5751 bytes .../mail/__pycache__/message.cpython-312.pyc | Bin 21952 -> 21927 bytes .../mail/__pycache__/utils.cpython-312.pyc | Bin 1067 -> 1067 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 215 -> 239 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 2657 -> 2681 bytes .../__pycache__/console.cpython-312.pyc | Bin 2705 -> 2719 bytes .../__pycache__/dummy.cpython-312.pyc | Bin 738 -> 762 bytes .../__pycache__/filebased.cpython-312.pyc | Bin 3793 -> 3817 bytes .../__pycache__/locmem.cpython-312.pyc | Bin 1664 -> 1683 bytes .../backends/__pycache__/smtp.cpython-312.pyc | Bin 7279 -> 7296 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 20754 -> 20718 bytes .../__pycache__/base.cpython-312.pyc | Bin 31102 -> 31095 bytes .../__pycache__/color.cpython-312.pyc | Bin 4146 -> 4142 bytes .../__pycache__/sql.cpython-312.pyc | Bin 2359 -> 2373 bytes .../__pycache__/templates.cpython-312.pyc | Bin 18349 -> 18304 bytes .../__pycache__/utils.cpython-312.pyc | Bin 8108 -> 8097 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 245 bytes .../__pycache__/check.cpython-312.pyc | Bin 3410 -> 3435 bytes .../compilemessages.cpython-312.pyc | Bin 9003 -> 8961 bytes .../createcachetable.cpython-312.pyc | Bin 5930 -> 5910 bytes .../__pycache__/dbshell.cpython-312.pyc | Bin 2288 -> 2312 bytes .../__pycache__/diffsettings.cpython-312.pyc | Bin 4343 -> 4358 bytes .../__pycache__/dumpdata.cpython-312.pyc | Bin 10882 -> 10893 bytes .../__pycache__/flush.cpython-312.pyc | Bin 3725 -> 3744 bytes .../__pycache__/inspectdb.cpython-312.pyc | Bin 15587 -> 15585 bytes .../__pycache__/loaddata.cpython-312.pyc | Bin 18859 -> 18834 bytes .../__pycache__/makemessages.cpython-312.pyc | Bin 34953 -> 34829 bytes .../makemigrations.cpython-312.pyc | Bin 23114 -> 23083 bytes .../__pycache__/migrate.cpython-312.pyc | Bin 22999 -> 22977 bytes .../optimizemigration.cpython-312.pyc | Bin 5883 -> 5900 bytes .../__pycache__/runserver.cpython-312.pyc | Bin 8248 -> 8267 bytes .../__pycache__/sendtestemail.cpython-312.pyc | Bin 2136 -> 2160 bytes .../__pycache__/shell.cpython-312.pyc | Bin 4863 -> 4869 bytes .../showmigrations.cpython-312.pyc | Bin 7651 -> 7634 bytes .../__pycache__/sqlflush.cpython-312.pyc | Bin 1751 -> 1775 bytes .../__pycache__/sqlmigrate.cpython-312.pyc | Bin 3703 -> 3727 bytes .../sqlsequencereset.cpython-312.pyc | Bin 1905 -> 1929 bytes .../squashmigrations.cpython-312.pyc | Bin 10660 -> 10661 bytes .../__pycache__/startapp.cpython-312.pyc | Bin 1074 -> 1098 bytes .../__pycache__/startproject.cpython-312.pyc | Bin 1316 -> 1340 bytes .../commands/__pycache__/test.cpython-312.pyc | Bin 3262 -> 3279 bytes .../__pycache__/testserver.cpython-312.pyc | Bin 2390 -> 2414 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 9485 -> 9463 bytes .../__pycache__/base.cpython-312.pyc | Bin 16588 -> 16561 bytes .../__pycache__/json.cpython-312.pyc | Bin 5961 -> 5961 bytes .../__pycache__/jsonl.cpython-312.pyc | Bin 3334 -> 3353 bytes .../__pycache__/python.cpython-312.pyc | Bin 9785 -> 9781 bytes .../__pycache__/pyyaml.cpython-312.pyc | Bin 4179 -> 4203 bytes .../xml_serializer.cpython-312.pyc | Bin 25091 -> 25104 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 209 -> 233 bytes .../__pycache__/basehttp.cpython-312.pyc | Bin 12159 -> 12174 bytes .../db/__pycache__/__init__.cpython-312.pyc | Bin 1801 -> 1791 bytes .../__pycache__/transaction.cpython-312.pyc | Bin 12103 -> 12101 bytes .../db/__pycache__/utils.cpython-312.pyc | Bin 11577 -> 11532 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 232 -> 232 bytes .../ddl_references.cpython-312.pyc | Bin 15645 -> 15625 bytes .../__pycache__/signals.cpython-312.pyc | Bin 322 -> 322 bytes .../__pycache__/utils.cpython-312.pyc | Bin 15719 -> 15673 bytes .../base/__pycache__/__init__.cpython-312.pyc | Bin 237 -> 237 bytes .../base/__pycache__/base.cpython-312.pyc | Bin 34818 -> 34684 bytes .../base/__pycache__/client.cpython-312.pyc | Bin 1573 -> 1573 bytes .../base/__pycache__/creation.cpython-312.pyc | Bin 17253 -> 17179 bytes .../base/__pycache__/features.cpython-312.pyc | Bin 8572 -> 8567 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 11150 -> 11118 bytes .../__pycache__/operations.cpython-312.pyc | Bin 38989 -> 38992 bytes .../base/__pycache__/schema.cpython-312.pyc | Bin 85181 -> 85001 bytes .../__pycache__/validation.cpython-312.pyc | Bin 1842 -> 1842 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../dummy/__pycache__/base.cpython-312.pyc | Bin 2930 -> 2954 bytes .../__pycache__/features.cpython-312.pyc | Bin 542 -> 566 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../mysql/__pycache__/base.cpython-312.pyc | Bin 17663 -> 17623 bytes .../mysql/__pycache__/client.cpython-312.pyc | Bin 3375 -> 3399 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 4659 -> 4680 bytes .../__pycache__/creation.cpython-312.pyc | Bin 4723 -> 4730 bytes .../__pycache__/features.cpython-312.pyc | Bin 14681 -> 14705 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 15737 -> 15747 bytes .../__pycache__/operations.cpython-312.pyc | Bin 19926 -> 19971 bytes .../mysql/__pycache__/schema.cpython-312.pyc | Bin 13916 -> 13951 bytes .../__pycache__/validation.cpython-312.pyc | Bin 3611 -> 3635 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 215 -> 239 bytes .../oracle/__pycache__/base.cpython-312.pyc | Bin 25982 -> 25952 bytes .../oracle/__pycache__/client.cpython-312.pyc | Bin 1440 -> 1464 bytes .../__pycache__/creation.cpython-312.pyc | Bin 22958 -> 22950 bytes .../__pycache__/features.cpython-312.pyc | Bin 9046 -> 9063 bytes .../__pycache__/functions.cpython-312.pyc | Bin 1574 -> 1598 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 15664 -> 15688 bytes .../__pycache__/operations.cpython-312.pyc | Bin 31979 -> 31986 bytes .../__pycache__/oracledb_any.cpython-312.pyc | Bin 837 -> 861 bytes .../oracle/__pycache__/schema.cpython-312.pyc | Bin 12366 -> 12378 bytes .../oracle/__pycache__/utils.cpython-312.pyc | Bin 4138 -> 4162 bytes .../__pycache__/validation.cpython-312.pyc | Bin 1281 -> 1305 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 243 bytes .../__pycache__/base.cpython-312.pyc | Bin 24754 -> 24679 bytes .../__pycache__/client.cpython-312.pyc | Bin 2981 -> 3005 bytes .../__pycache__/creation.cpython-312.pyc | Bin 5237 -> 5252 bytes .../__pycache__/features.cpython-312.pyc | Bin 7349 -> 7373 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 11799 -> 11840 bytes .../__pycache__/operations.cpython-312.pyc | Bin 18430 -> 18446 bytes .../__pycache__/psycopg_any.cpython-312.pyc | Bin 5692 -> 5706 bytes .../__pycache__/schema.cpython-312.pyc | Bin 13654 -> 13662 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 240 -> 240 bytes .../__pycache__/_functions.cpython-312.pyc | Bin 19421 -> 19421 bytes .../sqlite3/__pycache__/base.cpython-312.pyc | Bin 15756 -> 15713 bytes .../__pycache__/client.cpython-312.pyc | Bin 845 -> 845 bytes .../__pycache__/creation.cpython-312.pyc | Bin 8151 -> 8151 bytes .../__pycache__/features.cpython-312.pyc | Bin 6575 -> 6559 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 17066 -> 17059 bytes .../__pycache__/operations.cpython-312.pyc | Bin 21371 -> 21379 bytes .../__pycache__/schema.cpython-312.pyc | Bin 20382 -> 20358 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 341 -> 341 bytes .../__pycache__/autodetector.cpython-312.pyc | Bin 77217 -> 76898 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2809 -> 2809 bytes .../__pycache__/executor.cpython-312.pyc | Bin 19110 -> 19030 bytes .../__pycache__/graph.cpython-312.pyc | Bin 17933 -> 17906 bytes .../__pycache__/loader.cpython-312.pyc | Bin 17328 -> 17255 bytes .../__pycache__/migration.cpython-312.pyc | Bin 10069 -> 10020 bytes .../__pycache__/optimizer.cpython-312.pyc | Bin 3504 -> 3519 bytes .../__pycache__/questioner.cpython-312.pyc | Bin 15518 -> 15536 bytes .../__pycache__/recorder.cpython-312.pyc | Bin 6093 -> 6102 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 23599 -> 23594 bytes .../__pycache__/state.cpython-312.pyc | Bin 46096 -> 45921 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4973 -> 4963 bytes .../__pycache__/writer.cpython-312.pyc | Bin 14251 -> 14208 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1023 -> 1023 bytes .../__pycache__/base.cpython-312.pyc | Bin 7242 -> 7245 bytes .../__pycache__/fields.cpython-312.pyc | Bin 18350 -> 18350 bytes .../__pycache__/models.cpython-312.pyc | Bin 60236 -> 60237 bytes .../__pycache__/special.cpython-312.pyc | Bin 9820 -> 9791 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2666 -> 2666 bytes .../__pycache__/aggregates.cpython-312.pyc | Bin 10000 -> 9999 bytes .../models/__pycache__/base.cpython-312.pyc | Bin 96747 -> 96393 bytes .../__pycache__/constants.cpython-312.pyc | Bin 585 -> 585 bytes .../__pycache__/constraints.cpython-312.pyc | Bin 30791 -> 30774 bytes .../__pycache__/deletion.cpython-312.pyc | Bin 25315 -> 25197 bytes .../models/__pycache__/enums.cpython-312.pyc | Bin 6629 -> 6637 bytes .../__pycache__/expressions.cpython-312.pyc | Bin 102088 -> 102059 bytes .../__pycache__/indexes.cpython-312.pyc | Bin 15433 -> 15457 bytes .../__pycache__/lookups.cpython-312.pyc | Bin 39109 -> 39083 bytes .../__pycache__/manager.cpython-312.pyc | Bin 9260 -> 9255 bytes .../__pycache__/options.cpython-312.pyc | Bin 40538 -> 40432 bytes .../models/__pycache__/query.cpython-312.pyc | Bin 120213 -> 119982 bytes .../__pycache__/query_utils.cpython-312.pyc | Bin 21749 -> 21722 bytes .../__pycache__/signals.cpython-312.pyc | Bin 2292 -> 2292 bytes .../models/__pycache__/utils.cpython-312.pyc | Bin 3482 -> 3467 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 114977 -> 114920 bytes .../fields/__pycache__/files.cpython-312.pyc | Bin 22020 -> 22020 bytes .../__pycache__/generated.cpython-312.pyc | Bin 10121 -> 10105 bytes .../fields/__pycache__/json.cpython-312.pyc | Bin 31360 -> 31337 bytes .../fields/__pycache__/mixins.cpython-312.pyc | Bin 3952 -> 3952 bytes .../fields/__pycache__/proxy.cpython-312.pyc | Bin 1109 -> 1109 bytes .../__pycache__/related.cpython-312.pyc | Bin 83595 -> 83580 bytes .../related_descriptors.cpython-312.pyc | Bin 76323 -> 76182 bytes .../related_lookups.cpython-312.pyc | Bin 10305 -> 10306 bytes .../reverse_related.cpython-312.pyc | Bin 16713 -> 16714 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2541 -> 2541 bytes .../__pycache__/comparison.cpython-312.pyc | Bin 11896 -> 11901 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 17442 -> 17442 bytes .../__pycache__/math.cpython-312.pyc | Bin 9118 -> 9127 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 4069 -> 4079 bytes .../__pycache__/text.cpython-312.pyc | Bin 16527 -> 16539 bytes .../__pycache__/window.cpython-312.pyc | Bin 4828 -> 4828 bytes .../sql/__pycache__/__init__.cpython-312.pyc | Bin 486 -> 486 bytes .../sql/__pycache__/compiler.cpython-312.pyc | Bin 93261 -> 93086 bytes .../sql/__pycache__/constants.cpython-312.pyc | Bin 586 -> 586 bytes .../datastructures.cpython-312.pyc | Bin 10156 -> 10150 bytes .../sql/__pycache__/query.cpython-312.pyc | Bin 112989 -> 112830 bytes .../__pycache__/subqueries.cpython-312.pyc | Bin 8966 -> 8938 bytes .../sql/__pycache__/where.cpython-312.pyc | Bin 16752 -> 16706 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 547 -> 547 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 19985 -> 19926 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 571 -> 571 bytes .../__pycache__/boundfield.cpython-312.pyc | Bin 18565 -> 18570 bytes .../forms/__pycache__/fields.cpython-312.pyc | Bin 60811 -> 60729 bytes .../forms/__pycache__/forms.cpython-312.pyc | Bin 19132 -> 19117 bytes .../__pycache__/formsets.cpython-312.pyc | Bin 24110 -> 24115 bytes .../forms/__pycache__/models.cpython-312.pyc | Bin 64079 -> 63990 bytes .../__pycache__/renderers.cpython-312.pyc | Bin 5269 -> 5269 bytes .../forms/__pycache__/utils.cpython-312.pyc | Bin 12447 -> 12445 bytes .../forms/__pycache__/widgets.cpython-312.pyc | Bin 52627 -> 52590 bytes .../http/__pycache__/__init__.cpython-312.pyc | Bin 1136 -> 1136 bytes .../http/__pycache__/cookie.cpython-312.pyc | Bin 919 -> 914 bytes .../multipartparser.cpython-312.pyc | Bin 26381 -> 26326 bytes .../http/__pycache__/request.cpython-312.pyc | Bin 34746 -> 34734 bytes .../http/__pycache__/response.cpython-312.pyc | Bin 34149 -> 34115 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 231 -> 231 bytes .../__pycache__/cache.cpython-312.pyc | Bin 8918 -> 8916 bytes .../__pycache__/clickjacking.cpython-312.pyc | Bin 2228 -> 2252 bytes .../__pycache__/common.cpython-312.pyc | Bin 8466 -> 8487 bytes .../__pycache__/csrf.cpython-312.pyc | Bin 20341 -> 20351 bytes .../__pycache__/gzip.cpython-312.pyc | Bin 2968 -> 2987 bytes .../__pycache__/http.cpython-312.pyc | Bin 2243 -> 2270 bytes .../__pycache__/locale.cpython-312.pyc | Bin 3489 -> 3513 bytes .../__pycache__/security.cpython-312.pyc | Bin 4139 -> 4178 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1908 -> 1908 bytes .../__pycache__/autoreload.cpython-312.pyc | Bin 3411 -> 3379 bytes .../template/__pycache__/base.cpython-312.pyc | Bin 45329 -> 45249 bytes .../__pycache__/context.cpython-312.pyc | Bin 14120 -> 14091 bytes .../context_processors.cpython-312.pyc | Bin 3596 -> 3617 bytes .../defaultfilters.cpython-312.pyc | Bin 37756 -> 37738 bytes .../__pycache__/defaulttags.cpython-312.pyc | Bin 60110 -> 60057 bytes .../__pycache__/engine.cpython-312.pyc | Bin 9423 -> 9405 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1975 -> 1975 bytes .../__pycache__/library.cpython-312.pyc | Bin 14192 -> 14191 bytes .../__pycache__/loader.cpython-312.pyc | Bin 2739 -> 2724 bytes .../__pycache__/loader_tags.cpython-312.pyc | Bin 16752 -> 16736 bytes .../__pycache__/response.cpython-312.pyc | Bin 6308 -> 6298 bytes .../__pycache__/smartif.cpython-312.pyc | Bin 10842 -> 10828 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4750 -> 4755 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 238 -> 238 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 3650 -> 3645 bytes .../__pycache__/django.cpython-312.pyc | Bin 9598 -> 9574 bytes .../__pycache__/dummy.cpython-312.pyc | Bin 3015 -> 3029 bytes .../__pycache__/jinja2.cpython-312.pyc | Bin 6344 -> 6370 bytes .../__pycache__/utils.cpython-312.pyc | Bin 782 -> 806 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 213 -> 237 bytes .../app_directories.cpython-312.pyc | Bin 788 -> 812 bytes .../loaders/__pycache__/base.cpython-312.pyc | Bin 2262 -> 2281 bytes .../__pycache__/cached.cpython-312.pyc | Bin 5572 -> 5589 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 2473 -> 2488 bytes .../__pycache__/locmem.cpython-312.pyc | Bin 1415 -> 1439 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 233 -> 233 bytes .../__pycache__/cache.cpython-312.pyc | Bin 4559 -> 4588 bytes .../__pycache__/i18n.cpython-312.pyc | Bin 25789 -> 25788 bytes .../__pycache__/l10n.cpython-312.pyc | Bin 2923 -> 2947 bytes .../__pycache__/static.cpython-312.pyc | Bin 7161 -> 7161 bytes .../__pycache__/tz.cpython-312.pyc | Bin 7868 -> 7887 bytes .../test/__pycache__/__init__.cpython-312.pyc | Bin 890 -> 914 bytes .../test/__pycache__/client.cpython-312.pyc | Bin 54840 -> 54853 bytes .../test/__pycache__/html.cpython-312.pyc | Bin 11898 -> 11914 bytes .../test/__pycache__/runner.cpython-312.pyc | Bin 54090 -> 54044 bytes .../test/__pycache__/selenium.cpython-312.pyc | Bin 14651 -> 14592 bytes .../test/__pycache__/signals.cpython-312.pyc | Bin 8714 -> 8733 bytes .../__pycache__/testcases.cpython-312.pyc | Bin 82153 -> 81979 bytes .../test/__pycache__/utils.cpython-312.pyc | Bin 44500 -> 44363 bytes .../urls/__pycache__/__init__.cpython-312.pyc | Bin 1124 -> 1124 bytes .../urls/__pycache__/base.cpython-312.pyc | Bin 6622 -> 6610 bytes .../urls/__pycache__/conf.cpython-312.pyc | Bin 3364 -> 3359 bytes .../__pycache__/converters.cpython-312.pyc | Bin 3212 -> 3212 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 609 -> 609 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 36315 -> 36254 bytes .../urls/__pycache__/utils.cpython-312.pyc | Bin 2374 -> 2374 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 226 -> 226 bytes .../utils/__pycache__/_os.cpython-312.pyc | Bin 2894 -> 2887 bytes .../utils/__pycache__/archive.cpython-312.pyc | Bin 12360 -> 12341 bytes .../utils/__pycache__/asyncio.cpython-312.pyc | Bin 1535 -> 1535 bytes .../__pycache__/autoreload.cpython-312.pyc | Bin 32472 -> 32397 bytes .../utils/__pycache__/cache.cpython-312.pyc | Bin 16895 -> 16874 bytes .../utils/__pycache__/choices.cpython-312.pyc | Bin 5832 -> 5838 bytes .../__pycache__/connection.cpython-312.pyc | Bin 5347 -> 5347 bytes .../utils/__pycache__/crypto.cpython-312.pyc | Bin 3518 -> 3519 bytes .../datastructures.cpython-312.pyc | Bin 17370 -> 17363 bytes .../__pycache__/dateformat.cpython-312.pyc | Bin 16257 -> 16253 bytes .../__pycache__/dateparse.cpython-312.pyc | Bin 6578 -> 6584 bytes .../utils/__pycache__/dates.cpython-312.pyc | Bin 2378 -> 2378 bytes .../__pycache__/deconstruct.cpython-312.pyc | Bin 2510 -> 2510 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 9003 -> 8993 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 6686 -> 6672 bytes .../__pycache__/duration.cpython-312.pyc | Bin 1937 -> 1937 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 9197 -> 9178 bytes .../__pycache__/feedgenerator.cpython-312.pyc | Bin 19199 -> 19182 bytes .../utils/__pycache__/formats.cpython-312.pyc | Bin 10859 -> 10828 bytes .../__pycache__/functional.cpython-312.pyc | Bin 18785 -> 18765 bytes .../__pycache__/hashable.cpython-312.pyc | Bin 1105 -> 1111 bytes .../utils/__pycache__/html.cpython-312.pyc | Bin 20863 -> 20867 bytes .../utils/__pycache__/http.cpython-312.pyc | Bin 14587 -> 14572 bytes .../utils/__pycache__/inspect.cpython-312.pyc | Bin 4623 -> 4637 bytes .../utils/__pycache__/ipv6.cpython-312.pyc | Bin 2060 -> 2060 bytes .../__pycache__/itercompat.cpython-312.pyc | Bin 810 -> 834 bytes .../utils/__pycache__/jslex.cpython-312.pyc | Bin 9061 -> 9062 bytes .../utils/__pycache__/log.cpython-312.pyc | Bin 9726 -> 9726 bytes .../__pycache__/lorem_ipsum.cpython-312.pyc | Bin 5462 -> 5463 bytes .../module_loading.cpython-312.pyc | Bin 4085 -> 4075 bytes .../__pycache__/numberformat.cpython-312.pyc | Bin 3450 -> 3445 bytes .../__pycache__/regex_helper.cpython-312.pyc | Bin 11214 -> 11170 bytes .../__pycache__/safestring.cpython-312.pyc | Bin 3071 -> 3071 bytes .../__pycache__/termcolors.cpython-312.pyc | Bin 7492 -> 7484 bytes .../utils/__pycache__/text.cpython-312.pyc | Bin 21343 -> 21312 bytes .../__pycache__/timesince.cpython-312.pyc | Bin 5854 -> 5842 bytes .../__pycache__/timezone.cpython-312.pyc | Bin 9183 -> 9183 bytes .../utils/__pycache__/tree.cpython-312.pyc | Bin 5909 -> 5910 bytes .../utils/__pycache__/version.cpython-312.pyc | Bin 4901 -> 4897 bytes .../__pycache__/xmlutils.cpython-312.pyc | Bin 1935 -> 1959 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 12305 -> 12301 bytes .../__pycache__/reloader.cpython-312.pyc | Bin 2203 -> 2201 bytes .../__pycache__/template.cpython-312.pyc | Bin 9499 -> 9473 bytes .../__pycache__/trans_null.cpython-312.pyc | Bin 2301 -> 2325 bytes .../__pycache__/trans_real.cpython-312.pyc | Bin 27941 -> 27875 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 310 -> 310 bytes .../views/__pycache__/csrf.cpython-312.pyc | Bin 3933 -> 3949 bytes .../views/__pycache__/debug.cpython-312.pyc | Bin 29319 -> 29251 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 4781 -> 4805 bytes .../views/__pycache__/i18n.cpython-312.pyc | Bin 12009 -> 12012 bytes .../views/__pycache__/static.cpython-312.pyc | Bin 5575 -> 5586 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 237 -> 237 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3733 -> 3733 bytes .../__pycache__/clickjacking.cpython-312.pyc | Bin 3272 -> 3296 bytes .../__pycache__/common.cpython-312.pyc | Bin 1138 -> 1138 bytes .../__pycache__/csrf.cpython-312.pyc | Bin 3023 -> 3023 bytes .../__pycache__/debug.cpython-312.pyc | Bin 5384 -> 5384 bytes .../__pycache__/gzip.cpython-312.pyc | Bin 480 -> 504 bytes .../__pycache__/http.cpython-312.pyc | Bin 6974 -> 6998 bytes .../__pycache__/vary.cpython-312.pyc | Bin 1817 -> 1841 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1178 -> 1178 bytes .../generic/__pycache__/base.cpython-312.pyc | Bin 12202 -> 12202 bytes .../generic/__pycache__/dates.cpython-312.pyc | Bin 31599 -> 31599 bytes .../__pycache__/detail.cpython-312.pyc | Bin 7819 -> 7819 bytes .../generic/__pycache__/edit.cpython-312.pyc | Bin 12811 -> 12811 bytes .../generic/__pycache__/list.cpython-312.pyc | Bin 9345 -> 9345 bytes .../INSTALLER | 0 .../LICENSE.md | 29 + .../METADATA | 257 + .../RECORD | 344 + .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 2 + .../AUTHORS.txt | 42 +- .../INSTALLER} | 0 .../LICENSE.txt | 0 .../METADATA | 13 +- .../RECORD | 1877 +++-- .../REQUESTED | 0 .../site-packages/pip-24.2.dist-info/WHEEL | 5 + .../entry_points.txt | 1 - .../pip-24.2.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 2 +- .../site-packages/pip/__pip-runner__.py | 4 +- .../pip/__pycache__/__init__.cpython-312.pyc | Bin 702 -> 726 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 858 -> 882 bytes .../__pip-runner__.cpython-312.pyc | Bin 2221 -> 2246 bytes .../site-packages/pip/_internal/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 804 -> 828 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14311 -> 14513 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12682 -> 12708 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17683 -> 17673 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33301 -> 35594 bytes .../__pycache__/main.cpython-312.pyc | Bin 687 -> 711 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 4988 -> 5159 bytes .../self_outdated_check.cpython-312.pyc | Bin 10569 -> 10249 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13666 -> 13660 bytes .../site-packages/pip/_internal/build_env.py | 8 +- .../site-packages/pip/_internal/cache.py | 2 +- .../cli/__pycache__/__init__.cpython-312.pyc | Bin 295 -> 319 bytes .../autocompletion.cpython-312.pyc | Bin 8482 -> 8647 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10472 -> 10237 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30391 -> 30436 bytes .../command_context.cpython-312.pyc | Bin 1798 -> 1815 bytes .../__pycache__/index_command.cpython-312.pyc | Bin 0 -> 7165 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2315 -> 2341 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4922 -> 4947 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 15039 -> 15054 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 2637 -> 3875 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 18869 -> 12282 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7857 -> 7874 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 392 -> 416 bytes .../pip/_internal/cli/autocompletion.py | 4 + .../pip/_internal/cli/base_command.py | 127 +- .../pip/_internal/cli/cmdoptions.py | 9 +- .../pip/_internal/cli/index_command.py | 170 + .../site-packages/pip/_internal/cli/main.py | 1 + .../site-packages/pip/_internal/cli/parser.py | 6 +- .../pip/_internal/cli/progress_bars.py | 28 +- .../pip/_internal/cli/req_command.py | 198 +- .../__pycache__/__init__.cpython-312.pyc | Bin 4019 -> 4043 bytes .../__pycache__/cache.cpython-312.pyc | Bin 9728 -> 9742 bytes .../__pycache__/check.cpython-312.pyc | Bin 2107 -> 2633 bytes .../__pycache__/completion.cpython-312.pyc | Bin 5209 -> 5234 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 13229 -> 13204 bytes .../__pycache__/debug.cpython-312.pyc | Bin 10178 -> 10109 bytes .../__pycache__/download.cpython-312.pyc | Bin 7606 -> 7544 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4373 -> 4426 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 3000 -> 3009 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 1690 -> 1714 bytes .../__pycache__/index.cpython-312.pyc | Bin 6737 -> 6712 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 3992 -> 4021 bytes .../__pycache__/install.cpython-312.pyc | Bin 28930 -> 29155 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 15417 -> 15798 bytes .../__pycache__/search.cpython-312.pyc | Bin 7638 -> 7559 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 9745 -> 10518 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4743 -> 4750 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 8973 -> 8906 bytes .../pip/_internal/commands/check.py | 21 +- .../pip/_internal/commands/debug.py | 4 +- .../pip/_internal/commands/download.py | 1 - .../pip/_internal/commands/freeze.py | 1 + .../pip/_internal/commands/index.py | 6 +- .../pip/_internal/commands/inspect.py | 2 +- .../pip/_internal/commands/install.py | 43 +- .../pip/_internal/commands/list.py | 25 +- .../pip/_internal/commands/search.py | 8 +- .../pip/_internal/commands/show.py | 38 +- .../pip/_internal/commands/uninstall.py | 3 +- .../pip/_internal/commands/wheel.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 958 -> 982 bytes .../__pycache__/base.cpython-312.pyc | Bin 2879 -> 2934 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1717 -> 1741 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8505 -> 8480 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2265 -> 2322 bytes .../pip/_internal/distributions/base.py | 8 +- .../pip/_internal/distributions/sdist.py | 14 +- .../pip/_internal/distributions/wheel.py | 8 +- .../site-packages/pip/_internal/exceptions.py | 67 +- .../__pycache__/__init__.cpython-312.pyc | Bin 249 -> 273 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21903 -> 21658 bytes .../package_finder.cpython-312.pyc | Bin 40752 -> 40689 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12621 -> 12629 bytes .../pip/_internal/index/collector.py | 47 +- .../pip/_internal/index/package_finder.py | 61 +- .../pip/_internal/locations/__init__.py | 11 - .../__pycache__/__init__.cpython-312.pyc | Bin 16793 -> 16481 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 6873 -> 6893 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 8028 -> 8069 bytes .../__pycache__/base.cpython-312.pyc | Bin 3798 -> 3822 bytes .../pip/_internal/locations/_sysconfig.py | 5 +- .../__pycache__/__init__.cpython-312.pyc | Bin 5899 -> 5917 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2892 -> 2967 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35729 -> 35239 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 15807 -> 16125 bytes .../pip/_internal/metadata/_json.py | 4 +- .../pip/_internal/metadata/base.py | 56 +- .../__pycache__/__init__.cpython-312.pyc | Bin 375 -> 399 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 3350 -> 4532 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 13442 -> 12606 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11197 -> 11120 bytes .../_internal/metadata/importlib/_compat.py | 38 +- .../_internal/metadata/importlib/_dists.py | 52 +- .../pip/_internal/metadata/importlib/_envs.py | 14 +- .../pip/_internal/metadata/pkg_resources.py | 45 +- .../__pycache__/__init__.cpython-312.pyc | Bin 283 -> 307 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1922 -> 1645 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 11216 -> 10885 bytes .../format_control.cpython-312.pyc | Bin 4244 -> 4264 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1711 -> 1735 bytes .../installation_report.cpython-312.pyc | Bin 2289 -> 2318 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 26019 -> 26658 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1186 -> 1064 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5105 -> 5028 bytes .../selection_prefs.cpython-312.pyc | Bin 1868 -> 1892 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4971 -> 4994 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5797 -> 5801 bytes .../pip/_internal/models/candidate.py | 29 +- .../pip/_internal/models/direct_url.py | 41 +- .../pip/_internal/models/link.py | 19 +- .../pip/_internal/models/scheme.py | 20 +- .../pip/_internal/models/search_scope.py | 17 +- .../pip/_internal/models/selection_prefs.py | 2 + .../pip/_internal/models/target_python.py | 1 - .../pip/_internal/models/wheel.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 271 -> 295 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 22013 -> 22140 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6535 -> 6501 bytes .../__pycache__/download.cpython-312.pyc | Bin 8570 -> 8520 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11680 -> 11658 bytes .../__pycache__/session.cpython-312.pyc | Bin 18791 -> 18915 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2270 -> 2296 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 2966 -> 2990 bytes .../pip/_internal/network/auth.py | 15 +- .../pip/_internal/network/download.py | 7 +- .../pip/_internal/network/session.py | 4 +- .../pip/_internal/network/utils.py | 6 +- .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../__pycache__/check.cpython-312.pyc | Bin 7596 -> 7145 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10134 -> 10169 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25764 -> 25832 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 220 -> 244 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 7840 -> 7708 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 1897 -> 1898 bytes .../metadata_editable.cpython-312.pyc | Bin 1931 -> 1932 bytes .../metadata_legacy.cpython-312.pyc | Bin 3082 -> 3052 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 1701 -> 1718 bytes .../wheel_editable.cpython-312.pyc | Bin 2042 -> 2059 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 3946 -> 3891 bytes .../operations/build/build_tracker.py | 5 +- .../operations/build/metadata_legacy.py | 2 +- .../operations/build/wheel_legacy.py | 8 +- .../pip/_internal/operations/check.py | 80 +- .../pip/_internal/operations/freeze.py | 11 +- .../__pycache__/__init__.cpython-312.pyc | Bin 283 -> 307 bytes .../editable_legacy.cpython-312.pyc | Bin 1834 -> 1839 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 33876 -> 34146 bytes .../operations/install/editable_legacy.py | 1 + .../pip/_internal/operations/install/wheel.py | 59 +- .../pip/_internal/operations/prepare.py | 14 +- .../site-packages/pip/_internal/pyproject.py | 14 +- .../pip/_internal/req/__init__.py | 8 +- .../req/__pycache__/__init__.cpython-312.pyc | Bin 3760 -> 3486 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21599 -> 21261 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21478 -> 21473 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38431 -> 38525 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 7235 -> 5524 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32994 -> 32135 bytes .../pip/_internal/req/constructors.py | 52 +- .../pip/_internal/req/req_file.py | 25 +- .../pip/_internal/req/req_install.py | 41 +- .../pip/_internal/req/req_set.py | 37 - .../pip/_internal/req/req_uninstall.py | 28 +- .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 238 bytes .../__pycache__/base.cpython-312.pyc | Bin 1202 -> 1226 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 245 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 22456 -> 22620 bytes .../_internal/resolution/legacy/resolver.py | 25 +- .../__pycache__/__init__.cpython-312.pyc | Bin 225 -> 249 bytes .../__pycache__/base.cpython-312.pyc | Bin 8354 -> 8190 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 30415 -> 29213 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32131 -> 32327 bytes .../found_candidates.cpython-312.pyc | Bin 6225 -> 6834 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10395 -> 10564 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 4952 -> 5081 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 11446 -> 15397 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12368 -> 12355 bytes .../_internal/resolution/resolvelib/base.py | 18 +- .../resolution/resolvelib/candidates.py | 122 +- .../resolution/resolvelib/factory.py | 25 +- .../resolution/resolvelib/found_candidates.py | 29 +- .../resolution/resolvelib/provider.py | 3 + .../resolution/resolvelib/reporter.py | 1 + .../resolution/resolvelib/requirements.py | 79 + .../pip/_internal/self_outdated_check.py | 28 +- .../__pycache__/__init__.cpython-312.pyc | Bin 209 -> 233 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4550 -> 4568 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1880 -> 1904 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2424 -> 2448 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2227 -> 2945 bytes .../compatibility_tags.cpython-312.pyc | Bin 5575 -> 5601 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 698 -> 722 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4200 -> 4229 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3577 -> 3574 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3240 -> 3244 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2172 -> 2186 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 4007 -> 4031 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7472 -> 7367 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1178 -> 1202 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2356 -> 2457 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7568 -> 7646 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13571 -> 13596 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 34135 -> 33589 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 2726 -> 0 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2597 -> 2621 bytes .../utils/__pycache__/retry.cpython-312.pyc | Bin 0 -> 2146 bytes .../setuptools_build.cpython-312.pyc | Bin 4564 -> 4588 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8732 -> 8677 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12076 -> 12062 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 11122 -> 13536 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2419 -> 2115 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4494 -> 4509 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5940 -> 5941 bytes .../pip/_internal/utils/_jaraco_text.py | 2 +- .../pip/_internal/utils/compat.py | 16 + .../pip/_internal/utils/deprecation.py | 16 +- .../pip/_internal/utils/direct_url_helpers.py | 4 +- .../pip/_internal/utils/filesystem.py | 8 +- .../pip/_internal/utils/glibc.py | 17 +- .../pip/_internal/utils/hashes.py | 8 +- .../pip/_internal/utils/logging.py | 3 +- .../site-packages/pip/_internal/utils/misc.py | 96 +- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 2 +- .../pip/_internal/utils/retry.py | 42 + .../pip/_internal/utils/subprocess.py | 17 +- .../pip/_internal/utils/temp_dir.py | 2 +- .../pip/_internal/utils/unpacking.py | 178 +- .../site-packages/pip/_internal/utils/urls.py | 7 - .../pip/_internal/utils/wheel.py | 2 +- .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 548 -> 572 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5040 -> 5093 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 19009 -> 19058 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7629 -> 7646 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12501 -> 12565 bytes .../versioncontrol.cpython-312.pyc | Bin 29027 -> 29038 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 8 +- .../site-packages/pip/_internal/vcs/git.py | 3 +- .../pip/_internal/vcs/subversion.py | 6 +- .../pip/_internal/vcs/versioncontrol.py | 49 +- .../pip/_internal/wheel_builder.py | 2 +- .../site-packages/pip/_vendor/__init__.py | 11 +- .../__pycache__/__init__.cpython-312.pyc | Bin 4710 -> 4591 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 41287 -> 0 bytes .../typing_extensions.cpython-312.pyc | Bin 122067 -> 139493 bytes .../pip/_vendor/cachecontrol/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 920 -> 944 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 2664 -> 2688 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6482 -> 6506 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3827 -> 3829 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16185 -> 16266 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4365 -> 4389 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 6712 -> 6736 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 6423 -> 5303 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1692 -> 1716 bytes .../pip/_vendor/cachecontrol/adapter.py | 10 +- .../__pycache__/__init__.cpython-312.pyc | Bin 453 -> 477 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7728 -> 7810 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2756 -> 2775 bytes .../_vendor/cachecontrol/caches/file_cache.py | 7 +- .../pip/_vendor/cachecontrol/controller.py | 7 +- .../pip/_vendor/cachecontrol/heuristics.py | 2 +- .../pip/_vendor/cachecontrol/serialize.py | 76 +- .../pip/_vendor/certifi/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 336 -> 360 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 663 -> 687 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2867 -> 3258 bytes .../pip/_vendor/certifi/cacert.pem | 385 +- .../site-packages/pip/_vendor/certifi/core.py | 6 + .../pip/_vendor/chardet/__init__.py | 115 - .../__pycache__/__init__.cpython-312.pyc | Bin 4586 -> 0 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 27217 -> 0 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 1405 -> 0 bytes .../chardistribution.cpython-312.pyc | Bin 9656 -> 0 bytes .../charsetgroupprober.cpython-312.pyc | Bin 4140 -> 0 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 5036 -> 0 bytes .../codingstatemachine.cpython-312.pyc | Bin 3896 -> 0 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 807 -> 0 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 1414 -> 0 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 3014 -> 0 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 4584 -> 0 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 15328 -> 0 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 4401 -> 0 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 12100 -> 0 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 1408 -> 0 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 27222 -> 0 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 1408 -> 0 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 19144 -> 0 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 1421 -> 0 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 5840 -> 0 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 22173 -> 0 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 83021 -> 0 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 1412 -> 0 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 39567 -> 0 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 83140 -> 0 bytes .../langgreekmodel.cpython-312.pyc | Bin 77006 -> 0 bytes .../langhebrewmodel.cpython-312.pyc | Bin 77517 -> 0 bytes .../langhungarianmodel.cpython-312.pyc | Bin 83094 -> 0 bytes .../langrussianmodel.cpython-312.pyc | Bin 105269 -> 0 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 77695 -> 0 bytes .../langturkishmodel.cpython-312.pyc | Bin 77534 -> 0 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 7020 -> 0 bytes .../macromanprober.cpython-312.pyc | Bin 7200 -> 0 bytes .../mbcharsetprober.cpython-312.pyc | Bin 3921 -> 0 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 1606 -> 0 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 38663 -> 0 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 650 -> 0 bytes .../sbcharsetprober.cpython-312.pyc | Bin 6405 -> 0 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 2375 -> 0 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 4513 -> 0 bytes .../universaldetector.cpython-312.pyc | Bin 12287 -> 0 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 9997 -> 0 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 3193 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 506 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 -- .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 261 - .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../pip/_vendor/chardet/charsetprober.py | 147 - .../cli/__pycache__/__init__.cpython-312.pyc | Bin 213 -> 0 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 4030 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 - .../pip/_vendor/chardet/codingstatemachine.py | 90 - .../_vendor/chardet/codingstatemachinedict.py | 19 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 85 - .../pip/_vendor/chardet/escprober.py | 102 - .../pip/_vendor/chardet/escsm.py | 261 - .../pip/_vendor/chardet/eucjpprober.py | 102 - .../pip/_vendor/chardet/euckrfreq.py | 196 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 388 -- .../pip/_vendor/chardet/euctwprober.py | 47 - .../pip/_vendor/chardet/gb2312freq.py | 284 - .../pip/_vendor/chardet/gb2312prober.py | 47 - .../pip/_vendor/chardet/hebrewprober.py | 316 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/johabfreq.py | 2382 ------- .../pip/_vendor/chardet/johabprober.py | 47 - .../pip/_vendor/chardet/jpcntx.py | 238 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 ------------- .../pip/_vendor/chardet/langgreekmodel.py | 4397 ------------ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 ------------ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 ------------- .../pip/_vendor/chardet/langrussianmodel.py | 5725 --------------- .../pip/_vendor/chardet/langthaimodel.py | 4380 ------------ .../pip/_vendor/chardet/langturkishmodel.py | 4380 ------------ .../pip/_vendor/chardet/latin1prober.py | 147 - .../pip/_vendor/chardet/macromanprober.py | 162 - .../pip/_vendor/chardet/mbcharsetprober.py | 95 - .../pip/_vendor/chardet/mbcsgroupprober.py | 57 - .../pip/_vendor/chardet/mbcssm.py | 661 -- .../__pycache__/__init__.cpython-312.pyc | Bin 218 -> 0 bytes .../__pycache__/languages.cpython-312.pyc | Bin 9773 -> 0 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 - .../pip/_vendor/chardet/resultdict.py | 16 - .../pip/_vendor/chardet/sbcharsetprober.py | 162 - .../pip/_vendor/chardet/sbcsgroupprober.py | 88 - .../pip/_vendor/chardet/sjisprober.py | 105 - .../pip/_vendor/chardet/universaldetector.py | 362 - .../pip/_vendor/chardet/utf1632prober.py | 225 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 510 -> 0 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 3968 -> 0 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 16439 -> 0 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 3568 -> 0 bytes .../__pycache__/win32.cpython-312.pyc | Bin 8144 -> 0 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 9106 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 277 - .../pip/_vendor/colorama/initialise.py | 121 - .../pip/_vendor/colorama/tests/__init__.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 0 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 5485 -> 0 bytes .../ansitowin32_test.cpython-312.pyc | Bin 18121 -> 0 bytes .../initialise_test.cpython-312.pyc | Bin 11766 -> 0 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 4922 -> 0 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 2506 -> 0 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 6630 -> 0 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 - .../colorama/tests/ansitowin32_test.py | 294 - .../_vendor/colorama/tests/initialise_test.py | 189 - .../pip/_vendor/colorama/tests/isatty_test.py | 57 - .../pip/_vendor/colorama/tests/utils.py | 49 - .../_vendor/colorama/tests/winterm_test.py | 131 - .../pip/_vendor/colorama/win32.py | 180 - .../pip/_vendor/colorama/winterm.py | 195 - .../__pycache__/__init__.cpython-312.pyc | Bin 1287 -> 1311 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45623 -> 45573 bytes .../__pycache__/database.cpython-312.pyc | Bin 66045 -> 65727 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 24384 -> 24358 bytes .../__pycache__/locators.cpython-312.pyc | Bin 60176 -> 59972 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 15143 -> 15118 bytes .../__pycache__/markers.cpython-312.pyc | Bin 7700 -> 7720 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 41817 -> 41708 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17343 -> 17359 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19598 -> 19816 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88274 -> 88059 bytes .../__pycache__/version.cpython-312.pyc | Bin 30384 -> 30387 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 51879 -> 51496 bytes .../pip/_vendor/distlib/scripts.py | 26 +- .../__pycache__/__init__.cpython-312.pyc | Bin 978 -> 1002 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 310 -> 334 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53772 -> 53850 bytes .../pip/_vendor/distro/distro.py | 12 +- .../idna/__pycache__/__init__.cpython-312.pyc | Bin 899 -> 923 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4651 -> 5018 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 905 -> 929 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16300 -> 15833 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 38400 -> 99518 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2656 -> 2675 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 234 -> 258 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158888 -> 158890 bytes .../site-packages/pip/_vendor/idna/codec.py | 34 +- .../site-packages/pip/_vendor/idna/core.py | 33 +- .../pip/_vendor/idna/idnadata.py | 2206 +++++- .../pip/_vendor/idna/package_data.py | 2 +- .../pip/_vendor/idna/uts46data.py | 454 +- .../pip/_vendor/msgpack/__init__.py | 8 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1849 -> 1783 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2043 -> 2067 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8686 -> 8212 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 43594 -> 42085 bytes .../site-packages/pip/_vendor/msgpack/ext.py | 55 +- .../pip/_vendor/msgpack/fallback.py | 147 +- .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 30 +- .../__pycache__/__about__.cpython-312.pyc | Bin 648 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 484 -> 600 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 5009 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 12094 -> 9737 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 6928 -> 4596 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 14027 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3259 -> 3283 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7957 bytes .../__pycache__/markers.cpython-312.pyc | Bin 14076 -> 11053 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 24995 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 6964 -> 4452 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 31265 -> 38781 bytes .../__pycache__/tags.cpython-312.pyc | Bin 18974 -> 21386 bytes .../__pycache__/utils.cpython-312.pyc | Bin 5886 -> 7383 bytes .../__pycache__/version.cpython-312.pyc | Bin 19957 -> 19549 bytes .../pip/_vendor/packaging/_elffile.py | 110 + .../pip/_vendor/packaging/_manylinux.py | 237 +- .../pip/_vendor/packaging/_musllinux.py | 97 +- .../pip/_vendor/packaging/_parser.py | 354 + .../pip/_vendor/packaging/_tokenizer.py | 194 + .../pip/_vendor/packaging/markers.py | 271 +- .../pip/_vendor/packaging/metadata.py | 804 +++ .../pip/_vendor/packaging/requirements.py | 153 +- .../pip/_vendor/packaging/specifiers.py | 995 +-- .../pip/_vendor/packaging/tags.py | 175 +- .../pip/_vendor/packaging/utils.py | 58 +- .../pip/_vendor/packaging/version.py | 427 +- .../pip/_vendor/pkg_resources/__init__.py | 1091 +-- .../__pycache__/__init__.cpython-312.pyc | Bin 146492 -> 161323 bytes .../pip/_vendor/platformdirs/__init__.py | 137 +- .../pip/_vendor/platformdirs/__main__.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 18047 -> 19871 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1964 -> 1990 bytes .../__pycache__/android.cpython-312.pyc | Bin 9462 -> 10739 bytes .../__pycache__/api.cpython-312.pyc | Bin 9690 -> 12953 bytes .../__pycache__/macos.cpython-312.pyc | Bin 5655 -> 8049 bytes .../__pycache__/unix.cpython-312.pyc | Bin 12459 -> 15079 bytes .../__pycache__/version.cpython-312.pyc | Bin 329 -> 639 bytes .../__pycache__/windows.cpython-312.pyc | Bin 13017 -> 13716 bytes .../pip/_vendor/platformdirs/android.py | 79 +- .../pip/_vendor/platformdirs/api.py | 105 +- .../pip/_vendor/platformdirs/macos.py | 51 +- .../pip/_vendor/platformdirs/unix.py | 122 +- .../pip/_vendor/platformdirs/version.py | 16 +- .../pip/_vendor/platformdirs/windows.py | 49 +- .../pip/_vendor/pygments/__init__.py | 4 +- .../pip/_vendor/pygments/__main__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 3507 -> 3531 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 753 -> 777 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26624 -> 26627 bytes .../__pycache__/console.cpython-312.pyc | Bin 2645 -> 2671 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3251 -> 3264 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4588 -> 4763 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38348 -> 38404 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1587 -> 1602 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 3415 -> 2651 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4100 -> 4120 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4775 -> 4799 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 11065 -> 12141 bytes .../__pycache__/style.cpython-312.pyc | Bin 6693 -> 6736 bytes .../__pycache__/token.cpython-312.pyc | Bin 8161 -> 8232 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 33007 -> 33015 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 14000 -> 14112 bytes .../pip/_vendor/pygments/cmdline.py | 28 +- .../pip/_vendor/pygments/console.py | 10 +- .../pip/_vendor/pygments/filter.py | 5 +- .../pip/_vendor/pygments/filters/__init__.py | 8 +- .../__pycache__/__init__.cpython-312.pyc | Bin 37955 -> 37954 bytes .../pip/_vendor/pygments/formatter.py | 7 +- .../_vendor/pygments/formatters/__init__.py | 15 +- .../__pycache__/__init__.cpython-312.pyc | Bin 6945 -> 6945 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4234 -> 4258 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4213 -> 4265 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7283 -> 7336 bytes .../__pycache__/html.cpython-312.pyc | Bin 40591 -> 41069 bytes .../__pycache__/img.cpython-312.pyc | Bin 27062 -> 28591 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6084 -> 6098 bytes .../__pycache__/latex.cpython-312.pyc | Bin 19973 -> 20168 bytes .../__pycache__/other.cpython-312.pyc | Bin 6903 -> 6920 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2949 -> 3001 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 6145 -> 13816 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9085 -> 9182 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5848 -> 5862 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15176 -> 15161 bytes .../pip/_vendor/pygments/formatters/bbcode.py | 4 +- .../pip/_vendor/pygments/formatters/groff.py | 6 +- .../pip/_vendor/pygments/formatters/html.py | 78 +- .../pip/_vendor/pygments/formatters/img.py | 62 +- .../pip/_vendor/pygments/formatters/irc.py | 2 +- .../pip/_vendor/pygments/formatters/latex.py | 51 +- .../pip/_vendor/pygments/formatters/other.py | 7 +- .../pygments/formatters/pangomarkup.py | 4 +- .../pip/_vendor/pygments/formatters/rtf.py | 253 +- .../pip/_vendor/pygments/formatters/svg.py | 37 +- .../_vendor/pygments/formatters/terminal.py | 2 +- .../pygments/formatters/terminal256.py | 2 +- .../pip/_vendor/pygments/lexer.py | 88 +- .../pip/_vendor/pygments/lexers/__init__.py | 24 +- .../__pycache__/__init__.cpython-312.pyc | Bin 14671 -> 14664 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 64423 -> 68306 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42658 -> 43010 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 52 +- .../pip/_vendor/pygments/lexers/python.py | 48 +- .../pip/_vendor/pygments/modeline.py | 8 +- .../pip/_vendor/pygments/plugin.py | 22 +- .../pip/_vendor/pygments/regexopt.py | 2 +- .../pip/_vendor/pygments/scanner.py | 2 +- .../pip/_vendor/pygments/sphinxext.py | 46 +- .../pip/_vendor/pygments/style.py | 10 +- .../pip/_vendor/pygments/styles/__init__.py | 76 +- .../__pycache__/__init__.cpython-312.pyc | Bin 4467 -> 2707 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 3691 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 + .../pip/_vendor/pygments/token.py | 3 +- .../pip/_vendor/pygments/unistring.py | 10 +- .../pip/_vendor/pygments/util.py | 32 +- .../pip/_vendor/pyparsing/__init__.py | 322 - .../__pycache__/__init__.cpython-312.pyc | Bin 7930 -> 0 bytes .../__pycache__/actions.cpython-312.pyc | Bin 8414 -> 0 bytes .../__pycache__/common.cpython-312.pyc | Bin 13433 -> 0 bytes .../__pycache__/core.cpython-312.pyc | Bin 267727 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13013 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 48520 -> 0 bytes .../__pycache__/results.cpython-312.pyc | Bin 34129 -> 0 bytes .../__pycache__/testing.cpython-312.pyc | Bin 17207 -> 0 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 13203 -> 0 bytes .../__pycache__/util.cpython-312.pyc | Bin 14923 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 217 - .../pip/_vendor/pyparsing/common.py | 432 -- .../pip/_vendor/pyparsing/core.py | 6115 ----------------- .../pip/_vendor/pyparsing/diagram/__init__.py | 656 -- .../__pycache__/__init__.cpython-312.pyc | Bin 26832 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 - .../pip/_vendor/pyparsing/helpers.py | 1100 --- .../pip/_vendor/pyparsing/results.py | 796 --- .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 361 - .../pip/_vendor/pyparsing/util.py | 284 - .../__pycache__/__init__.cpython-312.pyc | Bin 632 -> 656 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 393 -> 417 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14744 -> 14743 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1099 -> 1123 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 14416 -> 14401 bytes .../pip/_vendor/requests/__init__.py | 9 +- .../__pycache__/__init__.cpython-312.pyc | Bin 5472 -> 5296 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 603 -> 627 bytes .../_internal_utils.cpython-312.pyc | Bin 2043 -> 2067 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 21299 -> 28474 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7223 -> 7241 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13942 -> 13964 bytes .../__pycache__/certs.cpython-312.pyc | Bin 941 -> 965 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1526 -> 1720 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25265 -> 25241 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7066 -> 7641 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4331 -> 4271 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1071 -> 1094 bytes .../__pycache__/models.cpython-312.pyc | Bin 35467 -> 35471 bytes .../__pycache__/packages.cpython-312.pyc | Bin 791 -> 1309 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27776 -> 27889 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 5978 -> 6066 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5636 -> 5666 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36288 -> 36409 bytes .../pip/_vendor/requests/__version__.py | 6 +- .../pip/_vendor/requests/adapters.py | 219 +- .../site-packages/pip/_vendor/requests/api.py | 2 +- .../pip/_vendor/requests/auth.py | 1 - .../pip/_vendor/requests/compat.py | 15 +- .../pip/_vendor/requests/cookies.py | 16 +- .../pip/_vendor/requests/exceptions.py | 10 + .../pip/_vendor/requests/help.py | 6 +- .../pip/_vendor/requests/models.py | 13 +- .../pip/_vendor/requests/packages.py | 13 +- .../pip/_vendor/requests/sessions.py | 12 +- .../pip/_vendor/requests/status_codes.py | 10 +- .../pip/_vendor/requests/utils.py | 16 +- .../__pycache__/__init__.cpython-312.pyc | Bin 653 -> 677 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6870 -> 6894 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2673 -> 2697 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25916 -> 25923 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10525 -> 10543 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 243 bytes .../collections_abc.cpython-312.pyc | Bin 439 -> 463 bytes .../pip/_vendor/rich/__main__.py | 1 - .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7034 -> 7058 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10323 -> 10335 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7840 -> 7915 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205995 -> 206019 bytes .../_emoji_replace.cpython-312.pyc | Bin 1748 -> 1772 bytes .../_export_format.cpython-312.pyc | Bin 2340 -> 2392 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 556 -> 580 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 874 -> 898 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12096 -> 12116 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4166 -> 4190 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1904 -> 1913 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3639 -> 3663 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5179 -> 5203 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 745 -> 764 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6598 -> 6613 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13198 -> 13222 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 984 -> 1008 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 884 -> 908 bytes .../_win32_console.cpython-312.pyc | Bin 28995 -> 29019 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2509 -> 2533 bytes .../_windows_renderer.cpython-312.pyc | Bin 3592 -> 3606 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 2379 -> 3369 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1627 -> 1651 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12341 -> 12330 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9125 -> 9109 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4291 -> 4315 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11877 -> 11881 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5637 -> 5853 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26589 -> 26612 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1720 -> 1744 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8606 -> 8627 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113812 -> 113484 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2277 -> 2301 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9245 -> 9253 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10948 -> 10984 bytes .../default_styles.cpython-312.pyc | Bin 10392 -> 10409 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1506 -> 1531 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4228 -> 4255 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1864 -> 1888 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3596 -> 3614 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3101 -> 3115 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9917 -> 9930 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6054 -> 6078 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5228 -> 5251 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20239 -> 20201 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19162 -> 19058 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4913 -> 4932 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13573 -> 13597 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9317 -> 9610 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6395 -> 6421 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7153 -> 7167 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1839 -> 1854 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5333 -> 5340 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12116 -> 12226 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40075 -> 40190 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75097 -> 75016 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10408 -> 10420 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 14800 -> 14830 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1811 -> 1835 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 586 -> 610 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6645 -> 6656 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6587 -> 6611 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3849 -> 3868 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2503 -> 2522 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28180 -> 28158 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6083 -> 6107 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6087 -> 6104 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33533 -> 33543 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2158 -> 2182 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39631 -> 39991 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43603 -> 43582 bytes .../terminal_theme.cpython-312.pyc | Bin 3367 -> 3391 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 58982 -> 60892 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6359 -> 6385 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 333 -> 357 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31567 -> 31554 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11458 -> 11479 bytes .../pip/_vendor/rich/_cell_widths.py | 367 +- .../pip/_vendor/rich/_export_format.py | 4 +- .../site-packages/pip/_vendor/rich/_ratio.py | 1 - .../pip/_vendor/rich/_windows.py | 1 - .../site-packages/pip/_vendor/rich/_wrap.py | 73 +- .../site-packages/pip/_vendor/rich/align.py | 2 +- .../site-packages/pip/_vendor/rich/bar.py | 1 - .../site-packages/pip/_vendor/rich/box.py | 345 +- .../site-packages/pip/_vendor/rich/cells.py | 55 +- .../site-packages/pip/_vendor/rich/color.py | 1 - .../site-packages/pip/_vendor/rich/console.py | 2 +- .../pip/_vendor/rich/containers.py | 8 +- .../pip/_vendor/rich/highlighter.py | 2 +- .../site-packages/pip/_vendor/rich/json.py | 1 - .../site-packages/pip/_vendor/rich/layout.py | 3 +- .../site-packages/pip/_vendor/rich/live.py | 2 +- .../pip/_vendor/rich/live_render.py | 1 - .../site-packages/pip/_vendor/rich/markup.py | 7 +- .../site-packages/pip/_vendor/rich/panel.py | 4 + .../site-packages/pip/_vendor/rich/pretty.py | 15 +- .../pip/_vendor/rich/progress.py | 7 +- .../pip/_vendor/rich/progress_bar.py | 1 - .../site-packages/pip/_vendor/rich/prompt.py | 3 +- .../site-packages/pip/_vendor/rich/repr.py | 2 +- .../site-packages/pip/_vendor/rich/segment.py | 1 - .../site-packages/pip/_vendor/rich/status.py | 1 - .../site-packages/pip/_vendor/rich/syntax.py | 12 +- .../site-packages/pip/_vendor/rich/table.py | 4 +- .../site-packages/pip/_vendor/rich/text.py | 116 +- .../pip/_vendor/rich/traceback.py | 3 - .../site-packages/pip/_vendor/rich/tree.py | 2 - .../site-packages/pip/_vendor/six.py | 998 --- .../pip/_vendor/tenacity/__init__.py | 608 -- .../__pycache__/__init__.cpython-312.pyc | Bin 27105 -> 0 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 4825 -> 0 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 2334 -> 0 bytes .../__pycache__/after.cpython-312.pyc | Bin 1643 -> 0 bytes .../__pycache__/before.cpython-312.pyc | Bin 1483 -> 0 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 2321 -> 0 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 1431 -> 0 bytes .../__pycache__/retry.cpython-312.pyc | Bin 14300 -> 0 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 5587 -> 0 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 2605 -> 0 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 12432 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 - .../pip/_vendor/tenacity/_utils.py | 76 - .../pip/_vendor/tenacity/after.py | 51 - .../pip/_vendor/tenacity/before.py | 46 - .../pip/_vendor/tenacity/before_sleep.py | 71 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 272 - .../pip/_vendor/tenacity/stop.py | 103 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 228 - .../__pycache__/__init__.cpython-312.pyc | Bin 403 -> 427 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26946 -> 26942 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3927 -> 3951 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 385 -> 409 bytes .../pip/_vendor/truststore/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 637 -> 661 bytes .../__pycache__/_api.cpython-312.pyc | Bin 15816 -> 16583 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 16681 -> 16615 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 2234 -> 2248 bytes .../_ssl_constants.cpython-312.pyc | Bin 1118 -> 1142 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 15525 -> 15783 bytes .../pip/_vendor/truststore/_api.py | 41 +- .../pip/_vendor/truststore/_macos.py | 14 +- .../pip/_vendor/truststore/_windows.py | 30 +- .../pip/_vendor/typing_extensions.py | 1557 +++-- .../__pycache__/__init__.cpython-312.pyc | Bin 3424 -> 3448 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 15950 -> 16422 bytes .../__pycache__/_version.cpython-312.pyc | Bin 237 -> 261 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20426 -> 20446 bytes .../connectionpool.cpython-312.pyc | Bin 36298 -> 36480 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13512 -> 13536 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10428 -> 10445 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4037 -> 4055 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20321 -> 20475 bytes .../__pycache__/request.cpython-312.pyc | Bin 7313 -> 7337 bytes .../__pycache__/response.cpython-312.pyc | Bin 33987 -> 33990 bytes .../pip/_vendor/urllib3/_collections.py | 18 + .../pip/_vendor/urllib3/_version.py | 2 +- .../pip/_vendor/urllib3/connectionpool.py | 5 + .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 241 bytes .../_appengine_environ.cpython-312.pyc | Bin 1867 -> 1891 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 11583 -> 11607 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 5738 -> 5757 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 24469 -> 24491 bytes .../securetransport.cpython-312.pyc | Bin 35575 -> 35548 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7530 -> 7554 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 234 -> 258 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 17446 -> 17470 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 14820 -> 14806 bytes .../urllib3/contrib/securetransport.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 218 -> 242 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41338 -> 41298 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 228 -> 252 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 1844 -> 1868 bytes .../weakref_finalize.cpython-312.pyc | Bin 7350 -> 7379 bytes .../pip/_vendor/urllib3/poolmanager.py | 7 +- .../util/__pycache__/__init__.cpython-312.pyc | Bin 1165 -> 1189 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4775 -> 4790 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1571 -> 1595 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1371 -> 1395 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4202 -> 4226 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 3008 -> 3035 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21716 -> 21744 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15122 -> 15129 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5090 -> 5094 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10791 -> 10796 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11158 -> 11182 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15814 -> 15828 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4422 -> 4446 bytes .../site-packages/pip/_vendor/vendor.txt | 34 +- .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-312.pyc | Bin 12020 -> 0 bytes .../__pycache__/labels.cpython-312.pyc | Bin 7151 -> 0 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 2718 -> 0 bytes .../__pycache__/tests.cpython-312.pyc | Bin 9270 -> 0 bytes .../x_user_defined.cpython-312.pyc | Bin 3314 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .../site-packages/rest_framework/__init__.py | 31 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1376 bytes .../__pycache__/apps.cpython-312.pyc | Bin 0 -> 720 bytes .../authentication.cpython-312.pyc | Bin 0 -> 10654 bytes .../__pycache__/checks.cpython-312.pyc | Bin 0 -> 1225 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 5781 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 9832 bytes .../__pycache__/documentation.cpython-312.pyc | Bin 0 -> 2304 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 12438 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 88349 bytes .../__pycache__/filters.cpython-312.pyc | Bin 0 -> 17437 bytes .../__pycache__/generics.cpython-312.pyc | Bin 0 -> 13232 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 7474 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 0 -> 5448 bytes .../__pycache__/negotiation.cpython-312.pyc | Bin 0 -> 4792 bytes .../__pycache__/pagination.cpython-312.pyc | Bin 0 -> 36069 bytes .../__pycache__/parsers.cpython-312.pyc | Bin 0 -> 9646 bytes .../__pycache__/permissions.cpython-312.pyc | Bin 0 -> 14170 bytes .../__pycache__/relations.cpython-312.pyc | Bin 0 -> 27360 bytes .../__pycache__/renderers.cpython-312.pyc | Bin 0 -> 46585 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 20847 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 4287 bytes .../__pycache__/reverse.cpython-312.pyc | Bin 0 -> 2465 bytes .../__pycache__/routers.cpython-312.pyc | Bin 0 -> 15712 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 68678 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 8551 bytes .../__pycache__/status.cpython-312.pyc | Bin 0 -> 3881 bytes .../__pycache__/test.cpython-312.pyc | Bin 0 -> 20039 bytes .../__pycache__/throttling.cpython-312.pyc | Bin 0 -> 11199 bytes .../__pycache__/urlpatterns.cpython-312.pyc | Bin 0 -> 4757 bytes .../__pycache__/urls.cpython-312.pyc | Bin 0 -> 1044 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 16149 bytes .../__pycache__/versioning.cpython-312.pyc | Bin 0 -> 9281 bytes .../__pycache__/views.cpython-312.pyc | Bin 0 -> 22923 bytes .../__pycache__/viewsets.cpython-312.pyc | Bin 0 -> 9575 bytes .../site-packages/rest_framework/apps.py | 10 + .../rest_framework/authentication.py | 232 + .../authtoken}/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 238 bytes .../__pycache__/admin.cpython-312.pyc | Bin 0 -> 3508 bytes .../__pycache__/apps.cpython-312.pyc | Bin 0 -> 625 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 3130 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 1877 bytes .../__pycache__/views.cpython-312.pyc | Bin 0 -> 3110 bytes .../rest_framework/authtoken/admin.py | 54 + .../rest_framework/authtoken/apps.py | 7 + .../authtoken/management}/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 249 bytes .../management/commands/__init__.py} | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 258 bytes .../drf_create_token.cpython-312.pyc | Bin 0 -> 2447 bytes .../management/commands/drf_create_token.py | 45 + .../authtoken/migrations/0001_initial.py | 23 + .../migrations/0002_auto_20160226_1747.py | 31 + .../authtoken/migrations/0003_tokenproxy.py | 25 + .../0004_alter_tokenproxy_options.py | 17 + .../authtoken/migrations/__init__.py} | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 1340 bytes .../0002_auto_20160226_1747.cpython-312.pyc | Bin 0 -> 1545 bytes .../0003_tokenproxy.cpython-312.pyc | Bin 0 -> 835 bytes ...4_alter_tokenproxy_options.cpython-312.pyc | Bin 0 -> 783 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 249 bytes .../rest_framework/authtoken/models.py | 55 + .../rest_framework/authtoken/serializers.py | 42 + .../rest_framework/authtoken/views.py | 62 + .../site-packages/rest_framework/checks.py | 21 + .../site-packages/rest_framework/compat.py | 173 + .../rest_framework/decorators.py | 233 + .../rest_framework/documentation.py | 88 + .../rest_framework/exceptions.py | 264 + .../site-packages/rest_framework/fields.py | 1910 +++++ .../site-packages/rest_framework/filters.py | 379 + .../site-packages/rest_framework/generics.py | 295 + .../locale/ach/LC_MESSAGES/django.mo | Bin 0 -> 472 bytes .../locale/ar/LC_MESSAGES/django.mo | Bin 0 -> 12150 bytes .../locale/az/LC_MESSAGES/django.mo | Bin 0 -> 10428 bytes .../locale/be/LC_MESSAGES/django.mo | Bin 0 -> 614 bytes .../locale/bg/LC_MESSAGES/django.mo | Bin 0 -> 13083 bytes .../locale/ca/LC_MESSAGES/django.mo | Bin 0 -> 9300 bytes .../locale/ca_ES/LC_MESSAGES/django.mo | Bin 0 -> 487 bytes .../locale/cs/LC_MESSAGES/django.mo | Bin 0 -> 10519 bytes .../locale/da/LC_MESSAGES/django.mo | Bin 0 -> 9955 bytes .../locale/de/LC_MESSAGES/django.mo | Bin 0 -> 10490 bytes .../locale/el/LC_MESSAGES/django.mo | Bin 0 -> 12933 bytes .../locale/el_GR/LC_MESSAGES/django.mo | Bin 0 -> 486 bytes .../locale/en/LC_MESSAGES/django.mo | Bin 0 -> 12285 bytes .../locale/en_AU/LC_MESSAGES/django.mo | Bin 0 -> 491 bytes .../locale/en_CA/LC_MESSAGES/django.mo | Bin 0 -> 488 bytes .../locale/en_US/LC_MESSAGES/django.mo | Bin 0 -> 337 bytes .../locale/es/LC_MESSAGES/django.mo | Bin 0 -> 10627 bytes .../locale/et/LC_MESSAGES/django.mo | Bin 0 -> 10096 bytes .../locale/fa/LC_MESSAGES/django.mo | Bin 0 -> 11976 bytes .../locale/fa_IR/LC_MESSAGES/django.mo | Bin 0 -> 11989 bytes .../locale/fi/LC_MESSAGES/django.mo | Bin 0 -> 10197 bytes .../locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 10662 bytes .../locale/fr_CA/LC_MESSAGES/django.mo | Bin 0 -> 486 bytes .../locale/gl/LC_MESSAGES/django.mo | Bin 0 -> 474 bytes .../locale/gl_ES/LC_MESSAGES/django.mo | Bin 0 -> 628 bytes .../locale/he_IL/LC_MESSAGES/django.mo | Bin 0 -> 487 bytes .../locale/hu/LC_MESSAGES/django.mo | Bin 0 -> 10844 bytes .../locale/hy/LC_MESSAGES/django.mo | Bin 0 -> 12885 bytes .../locale/id/LC_MESSAGES/django.mo | Bin 0 -> 5188 bytes .../locale/it/LC_MESSAGES/django.mo | Bin 0 -> 10480 bytes .../locale/ja/LC_MESSAGES/django.mo | Bin 0 -> 11759 bytes .../locale/ko_KR/LC_MESSAGES/django.mo | Bin 0 -> 11698 bytes .../locale/lt/LC_MESSAGES/django.mo | Bin 0 -> 5056 bytes .../locale/lv/LC_MESSAGES/django.mo | Bin 0 -> 10423 bytes .../locale/mk/LC_MESSAGES/django.mo | Bin 0 -> 12121 bytes .../locale/nb/LC_MESSAGES/django.mo | Bin 0 -> 9928 bytes .../locale/ne_NP/LC_MESSAGES/django.mo | Bin 0 -> 15636 bytes .../locale/nl/LC_MESSAGES/django.mo | Bin 0 -> 10163 bytes .../locale/nn/LC_MESSAGES/django.mo | Bin 0 -> 483 bytes .../locale/no/LC_MESSAGES/django.mo | Bin 0 -> 475 bytes .../locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 10673 bytes .../locale/pt/LC_MESSAGES/django.mo | Bin 0 -> 10382 bytes .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 10397 bytes .../locale/pt_PT/LC_MESSAGES/django.mo | Bin 0 -> 493 bytes .../locale/ro/LC_MESSAGES/django.mo | Bin 0 -> 10701 bytes .../locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 13160 bytes .../locale/ru_RU/LC_MESSAGES/django.mo | Bin 0 -> 5208 bytes .../locale/sk/LC_MESSAGES/django.mo | Bin 0 -> 9164 bytes .../locale/sl/LC_MESSAGES/django.mo | Bin 0 -> 9985 bytes .../locale/sv/LC_MESSAGES/django.mo | Bin 0 -> 10204 bytes .../locale/th/LC_MESSAGES/django.mo | Bin 0 -> 8880 bytes .../locale/tr/LC_MESSAGES/django.mo | Bin 0 -> 10073 bytes .../locale/tr_TR/LC_MESSAGES/django.mo | Bin 0 -> 10292 bytes .../locale/uk/LC_MESSAGES/django.mo | Bin 0 -> 13245 bytes .../locale/vi/LC_MESSAGES/django.mo | Bin 0 -> 2179 bytes .../locale/zh_CN/LC_MESSAGES/django.mo | Bin 0 -> 9915 bytes .../locale/zh_Hans/LC_MESSAGES/django.mo | Bin 0 -> 9938 bytes .../locale/zh_Hant/LC_MESSAGES/django.mo | Bin 0 -> 4809 bytes .../locale/zh_TW/LC_MESSAGES/django.mo | Bin 0 -> 481 bytes .../management/__init__.py} | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 239 bytes .../management/commands/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 248 bytes .../generateschema.cpython-312.pyc | Bin 0 -> 4234 bytes .../management/commands/generateschema.py | 71 + .../site-packages/rest_framework/metadata.py | 152 + .../site-packages/rest_framework/mixins.py | 95 + .../rest_framework/negotiation.py | 97 + .../rest_framework/pagination.py | 990 +++ .../site-packages/rest_framework/parsers.py | 206 + .../rest_framework/permissions.py | 314 + .../site-packages/rest_framework/relations.py | 585 ++ .../site-packages/rest_framework/renderers.py | 1081 +++ .../site-packages/rest_framework/request.py | 460 ++ .../site-packages/rest_framework/response.py | 107 + .../site-packages/rest_framework/reverse.py | 66 + .../site-packages/rest_framework/routers.py | 390 ++ .../rest_framework/schemas/__init__.py | 58 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1970 bytes .../__pycache__/coreapi.cpython-312.pyc | Bin 0 -> 25333 bytes .../__pycache__/generators.cpython-312.pyc | Bin 0 -> 9910 bytes .../__pycache__/inspectors.cpython-312.pyc | Bin 0 -> 5780 bytes .../__pycache__/openapi.cpython-312.pyc | Bin 0 -> 29038 bytes .../schemas/__pycache__/utils.cpython-312.pyc | Bin 0 -> 1822 bytes .../schemas/__pycache__/views.cpython-312.pyc | Bin 0 -> 2795 bytes .../rest_framework/schemas/coreapi.py | 626 ++ .../rest_framework/schemas/generators.py | 239 + .../rest_framework/schemas/inspectors.py | 125 + .../rest_framework/schemas/openapi.py | 731 ++ .../rest_framework/schemas/utils.py | 41 + .../rest_framework/schemas/views.py | 48 + .../rest_framework/serializers.py | 1701 +++++ .../site-packages/rest_framework/settings.py | 258 + .../css/bootstrap-theme.min.css | 6 + .../css/bootstrap-theme.min.css.map | 1 + .../rest_framework/css/bootstrap-tweaks.css | 237 + .../rest_framework/css/bootstrap.min.css | 6 + .../rest_framework/css/bootstrap.min.css.map | 1 + .../static/rest_framework/css/default.css | 82 + .../rest_framework/css/font-awesome-4.0.3.css | 1338 ++++ .../static/rest_framework/css/prettify.css | 30 + .../static/rest_framework/docs/css/base.css | 359 + .../rest_framework/docs/css/highlight.css | 125 + .../docs/css/jquery.json-view.min.css | 11 + .../rest_framework/docs/img/favicon.ico | Bin 0 -> 5430 bytes .../static/rest_framework/docs/img/grid.png | Bin 0 -> 1458 bytes .../static/rest_framework/docs/js/api.js | 315 + .../rest_framework/docs/js/highlight.pack.js | 2 + .../docs/js/jquery.json-view.min.js | 7 + .../fonts/fontawesome-webfont.eot | Bin 0 -> 38205 bytes .../fonts/fontawesome-webfont.svg | 414 ++ .../fonts/fontawesome-webfont.ttf | Bin 0 -> 80652 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 44432 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../img/glyphicons-halflings.png | Bin 0 -> 12762 bytes .../static/rest_framework/img/grid.png | Bin 0 -> 1458 bytes .../static/rest_framework/js/ajax-form.js | 133 + .../static/rest_framework/js/bootstrap.min.js | 6 + .../static/rest_framework/js/coreapi-0.1.1.js | 2043 ++++++ .../static/rest_framework/js/csrf.js | 53 + .../static/rest_framework/js/default.js | 47 + .../rest_framework/js/jquery-3.7.1.min.js | 2 + .../rest_framework/js/load-ajax-form.js | 3 + .../static/rest_framework/js/prettify-min.js | 28 + .../site-packages/rest_framework/status.py | 93 + .../templates/rest_framework/admin.html | 263 + .../rest_framework/admin/detail.html | 10 + .../rest_framework/admin/dict_value.html | 11 + .../templates/rest_framework/admin/list.html | 26 + .../rest_framework/admin/list_value.html | 11 + .../admin/simple_list_value.html | 2 + .../templates/rest_framework/api.html | 3 + .../templates/rest_framework/base.html | 307 + .../rest_framework/docs/auth/basic.html | 38 + .../rest_framework/docs/auth/session.html | 35 + .../rest_framework/docs/auth/token.html | 36 + .../rest_framework/docs/document.html | 31 + .../templates/rest_framework/docs/error.html | 71 + .../templates/rest_framework/docs/index.html | 57 + .../rest_framework/docs/interact.html | 51 + .../docs/langs/javascript-intro.html | 5 + .../rest_framework/docs/langs/javascript.html | 15 + .../docs/langs/python-intro.html | 3 + .../rest_framework/docs/langs/python.html | 13 + .../docs/langs/shell-intro.html | 3 + .../rest_framework/docs/langs/shell.html | 6 + .../templates/rest_framework/docs/link.html | 102 + .../rest_framework/docs/sidebar.html | 44 + .../rest_framework/filters/base.html | 16 + .../rest_framework/filters/ordering.html | 14 + .../rest_framework/filters/search.html | 12 + .../rest_framework/horizontal/checkbox.html | 21 + .../horizontal/checkbox_multiple.html | 39 + .../rest_framework/horizontal/dict_field.html | 11 + .../rest_framework/horizontal/fieldset.html | 16 + .../rest_framework/horizontal/form.html | 6 + .../rest_framework/horizontal/input.html | 21 + .../rest_framework/horizontal/list_field.html | 11 + .../horizontal/list_fieldset.html | 13 + .../rest_framework/horizontal/radio.html | 57 + .../rest_framework/horizontal/select.html | 36 + .../horizontal/select_multiple.html | 38 + .../rest_framework/horizontal/textarea.html | 21 + .../rest_framework/inline/checkbox.html | 8 + .../inline/checkbox_multiple.html | 16 + .../rest_framework/inline/dict_field.html | 9 + .../rest_framework/inline/fieldset.html | 6 + .../templates/rest_framework/inline/form.html | 6 + .../rest_framework/inline/input.html | 9 + .../rest_framework/inline/list_field.html | 9 + .../rest_framework/inline/list_fieldset.html | 1 + .../rest_framework/inline/radio.html | 29 + .../rest_framework/inline/select.html | 24 + .../inline/select_multiple.html | 25 + .../rest_framework/inline/textarea.html | 9 + .../templates/rest_framework/login.html | 3 + .../templates/rest_framework/login_base.html | 65 + .../rest_framework/pagination/numbers.html | 47 + .../pagination/previous_and_next.html | 21 + .../rest_framework/raw_data_form.html | 11 + .../templates/rest_framework/schema.js | 3 + .../rest_framework/vertical/checkbox.html | 18 + .../vertical/checkbox_multiple.html | 37 + .../rest_framework/vertical/dict_field.html | 7 + .../rest_framework/vertical/fieldset.html | 15 + .../rest_framework/vertical/form.html | 6 + .../rest_framework/vertical/input.html | 17 + .../rest_framework/vertical/list_field.html | 7 + .../vertical/list_fieldset.html | 9 + .../rest_framework/vertical/radio.html | 57 + .../rest_framework/vertical/select.html | 34 + .../vertical/select_multiple.html | 33 + .../rest_framework/vertical/textarea.html | 17 + .../rest_framework/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 241 bytes .../rest_framework.cpython-312.pyc | Bin 0 -> 15093 bytes .../templatetags/rest_framework.py | 326 + .../site-packages/rest_framework/test.py | 399 ++ .../rest_framework/throttling.py | 250 + .../rest_framework/urlpatterns.py | 112 + .../site-packages/rest_framework/urls.py | 21 + .../rest_framework/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 234 bytes .../__pycache__/breadcrumbs.cpython-312.pyc | Bin 0 -> 2205 bytes .../__pycache__/encoders.cpython-312.pyc | Bin 0 -> 4266 bytes .../__pycache__/field_mapping.cpython-312.pyc | Bin 0 -> 13346 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 0 -> 4835 bytes .../utils/__pycache__/html.cpython-312.pyc | Bin 0 -> 3015 bytes .../humanize_datetime.cpython-312.pyc | Bin 0 -> 1814 bytes .../utils/__pycache__/json.cpython-312.pyc | Bin 0 -> 2169 bytes .../__pycache__/mediatypes.cpython-312.pyc | Bin 0 -> 4016 bytes .../__pycache__/model_meta.cpython-312.pyc | Bin 0 -> 5935 bytes .../representation.cpython-312.pyc | Bin 0 -> 4250 bytes .../serializer_helpers.cpython-312.pyc | Bin 0 -> 10318 bytes .../__pycache__/timezone.cpython-312.pyc | Bin 0 -> 1435 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 1914 bytes .../rest_framework/utils/breadcrumbs.py | 53 + .../rest_framework/utils/encoders.py | 78 + .../rest_framework/utils/field_mapping.py | 327 + .../rest_framework/utils/formatting.py | 93 + .../rest_framework/utils/html.py | 95 + .../rest_framework/utils/humanize_datetime.py | 47 + .../rest_framework/utils/json.py | 37 + .../rest_framework/utils/mediatypes.py | 81 + .../rest_framework/utils/model_meta.py | 156 + .../rest_framework/utils/representation.py | 101 + .../utils/serializer_helpers.py | 182 + .../rest_framework/utils/timezone.py | 25 + .../rest_framework/utils/urls.py | 27 + .../rest_framework/validators.py | 326 + .../rest_framework/versioning.py | 186 + .../site-packages/rest_framework/views.py | 521 ++ .../site-packages/rest_framework/viewsets.py | 248 + .../sqlparse-0.5.1.dist-info/RECORD | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 3130 -> 3136 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 668 -> 692 bytes .../sqlparse/__pycache__/cli.cpython-312.pyc | Bin 7459 -> 7453 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 518 -> 518 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 8397 -> 8397 bytes .../__pycache__/keywords.cpython-312.pyc | Bin 51129 -> 51129 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 6823 -> 6808 bytes .../sqlparse/__pycache__/sql.cpython-312.pyc | Bin 32127 -> 32062 bytes .../__pycache__/tokens.cpython-312.pyc | Bin 2313 -> 2313 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4628 -> 4620 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 465 -> 465 bytes .../__pycache__/filter_stack.cpython-312.pyc | Bin 2033 -> 2013 bytes .../__pycache__/grouping.cpython-312.pyc | Bin 25147 -> 25125 bytes .../statement_splitter.cpython-312.pyc | Bin 4030 -> 4026 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1055 -> 1055 bytes .../aligned_indent.cpython-312.pyc | Bin 8001 -> 7979 bytes .../__pycache__/others.cpython-312.pyc | Bin 9364 -> 9373 bytes .../__pycache__/output.cpython-312.pyc | Bin 6560 -> 6550 bytes .../__pycache__/reindent.cpython-312.pyc | Bin 15709 -> 15604 bytes .../__pycache__/right_margin.cpython-312.pyc | Bin 2253 -> 2248 bytes .../__pycache__/tokens.cpython-312.pyc | Bin 2964 -> 2949 bytes .../site-packages/tutorial/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 222 bytes .../tutorial/__pycache__/asgi.cpython-312.pyc | Bin 0 -> 712 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 2618 bytes .../tutorial/__pycache__/urls.cpython-312.pyc | Bin 0 -> 888 bytes .../tutorial/__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 712 bytes .../python3.12/site-packages/tutorial/asgi.py | 16 + .../tutorial/quickstart/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 233 bytes .../__pycache__/admin.cpython-312.pyc | Bin 0 -> 277 bytes .../__pycache__/apps.cpython-312.pyc | Bin 0 -> 547 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 274 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 1212 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 277 bytes .../__pycache__/views.cpython-312.pyc | Bin 0 -> 2206 bytes .../tutorial/quickstart/admin.py | 3 + .../site-packages/tutorial/quickstart/apps.py | 6 + .../quickstart/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 244 bytes .../tutorial/quickstart/models.py | 3 + .../tutorial/quickstart/serializers.py | 14 + .../tutorial/quickstart/tests.py | 3 + .../tutorial/quickstart/views.py | 31 + .../site-packages/tutorial/settings.py | 124 + .../python3.12/site-packages/tutorial/urls.py | 15 + .../python3.12/site-packages/tutorial/wsgi.py | 16 + env/pyvenv.cfg | 6 +- .../__pycache__/settings.cpython-312.pyc | Bin 2597 -> 2597 bytes helloworld/__pycache__/urls.cpython-312.pyc | Bin 1139 -> 1202 bytes helloworld/__pycache__/wsgi.cpython-312.pyc | Bin 661 -> 685 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 0 -> 1106 bytes library/__pycache__/urls.cpython-312.pyc | Bin 0 -> 497 bytes library/__pycache__/views.cpython-312.pyc | Bin 0 -> 1453 bytes library/serializer.py | 8 + library/urls.py | 7 +- 2104 files changed, 36411 insertions(+), 63663 deletions(-) rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => djangorestframework-3.15.2.dist-info}/INSTALLER (100%) create mode 100644 env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/LICENSE.md create mode 100644 env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/RECORD rename env/lib/python3.12/site-packages/{Django-5.1.1.dist-info => djangorestframework-3.15.2.dist-info}/REQUESTED (100%) rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => djangorestframework-3.15.2.dist-info}/WHEEL (65%) create mode 100644 env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/top_level.txt rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => pip-24.2.dist-info}/AUTHORS.txt (95%) rename env/lib/python3.12/site-packages/{pip-24.0.dist-info/top_level.txt => pip-24.2.dist-info/INSTALLER} (100%) rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => pip-24.2.dist-info}/LICENSE.txt (100%) rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => pip-24.2.dist-info}/METADATA (91%) rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => pip-24.2.dist-info}/RECORD (54%) rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => pip-24.2.dist-info}/REQUESTED (100%) create mode 100644 env/lib/python3.12/site-packages/pip-24.2.dist-info/WHEEL rename env/lib/python3.12/site-packages/{pip-24.0.dist-info => pip-24.2.dist-info}/entry_points.txt (69%) create mode 100644 env/lib/python3.12/site-packages/pip-24.2.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py delete mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/retry.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/chardet/version.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/six.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 env/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/__init__.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/apps.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/authentication.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/checks.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/decorators.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/documentation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/fields.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/filters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/generics.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/metadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/mixins.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/negotiation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/pagination.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/parsers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/permissions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/relations.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/renderers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/request.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/response.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/reverse.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/routers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/serializers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/settings.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/status.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/test.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/throttling.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/urlpatterns.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/urls.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/validators.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/versioning.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/views.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/__pycache__/viewsets.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/apps.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authentication.py rename env/lib/python3.12/site-packages/{pip/_vendor/chardet/cli => rest_framework/authtoken}/__init__.py (100%) create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/admin.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/apps.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/models.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/serializers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/views.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/admin.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/apps.py rename env/lib/python3.12/site-packages/{pip/_vendor/chardet/metadata => rest_framework/authtoken/management}/__init__.py (100%) create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/management/__pycache__/__init__.cpython-312.pyc rename env/lib/python3.12/site-packages/{pip/_vendor/chardet/py.typed => rest_framework/authtoken/management/commands/__init__.py} (100%) create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__pycache__/drf_create_token.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/drf_create_token.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0001_initial.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0002_auto_20160226_1747.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0003_tokenproxy.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py rename env/lib/python3.12/site-packages/{pip/_vendor/pyparsing/py.typed => rest_framework/authtoken/migrations/__init__.py} (100%) create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0002_auto_20160226_1747.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0003_tokenproxy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0004_alter_tokenproxy_options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/models.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/serializers.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/authtoken/views.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/checks.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/compat.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/decorators.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/documentation.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/exceptions.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/fields.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/filters.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/generics.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ach/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ar/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/az/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/be/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/bg/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ca/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/cs/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/da/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/de/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/el/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/el_GR/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/en/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/en_AU/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/en_CA/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/en_US/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/es/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/et/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/fa/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/fi/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/fr/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/gl/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/he_IL/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/hu/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/hy/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/id/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/it/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ja/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/lt/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/lv/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/mk/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/nb/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ne_NP/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/nl/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/nn/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/no/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/pl/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/pt/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ro/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ru/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/ru_RU/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/sk/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/sl/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/sv/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/th/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/tr/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/uk/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/vi/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo create mode 100644 env/lib/python3.12/site-packages/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo rename env/lib/python3.12/site-packages/{pip/_vendor/tenacity/py.typed => rest_framework/management/__init__.py} (100%) create mode 100644 env/lib/python3.12/site-packages/rest_framework/management/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/management/commands/__init__.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/management/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/management/commands/__pycache__/generateschema.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/management/commands/generateschema.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/metadata.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/mixins.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/negotiation.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/pagination.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/parsers.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/permissions.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/relations.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/renderers.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/request.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/response.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/reverse.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/routers.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__init__.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/coreapi.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/generators.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/inspectors.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/openapi.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/views.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/coreapi.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/generators.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/inspectors.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/openapi.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/utils.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/schemas/views.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/serializers.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/settings.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-tweaks.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css.map create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/default.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/font-awesome-4.0.3.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/prettify.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/css/base.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/css/highlight.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/css/jquery.json-view.min.css create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/img/favicon.ico create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/img/grid.png create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/js/api.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/js/highlight.pack.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/docs/js/jquery.json-view.min.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.eot create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.svg create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.ttf create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.woff create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.eot create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.svg create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.ttf create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/img/glyphicons-halflings-white.png create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/img/glyphicons-halflings.png create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/img/grid.png create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/ajax-form.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/bootstrap.min.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/coreapi-0.1.1.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/csrf.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/default.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/jquery-3.7.1.min.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/load-ajax-form.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/static/rest_framework/js/prettify-min.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/status.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/admin.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/admin/detail.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/admin/dict_value.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/admin/list.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/admin/list_value.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/admin/simple_list_value.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/api.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/base.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/auth/basic.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/auth/session.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/auth/token.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/document.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/error.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/index.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/interact.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs/javascript-intro.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs/javascript.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs/python-intro.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs/python.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs/shell-intro.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs/shell.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/link.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/sidebar.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/filters/base.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/filters/ordering.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/filters/search.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/checkbox.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/checkbox_multiple.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/dict_field.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/fieldset.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/form.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/input.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/list_field.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/list_fieldset.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/radio.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/select.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/select_multiple.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/horizontal/textarea.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/checkbox.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/checkbox_multiple.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/dict_field.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/fieldset.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/form.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/input.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/list_field.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/list_fieldset.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/radio.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/select.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/select_multiple.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/inline/textarea.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/login.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/login_base.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/pagination/numbers.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/pagination/previous_and_next.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/raw_data_form.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/schema.js create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/checkbox.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/checkbox_multiple.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/dict_field.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/fieldset.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/form.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/input.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/list_field.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/list_fieldset.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/radio.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/select.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/select_multiple.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templates/rest_framework/vertical/textarea.html create mode 100644 env/lib/python3.12/site-packages/rest_framework/templatetags/__init__.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/templatetags/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/templatetags/__pycache__/rest_framework.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/templatetags/rest_framework.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/test.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/throttling.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/urlpatterns.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/urls.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__init__.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/breadcrumbs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/encoders.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/field_mapping.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/formatting.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/html.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/humanize_datetime.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/json.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/mediatypes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/model_meta.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/representation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/serializer_helpers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/timezone.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/__pycache__/urls.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/breadcrumbs.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/encoders.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/field_mapping.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/formatting.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/html.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/humanize_datetime.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/json.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/mediatypes.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/model_meta.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/representation.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/serializer_helpers.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/timezone.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/utils/urls.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/validators.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/versioning.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/views.py create mode 100644 env/lib/python3.12/site-packages/rest_framework/viewsets.py create mode 100644 env/lib/python3.12/site-packages/tutorial/__init__.py create mode 100644 env/lib/python3.12/site-packages/tutorial/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/__pycache__/asgi.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/__pycache__/settings.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/__pycache__/urls.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/__pycache__/wsgi.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/asgi.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__init__.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__pycache__/admin.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__pycache__/apps.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__pycache__/models.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__pycache__/serializers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__pycache__/tests.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/__pycache__/views.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/admin.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/apps.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/migrations/__init__.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/models.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/serializers.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/tests.py create mode 100644 env/lib/python3.12/site-packages/tutorial/quickstart/views.py create mode 100644 env/lib/python3.12/site-packages/tutorial/settings.py create mode 100644 env/lib/python3.12/site-packages/tutorial/urls.py create mode 100644 env/lib/python3.12/site-packages/tutorial/wsgi.py create mode 100644 library/__pycache__/serializer.cpython-312.pyc create mode 100644 library/__pycache__/urls.cpython-312.pyc create mode 100644 library/__pycache__/views.cpython-312.pyc diff --git a/db.sqlite3 b/db.sqlite3 index 68e1b3d0a512234cdc9ebf6182f18560cbbeacd2..ae3d4f1a40ae7328ce5ef5c66d0e3f6ecbe886fe 100644 GIT binary patch delta 217 zcmZp8z|ru4V}dlJ%0wAwMwN{T3+2Tb7#KMCQyKVQ@?YWK&0ogf%|DBO1%K+sMqhqG zeja93&YaAoqQs)g_@w;&?8#;NMiPSD%$jh~#L|+C{33B?W@Egmof0af$f zMiLAR48lN+48)n4jTxsaW-tnGzN~MUu$ZMlVKYm?ANi&W+b%G&K-h~41b_$thzTCc diff --git a/env/bin/activate b/env/bin/activate index 7895d70b..31e44009 100644 --- a/env/bin/activate +++ b/env/bin/activate @@ -39,10 +39,10 @@ deactivate nondestructive if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then # transform D:\path\to\venv to /d/path/to/venv on MSYS # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath "/Users/karan.bhatia/Desktop/personal/helloworld/env") + export VIRTUAL_ENV=$(cygpath "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env") else # use the path as-is - export VIRTUAL_ENV="/Users/karan.bhatia/Desktop/personal/helloworld/env" + export VIRTUAL_ENV="/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env" fi _OLD_VIRTUAL_PATH="$PATH" diff --git a/env/bin/activate.csh b/env/bin/activate.csh index b7877925..e07ab212 100644 --- a/env/bin/activate.csh +++ b/env/bin/activate.csh @@ -9,7 +9,7 @@ alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PA # Unset irrelevant variables. deactivate nondestructive -setenv VIRTUAL_ENV "/Users/karan.bhatia/Desktop/personal/helloworld/env" +setenv VIRTUAL_ENV "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env" set _OLD_VIRTUAL_PATH="$PATH" setenv PATH "$VIRTUAL_ENV/bin:$PATH" diff --git a/env/bin/activate.fish b/env/bin/activate.fish index 617f8480..747286d8 100644 --- a/env/bin/activate.fish +++ b/env/bin/activate.fish @@ -33,7 +33,7 @@ end # Unset irrelevant variables. deactivate nondestructive -set -gx VIRTUAL_ENV "/Users/karan.bhatia/Desktop/personal/helloworld/env" +set -gx VIRTUAL_ENV "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env" set -gx _OLD_VIRTUAL_PATH $PATH set -gx PATH "$VIRTUAL_ENV/bin" $PATH diff --git a/env/bin/django-admin b/env/bin/django-admin index 0e5d52cc..d5363030 100755 --- a/env/bin/django-admin +++ b/env/bin/django-admin @@ -1,4 +1,6 @@ -#!/Users/karan.bhatia/Desktop/personal/helloworld/env/bin/python3.12 +#!/bin/sh +'''exec' "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env/bin/python3.12" "$0" "$@" +' ''' # -*- coding: utf-8 -*- import re import sys diff --git a/env/bin/pip b/env/bin/pip index f845312a..55a67590 100755 --- a/env/bin/pip +++ b/env/bin/pip @@ -1,4 +1,6 @@ -#!/Users/karan.bhatia/Desktop/personal/helloworld/env/bin/python3.12 +#!/bin/sh +'''exec' "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env/bin/python3.12" "$0" "$@" +' ''' # -*- coding: utf-8 -*- import re import sys diff --git a/env/bin/pip3 b/env/bin/pip3 index f845312a..55a67590 100755 --- a/env/bin/pip3 +++ b/env/bin/pip3 @@ -1,4 +1,6 @@ -#!/Users/karan.bhatia/Desktop/personal/helloworld/env/bin/python3.12 +#!/bin/sh +'''exec' "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env/bin/python3.12" "$0" "$@" +' ''' # -*- coding: utf-8 -*- import re import sys diff --git a/env/bin/pip3.12 b/env/bin/pip3.12 index f845312a..55a67590 100755 --- a/env/bin/pip3.12 +++ b/env/bin/pip3.12 @@ -1,4 +1,6 @@ -#!/Users/karan.bhatia/Desktop/personal/helloworld/env/bin/python3.12 +#!/bin/sh +'''exec' "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env/bin/python3.12" "$0" "$@" +' ''' # -*- coding: utf-8 -*- import re import sys diff --git a/env/bin/sqlformat b/env/bin/sqlformat index edb10470..ac97a48c 100755 --- a/env/bin/sqlformat +++ b/env/bin/sqlformat @@ -1,4 +1,6 @@ -#!/Users/karan.bhatia/Desktop/personal/helloworld/env/bin/python3.12 +#!/bin/sh +'''exec' "/Users/dbaweja/Documents/Education/Scaler Academy/LLD/demoDjangoProject/env/bin/python3.12" "$0" "$@" +' ''' # -*- coding: utf-8 -*- import re import sys diff --git a/env/lib/python3.12/site-packages/Django-5.1.1.dist-info/RECORD b/env/lib/python3.12/site-packages/Django-5.1.1.dist-info/RECORD index 2ae30771..ce548787 100644 --- a/env/lib/python3.12/site-packages/Django-5.1.1.dist-info/RECORD +++ b/env/lib/python3.12/site-packages/Django-5.1.1.dist-info/RECORD @@ -1,11 +1,10 @@ -../../../bin/django-admin,sha256=CdDuRreSAIykZLsr0AtqH9C0XarNQ4ycIWRFM87AWr4,313 +../../../bin/django-admin,sha256=BHK4jIM3DjoLVvYgBdo3aQPYB7TOG29M4Z1HxQtbzXc,372 Django-5.1.1.dist-info/AUTHORS,sha256=PRqRG0Fm9_wNJAoFDQo51gEVArm104sUEQB5GRGBSxw,43110 Django-5.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 Django-5.1.1.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 Django-5.1.1.dist-info/LICENSE.python,sha256=ktIAtrhtqXpPighr74DsWGJ6aCryy_ks3CvX6ekGLlE,14261 Django-5.1.1.dist-info/METADATA,sha256=izo1dUckTggVSl64gUoDH41ECC0OkNkIQ6eMHj_cjNk,4167 Django-5.1.1.dist-info/RECORD,, -Django-5.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 Django-5.1.1.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92 Django-5.1.1.dist-info/entry_points.txt,sha256=hi1U04jQDqr9xaV6Gklnqh-d69jiCZdS73E0l_671L4,82 Django-5.1.1.dist-info/top_level.txt,sha256=V_goijg9tfO20ox_7os6CcnPvmBavbxu46LpJiNLwjA,7 diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/__init__.cpython-312.pyc index b5962e3ab0947075985e9d4c0f8d29329bf84d90..9da634289ffc4a2a18f6d4be574b8576fa3e2ba2 100644 GIT binary patch delta 20 acmey)_??mGG%qg~0}!+`GNw=Dc?|$NYz1Th delta 20 acmey)_??mGG%qg~0}$vO_?0%1=QRLALI%J9 diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/compatibility.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/compatibility.cpython-312.pyc index e98cecafa372d67696ff0b16224798b3b3bbe091..c370824d3ae63997a534e79d994a23e32a00fd0f 100644 GIT binary patch delta 99 zcmeC@Th7OGnwOW00SMX|8PhlNs4{sp>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Z;nbxrY0O|oD A0{{R3 delta 75 zcmZ3^*U!gunwOW00SK5Md`sKNqsnBEsUKRLT2!o`omiBZrA4egF9|4rXJ!ymz96Xd z8fNK@@G?B`C$Hrwuf+f#C+P;B{X4i@fqz zcoi3f-w~FYVZOlmvarT?W=2lUj|@QKIg*TOb@7EQT5tvCZNG0@_~U#itDC9@PhCT_X*xtc@!=h1Wzs!+2oWB z)YQQ6g@Zv{>LWJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~A^TJg2@#+XKN=Vogj`p(x~OWk!}NgqWmT^RhRr?# z8Z0887?`BEZm8;XxKHrD%A@d+8OWX7A+m`vf3mfx9Lr^c;4hP7MP)cHD>{E-VC58_ rTqCN<45T-&6n)LYxOehYDNByas=l8XIC*6!UzCbu2GX1Lq&ZjsNZUVP diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc index a61d00de9d9138eabfaa16ed4f3ab15cedd5843f..fb837db9d8e972f36a14dd2e162369ca3187645f 100644 GIT binary patch delta 193 zcmX@RnQ_BrMxN8Wyj%=G(9X!1zL94sJ9i|I)4=eVjX_Xi@;iE>P6NXSHU>e7PYi6VvXl3)8!-dv%^%sB zl$ZpVCV$nm7r!B+_=$m0P-%k84H1dy-V?p2`hH+$6r60REy)3v;}Vpb?5pj_45BA$ zCr)P9mLN&f=84*CRmFsWZu!x`Fh}|Z5AO|W%`dFXQd|uTn}Y(?m?TA!4{a~2>7! UA2-BJegJjynj-1R5UOAW0L^VwG5`Po delta 257 zcmcbw|3IJTG%qg~0}wDj_?EVjXFsz+vVLfBYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJFw1-v1$9OSh8GM!8W=us@N!Dt5m#9depy`iI|D1P zEKc9%pT^HBAD6ad7fl*NM zrijD`W+46R11CrUSS!NB&2gNQIhdFjCw~?+<^|iu$ZPtM0Z2^N5t5e&n!s!NJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKne{#|0H5s|c>n+a diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/typing.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/typing.cpython-312.pyc index 99d01104b6feaa58c24a1755023b80aabfad6ef2..6cae99d0a2aed21d899e6a40c4eed5d667c78053 100644 GIT binary patch delta 99 zcmX@$d&8IKG%qg~0}!+`GNy0jxz6rUr5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kpF delta 75 zcmccNd%&0HG%qg~0}wDj_?EVj=Q_JVl747$YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJHpf~y0PV6HW&i*H diff --git a/env/lib/python3.12/site-packages/asgiref/__pycache__/wsgi.cpython-312.pyc b/env/lib/python3.12/site-packages/asgiref/__pycache__/wsgi.cpython-312.pyc index 21ed718b7f5e1c5ce49b6c6a8609255702451338..919509923dbf0d92bc6ead2b3868de1bf2f87206 100644 GIT binary patch delta 259 zcmZ2vxy+L1G%qg~0}!+`GNy0jna}7^p&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kwoDEV8d`1^|4L`6kNNfH0Ai}___2auVL~Qc|&I&fhQ=20N>=>D^Nn1>w zFWAJ)AY-{%MQ9>3rVKPeXY&lPYs`#Hlk=ranXid?PF^E5iG@Mji*d7~bRr`F Dfvr%5 delta 255 zcmZ2xxyX{|G%qg~0}wDj_?EVjXFj7rf_`XmYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}XGSA-#tW0xICVI#@EU$#;N{es9Lm`s2c*HA4{Qw5 zT0cIBFz{;q_%00--Ta=jf{pR~<_rNlMvlwU7M~b+ICUnk6l`J!(wp^!CNeYrntVVs zllKD$gMz_#R%T(YhXT@*EyOhBJ}?709qb<&fYb*r1`VAKmMa`8H>9;cF)(pjO|BAC oW(Lxm7l>VBW@MXOE@jGbSaMn1S?WSLsAX0R4DPp8x;= diff --git a/env/lib/python3.12/site-packages/django/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/__pycache__/__init__.cpython-312.pyc index ad7aebdbf7cb2fd3a01bfa24111e243110fab50d..31e857f7af6d70fef4f7ac22c7601b6f2b353b37 100644 GIT binary patch delta 21 bcmaFE`G%9{G%qg~0}!+`GNy0jdB6eyK(+;U delta 21 bcmaFE`G%9{G%qg~0}$vO_?5Pi=K%`JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>KiLn|0n5-I3 diff --git a/env/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc b/env/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc index 986a61410f6683bbac067fda74c08f94a9cf9318..9ed4f9cf5926f0df2737a693088268a703aede7b 100644 GIT binary patch delta 34 ocmexs{nwi3G%qg~0}!+`GNy0jDU)Eor0RN|-|h0|PKgp$0Jppfwg3PC delta 34 ocmexs{nwi3G%qg~0}$vQ_?5Pir%ZzVqN?k4ezz-|J0(h30nw=p6951J diff --git a/env/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc index 7e4e0b48c5c6cc15918b74dc4f5ceb0bf13cef5c..841a8906b2ee98f0db6eeada549a7172bf7b7516 100644 GIT binary patch delta 21 bcmcc4be)OkG%qg~0}!+`GNy0j@n!@7J2wQU delta 21 bcmcc4be)OkG%qg~0}$vO_?5Pi$D0uVLum#B diff --git a/env/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc b/env/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc index 6d5e8a0905c7c7417198cababa88c2c63e3fdc36..94233458ee96e346e988162388088ff43ee41a6b 100644 GIT binary patch delta 234 zcmZ4NvBHDrG%qg~0}!+`GNy0jaS~V_zNqCywF4K;F$6a`ZGA`h$?(!0IL1M#ULR)!}_wg`U=HM;@USIysxPG9OT{@z9D3X;gXaUCQGvpa8FJW zJ8lfNo<$B~{S1~FnRmn$7ig{sz9Me8A@e}-MKiB2KvN}Wh)nf@x=VUmMU Y^6JdjL^UUe%j+>Sh-q!^ke|&00FO~mU;qFB delta 183 zcmZ4CvDky>G%qg~0}$vO_?5Pi$4QjYd9uG~H1}og;P0#)@?XRfhma877P|1#X(4cAg$8LK>VOd6C}h$U6{Br(IvZ9 zjcMV{YpI23LhX{)Kcr@%kt3DS(GtPWc~LjV>)RRFAz8@e}Sv)*b0;Jmr? z{WSJ*$W?O#IfAFT+h=L42Z5yQ?n~L|goVZl8n@6SL6aq<)fif?0f)q8lT|n9KWU)} zf+k8RSqfYrDEWAJHMZ8g88XkE-|AZFG*J?Zd_t-O)x5_RWJ`z;AyO8)s|;ux#JBjv z6pHgJ}u|Mhxlnq~kAke$@y7 delta 622 zcmXw1O=uHA7@f(+*j;uv+jJAUYc|v-apO?Q6pMVFOrKASrt9iV`)8PU1K65;z973AEDKY&IX;!n|bfe_kHu2XKV258f3RQ zjsavHdHcKYoLyoEI>4sz&A^Dpl%02+ZHk=qCu|xHwIKjS&=LSEtj2G|o2;wV2YAZety3v3>KIZ0e&#~WzcK+`5lHl*z1 ziAT|jdox%&dv5#S{Xk91V$PY^XZm6t0J*~&(-h=}5Hf^NT{zUD2!$7&`-vX4bpJnn z$Pk9=!my?L@k6IiB2%@j(SCJL0(lPZO#LVHnseR(Z{rb9qOVtk;$(c;6Qv01Pd!Z= z%;M{kN}KW+X+U3qxGMSV)z}C%CS=H-eP^=fZ84vM=S%r&R?D02cn9pI!}#Us0!2`lA`5odz*nPEzZpw^6lW{4 zmMiCRz9!D%O0+IiBKn`Hbq7r0_2e;+IXG#hvZJUT4}*;M2Mz{F`3{y|-pOzE zr8iF#-Oa<-#mKeN{Y-35;~K+lq{I0RZKpqlnvx6Y&KVZ&nfqT zfklk#p{UaY#vA+sGg#*H&g8wwulj|RftT;5sMBN@-By;1qE4STpVhTySjKDHWmQF+$|{p delta 160 zcmZooo07(JnwOW00SI&s{7T!%^GAd+e=?`2A^U9mPYleQnv-or^_YS5=3LSHJR;K= z85kNEo`_4$vA-;?{fU8z(~EI(l#(I~m{F%>!9Ka-69YG=>EsJ0%tRRuKw delta 21 bcmeB9?oQ@8&CAQh00cS*ex+^XsW$`wMu!HG diff --git a/env/lib/python3.12/site-packages/django/conf/locale/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/__pycache__/__init__.cpython-312.pyc index 578ee3a834befe8a74d69a49b9b3a8f9edd06c5d..e2b66a54716fc1c6807ccc382af0277eb098cd70 100644 GIT binary patch delta 21 bcmbR3JlmP)G%qg~0}!+`GNy0j=~n~*JS7Dc delta 21 bcmbR3JlmP)G%qg~0}$vO_?5Pir(Y2OL{|oJ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-312.pyc index 3bbf5121fc0682fe5e2ffaf24c773fd1d0567c4a..54997abf4237d50b093b231189dd2ef97042c8d9 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-312.pyc index 04a97c441b934bad390f04edc9655dfa350dca2a..5172542ea885d279728ea2fcf82233435f73412e 100644 GIT binary patch delta 97 zcmX@ie4Cl)G%qg~0}!+`GNw=D`R>uFA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-312.pyc index 19dcf713a9aa981dfd1fd385ca5f192dae9bbbae..457e043e31d9d36ed65a07f9e1d315c02811fe09 100644 GIT binary patch delta 98 zcmey)+Rw&wnwOW00SMX|8PhlNJZ1Fg(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>qlIa=%sh}Ft diff --git a/env/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-312.pyc index db5cf1b9074d94596c844423716ba85d8368615e..9f7e57fcf112ab61cc6ed8bc28caa996d9d483fd 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/formats.cpython-312.pyc index c8d3ac2498e318ad9a9cda65c98b1443e336734f..084376f7934d66803bcdd0d9fa79d3349d9c275b 100644 GIT binary patch delta 98 zcmZ3+wvUbHG%qg~0}!+`GNy0j(P8rF)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>KfoUHAc}*H6 diff --git a/env/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-312.pyc index 9c965141fdf443b99a3762a5d42a8c2c8a58c936..42da9fe5807a109695a8333b12d858f8ad5b7f6c 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-312.pyc index 96e2798ccba85ddab6946a468ab02c78021ddebd..50f5a301e7bc9ad7ed1de1b79339bdf0dc27c2c9 100644 GIT binary patch delta 97 zcmbQvyq=loG%qg~0}!+`GNw=DIq%V_A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6};VAmo*?i5 delta 73 zcmZ3_Je`^6G%qg~0}wDj_?9-2=e$9oerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT a0Z=ACFEK|yBQ+-{zdXMvCuOoSV-Em>N*VG1 diff --git a/env/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-312.pyc index 2c165f9214c8436f883286c2de49e423c4195d63..6d599db873db829daa6573394030b9189b3c7bd1 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-312.pyc index 69290da996e0369dadb55f99e49c7a3ce615b908..41498422ef317f4b5cb15fc9250e17d87adb785a 100644 GIT binary patch delta 98 zcmdnadY+Z%G%qg~0}!+`GNy0j*~{qBsUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8km delta 74 zcmX@lx}BBhG%qg~0}wDj_?EVjXD_2cp?+v_YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{pIAk#hopc5Kq diff --git a/env/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-312.pyc index b0d8612da6331f1187de6a374c686905b954f902..0b811fad97d03e0c8fa48dcbd4bbca06160a462a 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-312.pyc index 0fe5ae49d05c5a456048683588993a0fd76739bb..3fba434e5d24062b0d408c3b26ac03c419c1e369 100644 GIT binary patch delta 98 zcmaFJ{F9mIG%qg~0}!+`GNy0j5n%M_)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?fnXl8PEK diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-312.pyc index db4085a288660da29f8c397de6880c958bff1b77..82c1ad71de512f7f27ac8466251282386e0542b8 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-312.pyc index 193241e33e54cb51def748122adce42cf91b701b..d8151c359a2ba4a0cffae4e7e80b9870c36b2aee 100644 GIT binary patch delta 98 zcmdnPc7=`SG%qg~0}!+`GNy0jaboi5)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f8q+=iiq#r@ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-312.pyc index 12a4e4f86c9b106eb9e3c71ff6b87de41f3e5c5b..0ad9ab4a86f371512d95997d248630a8fb08131c 100644 GIT binary patch delta 96 zcmcb@_=b_^G%qg~0}!+`GNw=DG4klv4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0RYMVAq4;c delta 72 zcmaFEc!iPYG%qg~0}wDj_?9-2$H<^qKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_4FGE(8V3LX diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-312.pyc index ebbecc071cf3593d03ba945bdf5417257147b00b..bf0947eef45d7be7286ac55831e65afdb2e966e7 100644 GIT binary patch delta 98 zcmX@ia+`(cG%qg~0}!+`GNy0jNoDlt(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fC*vXjm4Oqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-312.pyc index 6f28986b28e3998eefaafe6f33a913396b0d5b20..0f0b5f996fb75c9d36a5745bc738666d0e18ca93 100644 GIT binary patch delta 98 zcmdnMeuACnG%qg~0}!+`GNy0j*~aA2sUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{ny7xO*qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-312.pyc index 59943202fd940e921e357d013879adf0803cd809..15f1cfbaa068e4b1cc73e78fb9986a22ea0d036c 100644 GIT binary patch delta 98 zcmcc0_Lhz3G%qg~0}!+`GNy0jiDvTX)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fJ<~n_p1~U7 diff --git a/env/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-312.pyc index c26fd2ba15ec14d60dfd9354873fad95e459436e..bd165157866e089ce02aeb32dad7511e4fd497c9 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/formats.cpython-312.pyc index 0adbf7d4597437e4a4036507ee5b139062d3a829..40dac308ac9383c2c13162436e866855f54d5445 100644 GIT binary patch delta 98 zcmcb^`h}I}G%qg~0}!+`GNy0jdCKU~sUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kp?+v_YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{pICDU#IzB(HH diff --git a/env/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-312.pyc index dfe83cdb27dee3fbdb13dc0a9c1b8df27b49d331..dcb40571f4d8f3afb22ba02e777ed20e58191ccd 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/formats.cpython-312.pyc index a8993db3f10f01da123eacc3a3ffa5ba84b83622..cfac3fc961460b584a4ffde13d14b7d6662bb090 100644 GIT binary patch delta 98 zcmaFO+RVmtnwOW00SMX|8PhlNd}Q?K)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7td(FyonwOW00SK5Md`sKN^O4b@P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>qm1!RUq|6$( diff --git a/env/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-312.pyc index 733cc0f0b859e6401f7f2711b7b61887b6ed260a..d01a12d4c177004cb3d28ba179083ca5a9b720af 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-312.pyc index c4b2f02cdada64d81c927da8495bc4f25db05d99..be517d0422fa206955545535e8204b8824390562 100644 GIT binary patch delta 98 zcmeyw+Qr6mnwOW00SMX|8PhlNd}Z|L(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>qlj$G;s!qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/formats.cpython-312.pyc index 4e68dd397de5853d093a01c045f625f7325ad699..3c035e231dd8dec8191c13809dfbb679f73d2d9e 100644 GIT binary patch delta 98 zcmX@X_JED&G%qg~0}!+`GNy0j31jl;)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7th= delta 74 zcmaFBc7l!PG%qg~0}wDj_?EVjCydFUP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f71K5VmMt2! diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-312.pyc index 191a8fa840dff9ac9709e799624a25e619dd283b..fcd9fdfea83c6f6e2a55a02c113a9a085e423b0e 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/formats.cpython-312.pyc index cef48e92af6ca0c2537a32903852e05f82f1348a..5ce9dec9ebeca6fb7a303b5613dbab81ca02d9bd 100644 GIT binary patch delta 98 zcmey)-p|2vnwOW00SMX|8PhlN{ABXz)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tG9Ll}CE6k9 delta 74 zcmeC@_|DFAnwOW00SK5Md`sKN^OMP-P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>qm-!F?uFx9k diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-312.pyc index 09333424893791fb0e4354ee25195da8f0300084..8ded8e58595cc1d3c438c80935aa091a0e863376 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-312.pyc index f0e54b9c06ede03ac1f225b111fd286ac273d356..212c305895aa9f9ff1ddaf124e082593fdf061b3 100644 GIT binary patch delta 98 zcmcb?_JNJ(G%qg~0}!+`GNy0jiDvTX(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fJ<~w|p%xnL diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_CA/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_CA/__pycache__/__init__.cpython-312.pyc index 8ab66f268bade96fa6e5f64dcd71ba9d1ee2b3f9..4a2998493b696aa915bcccfeda9a12f9ec972c85 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_CA/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_CA/__pycache__/formats.cpython-312.pyc index c40f788faca416d952bd98c0b8c4da836c5fdd7f..6e88bb8480803a8912eb382542c67f8f1e0a5a9d 100644 GIT binary patch delta 98 zcmZ3?wwsOTG%qg~0}!+`GNy0jQDgGx(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>Kis>K#cG?;l diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-312.pyc index d31fcc3908fc256190f59ea89be351f17d8018c6..174569584d86a41efde7e39ce57a2b0735783f7b 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-312.pyc index 1f174f50303dcdfe3fb88b9dfbf25aeb6d45d67d..e9fb8648c56f583ae7f7394afa04c272cecde627 100644 GIT binary patch delta 98 zcmcb?_JNJ(G%qg~0}!+`GNy0jiDvTX(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fJ<~w|p%xnL diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_IE/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_IE/__pycache__/__init__.cpython-312.pyc index 8880f542f8b5d609d1289792c79310f0c05a1ac2..1c6430a365c669d8e464911db22d18a87eaa97fd 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/en_IE/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/en_IE/__pycache__/formats.cpython-312.pyc index 082e0db7dfa3956298af616fcdb1e3f9c70b1981..9814ac79eeddfd9ab42cd4da3ab839b7facf31a7 100644 GIT binary patch delta 98 zcmZo-pT*8|nwOW00SMX|8PhlN^fGz$=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9CdGVKHa-UA_> delta 74 zcmbQm-o(yxnwOW00SK5Md`sKN)5~N~q90nET2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-312.pyc index 5c52b99fcc3befc5651ff7b24aee8590cdd02185..9bdc957d3ae20308c0d7f74c3483150e4b4c02cb 100644 GIT binary patch delta 98 zcmey)-p|2vnwOW00SMX|8PhlNd}Z?J)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>qlld3`t?U}* diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-312.pyc index afae5e08f00f9849731ebca07740eefc11c2e46e..c8ccd09b9985dae887366713c4ccb081c3a3ebd7 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/formats.cpython-312.pyc index 146fe80db9e767b7901ceb8fb656568130db4415..ad6b93bf48b78c1dc3f23273c6680af7927896d4 100644 GIT binary patch delta 98 zcmX@h_LPn1G%qg~0}!+`GNy0j31;%>)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fInzD>m|+^h diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-312.pyc index f5933edf135bd97b362fddafb7d42b9316475ca3..d59782003d39fde6187609c36afab2a3d4e85155 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-312.pyc index 3e356a2854c44e432e515b66712f263b501ca4fc..3333da33db9cdac07d56cd763f512f389ec35cea 100644 GIT binary patch delta 98 zcmZ3JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>Kf$1Osd!iaK diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-312.pyc index ba06e1bde10c2ccfe5a7e3d6acce1af7d1f6d19a..6d94a1d18ec5411fb9d938781aa83e497aecc4c9 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-312.pyc index 09b801fa000a76c433274834de54aeda02a67783..51cef0930a1b5bdf1c1ff75ca73bae347b129c70 100644 GIT binary patch delta 98 zcmX@d_Kc0^G%qg~0}!+`GNy0jiDdHV(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fEz?c_n&ukK diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-312.pyc index 0f5586a70ee0711ca068f098666419ba3a99b132..1ecc39eb427064f1fbe641f077878c22cc47f8a8 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-312.pyc index 2309dcec08a1413f56c5e923b30914a1e6c511bc..6260a302acd0137167d91648ee545a212c47c9fa 100644 GIT binary patch delta 98 zcmX@d_Kc0^G%qg~0}!+`GNy0jiDdHV(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fEz?c_n&ukK diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-312.pyc index bc7fe7f5cfbcfdb439b3d02055f3c955a1e12bc3..0abfd582de098395be2a4134776f88ea63f3fd5b 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-312.pyc index 1c8c12c4ef80e3d7ce6a29f9ae68e08f367e53f8..ad1f6467969900ae1faf0e7e6f3b81b0b8acfaf1 100644 GIT binary patch delta 98 zcmX@d_Kc0^G%qg~0}!+`GNy0jiDdHV(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fEz?c_n&ukK diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-312.pyc index ac7963fb41f738f029f050433a5ee8eaecb72500..8412c6ab98696181701ec0ae7fc5613477fb77fe 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-312.pyc index 0896b798bf2cbe758dd0a8734b4d005d3fbd313a..b9fd268a1a90a0c7988f994d6247039c42466b8f 100644 GIT binary patch delta 98 zcmX@Z_Job+G%qg~0}!+`GNy0j@n`br(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fG1EZ+mxda> diff --git a/env/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-312.pyc index 48bdcaac9f947369c6b51f077483d0e197e0c5c6..6cbcc2e0d1a5e27bb4dec8014bcb29071324ba64 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/formats.cpython-312.pyc index f6711dcd07473eb1fa83d73a5b72c081fbd679e1..20c8c3e1151c047346550ba06dd2a4d616a2d848 100644 GIT binary patch delta 97 zcmbQqypfsbG%qg~0}!+`GNw=Dx#-cUA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6};VAoz##Yl delta 73 zcmdnUJd>H{G%qg~0}wDj_?9-2=b}NOerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT a0Z=ACFEK|yBQ+-{zdXMvCuOoKV-Em?+!^`+ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-312.pyc index ab3c409a80a65e9a46973ddfdc8ff59dbf7093f3..f7672e6757b3e90303da091da55a305b0e9f9895 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-312.pyc index a3296e84b9d4af729218fe823ca3b9fe336277a1..556bc6e153618f38fb288bd5e32526b43c857e95 100644 GIT binary patch delta 98 zcmcb|@{NV(G%qg~0}!+`GNy0jsbTc!)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~0^>3OsqGsV diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-312.pyc index dcc4bb6f860da52f764b66de65cdb2e5e7dd49e7..904694986f07dc61bd8aebbcf617486ccc41b249 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-312.pyc index 1182795f489d9b0d3b3b3e7d313b33c9801a8bdb..7971c1d7603accd0baa75c85786a415310ed5639 100644 GIT binary patch delta 98 zcmdnPa)pKGG%qg~0}!+`GNy0jiD&fa)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fGvh)4kMbIn diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-312.pyc index 4430a8a641fb282855230ccdc7547e75f2f3fedf..4ed40e5e26c6bb7882921080fdae3550d7f1f882 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-312.pyc index e6219769209a0b7e730d6fb5b0c88dffa6515caf..1d77470d1268931b97ab729d2e0e06828e6825fb 100644 GIT binary patch delta 98 zcmey)*3Zs!nwOW00SMX|8PhlNlrnjA>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9CFG93c|{ly{R delta 74 zcmeBY|IWs9nwOW00SK5Md`sKNQ_5ses2^IKT2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-312.pyc index c6dc48b0401b401ba421c779b47c8c678553f3a3..ec104d49d2cf4fe8766db7a8d72f99500f7f495e 100644 GIT binary patch delta 98 zcmaFE+QPJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>qjcFeMrI;GK diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fr_BE/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fr_BE/__pycache__/__init__.cpython-312.pyc index 0a8edc24f2bfa72b58293d3577ef601cf81aa65e..d64de2a0ee8de1535c5b05b8980582f2ec7d766a 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fr_BE/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fr_BE/__pycache__/formats.cpython-312.pyc index 60ac5799cd3a502b5408302dc68e92c7e6a0b775..908bf3753b3d66a3e39856bee41cdc535b299a82 100644 GIT binary patch delta 98 zcmdnSc8-nbG%qg~0}!+`GNy0jab)u7(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t{B6Y delta 74 zcmX@dwvCPFG%qg~0}wDj_?EVj$C1gPL_f4RwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fD$`B?hsGLh diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fr_CA/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fr_CA/__pycache__/__init__.cpython-312.pyc index 52381ecfe9687400dfcbbb01e4c12e2d62a0038a..cb0809f273f0d0128793118abefa627bb7356716 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fr_CA/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fr_CA/__pycache__/formats.cpython-312.pyc index 21f8076a9a0c1ad88eb6e55dc8d981f9ce48a3c8..d09ee65847bd50f345f69c8bdd921e31943a0ca0 100644 GIT binary patch delta 98 zcmdnTc8!haG%qg~0}!+`GNy0jab)u7(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fD$_v#j9war diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fr_CH/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fr_CH/__pycache__/__init__.cpython-312.pyc index b78457fffda025824d971addc68de87a8224ab55..1b08fde80442d52bfaa5016f166f5819d68b1d73 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fr_CH/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fr_CH/__pycache__/formats.cpython-312.pyc index 087ee7ed534516bb10ab989a3b1ea03af35790d5..f43732eb88125d451eb4b9121dcd22a3a29a405e 100644 GIT binary patch delta 98 zcmdnSc8-nbG%qg~0}!+`GNy0jab)u7(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t{B6Y delta 74 zcmX@dwvCPFG%qg~0}wDj_?EVj$C1gPL_f4RwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fD$`B?hsGLh diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-312.pyc index 2b8d62af48f6c3630410ac057fa803bcd94a0e85..e4d4e94735cfab1440ca806789b140d8b59568ee 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-312.pyc index 5344071bccc0f03818b4c59a67a20334e9a0593e..0a517b39dce48cc1c476e47b47d504577a893c7f 100644 GIT binary patch delta 96 zcmcb__==I|G%qg~0}!+`GNw=DG4klt4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}00778ApHOU delta 72 zcmaFGc!`ncG%qg~0}wDj_?9-2$H<^iKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_1psNB8UFwP diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-312.pyc index ac4068804cf6381f10e9848ee61d0ddafa4ed7d7..0550cbcc81d9b6a00cd7232e1e45a9c2fd4569c6 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-312.pyc index f24b02c5b2dd4c7fcc39f6cdce9d71ad34720d5c..fea39f65cfc98270ddaedb0222dc7c800cc330ea 100644 GIT binary patch delta 97 zcmbQtyqcNkG%qg~0}!+`GNw=DIqlJ@A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6};VAiS|H#6 delta 73 zcmZ3@Jeis2G%qg~0}wDj_?9-2=d?kgerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT a0Z=ACFEK|yBQ+-{zdXMvCuOocV-Em;CK=)Y diff --git a/env/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-312.pyc index 759edb976058d0603c6629a6f55118f2320d184d..1ddfce26c5e732b37cbcc4bf0ab97ae876f44309 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-312.pyc index 4e30cc10ac950244e5eeea2f578fbf90442a98d1..f21db86a287ee0300271035febf7ba335a675e93 100644 GIT binary patch delta 98 zcmZo?na{#=nwOW00SMX|8PhlN7%+Nt>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9C>7-s_jz;PhN delta 74 zcmbQw($2zjnwOW00SK5Md`sKNW58%os2^IKT2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-312.pyc index b0b7be3a1dca35599dc926b66c57b5ca2ccf023b..dc52f0d1561d53f33bb6e3135b8ccae63622e1b9 100644 GIT binary patch delta 98 zcmX@d@{EP&G%qg~0}!+`GNy0jDP;8M)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~DC0r^o=O_r diff --git a/env/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-312.pyc index 84639ada9559631aa1f7f35c68224604947968cf..8c01bc2b00503969c4b2e656fe96b1ff3ea918df 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/formats.cpython-312.pyc index d215e5a499589f8a4b791925a90ba1fb13496d55..bc29e8e345763dba2aa4dcf02f23ebaf4d7b9d5b 100644 GIT binary patch delta 98 zcmbQtvYLhGG%qg~0}!+`GNy0jv0?P+)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f0^@7|aGV+T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-312.pyc index 7fbc4027d6e548a50543b3be327fa2f6365bf198..caa11049bc040aaa6c6971385e94a0fa798b8987 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-312.pyc index 2db9b194138048f26edd267c1deb46f733414682..346113affe6205106207b6afa6db9f86b4f2ade3 100644 GIT binary patch delta 97 zcmbQryq1~gG%qg~0}!+`GNw=DIqT7>A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6};VAkd?4rm delta 73 zcmZ3>Je8T}G%qg~0}wDj_?9-2=d3}YerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT a0Z=ACFEK|yBQ+-{zdXMvCuOoCV-Emqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-312.pyc index 43aa6c4cbef29cd14c7aefab0f1531815e592fb6..3bdd683ed3021b0fe7c4f2f4b8f039d2f4319193 100644 GIT binary patch delta 98 zcmeC-Si-?`nwOW00SMX|8PhlNNHKeK>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9D+n707{!0I5$ delta 74 zcmZ3&(Zj)WnwOW00SK5Md`sKNBgJe`s2^IKT2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-312.pyc index 751cfed8cc2082df50a89674f68a92d0d9668bf4..20bf7e1bb9d97072b610643a59ff515b7121ed60 100644 GIT binary patch delta 98 zcmZ3+wvUbHG%qg~0}!+`GNy0jk!SMg)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>KnCUbCc4!(H diff --git a/env/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-312.pyc index 351bf2aaff9e9b9513fb19431489ed33a6ddc29c..261caf87338e8590ab35939b154a901e94e74d15 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/formats.cpython-312.pyc index fa34768ba33cfc44cfe49bfb439c035ad9603dd9..45ee2e32578d9938a939364b9b974b4a8da4e075 100644 GIT binary patch delta 98 zcmZqYn9sp;nwOW00SMX|8PhlNurhme>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9B=nU4Vgwss(; delta 74 zcmbQw(aynhnwOW00SK5Md`sKN!^&(>s2^IKT2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-312.pyc index 6a60c99193a8ed47872c1e1f94ffaff63e35e58a..10b2e2c4b80a57eea83e2b025e05d1000d8c53b3 100644 GIT binary patch delta 98 zcmZ3^wx5mXG%qg~0}!+`GNy0j(Pi@J)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>Kk!c?QdKnri diff --git a/env/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-312.pyc index 91352f0c9edb1e9f37892d7e3fd462e6178bc6b8..347e115eee0bd41570cb87ca96483700f52c9d98 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/formats.cpython-312.pyc index 632c5ff79027a268f148ed9bb3bddd27d929e619..0fe0cd3d8e189d506e8f0dfdcedbc9326a5586f0 100644 GIT binary patch delta 98 zcmcb@{Dzt5G%qg~0}!+`GNy0jVP^E`)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tzg3_ delta 74 zcmaFEe1)0kG%qg~0}wDj_?EVjhndl!P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/formats.cpython-312.pyc index e21251264ead067bfb77e1348dbc51319850729f..6fd0e51a01848e37ed9c9e9c9a832e368578742c 100644 GIT binary patch delta 98 zcmeys-oe3hnwOW00SMX|8PhlN{A2Ry)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7teC^A{rsr delta 74 zcmeC+_`uF{nwOW00SK5Md`sKN^N-1(P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-312.pyc index 362c844f34cb27b2e81e0b05ea653ce4733bb4c2..a4d747d49e7ec322dc06e818721d3f54c83f57cf 100644 GIT binary patch delta 98 zcmX@ca*u`QG%qg~0}!+`GNy0j$zt^A)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fAL9Z5m?Ij! diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-312.pyc index baf50223cb2588f40156537e7f35249e7555ea91..60040d7d68cc6b5214e08c94d2fc25073cbe68c9 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-312.pyc index 869f58068f81a34a7f6ae23b7681af2bf6f78150..aaeff4435eb62f0d3024a3471b8f5ac1a7d4401f 100644 GIT binary patch delta 98 zcmaFI-p0XmnwOW00SMX|8PhlN{9*Fw)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/formats.cpython-312.pyc index 7687ebed40719833737632c83714446144334edb..61f112574506c8c123f82c7cc82066740bfa35a9 100644 GIT binary patch delta 98 zcmbQivVn!?G%qg~0}!+`GNy0jacA`C)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fHse$Pb?zDv diff --git a/env/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-312.pyc index 3aee63a4a33a2a409de7a79993003334ad7a4bdf..71b78559ec296d488337429c7e0c587194c79f5c 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-312.pyc index 1d8f88c00c33cd987e89cccd57e53c8a266c2581..21c064097566195f9c72c9e84f40c3943e304fa5 100644 GIT binary patch delta 96 zcmcb_^ooh+G%qg~0}!+`GNw=Dnc>l?A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}{x7 delta 72 zcmaFGbcu=QG%qg~0}wDj_?9-2XNEzcerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT Z0Z=ACFEK|yBQ+-{zdXMvCuQQBIskwy8s`82 diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-312.pyc index c23fba861c7eb2288ebed71819e0e0280c9d00e6..ab60702acd1d1d656358578f5c8bc00dc5adf357 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-312.pyc index b518ef25a68b698b2f89bb6b36117998069f4b50..a51c983810a34853e2c016de1f87d2795b372e39 100644 GIT binary patch delta 98 zcmdnWah8MUG%qg~0}!+`GNy0jab))B)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t delta 74 zcmX@hv6X}8G%qg~0}wDj_?EVj$C25fP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fD)SBihwmC~ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-312.pyc index 43b53317081fc323bb511774eab2090472907d8c..e57ab8b8212ce061f4dd65c1faf8caff6f1b1e0d 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-312.pyc index e5238acda82a501529055ac4798195e32cdff29e..81f8e15d39554dab99e798881a4d4728a2efc9c9 100644 GIT binary patch delta 98 zcmX@Yc887UG%qg~0}!+`GNy0j@nZ7m)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f9@9Pmku@5f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-312.pyc index c91885e2fffd158f26da6af1f6da79c5f1c37f78..0111bf7d39a7c16ff99dcfc4ba9f9a975d2682ff 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-312.pyc index 755edef27e0ec7943d7fb00ca8b48150b7acab09..8e976378c938c425aea8d08e285132c90f637881 100644 GIT binary patch delta 98 zcmbQlv5JG|G%qg~0}!+`GNy0jkzn@d)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-312.pyc index 531cb585c352e17a1ffbe511e626e67a65cf0831..2fde3489d23f128af786ac5bab8ba807a0bb1242 100644 GIT binary patch delta 98 zcmbQmv5AA{G%qg~0}!+`GNy0jQDFAy)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>Kgn1tTaTOW+ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-312.pyc index 575c14ed537712b48a46a9e73b5078703e79acc8..720f41d4f2fe05d895b6bf38777910ad8fae1053 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-312.pyc index 34fed3e3196a0243b9939fa3df8e48268a1411c9..f750a798f9e6d71b86dc256798e5edac2dbef075 100644 GIT binary patch delta 98 zcmdnYewv-KQA#yKO;3KC%-(uC?{pIDDyS|paU9Y diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-312.pyc index a661fc00fbe385e8c476822db42262059ee23d93..4d90e16b260bb11467d5ca664325c6a2f8409b47 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-312.pyc index 452c6b4f94bfb60cc379d2ffb018fe866d208aca..c360d978782a957a154c505db54dc58787d7f0fc 100644 GIT binary patch delta 98 zcmcc3_L+_6G%qg~0}!+`GNy0j$z<~A)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fFVi*vrBNFJ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-312.pyc index 3fa1f07d052efa2a292269ddc03f3f17b915000b..7102a8cf4ad2bf4a71bcfb4b9b013b7b962ac466 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-312.pyc index 887efbfb99848f6e07d39c5462ce9a0a00774db3..b8665c0ddc09af80c2ebdcdfc5a3ac9d0713591b 100644 GIT binary patch delta 96 zcmdnUbdrhZG%qg~0}!+`GNw=DsrBg84=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD68D0075fA!h&p delta 72 zcmX@fw2_JDG%qg~0}wDj_?9-2r`DiQKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQQvQ1psIZ8fgFk diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-312.pyc index 0edeb55e6869fbb38e1ec895e0cf2acae903d64f..b335105a1bc524c323b22ba6002147075a53b357 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-312.pyc index c29e9fa9ef31b247c828310c25735c74301c68ac..d4e9df8c68bc185f18dd39de5710069801a7ffd5 100644 GIT binary patch delta 98 zcmZo>pUuv5nwOW00SMX|8PhlNOl0!t)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~DbqFpe8C!{ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-312.pyc index 2ef4165b489945de36392190bf4bde1c28f6f197..27b5d4df5601af3223321cf664489ad5af14be38 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-312.pyc index fd2acb5a612a23df13f5206261eb3fe9e7dece87..b6ebec6e77921ed19e722763446ec89b855ac376 100644 GIT binary patch delta 98 zcmaFL_Lq(4G%qg~0}!+`GNy0jDQ5EM)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~IMX%&tw|dx diff --git a/env/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-312.pyc index 7c05fe4fe7551898e93d94c6038c14a2617ec65f..226445fa538542a34e582316ed2cbfe5c78942f1 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-312.pyc index 7355ec624a576408944e454a17091b3b84457f00..35e65e2e8ab8ff38ebfcfd4f345aa87665f7c171 100644 GIT binary patch delta 98 zcmaFD^@oe+G%qg~0}!+`GNy0j$z<{9)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fFUx)att=ZT diff --git a/env/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-312.pyc index c0b777dac69d2dbd3fadf97aff5ec6f0f0566888..86b85e05f32709e94105e9fb2ae15b1e13a2f3b7 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-312.pyc index d3f01bb2f70873cb619f7c54dd5363493752d213..3ecc80f2b59b9e1a785253ada3ebb7423a6738ec 100644 GIT binary patch delta 98 zcmaFL_Lq(4G%qg~0}!+`GNy0jDQ5EM)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~IMX%&tw|dx diff --git a/env/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-312.pyc index 3d0a695674d3b0944ab778be86949ab29f32ec7a..b6aa6e7a2bf7b840c2f6e24eec38a4fc94adea19 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-312.pyc index fa90f7df83fd24abff6df577c5c955363b6bedd9..5dfaf76a0b9fb9b7b9eda32e999044758d3aff2b 100644 GIT binary patch delta 98 zcmey!+R4UqnwOW00SMX|8PhlN{Acv&)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-312.pyc index cd97f12e7e722ba521f66819a2d13525b092affc..3762f8e9e77b9815e23ab147b407a93c5ccb5589 100644 GIT binary patch delta 98 zcmZo+pTo{`nwOW00SMX|8PhlNOk(or)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~8PhfZeT^EY diff --git a/env/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-312.pyc index 65aa8b95c511ffa4fd2966d33c8587ea4159840e..d3e92e52fb9f2896a6c6f0d7555d8fd8ccc5eb33 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-312.pyc index c5c8609a58c6cc365bb3d4d56c655ed1472deb94..4e0a0e396c8b088cc235d871099d91f641bece40 100644 GIT binary patch delta 98 zcmX@b_K1z=G%qg~0}!+`GNy0j@n!Pp(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fA=5zsmF^m~ diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-312.pyc index 0cc2a10ee3a882b367c89d20e4105062949478a3..470a7dd349cb22712b34a7010bba035b1975a107 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-312.pyc index 64766ffc41702f4c858a79d0dd427d654127c2fe..190cd74c23cf73096e04060af66d7b2ca28e8725 100644 GIT binary patch delta 98 zcmcb}_L7a~G%qg~0}!+`GNy0j31{-?)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fHPb!-n~@sP diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-312.pyc index bed3cf070832ebd1703b54e5e3995106cfcd4a19..86f0bfd39ccf307b07586a6a61d4fedb6fde2461 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-312.pyc index abcc4494a465018f08b0dfd83464476d4025b63a..f1d320a48c8cfc78aa562c2b3ff47b7b481e086f 100644 GIT binary patch delta 98 zcmdnRc8QJWG%qg~0}!+`GNy0jabWW3)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f3e!FSi9H&1 diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-312.pyc index 3cb2db5e12c194261613b5ca55137fb95da8e03e..9229723df6302dd013a9a4d7e26410f2bf70b947 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-312.pyc index d982eb23ab9a84480db8e5c050cda29f9726d029..25647301b2fefd0913633776b95c25764a81d08d 100644 GIT binary patch delta 98 zcmey&+ResunwOW00SMX|8PhlNFfw^`>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9C*nYIA{)Wsm) delta 74 zcmeBX`^?I7nwOW00SK5Md`sKN!^mV%s2^IKT2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-312.pyc index 3784f4218dbea5660190e116c31be24e8c4002c7..5aa373f321856f9097fa2433201b59acc6b25231 100644 GIT binary patch delta 98 zcmey(KAD5(G%qg~0}!+`GNy0j;bivc)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-312.pyc index 1a9fd0635d3a124e65079a1fd11ffad48652894e..4cc3d328425c1dc31fde8f514b8e04be0612e18e 100644 GIT binary patch delta 97 zcmdnWe3qH#G%qg~0}!+`GNw=DdFj!qA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-312.pyc index f38bc70a8eec8053ab5312ecf705e470f115f826..880223f584a70a6b36143d8a22ac6a4596abf3a3 100644 GIT binary patch delta 98 zcmX@f{*ayLG%qg~0}!+`GNy0jxz6O#sUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kC$Ay8 delta 74 zcmaFJev+N%G%qg~0}wDj_?EVj=Q@)?p?+v_YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{pIHuE+Bv5OkK diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-312.pyc index fb58d246ada77d2614e42da9d198187bfe62f6b5..a4f85638a609b0a535a2cae2b3dff48d19f1d5e2 100644 GIT binary patch delta 96 zcmcb?_<@nAr$}s delta 72 zcmeysc!QDWG%qg~0}wDj_?9-2$H<^uKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_3jl5?8W#Wn diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-312.pyc index d647eb5584bd608e01b7d4ef7f28b8695fb191fd..695862a77a23d366937f2e4acda545657dd73522 100644 GIT binary patch delta 98 zcmX@d{*0aHG%qg~0}!+`GNy0jxz6O#ryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pIHuG)(wQd^F diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-312.pyc index ffe5b16b567f5b831033a4b8d7b3f7d3f26d8690..f454e5196ba9b0e676e0894842f44b966dbece92 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-312.pyc index d13db63c87ce5da4cd13196c2de0513c743d7103..56639fd4eb657480f104dfec7188a505156bcbbe 100644 GIT binary patch delta 98 zcmaFF_KS_@G%qg~0}!+`GNy0jDPZ#G)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~2-7wIs^uFU diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-312.pyc index 09b3d7a87e126676b08c695bc0f8a1291bbfadac..c4490d69b758d00a970b1f52cc73c247f8939691 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-312.pyc index 2e9322329a9f782d84bd7ab20fa82d1f22dfcc06..2166188da710f9af5da448de449742d2f41d3fb6 100644 GIT binary patch delta 96 zcmcb@^oEJ&G%qg~0}!+`GNw=DndQ-`A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/formats.cpython-312.pyc index e5945131596c1263b48fa9d78a5bb60f1cd2f1db..80986de1611aa076235ecd4652b27ab01ee32490 100644 GIT binary patch delta 96 zcmcb_^ooh+G%qg~0}!+`GNw=Dnc>l?A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}{x7 delta 72 zcmaFGbcu=QG%qg~0}wDj_?9-2XNEzcerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT Z0Z=ACFEK|yBQ+-{zdXMvCuQQBIskwy8s`82 diff --git a/env/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-312.pyc index 0ede009b1822c770181cfceb3ce1ae0429294282..d2e1b205e0a0048dae4826ecb4b04f3cf97a6ed7 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-312.pyc index 92dd149a796eb0494d5e301cac8b4adea28e20a1..0ce0aa878f270c365a0cc5ecb539e179dd8ca25f 100644 GIT binary patch delta 98 zcmX@Yc887UG%qg~0}!+`GNy0j@nZ7m)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f9@9Pmku@5f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-312.pyc index 785620aee020a59918530b582fa3acd192383742..0ec27e60286bffbd9f19ee6aaaa2672d667fde5d 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/formats.cpython-312.pyc index f2a8dbc3ecf217e727d41c1b129611fadbfe20e4..f9ce87ce3d2cd3333942a93e112c3014bd3205e8 100644 GIT binary patch delta 98 zcmdnQc8ZPXG%qg~0}!+`GNy0jv0(D()DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>KhiM-Gg54Tb diff --git a/env/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-312.pyc index 78e78e9725921876262c929df77ede27be6847aa..4435903fb686bb3756eb009fe9083cb27c0a12e0 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-312.pyc index 5c80350276ae5287731d3a406e2e621375a5014f..e2d4110725e7039d78b22ff767ead7c7b3096ed8 100644 GIT binary patch delta 98 zcmX@Yc887UG%qg~0}!+`GNy0j@nZ7m)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f9@9Pmku@5f diff --git a/env/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-312.pyc index 390a2fec6492b9db2b6599571e0d0fe97e680bc6..016bcaa5a5011ebfcce1b79319fe0f69375bf41f 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-312.pyc index d525e885114dc3c0e80b6aeca30bceb418334c04..7b4ef39f0377fa4578453db276a64cd04c5fb120 100644 GIT binary patch delta 98 zcmaFE+QPF>M0?8~P!^ delta 74 zcmZo+d&A0enwOW00SK5Md`sKN^NZ1-P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>qk7*kKr(hbx diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ug/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ug/__pycache__/__init__.cpython-312.pyc index ff2e65e62a6ae60aa5152893e7f7f88eabeda72d..3d560da045f2a859f8293504737fe9ef21c22b2d 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/ug/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/ug/__pycache__/formats.cpython-312.pyc index f5f8305a6dfa26b0077a83c0038b5d9cc5cf2934..d928a5fab40712a95e02bd30ea900349f3c661eb 100644 GIT binary patch delta 98 zcmbQovWJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fI^%o*czhZj diff --git a/env/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-312.pyc index 2d3407bb32c0dae02807102678862506715dbc70..6a8f1b2e44d3d800d262daa4d72b905069f03ec2 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-312.pyc index bc257845e664cd3a838d8175839e3a8cf3a5f71e..e624145006fd424e816d628339b2cba0337391b0 100644 GIT binary patch delta 98 zcmey)*3Zs!nwOW00SMX|8PhlNlrnjA>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9CFG93c|{ly{R delta 74 zcmeBY|IWs9nwOW00SK5Md`sKNQ_5ses2^IKT2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-312.pyc index e31d8492e34b967fa2df90d26766511ef8e66aef..ea1cbe1291fc24bb723ddb824dab7cb108b14b05 100644 GIT binary patch delta 98 zcmcb>_JWP)G%qg~0}!+`GNy0j31jl;)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f71KTdn#CH; diff --git a/env/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-312.pyc index 2bdc47881ba852d6060bcee2931161f8df8b113b..620bed7ad88bf289c63bce5787da579821939c2a 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}!+`GNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szSLAprmY delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-312.pyc index 18faec6047ce779299d7e0201fc95a6255ebc6e6..69421180fd3bc081eee6ec9baa41312adcf432c0 100644 GIT binary patch delta 98 zcmX@Wa)X8EG%qg~0}!+`GNy0j$z=5C)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tBG%qg~0}wDj_?EVjCzH{jP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fFXLAr$}s delta 72 zcmeysc!QDWG%qg~0}wDj_?9-2$H<^uKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_3jl5?8W#Wn diff --git a/env/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-312.pyc index 51bd787042ab59e197d4e2fec65cf95fd7c4b0b7..13390e552331eb9913299e30cb697241b3627836 100644 GIT binary patch delta 98 zcmaFB{)3(8G%qg~0}!+`GNy0jdC26^ryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kWj+i5J=!7; delta 74 zcmeyt{(zn5G%qg~0}wDj_?EVj=OL3pnSN+-YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{pIDf3|f!TuW% diff --git a/env/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-312.pyc index 0bd0f4992529be217c1d9aa35f793db2361ede82..0d51f51b026bf89681b54251bcd6031ce8513228 100644 GIT binary patch delta 96 zcmcb?_<@nAr$}s delta 72 zcmeysc!QDWG%qg~0}wDj_?9-2$H<^uKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_3jl5?8W#Wn diff --git a/env/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-312.pyc index b3b87344bdc36a17790f4664419fe1e372755e06..40eb35e4f828f8d83f84fe40146291d77fb8b4d1 100644 GIT binary patch delta 98 zcmaFB{)3(8G%qg~0}!+`GNy0jdC26^ryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kWj+i5J=!7; delta 74 zcmeyt{(zn5G%qg~0}wDj_?EVj=OL3pnSN+-YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{pIDf3|f!TuW% diff --git a/env/lib/python3.12/site-packages/django/conf/urls/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/urls/__pycache__/__init__.cpython-312.pyc index e3e5fa3d45c5054c9186bdb0508edeeade147b99..02b9f206301ad28ac5655ddb7048d9479030a6d4 100644 GIT binary patch delta 98 zcmcc0@|K0?G%qg~0}!+`GNy0jX=3zf)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~8sl^TrAQk7 diff --git a/env/lib/python3.12/site-packages/django/conf/urls/__pycache__/i18n.cpython-312.pyc b/env/lib/python3.12/site-packages/django/conf/urls/__pycache__/i18n.cpython-312.pyc index f562b8d1223a583acaa5bbb7308eb514ce428617..a47f1f600b83e0f32b9eb31bbc5266289551e2de 100644 GIT binary patch delta 135 zcmdnUdx)3kG%qg~0}!+`GNy0jX=n0i)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agHq&$_8DF3g4Gdod7$j5{xL+36xh`&bQQYzq0~4z& RJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag0CPDb0H3`YbpQYW diff --git a/env/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc index 832f940899b7c82862f5aad008d93b2c6747cb6b..c7ec67428aea66f6c996cc38903f25bc120cdace 100644 GIT binary patch delta 20 acmaFD_=J(?G%qg~0}!+`GNw=Dxd8w;hXpGD delta 20 acmaFD_=J(?G%qg~0}$vO_?0%1=LP^jT?U5$ diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc index fcf20b4077c8e571d8665bcb93fe2b798dbfe6e2..82f34d5e9ca878f903140f3bf29f945f6772cc66 100644 GIT binary patch delta 21 bcmX@Wb%2ZKG%qg~0}!+`GNy0jF<}J&IHd%3 delta 21 bcmX@Wb%2ZKG%qg~0}$vO_?5Pi$AlFCK-UG* diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc index 3b277e9ca5e33cbf01328680b722307b7efdd6e7..a467408f5aa3bfd53114faa50ca7307200a8a1d7 100644 GIT binary patch delta 21 bcmaDS^-hZCG%qg~0}!+`GNy0jN#X?nLYW09 delta 21 bcmaDS^-hZCG%qg~0}$vO_?5PiCy5sTO3Ma> diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc index 930381f576b35c343fd00a3f4934cfd94009c6f7..fb5ee0a562898d755db2dabaa2a386b553b5f646 100644 GIT binary patch delta 21 bcmey$_mz+5G%qg~0}!+`GNy0j$z%rrLGcA2 delta 21 bcmey$_mz+5G%qg~0}$vO_?5PiCzBljN+Sk) diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/checks.cpython-312.pyc index 2484108664937e37d0ff88d9c0bffe2e08e578c3..7d68ba4a77869b0d306b3de9f417b0a27766c314 100644 GIT binary patch delta 1219 zcmZuwZ)h839DXl%mp|7ey*0i3YnPRsbSJEb>hP4^k}vzZ|2vv?Pc6zNAGCdI=cn8 zJOSI|U~TWfa$wP$IUzYZ*Bzb90rWMyN)f~G3>Tzj2DF6XS6sq~zgrE!WWNxc4t~Z% z!rVjxlM6b{x5(u{9z8T~Yl(~SCujO#A$(*@M|0*swcz=qgxJhyUd$dWYk+O9WQ~f} zXtCLuwXgAqRymPR{Y|QD_Oe<*{-r}Nxgv};ij{3wq?G~fZNN0`NkX&+V7ARotCa)% zuB|{7_`@>1g4)sD;IyWt3`m!8(;b>hDjqqBZ57$p?CFK%qE=$#C3gsYxNnpoFSW_& zX~&Yv^6ZdMf|#v`ixCf=fou3E@|Y?F1!aZ}{jxt!Gu0XX=u{d8dz#3SKZ^Q$G%D(z zKPtng9X9m#3zI5K>{Mw8waZ~JsG~NwhY&ZQ{!wI#VWRa>DU2UTeW=* z_h8%T%1D;6yj+9VV!RQA`W5`~lfATFso~|5YZ#xD(fhBTQ(F$y;H$d}WAhhA$=BXdC{)7x&Gd`3%{fA~Zfy$CUiMLK%lc^S3Z%Tt@5{pBpUQHMvxid=77_4t{%0VZ=3j zeC-a#E1N=%^)>g|BP>O}99bC3QMuRV6H5`aar-DiurR!0^~ze{@J$X*B&NI>V#8$5 zbgZ>>6-<#LYb`q5lB28O=z{O9j0Au)g0HN@x77;vG)t^U#IHh}_Xv4bn4pVIuDR~n T?u#+_?@E#c%>guU=M48B@_nXa delta 1213 zcmZ`(Z%i9y7=MquN`GNVtn6BOe`bD4iAZapox#Y={ z_xJpMzvp@0ySvxuU#`)%-|TiC!4qEi_t+KN6}ILeB;&~7(R1z;pXHTtH7C>;5XZXl zGTT5yBdJDfNhxj~?{A~qfVIBBux!VcR5RtRy%h34{ZY>~|ZNY!ZwRADs zT=Voo%L=*W+OSZQ_-6f^_H5gMbt@~o9$Qdd1S>v&#osjP^Tl{62I3nfbs!0d0PqCy zg?6PjkmW_#u=y3qBQhBNZ< zuHzK_P0%2Z+OJng@u&HB;2&d($$vk##$-ckk>5jpk9V<_O@0NpCTdxeus6X~Fj{k` zK?YyFSRuXqG-D7~sf{LMTup=HghBpP-+4xNnE@C6Bxy78=aRPo-&=BkqZgl$~w{rpP1D4t(|SOAHMe&L0LmbV(M5W_YQ1b+#sM z0j#5l{c!jdhK3B!4`%?|W022}ovDA;+QiPhr$x|A%*WA^NICfmHHBuE~e9p;Kl zE*0a!$@=1wq3@3-Zvf~ugCwRNTDNx-n>O8$x2MAt*hw1X+{{mOc#Eyf%1%w%nRcd+ zW;**b`wnTHhjeMs)H!)+9(20Q?rj}ba^$-a`*wN(ymoc7dplW#n$j(e5ax$9N7*N< zsF#Ok2hvRX$fa&gQ3-SNAoY4ZRs1{Ts+|*+IZ@WdW=(9)iY*gd-h#Z11ypTyebztG z{Y4-}tvYK`?HPY`#Tm;9?wq$l_eM2uw16CT7oPfcC;~ChL4nbPs-M>dMT1vS=VB|0 hnibRuHdpJL-u>0?3wsL4ZWXb6v4@68h8I7O{|C{Wl+geH diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/decorators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/decorators.cpython-312.pyc index b2da8670723d7767e7f656a7225469da1757b1e4..ecb6262c2635ca6ffbb9a6f49cfbde1347735f55 100644 GIT binary patch delta 21 acmZpdZZYbNcW2(kz3HlLxYF&ed8Z+08n)E+5*8|1NlCRm6w+TU zBuYJCDh0C!Z4cq>MnO;cER;8Hy9PcKK?D`3n?Cu_^=h4$bAJ53=gaT+`7VrUUX5vt z^SQYsP|iIF&(0dVEbtBPx42PyS2a#rx)HF{2&Pgq(rf@6_6|2Og(=dQh}!pD0(B&=rs?24HiK5_tWPpU^AMWdacSLQQp!7CyvtZB_UR*N&vp z19*YEi-6TBg#FXdXi&Xk?iYb)0c;M3gp+|kBpkyHjW=|e9Ib=I9~*BYYS!4KykZ;0%!@ z;CQ3~v#knqojx6PYHJ=nU|lKgTXL3^7;a66 zOyoC)6S1Yoty^Tcj816jxv0^6*o=!gyu>)Sv}r|Sr0)mCe0oGTa&3`slKEDVZS8Bl^prRo!A9VIvyJ)4bo@g~d~Y75`K8V`6B(nxuEA1pNg=B<4N< delta 749 zcmY+BUr19?9LLYSXMgVQ=G9G6_UF#J!j@aKjYi^i&dpL#dRQ(CA{gPHG%8299tvtj zhV%!_17=a7IB-Itc7h%v>cs~M!pkLYfe%IW)XR1!40@2xt{QY6e&2K8_vicjoY&Lz z#x!mDR8_?Sat?m{GrVdUa8U11+7V)8dy5K;CL78*1|d;wc3L3~DCBluWMmQ{lD6ix~vB#PGrSyvY&6SCmD*Qa=+k~gXX9m!bq`XN#L z#arT>IW42W0=J;>L5UBRO?n$!WPsIyejSMzAbCw1u&>3aqfy0%4}BhI(fPI{BRLPL zz)bACZ@UAD;$x9{imPmu1#_Xr=zKH_aIw9^Og%=So||mJsPnTbs3sN56A@JG>4xNv z#onh>L#{nT#-(auNiCH>h}8B~PpD5;a;CPHadVV_0*t86ZZfAc2xUU=iLVQ7nEn|E&u=k diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/forms.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/forms.cpython-312.pyc index 17fa10a0533ad9fd34dd031ddc678a6a2ef412c7..43bbad47e5e33b01865d961a7287aab5ffbc1272 100644 GIT binary patch delta 99 zcmdnad!Co)G%qg~0}!+`GNy0jsbThL(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag0`q?+0JOs!R{#J2 diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/helpers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/helpers.cpython-312.pyc index 262191624dd8b24a32bfb8d08ad05c6d89e4e015..df051f08d91d6a40a3507dec8cb0f8cc3b1e6d41 100644 GIT binary patch delta 602 zcmbP#k@3|9MxN8Wyj%=G(9X!1zLCeAgRyI}3x~4B6&?4ltjsE04|Uux3TRB=n&I<- znL%87hSfzewUauREy7Rg90=SYvLkV~_z9hh7U7q9B5vroe`ei0i{n0%KoHQt7Ysid z7;eZa&X1cDH@T17iJw7E=Vvh+P^QU|&5?s~as!XYW_2EJW^EmySOdcY0g>sP6FH~z zPvq}ly)7ix;dFyXa6-`Zh=~ywd1O0Xf%XfFZ%*Q0$fDy0*6@UzZ-dHq&5fGZjhrqS zIbG&=zG&pMLUaP_43YWLGo>#Hs9Z2|y0}?WM4eH<3hp3L$?4Hkq9><{YB4j2DQ=!5 z>cY(Rfq_|*>!GB|1lGy-B+Qv_N~%njlDyA6OZxNXKaw{XMKfT!??@;vP+6|MQ2UyM z-sJbv!ORSj`kUQk_AvsDU=ia38R0mYM@|cDgtc52*oYN!s}vdICkH#kvwmY{lINPd z$01AzNPm!F06NBJqR({^ohu?blQkXfm>EQMH)lEKvNEkgHk!H*{~Z*#CgMZ delta 677 zcmaJ;-%C?b96x7gKkmJ|`{BBGZe8!ja%j#KYLH?NZF5cqp? zm6BA-ylLL-OP0mdAz?*s*B~c>>nl2%M-??tOfRSF$imy{qBZ6K{Pn;L?T1lwl*4ph z9A@pJm2`DOZ5~yfQi0F&1xMbIHC0^hI>Nj!8>@&-xvPa#KBbB3!eEU+k==Bx7~3L^ zU!Se^)!^%nwT|tcnAQ{9atyqXbEYM!s4Od+&fq2sN$ps^2yg$2lD&n={A3*w5S5Wb z1duJtal%2VL#R4sy5s3J?Gs3-+q+Aal|y#qtzhNeF~yE2@HF_mbEUKFIa^0&K7r{M z<(g3s*oBt27?_N1dsUJt@r8g1658dv(_nhydl|s9bT~3491w$Fs3RNbcon(s1+29o zP&b+%-Il_d6s{wlw`b$@eZ)@}qAG!mjYsdA46B&VW>mVDNN{C!<)c<=(EEogPEsFy^rLhqQ;PJAWq9-t&3%Xg``1giSPMGc_RVL2s zJ~{1dY~nsPYQDikwsE6q##8im#&6M0Hu5gIkm)0U>|N%-fFIM+bT?l))eUajBAEV| aR(b7A3|8F)nK+{eda!TOo2+Z5pZozrY0m8c diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc index ba0cec55724dae2ce7771299f70bef7a7ee04004..970d0e18ece785f09307b44093b6348946b2018b 100644 GIT binary patch delta 191 zcmdlGus49`G%qg~0}!+`GNy0jDdl1;o7}`@Ciqc_K}O}XIFAV5M=>C4g7f6#Tz>2y zM1bs%;*-U>l>|RZF-Rx?RY-9GRY)jIV4m#39m**JWPT85;1plHm|Kuf4QTKSh93>kBi3tjYqft1|kZm^V+6<6{&C bD*BMX$RMXUKVoJCQ2z;yE1S2Tq{ZLG=s+~#OLf2H?szyG}_Ss|IV1G=JCQU{lrTc4pAzJp& z?vK0Yz4v*a`~9Ae-xcqxe|ld{eWB4*AbkBC;KgNXzaGZ8L47TeW7@bGeKmoM?c$O? zSqgi^V^tpmkux@NM%y6*nVQ83+qFjMyBM+)8A~Tu8`|eWRb53rsFKeQ@$G@wnfR2#wBeO_|JfG+ z0$lq@rz2x)jSS{>Rz=q$=~`snp2Rs>x4*zzizUduhg%r2pUT;K<_9AOqV0Lgu261? za>r{kls8}HTxz=36jkSGw?fxSbZz{Fo0IQMX6Zef1hRT}0t7ZIFxYjYg+IP#j?Zpe0g-jYP*D4%%Z&2o-Q-zZ7#+3 zgk*a{IF^{m*}Ayxsc8b)_lc*!f4m&N#eI6V-*D%Y?C865Dlr}Vu`n$=TT`bbkv;cZ znXm3~I*Lf;sVJ~@QMce0UcEhYYew;hB!6hNA@pY7!t3JI**8=q-ro{^bN|$JJ%tbM zrmxDiV#Ctrss3BB!02ft12URIj0VYmDm4H zy6lgEr`ZuHFq{a+$R*unouF3Ce!S+Gn|}(X1H&>q5}`JlI%T&1*2#Fsua90)3nwE~ zn(Z&N^=52+%Y*Nnj(=NVgjcSNCkE4H7RlCER3oc%$$#0eRJCNPTDUf$6PK-3d|CLe z3O562kQ@Pp-e2$pxQFk4X|wzfoPJE|8x>w#2*m3ZLj$(C zuijgs&tQjt&7$?)0m|BgP-kg> z(TG@w$b3+)g70vS+ufc*Unr{!udq^6k1(ESOEFP0`f6-E-j+6bCE9zJmBkCU{|&es zE-d5WtPgX-@{=U;4uH6}yr}~>_vOkZV$I&beeaVo0y!GRl}`?X9doVMZd5l%5AAUE z3CwNFElc8%LiZM`o5jXY?Etl0_@1|YBXneoP+7Hw(2*1+(XJbY_(|E_iW~lOO_4wv zGwv>{7U$LGhz$Oj^~Cq(SU-2`UMo}R?3bAXcdSBJ^mM#>)mWFZO58v0HL8%AGk@kK z@z=M+{?B4%W+Tqoqrt5|v=U6U3+jaN1MNys+`4}qh?Sr$#?og?nP%)Zi;6TV*Sw{f z*Sx7)W1XBYZzYh~C5G~^m$)%2R=?p3$9A9@JqqKK7@xv)NKA*q>@E1h;)AbTDwyWV z*PkacrVj20>t5WrPjOe)e@CwR!dv1uHhMZ>h`-9hej?`#B>%<&2`c1DJ}^V4$}_hM z0oTyLM$hsW7A`2PS7N;~+aT*3Bc*GVWS>=7K6} z6G8b=P&C1`CYZe8f<+4MB)gj6EMdd4=WLD)<*CZ(^N(~xqI~lQFcoKWa`j2blJG-b zXoqlh#@n6I9hJP@mm6Z$u`_ool-^;fcQ`#Vp6xwyu_W#7UQKE{;3XBz^5^zKxN^

uptohJ-)(63&aKn;UgsLs#F_Onp9*{6e?P_ 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 delta 299 zcmeB7f62xalj&*|H!CuswzUPT2OXf-TI=s^$iKB`TR5aFKAkRW@ge5`@q1Y zBG$k#*;VZsN=b^q!d3fF!H)EPL5WWWdSp))ulBq3+jGkVC5CMAs{lHeb_S|gj_rT4|z}}x$;yomcMi@^Kqs;h5l6i1Pka3 z+=l&5GUyjPWiC%iB)4hd_PT)G*>VA!M+m8pWB!ax!GnDq;O0ELY^|w!x2B(yx)VQ# z*5+zPPx1MZt8%$+oVXJbg%5RqL$^a-c=+E@=c)Dd?c{ax2DL(!LKROb*l(dojajhygJRyNM--O0!2X5g&XW(PoCL4-c`!Qgqgo{=eGz@jR z_sv#*dYg2h6~dtgHs^gUSyhl|Q9}!V5LFy%(Ko#p&TI_EBx770jFp%rN71rrVylBO zeyVDWw`8T*20b9s0}VPP(xDn1-dAFlu3b8uo6g4bBl4eW!xe2#+rWJy?z?3vC2t-U z@u4OiZYhD%D7@kLr%QvujuP7z8+y(AE(WZW(DwcX;UwDa^AKBHOwz|!7mF`uFE$KL z$>6LkiUN6b4Z^ojqyIQoCj!Xm@4)~W6bAiQA$$t`7;s~CYXI#9WS9sF=HR{tx{)gK z15Hk@W8YmORiDgS6@fler z1Yh!fh?NOR`1;iAO85Zv&p5CHg%dN&9feyn-yMRd(dV;AI`FTvp$@D{Zz*9B?Vhz! zn`%b(lk-WqHgd-J-c|#R2ifK)O`Ce(4$b6MO^?6f3D-Pf^!EIy0kDyl8HC3g z+{qeu65X9o8A13N*rI^%Si^gw<~@-|;`~uGyI|@EzOlU^uzT7VF!Z&e5a^Cn6^FB9 za%!K3@*PplJZe*NQ}}e@1=zjNaYK{tsVb;#(v8&T9>ai*5#s0W9fD_&^?dB?E;}yi zq9Qw9gxN%1Rd6k7bF)=;T+~H*b(1}IBfXNYv0Tj%7Fq6-WFaBXy}HEY=a4sdxyo`I rhA^+)()SczDKTI6mHXC5rQv7SM{mznCMt84m%fUxjf&{j`FsBYc_vK3 delta 1057 zcmYjPTTCNW7(QpGLucrfPCIlhFw;9ifnDeYgCJ;2AndBd($yt`Y!)_(KA2#_`r_z| zt(Q=8c4JLy?8c2-vnE@1UNG^Y2{B%?VLIK;tRV(pTs6B%sU+Qyn0Q)VJP-eO&i{Y; z{@eLRg-0sX|7J0w}TJTr|D*$@6gy;*Bn+ojGtUop)V zm&#^O?uERwaJgchD2X5G|Ax*kOn!8nl%LydO-NKC zMOBFgM_e&Mf-yA6)^ zR9?j~AUOsUM@VvnWJjb<5=_hQ`u1cj9jp?7Hg4!rI)(B}l>cicAHR80q6Vu3<_I(5 zD)+F(M8W1TR0h{a(_wVM_b!1^{KNMbgioX0Zcm#Uj#dn@+{?)~6eBMi`I1OKUWD*H z^i$6%TDApn-SiYh|Mqlh8W*v%_X>p1qT2x%EnAz>C`3x25sgBz9yn};e)J&nUAN4K zYk;r?Gnzflms`un3&S$^WJaSpxZH5b(fg}=sH(+ru{_-2_}_=J59B7YOlJ0TR zRQv--fBo-e28@O9Mv4Rne0b>^H~C;_{;paC)^9i8?gYRW#fG6e703KxP?j8 zV8W)cACe5AFBd`tM)9|Wdt_t>4@Ur13$WT1#v?Hv;mjW0nYk#_?gPBda}fVa{ux*d z{?H+FiCwCrPB*;h{>4dNHuw(!N3*KK{SW9euxYL8=~X-t$rGsos*Ocs%Oea%tR5Lt z!e^!M*&5Jc|NF}c24mF@{QZh=RPv1;^B*ja^ke=(9~P?s1=jB|n)2+j{%893Qc zatUMWmv)Z6yF5a56ld_A`?=3{Xa4R`J3lCBr>smWCb!m zZ)SC#sU&6()bs=FtPc#V!a!Y25_}VwCvQmAU||9>H{VH}&ZvEWk%8f71H%Jh@fkuh z0w?Hpu-_1poFLi3c0*jIgXf`);%8{-U8+|@70YyKuPQF^00RVbUZ$4Tr z-yxBS?E@>b6yKN4Y|b;4gsg!Yet;eLiGfuZs6%-2)>I7^W*~d>!_?`Fj7KI{rpt0a zkWu``%p}8gLtJ9=;&erh4*9LqD`QwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|g>5+#0554G AVE_OC delta 75 zcmdliJX@IOG%qg~0}wDj_?EVjX9t@>gMMgnYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{nz5BqW^0JX{*WB>pF diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-312.pyc index 00874a2b4b35bc33df2bb777f75967c9667dcfd8..a9cd53b0fd4378603b058b6cf7a34dedcd5ee9f7 100644 GIT binary patch delta 99 zcmbQozKxydG%qg~0}!+`GNy0jQDX8~sUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{oe8IuDe0FzM}#sB~S diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-312.pyc index 884241ddc824f2fada189c1a06476463e5dffedc..fd67487c58564ec62f7d4f8779788c7dea23da82 100644 GIT binary patch delta 99 zcmbQmzKNaZG%qg~0}!+`GNy0jF=q1Es2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{oeJCime0G4|h(*OVf diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-312.pyc index 6a8440b584adaa993939854c019256dd0bd1aba7..c9de90a216e136dc0a6a2df32336025dcd8395d5 100644 GIT binary patch delta 96 zcmcc1_?408G%qg~0}!+`GNw=DG4hzAA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_9{_Rk8Y=(* diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-312.pyc index 111ede9dd0c851d0ef4b990274ff6cbaf293485c..1414033ae38b857a2190ab93f07c69b54e8ec50b 100644 GIT binary patch delta 20 acmey)_??mGG%qg~0}!+`GNw=Dc?|$NYz1Th delta 20 acmey)_??mGG%qg~0}$vO_?0%1=QRLALI%J9 diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-312.pyc index 6d4ce67238a57de99d07696d762752c4785fbc3a..10e628e1cabc8b322da49e7ec248d0ba20b08684 100644 GIT binary patch delta 408 zcmcb+nDO3XMxN8Wyj%=G(9X!1zLDoNo5u|O(BjmhV*Qk)#PZavM17b1B`Yy6JwKo*KPxr4WHUSadVWUs z$=k)0n6FD3Z+;}Uoss#PsPW{562;66VkVQtB{woNNSSOtBPqepSTXsjh7t31W!ue) znunN}8C2{xztFzI!k9OCuYn5lHA%b4uMFh*7^Lh!urY{;O}Cq3*Wo<*gMlP7gNV{* zYs24+jMX5OOxGkQCmH(#&9&dW#drlHW7gzYQyJ#lydskufiwf3=;j5c|F{|7Y@YAP z$H;p{#q0|!vy#|D6|z%smCxclGD084fUFtJ zlO-ialC!ZHn;=C+r{Fxzwk(F!n7qRV(9G69n zKQZud>P%iIQOpdYRU|jEfTeFpO7Jr_PX4H2#C2KO_A^5$Bda^(W;M-2Oso**Ywas6 zj5U)F7^naZwfn@t$mzm3`MH6-D2VZajX^|gy4^&mc!%@kw+50dAeqeuhQApZ8$kNl z!TOjuCkGk(Gc$48ZC+x$f{`(QvahKO#|>VQPYg_~%9C?UWtf5V=5Et}+>BQ?cRBJg za$i<4`_9U&B=%57Ve(QZ4fYSrK+XiO%~ze28TmiRF({~f6X%f;`XI(2DKnYV#h&RC z^JIS)d;Sk13`!c`gt>rHLJX2}ljplwfutU|=<|QzVNg{2#?1zl;$o1Lovh%h4wTyL Y=X#Qziwzj~4Gc5F8yGgr`|f7}0Mu!F`v3p{ diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-312.pyc index c2fbe57669a30712858ed0025d6eabb4553740f1..8b20c186e56301ba304c9bf8876175604af953e7 100644 GIT binary patch delta 285 zcmdm^wOfnlG%qg~0}!+`GNy0jk!16jr5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?cfkozqpvor(K31;DN$mP&7ahaCF*7L(-7vPD;5x(Wx{TgM z8NJIQdY?doA2=AyZFcxwH1h_kQ4zYKVKl*Oy8mSVPm?dQJ1_%{*et^Fkb{d2=!ph~ z8Q~2KoBs*~F=jY&0 delta 21 bcmZn_Zx!b`&CAQh00cS*ex+^XspJL#IvoYU diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-312.pyc index d0913823d2b34979f02ad268ce9e6b45c2c65c82..be480dce7e202ba6bb8d95904432054d7744d477 100644 GIT binary patch delta 99 zcmX>ia7TdWG%qg~0}!+`GNy0jk!SXpq#s(GT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#nE53O0IGu;wEzGB diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-312.pyc index 488b8b7ff8be26bc51986a3565f95a050aef64c1..1d46ff1336abc8e4aac5d9217a2228262b8f4b39 100644 GIT binary patch delta 99 zcmaDQ(Im-pnwOW00SMX|8PhlN)G~TZ)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t*7XSbN diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc index dc7c8a6dcb862ee6299d71e46c05a9e4a861c6f3..b7042471888f0cf7574b67e94d997ee91c6aa19d 100644 GIT binary patch delta 20 acmeys_<@n(}BTLn)5 delta 20 acmeys_<@nY?Vv$rk`1vWrQBeo6cbVz|0^jd0j;F ZqKM`SB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i-%&D10z0yMdS dVS?gx?TOl#gme}tF4tP9bwNmH^A;u-MgWL=Du4h0 delta 103 zcmbQp@q?Y`G%qg~0}wDj_?EVj=RTuBrG98}YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pIF;kPcFwlesh6#$(wI^y{64F_qxLj+YRs+N4vrI0G E02~e@3jhEB diff --git a/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/main.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/main.cpython-312.pyc index 5b8aa5c9f344c2ef0feeaf7449b295de47748027..559ef086859558001a1674a2ad5c9e0947993d21 100644 GIT binary patch delta 731 zcmYk3T}V@57{}k&vorKG=f}=D+s>T(a67JjG(lY%!Te0qrOq(>Flf#tNpm#6N+PTX zCq=B@(%l5om11FaAiD4(2rTKwshbn+Lb{2FJhC9WD0+9-%X9JYdwBl*pa1)L2|inb zvQN3W6u@r+!oF9s(`3^fNz7#ego^bY%dLzhDX&QpHh zl|WcuzW&x2}Fmd$DWMMji3unZ~hxP+LzgP z3f2>02=~#`W=rm>x-3mftkjOWEJ~u4W|m2*%l0y44@eBuO13sl0Y;1d zG%sQ=TC~_=wXE`OX%bu9Bc;52MP^LPf!-B8uqOqr@GMLdSzO`f$un=qP=QBL`|&(J zqChDEOn*{m_<*I3uO!j+aenK$@5+U zdyv)3lj&^08PPfKeIi-nMnAlk9AK)3qBcW|JBo=U<3bG`M{$;ig*zP|Bya+?bTts` q8as-0RpDQB2cz<<|Cjfhy!Yn+9=wBJ z-a+F>K`;P%nC0~|FOA2z`b_v}CYjEJ&nMD}i=mTe69eZG;nrm4{6JrSxSx`~i-}bD zY%-PV8|+J`PRmcYXC`&;ov@eU-Ej^binS@KnWknwyS2_MDUZ@uOiR1UqQ8mqiK0bnl-@Rc(nSeJ@0PP z0Lyp7n@6&Ha+2z()Bq!NL+tSFb{7M}6e%$RyOcGm74AYsK&c3<0v{ieGd=@kiouA# z7xH;mBkd~0AzrF!WQ&0;Zn;?kU*mg$P`g@MPAl`y?5@wEW5R>u#kbBJRIO;dWvpcy z-i@ku3MSbVjsn8aw?q#_cL7x?s49=>mpI;mxw{ zMW&OvOXEX#hZI``@7VY1KNgI=UM_>uq^~*i`JNm9CQ?mJ!>XzlK}m4+rc>&rZL~? zGf?9tYGA40!cCob^!dstb+gok=Q?Y`REd)k(gZB-dA*C6flV6k8S8oIP{cq%Y*568 z7nOOD4zCm1Ar`xu*Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/apps.cpython-312.pyc index d84245ad72e9dd396dd27f6b105fff1c249e2430..bdbaa0f443aaa27859b47a33d26d03b4569e42c4 100644 GIT binary patch delta 98 zcmaFM(#pznnwOW00SMX|8PhlN*fV-`>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Dk89xC4<3S;Y delta 74 zcmZo=eapggnwOW00SK5Md`sKNW6x+%s2^IKT2!o`omiBZrn+a delta 75 zcmaFDe}JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~39ADW0Jx4CdjJ3c diff --git a/env/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/urls.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/urls.cpython-312.pyc index d04bf11dcdb87a9f43032ef8f95076f4174e3c95..a6317c97287b92fac14178f09f05e3fef6e26ff2 100644 GIT binary patch delta 99 zcmeyy*T>IunwOW00SMX|8PhlNOknls)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag3F|6G0J)@ zz_37Yf#D*N35pXOC#uX4oMAXqWTN&3A^jDGD*{)V02!OZL=H1D)=ZWXlV-jqqBGf6 zERLB$RCn_{v1~?}Y@iV@7=AP`+~5~(@VFr;cU@5ZqM-T;_G^L$leHxLnHhu(H`hq? zGRfqDE&C$Eprp4V{ffEQ6-Do_tjuz34;8&HPF9ze6}qA5{ehK%Rr(VHQ1mkggPP6c zXlY4iAicRa)F;1D$_D_IU2gUO delta 405 zcmccScH52TG%qg~0}wDj_?EVjhlRzUNI$eVwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKg5?uGqrzlw5lOBFh82b@0#}+eFl;UmIn1ci2sF5X z;en>XMHaOSEYdR~?}*6GNMDe=AZ14GWf7fE4BV_5lY_+Kn1S@>&0^V%j0KbBB_ud5 z3mSZ4U}cq_Y$f5(45T;rNc1x0m4Z$CBEq1gw<7(Dxz}Yy@9(V4a%>+MfW$){*$&qU z#xqzyFf(uoP7s|?e1TJXM(6^=nGu&b)IKl+m0Vzv`UFz?frCNK<`V-WtL;S&#SY#H zRX2nrr|VDDU!c1|>avhcC;JCxpxovL>0~CQT(F%V1Q_JiFS1BC_)f66BdNL|{ffTJ zWl7gh3@ohTljJOzfz)Ojx&Mre(UWZySU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(Cou!*&5xxG*%;qU7FFtDzAY?0d6kj|GlPiC=4(okOiG@>5dG1>a7S5v zx&1=>E6OI91x+t1o6Ja@pg3K9vib#Olg)mr%LEx$P5x@Oi)l*qR*%LEGdrE3>53LoMS4Y?HTGsk7eD zGXBUq`L2~NKZAnVhcZS65sB-<>Q{u-C(Bts0D3}WGowudE2H7$CPx?7D^ivd*zO2R z%`jVFbyZmJhJxC1{)PP46bxsu+>n-EP<=_-=!T5?bs4>jGI}dYuF9AI?N&7Uz{((P z^@WQ;Rc}T1H5IGLQclUt464?f8=Stg348;FP6NXSJ_cU?2G`rX5|ev9cQP~ZNpAM? Hy2lCtJBZ?= delta 682 zcmaiyOKcKR6o&6~7z)@a;K0z%kPH^e5TraTR9=zR;DhSQM~E@eP_3zf6a=CsH4Smq zMHiU6keVi?E-c2xY9`U>!i8>(#-t-D%z_wPxiZ4k)NV|?#JKh@?ssy}`Tuira`)D- zS`{1kNRk?W4&L6q_IzMQ>CJo27iRMXPdb%P&AVsjQpM{jPkgqJE@pF{9Li+pQyI_P zY$lVvmCa|a3NMs36}AE|Yhy9dmuRrlHEZQem3olaVyBl*qf2u5pWPN6F&P+0TGZLf z`zlGv>DzQYb~T+*(HX5fkH~=1)3BjUt0az>0d8bqT<64lyrB!JP_m07wIJx039Jey z>6rC@&1jN_RobAcdr!!~h}>V&IZa0iERMhaF4I5%VVE~rRH&qjBayIbdWvIP@D%In zm5)VapjHpUJM0XOD12poN^A#GBg<-uVr77-lNfwB;!yMg;nT>4KJGZ$=Uxf4to%l7 zJyy5+8~Q*cRX%W^hy0d4AebQQ%An8ag`1%vyvGlrcO;tr zpnsRZhncp;4p+l`pNzxz;V}bJb#7w7Fw~@YkwW_(My(W)HjXHKilRS1UiF&)RvA(%x`h8tqwvkGirW}jt{8=X K-fXXYniBv(bTNeh delta 177 zcmewz*%ifenwOW00SI&s{7T!%W56mE4dgU1+~5~%@VFzPa9zUUqJ+gK1}0X2#>oM! z$}Awp<}%iEOpHO3T{+Y^ZtzQiWQ`~1amX+O>CL?yHIhED;q&ppqXi7=AP`d}3hM5qlt`_l223Qg21h1slKX68;~Vfr6XM S6t^+5Ts8{-ve`iSG$#N%=QMQy diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc index 99cb26bbf181436aee890ee85332ea44eef48fd6..e3a98cc5816e23bc2289213aece591310d393d06 100644 GIT binary patch delta 70 zcmdlTvNeR~G%qg~0}!+`GNy0j*&@K`GWno@qUtqXw;RIZ)9ohOEl^)!u_5-du=96j XMot&Tj|?F4If_jnw@=z5H delta 76 zcmdlQvO9$5G%qg~0}$vO_?5PiXNv%%*W`l&irQCr-99ofa=I|y5Eh?qH_>i^`U;B; Xv6qFNzcYhGzk}sIfyvG6f_jnwszMg1 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc index 7bda82dd1c20bfd23fbee8d91811192be227c661..2a2bef8dd5208e29b4e11ec125b1b2e995cd49a9 100644 GIT binary patch delta 21 bcmey#|C68RG%qg~0}!+`GNy0jdCLv}L%#*B delta 21 bcmey#|C68RG%qg~0}$vO_?5Pi=Pf$`OYsK@ diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/backends.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/backends.cpython-312.pyc index 5b61db5c899eb1232899fca229e403e13e6d852c..f782ac3cafe075457e30d6da279984f44913522d 100644 GIT binary patch delta 191 zcmZ1!e;}UcG%qg~0}!+`GNy0jS;Oejp&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kQzbKyPG%qg~0}wDj_?EVjXAPr4fqrOlYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{nTQ-lEH{>hO-6GbirhF#YVKNxW!=!D3oqMas}bQ~^k zW)a@Srv8b6S&Qp|fXD}C242Anf=Uxirdv(4nvp!&{sNEkg37Br1|OM$DkeXboWXKg M!s^TBMk#wy0CM6xQvd(} diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc index e8ee94349ea09dc706e5ef07e905969512e30657..1d8629c55c4ff4e706101b9cbc54c9ff1bd0b383 100644 GIT binary patch delta 72 zcmaEE|G=K-G%qg~0}!+`GNy0jIVhp41?0S7_|d>{M_&E9yv-GPn-2dQLSom2bT10& aZiv4iqnJz;p8RE z+RO|RMw>4&A7>ZU1FHM+g5gI4!v_XtH%7LHQZ^l4lh<%dGT)T4*?gM&BQs<4Mw%7NF^$C;yd;VSXYgJ~>I=h~3XgJhtCRMH*8b%#n*Lf5#@+e;CQU1sb6q@{0;9&q{npLi~OFOb)*+EGjTCbJ};-ja>LB=%jEBJF`N$s#XmD7F|w*m z4wE-xxvb`NWpa;vH_K%`k1La<6`DCN%ISS(Fyd6%yih@wkqgN9kjMy9zWKPKH46Yp C7-^dT diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/context_processors.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/context_processors.cpython-312.pyc index 498e61febebc231613dbc1ee63c81de1644f5f29..f3e2bec8f658429c13e48586cfe3651968233aa6 100644 GIT binary patch delta 99 zcmX>l^+<~6G%qg~0}!+`GNy0j5oPq4q#s(GT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKlkq1v0I>=h)Bpeg diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/decorators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/decorators.cpython-312.pyc index 0238455ca47bfe38967387a1cfdeb5e8665586bf..e7cc7c3e7366f39359930bae010bd2828ea8c049 100644 GIT binary patch delta 41 tcmX@6eMFn*G%qg~0}!+`GNy0jS;xx<;x#Z#P`oara!E*K^C{jx>;Trg3oifw delta 43 xcmX@2eN3C@G%qg~0}$vO_?5PiXC1Eq50KNqFhTLUkjh0Nl?H~*CwTv`0{{`|4GaJP diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc index 58919ec60ea24de2380b22e23bb57e81705728b3..b498bc8126c228703ae05d5332d4fcdad8306d9c 100644 GIT binary patch delta 102 zcmX?flX3e^MxN8Wyj%=G(9X!1zLDo47vs0d@3<0}uPM7u4(FC-W>9h4T+XfN%JqSP zRe*! GXE6Y|^CJ@g delta 113 zcmdmflkw0^MxN8Wyj%=GpmX3?+D4v-T#SDvzvD{aysYf{iGfkjmvM3+w=6S|vAK|2 z(Us#91FHbn0|CLwa{`oEKQaS3lMe;FVtF8{_+|5kz{kvtk0wtEjp4W~qWOtIn3Hev P=g>N4AicRH%vlToa3Ll1 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc index e2226abe33bc6fbb9990edec73b5384e3e90398c..f40c130e45b4731140799723d65aaf7e296e20a2 100644 GIT binary patch delta 96 zcmaF*it))SMxN8Wyj%=G(9X!1zLDpXfJh9G)4=e6PoTm5j=21Faf2)329w1FotPOU w3@673?p0C;D|ljTx5f4{x8p|J6=EH3*Lh?v^2p3cyU3%m!S>>2b0NKC0DJ)+IsgCw delta 97 zcmaFzit*_yMxN8Wyj%=GpmX3?+D4vF0+NY9P6NXOK7j`JJL2-!#SJcs8+>A5XO*8U vBKQA#yKO;3KC%-(uC?{p}XC`wN0Un?cKN=XeaO@DjY~a|yu-SrLRvG|%)*)g5 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/mixins.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/mixins.cpython-312.pyc index e105a5d4911708485280ea5e49c63513ea8be40b..dbda63b7964f38b78c088785615a05fe7623c38a 100644 GIT binary patch delta 99 zcmaEB)@sgknwOW00SMX|8PhlN=&^XT>4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9b!SeV5DBn}}H delta 75 zcmZoQe{05bnwOW00SK5Md`sKNqsL;9ryp9JT2!o`omiBZrb8XlGb8&^hocZ6lAoI%C{q9d&um%ff1(7?@a{7$^Iw>#~3to9on@ z7$p;dN*frya4?8STo+ckD69fj$j&M`Swz!-8Axw-*9>QrOu(sZla@Y6*<^Q3`OVDQ zay;@fK&3xkF#Kp>xFqDXfn|cpblZux3q%$aUl-QCDC9KR(R?xU4$do+YeJMab6Moe LfH<3LLYmnCc>p(P diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/password_validation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/password_validation.cpython-312.pyc index c27ed026e9265572c36526574550b4c47f69ab4e..6876589187b870948bdb06efccad72ebfb48c8e9 100644 GIT binary patch delta 405 zcmbQ9^gfa2G%qg~0}!+`GNy0j$!Fzj1#%h~ZU_oDc-m3GTD*K zkI{Vc1THaVpuWlLxa61^#5SMfa%Qx(2P^r&!5}2k;B|vt>H@pc9XZ>}a`qQEq``LF z;1IgbA$gHQa)#!0DZ`6WhL@#`uX31t06Iu>b1=_hMloTa5ib~iG%#F{cHOD9B63FL z9G{(9lezh3G4Is6ym$qn+d%va=$CNGtDWWFt@Ir*J@CkKPP)<<3jdE?FX z3T5n!D<*$aH?F@b=ypQ!rm5LwMe~h;8yFWTE>~ZuzEpEV;6+9A2`p3izB4ljxiel6 zbo+Tr(HzeC{e)la69W^c#T`M>3t}2q1T|L#Vj8kB@aGkTDO%SBH7^Tl{`$ZS)c316 P8R(4#5}P+`q;LQL>QRIl delta 451 zcmaE#I6aByG%qg~0}$vO_?5PiC!bZM2gqq)xFIOq;B`Y(^%Dapt0Uv&PF5Qh5M%QR z)_f+1BCwJVd<=X74Q@Bsr7o~5-I24sEN6d#L;8lO#wP|AR>cm^4@}IQiZ^&fuk*-V zthx%xu&rJ9!%%_p!-;rq@E zlm#pKc}vk8!TbG$U+fbD6Q{);LD36h8kYq%!HQM{qMLJ3(fsEXB(uJQtosZietlrx J+@O)q0RZ~Aigy42 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc index 5478477f7e1d2709cd886e9b9dfb19adf8a40996..199bc5a285c8ac4f8ee2ec96f1ed87fe71d60e0d 100644 GIT binary patch delta 21 acmeBW?q%jV&CAQh00ixfjOiPB8W{mFIRr}p delta 21 bcmeBW?q%jV&CAQh00cS*ex+^XX=DTdIBNx` diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc index f99bb230811f4e7fed5622dfd168590302688a84..d723ceb06de1472f470d990786e4785ca1f2ada3 100644 GIT binary patch delta 44 zcmbQKH${))}I*IIVC4A;Z|b?(won6yK@5o DUeXPy diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/urls.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/urls.cpython-312.pyc index aeb793bb32af103759091ee74d4b0814c58d2403..3361fcc2ed34ec90e4886999da29df91603e0a6b 100644 GIT binary patch delta 99 zcmZ3&vxkT0G%qg~0}!+`GNy0jX<+ea(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t6 Aod5s; delta 75 zcmdnPvxJA|G%qg~0}wDj_?EVjr-8*FM?bVUwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag3QGnf0I0?qp8x;= diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc index be9c528cf9b2f9ea68dceee0381c09463f15dfdf..2f52e2ca0e0326be7a82dd41b461f295a7e5f7a3 100644 GIT binary patch delta 21 bcmX@Xb%KlMG%qg~0}!+`GNy0jv0()OIrRjN delta 21 bcmX@Xb%KlMG%qg~0}$vO_?5Pi$A%RELMH|4 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/views.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/__pycache__/views.cpython-312.pyc index 7e8ef39ad98b209134c763e001c2b26eaafa33f9..d1df5853c4f64798f602d26773ad8bff5256cfda 100644 GIT binary patch delta 101 zcmexAiE;X5MxN8Wyj%=G(9X!1zL7_V&7)O6v^ce>SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(9?hF8Y Cq9QN= delta 77 zcmbO}neqQ5MxN8Wyj%=G!2IA_+D0B7HiKOK(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t e`~v*~piF*VVvc@BYEDjmd45q&%H{?(ac2Pas~a)^ diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/__init__.cpython-312.pyc index 2f2d2f23edea0ccc86d84bedfbaee74091b8d0e5..34340d2ef3db03223e87ef29b8d4f601357c27d8 100644 GIT binary patch delta 96 zcmcb`_=%C{G%qg~0}!+`GNw=DG4hzGA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_2LNxZ8Xo`v diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/modwsgi.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/modwsgi.cpython-312.pyc index 0853b95ea0805ab8f4d6b8a50a80917ca2796890..e59550faeb1ad08a3f15fec23abb57b97bb0eeaf 100644 GIT binary patch delta 146 zcmdllbXSPyG%qg~0}!+`GNy0jX=nDBpdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k0I#@!;eQ x>`@9=44p3XJ6|+(TERMjbvoBXuImDd7X=ir3MgMNbh^mzJh_rZX0ijve*iLLGqnH! delta 111 zcmcaBv|otlG%qg~0}wDj_?EVjr=8iLLO--PwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agHuD>1#@&-out!N;Hgvki@4SL_0_$|HiCotO6fX)W OUKLQjwAq0}mJtA$Oeg*T diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc index 7b05adf7dcfb8cc18b8fd08fcbbe30b751f70c39..3afb7cd8bca3cf62a05dc830ba1f90d63df9abc8 100644 GIT binary patch delta 139 zcmX@8zfPa$G%qg~0}!+`GNy0jnZ+XJ3FI^|eBff>kR?138fQxJ6P|?8Er7#ZoSd^vYh=V z26j%($tQUNIe_#BR-nSk%Dft~H$)^qF)(r(cevc)5xgLzwIbxAkl|GxqmRr$!Oh9M G-dq3?XD$i= diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/__init__.cpython-312.pyc index 1d664bccbb333a73853a7fe47eb7af3acb76f885..f08baef640c73e94aa8c8519a39b81800906e9bb 100644 GIT binary patch delta 96 zcmaFL_?MCAG%qg~0}!+`GNw=DG4hzBA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}__7G%qg~0}wDj_?9-2$H<^XKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb8~}I%8cP5G diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/changepassword.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/changepassword.cpython-312.pyc index e08446937c14a2d8bc8136e9e18560b794014716..f3c850682a4e493026656b3ba67779670d7de2a3 100644 GIT binary patch delta 99 zcmbO#yH=LxG%qg~0}!+`GNy0jv0?I9q#s(GT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~0+TEc0G|^X^#A|> diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-312.pyc index a1b6bcca38bccd8514aa51b31c9d6882261f08e4..514143c84ab1d05ef0347058ac4a9214d5c8e8a0 100644 GIT binary patch delta 281 zcmZoJnpMPenwOW00SMX|8PhlNs4{sh)(mwV3S}@}U0maEJhK|e+ VRf8sWBshg82lE_Z2GX0Qczr~f z{;_S&P)@(7G(4`#~0{aI=&~Hm689 v&@(??F#Kp>_{6{>%=LkdK~QP(Tti3JkIX>sBUO%)rwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agCa(}H0NAk`3;+NC diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-312.pyc index 5f370716b1bd7076339d94a47386deef984d22ec..5d64d2aa0b28c26290d942a2a9fe230784c61f8c 100644 GIT binary patch delta 99 zcmdnUc9MB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY&7{T%06vi+ AE&u=k delta 75 zcmX@fwvmnJG%qg~0}wDj_?EVj=RBjq4E@mJ)S_bj?8KtPJiVlh#FETJeV5eY?2`Nf c{Q{s&eqLgZenx6ePJVfQQBKNcWhOO70K-ojFaQ7m diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-312.pyc index 74879526680f18969bd896ca59b92925a7e7a2a2..56be3cb60913378bae32f2f6d83fe17dfb2354d0 100644 GIT binary patch delta 99 zcmaFB_JfV*G%qg~0}!+`GNy0j`N!z7T0gWnwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAN#iYgv0C0FA A`V046UX AMF0Q* delta 75 zcmbQo*~ZCpnwOW00SK5Md`sKN^PI_Gf_`XmYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJHFGi}0I<~>M*si- diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-312.pyc index 30062881473f07c1533df8112909ffd5396b56c5..7e12383de1907b2bc4c5b522929d2f9477058e50 100644 GIT binary patch delta 99 zcmcb}_L7a~G%qg~0}!+`GNy0j`M~J0NB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2!=%ax0ALj% AsQ>@~ delta 75 zcmaFKc9D(eG%qg~0}wDj_?EVj=L4g`B>m9h)S_bj?8KtPJiVlh#FETJeV5eY?2`Nf c{Q{s&eqLgZenx6ePJVfQQBKNc7baCk0NhI&s{jB1 diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-312.pyc index 2067937014874f6024c44e476369143e3f086df6..02ed6945e7ffbfaaa630fdb6f1a725b2f1bf66b0 100644 GIT binary patch delta 98 zcmeyvGKH1rG%qg~0}!+`GNy0j@n!T_sUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{p|LdMSkl6e~A diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-312.pyc index 25687ea728c519cb1899f89218b65fd99e4d4b06..8317677a2984179190a2c3f4364a8efe940d963a 100644 GIT binary patch delta 99 zcmeC@T+YdJnwOW00SMX|8PhlNJZ19OtRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJC37Al0JrWMYXATM diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-312.pyc index 0066a339f99b75577a0b91bacc2bd25e1544758e..0a5a6d7c59f1ff8f266d21821a45ea16b0aba755 100644 GIT binary patch delta 99 zcmbQrxt5dXG%qg~0}!+`GNy0j`M~6{PCv9bwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2!<@+o05*9c AfdBvi delta 75 zcmZ3>IhB*=G%qg~0}wDj_?EVj=L3_$H2u)x)S_bj?8KtPJiVlh#FETJeV5eY?2`Nf c{Q{s&eqLgZenx6ePJVfQQBKNc7v@Yx0KDfKg8%>k diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-312.pyc index 7a332c78b7b313715bf9db11ab07db0ec9a302dd..d380c8d13abeafa9c2b83add4d5400b37a77050b 100644 GIT binary patch delta 99 zcmaFJ_LGh0G%qg~0}!+`GNy0j`OWCDUO%)rwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAN&ZNZ%0C9XF A=>Px# delta 75 zcmey#_K=O|G%qg~0}wDj_?EVj=QpFlbp6oc)S_bj?8KtPJiVlh#FETJeV5eY?2`Nf c{Q{s&eqLgZenx6ePJVfQQBKNceLs>i_@% diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-312.pyc index f178599c5c6b0615930b752a6e3446d46f24bc26..ecb32b3e94c7a21ad9094c908099c580e35a75e6 100644 GIT binary patch delta 99 zcmX@Z_Job+G%qg~0}!+`GNy0jdCTarT0gWnwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2$)wB(09%eB Am;e9( delta 75 zcmaFDc7~1TG%qg~0}wDj_?EVj=PjebWc|?M)S_bj?8KtPJiVlh#FETJeV5eY?2`Nf c{Q{s&eqLgZenx6ePJVfQQBKNcM!w}U2DeFNGfL*y z&#J$~qkq9J>;p3cr_SUWE=lGqa(a{JaY->V$m>tu!&S|EP0(PnJ-4+ugOK6RkD3fZ X%0EAG0L}QW02H_&Xs~%QH!}+WwGd3B delta 217 zcmbO$KTV$JG%qg~0}wDj_?EVjN0-xJf_`XmYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{odBWE|G*koQVH^<9@N}n0zSou0wZ}5xsS9ex-u-xDm z?yu^qy1^szz|QHqUD!ptuy4#v`dl|mtR|JsD4AbBtNs#?{s)lI1rF`W6S*WgFUskC zVqoNSWSqQ~ONs@|IK@@XaYfMJBLfSs#bgg|Ye^ve^P?uvs-K@YfLgyR00lmPWH-;^ HW@Z5Zfip*K diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-312.pyc index 0b1855d23d5edbeb2fd825a236e984d3a814102e..c3d76c8ee610f8ed0a7313d541458bc0aba0d934 100644 GIT binary patch delta 99 zcmcb|_Kl6_G%qg~0}!+`GNy0j`OfIEK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAN%%sf-0B$cK A-2eap delta 75 zcmeyyc8`tcG%qg~0}wDj_?EVj=R2dp4E@mJ)S_bj?8KtPJiVlh#FETJeV5eY?2`Nf c{Q{s&eqLgZenx6ePJVfQQBKNcZzgR<0Oq|K-v9sr diff --git a/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/__init__.cpython-312.pyc index eb00feb7dbd4023098622b1dfcae29a8ee75ef5d..4dfb26a55c50f335bd7609a882e9ae9b74205b2c 100644 GIT binary patch delta 96 zcmcb^_=S<@G%qg~0}!+`GNw=DG4hzKA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_4*+p68Ych% diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc index 4af8d9ef361a457d240d6c3d00f6bd6776d80479..ba234295314bac53347a6abdd7479f817ae4c28d 100644 GIT binary patch delta 20 acmey!_>qz4G%qg~0}!+`GNw=Dc?tkJf(23l delta 20 acmey!_>qz4G%qg~0}$vO_?0%1=P3X|SO%^D diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc index ca00681045c0fca03599590441e040a5c719ef4e..a1f81e8e44e1ae605084532dbbd1ac95b8248c86 100644 GIT binary patch delta 104 zcmdm`w?mKTG%qg~0}!+`GNy0jk>#?!$;iOa!0>^GK}>RboyiS!z9G3a$>X>pY4Vc@(en zC~wT(%*`yt=x7I2^#iJmm5=SAsC0+x9bxeqtdp&;3#(ofR=p;y-r;ePCnY V6KHU|Ehs+uGDi?d@nj9onE>1ZNAv&y delta 254 zcmZ1{d{CI@G%qg~0}$vO_?5Pi=N^-y9FX&Z;YS0*Ck7@}t{WOg9bVUY6fg29UguH% z$P5(P%*8Cl=;;Pj_5-Spm5=QKkKi3)@foa>t*;BKUKCcnEUf;C9Vq^Rje%F-4!7up z;O8-n7W7&uw^ OCLiDkVg}KooHGHUk4Fap diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc index 969e627d3516ba7dd13fa3a231664a7e2fd0f5e5..54acceb086df051b7a855458310af16b7644a165 100644 GIT binary patch delta 618 zcmY+BT}V@57{}jtuLo_LA3JB~G~33`+?g&lBg_xTxzYvVungxc5Q+-JDv|ZS&poG4ZS4!!k-2{#xc3QZ}ZltTAn~gFRf_n3==i=e{!~f6k;dwUVnx}D% z{$p{m7O}d8@ufw*-60y7m_QLBCPk$=;hFW3RW%)?UdJGo9%F=dCQ!y^PZn7+I%85N zXDv=xRr(3CRzj7tfn-f~xajN1WTN!5i z8`_>gN#36b#E;J$P7BSd(7Y_B1y3SC%Z{AIBoRo_%Pm8NcprRi|3$K56>NAd1W7LX z#~b8u3j{mu{Gui$)Guo0I%YZ^_`tWIQR$P;B|Uxtr~4-PgfZ24B4La>7KY!B($Q6; zO27BrFk=aZh9&a3u?MDxe=v0|$dv4+(cpQEUGRIPlFM^M<{>m_2JdJN+n{00MpR2X zJu}vi@qKu6ok@mGUtZ4Mmj+pW#QByBS{dV2O&)}de{uD zd|1MHXd}k-rG$tUM@ZXm?zS5%3=*wzaK}q|JbK%XyA~_Zjm0GwBRdDx!7WWe_y}k3t=Wzlbk15oWoR>3 z05w%J;JrAo9Bh{_$M!?xd))5KhuQbD#n8AcOwh!<{TE^^)(WDqY!pdm`Lzy)aWv7- zDh?MNqNM|`Ct^s|?}@oUi65u}WRVn?R0A4bN}&Uxb9<~LbSr`*%cj|kzRJ+|I-*cr zB^x-ozw$uS;cG1ZfNN2j?TWGaY4k}nrOg`BhTXRPv*Fy8?F(-ruOda_UX3x@mBw!q zXYkg#x2sWBWAP|1bs4-Th17ETv_503BI?%>4b}lQRn?H6>plbzu{#-HOP2FhU^e;i fwPcuWw5{d4aV9AtRX-&?CK{}(L<1w$q~G!%46)^o diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc index 06b5b2c28ae87b847459cf33bb2f7ff550fcfb01..dfc35da69c461d56e7dca784666fb41dc976dab8 100644 GIT binary patch delta 21 bcmcbpc~O(+G%qg~0}!+`GNy0jIVu7GK^O&g delta 21 bcmcbpc~O(+G%qg~0}$vO_?5Pi=cot(NlFIN diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc index 72410b12446773c9bf72e5df69c22068a6d19c61..5b67272e9dd5a67ed6bd2013aa050be6079065ce 100644 GIT binary patch delta 227 zcmV<903844P0&pY%MA?*00000hXDa+u?*V}F)jcA0O$btfB^6S0}>M9Eke;4DVPbM zHuM7k6&8?tph?gcF0dQ8X3#K2*AzzCEkd&w5JLe0n3G!(AOqVK8V}W8Sw%G5)$AoI@c{g(JesKEkg5?)e$KJ+ZGv<1`;1T+Z`y7Mc5@LkVlwBl1}gg z03Ipe5ER!CBGC{cpfsm9p*N^P)etZ62>=%w@C*PoKmpe@MbR`x)-*?xY7#OT+ZiN~ d1=t}YkO!Crk`D0$02(Fm2LLrl0kgRhE);gxNnii~ delta 210 zcmccM``nl3G%qg~0}$vO_?5Pi=QcmTE|Bwr;YS0*CkAFAp@)-y^2@M(WCk)fO9(hK zGH#e0BdEY}Lsa?`0|%$dnb99WLrRT-J5^GWnvQ zCdUmi$xjR{yatp13d&2|kk$Caz$mCO!S#l!`ULkGu9N&eFa!CM^@YU5fr>uxFqk?p zUN>>QXySU=#2u&+XivD1k?ajg6`)35l?kjj6qP5i&tRRz_mLUM|G*AZv3Ze@o(KSa Ci9bvL diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/prefetch.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/prefetch.cpython-312.pyc index aca6d70f9706670ea75502f7ccb05eaee9b61144..5ee888ace3d8a0af1ff3ab5f962372a6931e1f25 100644 GIT binary patch delta 144 zcmbO(uvCEOG%qg~0}!+`GNy0j*~{cHK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i=IlPQ-g6=?F0 s28P=bijzy39hn&G%qg~0}wDj_?EVjXD^dMg??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pIAagE%7SMzr4GcFV6hAR=aSBcDV0L5%(womPuVrM+ dom|DL#y*qp69XHk`Q$~cmdrqU^F3B~CIIRBDB%DA diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/views.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/views.cpython-312.pyc index a2e36b32aa4db505f52843909d654d18329a3a78..896fdc4a665b046441b8c528d34737bd165e1ade 100644 GIT binary patch delta 144 zcmZ1|yK~LCq-5ty&Xl|^sd+_GbFw|RCo_YT*5+<*F(v>$T`sBs delta 130 zcmZ24y-=FxG%qg~0}wDj_?EVj$ClHeR6n#hwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=fB4-q1^W-<24>>N1s(oURd6*1TpAlDQn(G(@9Lb!Lh zY0wlU)D%ef0{|8>la2=#1^^Z^&=oPWt_SM|0Wg!A4n70pA0w0D4n+gjAU~5X4^<8T zAwU825CAPUuxHjRK9iOYDF^^9Kk+R9ASAQN50nA{y^~%NQBu?rRr3V{6$arFRft0H z0{{sNj|hnfkRpi;*b-In1poyS@Bjl92Ji>~K1c!AJyOv*N<~O`KOm4L>q43VJe5&Se)@0Wm&^FbK+A z7f`+^pnP3G|Du5YRRP2AqF@=Y!p)1>U$ZefP44Hj<9r~m{E0!F)s=Db1wL1f%L?|N z7}z<@Crj{$3Ipjc0t~ul8`3Z9*nMJPo^lV z%s@_q^JFz~U9}rRq9AwqF?KlJD#)@%_jQlH6P*F2V=^ DReE7b diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-312.pyc index d485e666579843666ad37f5f486dfa4f2b32b095..6dc041bd241a91ef208b7fdeebf252bee8bf81dc 100644 GIT binary patch delta 96 zcmaFM*viCnnwOW00SMX|8Pg~77A0M^n_F#rGn delta 236 zcmcbuaZ`imG%qg~0}wDj_?EVihs9v7erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT z0Z=ACFEK|yBQ+-{zdXMvCuMU8%LX<+kP!_GGnnV|&g5-i*et-U#=__@*_^-A?gIyd zruAnAGfq#&i##eFo)c(}?R6XLE}Oew zH20q+bU`9u@=tyRjvI37pBVT>l_tvwcye6UbNR%;A*nPuL%@OqNPpl5$*dFzfhc1W YRhcAc#SEk-+X~9FfUMmdFZhQE0Kf=LRR910 diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-312.pyc index 985acd756b388ced70320063bfaa49b83bc353d6..a3e018500919def68d5ba778dce0d024e282609c 100644 GIT binary patch delta 99 zcmbQwyPcQkG%qg~0}!+`GNy0jNoDbvuOC{RT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k5G%qg~0}wDj_?EVjCzZvZT|cxqwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~C(A!Z0H)&`5&!@I diff --git a/env/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-312.pyc index a2188ca8b01287401879dc1c66cb515f0baf8aa3..d83d93fa50f1c04766bb560b62f1a2babf8dfed2 100644 GIT binary patch delta 121 zcmey*KS_Y+G%qg~0}!+`GNy0jImP6$K|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)iy~(GTt(Y13^*6J#{9pzEgBU0u delta 102 zcmbOv@SmUOG%qg~0}wDj_?EVj=MWH delta 72 zcmeyv_=J(?G%qg~0}wDj_?9-2$H<^rKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb3;=gP8b<&C diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/__init__.cpython-312.pyc index 6c95d64b4ce106d33426401424facaea2284311f..aecbf2c2d36538ffc9ecc58bd6e5ce59d9a3bf53 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}!+`GNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007JqAq@Zk delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/admin.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/admin.cpython-312.pyc index eb0c42acbd8a86830099e03017b9c0375e7db923..0146f5d4d33cac30411d9c4eac7519a340e4d83b 100644 GIT binary patch delta 99 zcmX@aaf^fJG%qg~0}!+`GNy0j31#x=(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~CDTSm0Iwbz$N&HU diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/apps.cpython-312.pyc index c33a0519283cd1417982b3b1142ef407d361dc0e..f8ee7a4394731f891873e21aa0ff41f5f2a6b381 100644 GIT binary patch delta 98 zcmbQtx|)^eG%qg~0}!+`GNy0jNo4fs)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tN{G%qg~0}wDj_?EVjCy~*hP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fE8{l+dFdLR diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/forms.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/forms.cpython-312.pyc index bef68097ab93833d6a2013d240e89021ae9f8942..0c6aa3731e609c46fb51f42d8307f6c2695fd05c 100644 GIT binary patch delta 122 zcmaDQ_g9YRG%qg~0}!+`GNy0j@nZJq(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7ts@Evk delta 103 zcmew>_ezfEG%qg~0}wDj_?EVj$BWsZNI$eVwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~9xUMn78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9bkm?W400qh{A delta 75 zcmeC;{KUa?nwOW00SK5Md`sKNBgbS=t{+;QT2!o`omiBZrHZV_7dT%Q(O99fUSp-kWntqE=MPNGyrOr+JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~2`d{jW98)49C92NgpEHjuyBe_KEol!45T-|KQA#yKO;3KC%-(uC?{pJIP(QY0L|PQ;{X5v diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/urls.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/urls.cpython-312.pyc index a9f1bcda2a7be98e97f93e20480faf2ad46c50a9..d24de2dc27da19e99dc05aa0b9f2b71278d892c0 100644 GIT binary patch delta 98 zcmX@d{EV6BG%qg~0}!+`GNy0j;bZjZ)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tVzQm delta 74 zcmaFHe2$stG%qg~0}wDj_?EVjhmX;qP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag4~qsH0IIzjo&W#< diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-312.pyc index d452063475873a3305b6b41cf8b317d9dc0bee46..760b50f3e9a823f286ee3e87ff6bbded6d40d21f 100644 GIT binary patch delta 99 zcmZ20a8!WjG%qg~0}ymDGNy0jImPNRM?bVUwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY#-`2$06h*N ACjbBd delta 75 zcmX>quvUQQG%qg~0}wDj_?EVj=M<|!i+*TvYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ9Gf~50K!fhC;$Ke diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/__init__.cpython-312.pyc index 7bcf4275ccab627224fa9616102c2ad8ffa6a255..1c6801ede522410ac98b26bd2f359d104c274d99 100644 GIT binary patch delta 96 zcmaFJ_>+<6G%qg~0}ymDGNw=DG4hz9A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}ht3G%qg~0}wDj_?9-2$H<^TKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb7yxwo8an_0 diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-312.pyc index 5ceaa9a5dbc32c814758723dbeb9c8f4112ef409..e836cc4f5e3292b16342befe433bcf0c522812b6 100644 GIT binary patch delta 96 zcmaFN_?waEG%qg~0}ymDGNw=DG4hzDA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb6aaR98bbg8 diff --git a/env/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-312.pyc index 1e11782099f6ab0c4c01064ad5981946a33a084c..9f2bc35af36fbdfeb3de12e712e0d73d9e2935c5 100644 GIT binary patch delta 99 zcmX@1@IZm*G%qg~0}ymDGNy0jiD2@Wtsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~4bv800K}0SDgXcg diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/__init__.cpython-312.pyc index 6c7bc99ef9f129e45e3742c743c527608e541e94..b394e58610e985f5cc8a006e9b9c04e912217ebc 100644 GIT binary patch delta 96 zcmcb>_=1t=G%qg~0}ymDGNw=DG4g2F4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5(e0RYA+Aoc(N delta 72 zcmaFCc!81UG%qg~0}wDj_?9-2$H*XGKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_2>@sq8TSAH diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/apps.cpython-312.pyc index 42633105b680263cba49b0c3d558368b2e8a4261..ceeaa61d76925c074ed6463368a32f0f186ffeb8 100644 GIT binary patch delta 99 zcmX@f{*ayLG%qg~0}ymDGNy0jxyR_ytRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ5z~4`0L=y(+yDRo diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/feeds.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/feeds.cpython-312.pyc index 7a6cb5ff7f2a2fc0fd51f502224b67853abc579c..983eb549e0f8aa44c65029065e0f5a6e9fae2dd1 100644 GIT binary patch delta 150 zcmZ2web}1kG%qg~0}ymDGNy0jabWgn(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t+Q54!TX2Whr1j=yrMY1Qsbt0M2eS A`v3p{ delta 108 zcmX?Xy~>*BG%qg~0}wDj_?EVj$AQ@(M?bVUwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=f3UdvQ63~Pf3_lteE{S_jmSYiPz6hkvSPGaAxLw)2 Il0`}q0LoD$>i_@% diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/geoip2.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/geoip2.cpython-312.pyc index 25b0ade89e23eeb8a3c779020c6244a94a76a7e2..252b0669c1d335c42eca92e1031935fd376c1f80 100644 GIT binary patch delta 173 zcmX>UbuEhLG%qg~0}ymDGNy0jabfXj)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tcc){?af#HIP{=$p}f)he!C{7Jum@#?3$`bB{ Y8J9)$FZ1hP;Lx93uU5SIp=u&K0L}b7wg3PC delta 141 zcmcZ>btsDGG%qg~0}wDj_?EVj$A!fpS3k5kwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~2FnFbMv=*xd=oe>h?sw3;Naw&{D;qo8Axw7JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fE7MW{l*SsY diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/measure.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/measure.cpython-312.pyc index cdab466df2e96d7cb9d2b3c1397f6c57cb070ec8..7b67e6420a8262715c27d05ecb7d4bf835fd96f0 100644 GIT binary patch delta 261 zcmcax_^puVG%qg~0}ymDGNy0jS;yqjrXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kdjQEBpR zc{!$ec9R(uzA`h&Xl?$bu$hnX$L4kV7no$0)L!K^U06G_WJciv#g4@O^v?9|%o&26 zISXnpZ=Px7!@_uL@-s6f&MTJw*LVUhTKZ2GG#6vJVCjElvWB^`{1r2wYdpRe&3sm- ktVrA-*bz8adtu=P0nLlNnitG`u1rohm&I?zd~-WS04Wz|00000 delta 278 zcmexXc(;(}G%qg~0}wDj_?EVjXC0G4o_=U?YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{nz6Y~cdbxlSFh6aWYTnzj|9n3exrLT)?UKH2t;JG2K zINxTb&1}0*3?iJKjFW{GzOsNAo4FM?^D%zkykGwUll0=+>%68Hcui-P%qU!-*pb+u z-kIK=IYY2B=gQ{QMm{WzmnZ))Q&PBW>3^Lk;37}JMv)DI8yu%rFLb=XtG0r1h2ct; zi@Z8lC)=7U%Um||xz6Kzk;ivs%8JAdf*pZ#wHFp%5YW8Ht9f;Dy}2x2%XXOCF#-Sq C25Gqf diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/ptr.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/__pycache__/ptr.cpython-312.pyc index 2945332eb5cd927f290ca403e7a576de9b98e946..32efd27945c3b5df0bb671b574834b944651e691 100644 GIT binary patch delta 99 zcmeys*TK(onwOW00SG!68PhlNL^63a>4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9boGTmkY02Vv{nwOW00SK5Md`sKN6Uk(dr5{?HT2!o`omiBZrbPmW`j gXTHK|F}aOdk(q(Za`I|sNj4yTfzx91Ip&qj01@6Q6#xJL delta 119 zcmZqS|IWvAnwOW00SK5Md`sKNbArjBKtHrNwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=9hB=ZkZ*m#4Jm+Ojiw_KptgeicXD}$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9b^nddVC00Sr? AC;$Ke delta 75 zcmeC<`o_s~nwOW00SK5Md`sKNBh74(qaRwFT2!o`omiBZrJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=9f~f-lhjkg` diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/options.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/options.cpython-312.pyc index 2d2d25344147536d7f4806437b2b4f1479cc1da8..844f34cae1d9b7d2908b5bcfa15f54809c237c08 100644 GIT binary patch delta 99 zcmcc2{hFKSG%qg~0}ymDGNy0jxy|I!qaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJKJy+X0M?Wn3jhEB diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/__pycache__/__init__.cpython-312.pyc index d53d237ad402c7a5d5550838ce5c91986f6c6172..f1ae4c40ea38f02a015177c8da8306b5ab2e9e07 100644 GIT binary patch delta 96 zcmcc2_?nUDG%qg~0}ymDGNw=DG4klr4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0szTJAp!sZ delta 72 zcmaFOc$tysG%qg~0}wDj_?9-2$H<^aKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_6#!~p8Up|T diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/__init__.cpython-312.pyc index d7e6a64cd9f973f60303a0c77779d5cab43e7737..f4f3b3141731c112a53802626f0cf63552d68bac 100644 GIT binary patch delta 96 zcmcb^_=S<@G%qg~0}ymDGNw=DG4hzKA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_4*+p68Ych% diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/utils.cpython-312.pyc index c6c5157b38a6c98982a3d6ed2cadc73a50dbeeee..895b0ead4f40b98b4d8ba8b857b5e8c833342902 100644 GIT binary patch delta 99 zcmeyzJ&lLwG%qg~0}ymDGNy0jS;^=zK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|lu?oe06SA5 A-2eap delta 75 zcmbQn^N*Y7G%qg~0}wDj_?EVjXCKQA#yKO;3KC%-(uC?{p}Uq(q50KwH7-T(jq diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-312.pyc index 30e9c14a2342f5568be60fb9dbd38e42bfd4241e..83ecb64cc599ce217c5b77b7ce3a97622a2acaf6 100644 GIT binary patch delta 96 zcmaFJ_>+<6G%qg~0}ymDGNw=DG4hz9A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}ht3G%qg~0}wDj_?9-2$H<^TKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb7yxwo8an_0 diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-312.pyc index 6cebeae7365f9cb7323f6c76ce16df0c00a38944..04b35cab8493c42199a0d85a17974097b059e478 100644 GIT binary patch delta 99 zcmcb@^M;4#G%qg~0}ymDGNy0jDP{DSt{+;QT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agB;#Th0L82uGynhq diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/features.cpython-312.pyc index ca99895fb134b3687e7e70df6ae0efd87cb5e7cf..f304c56f9d22a980f385f35ab4c8c8ff9827c88f 100644 GIT binary patch delta 99 zcmZospQFxmnwOW00SG!68PhlNcrtm+&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tnf A+yDRo delta 75 zcmbQE-lEQPnwOW00SK5Md`sKNB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|ie-W@09mpk Ay8r+H delta 75 zcmbPa_{)IjG%qg~0}wDj_?EVjXB~?{oqlL>YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{nz6YB(F0Mxe{y#N3J diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/operations.cpython-312.pyc index 6144d062c5f2b9c7b4462c57c680044a96fb8ea4..e741a2921cd4f71dbe6514c3793d6ae95492db9d 100644 GIT binary patch delta 99 zcmX@<@X&$hG%qg~0}ymDGNy0jQDyR&r5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#lIevk0L!!+NdN!< diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-312.pyc index 38413de4eda5aef550c23b32b33d13f857ea082d..c5fd8f5e694a0d22a1fbb039806b7d83bbd2842e 100644 GIT binary patch delta 96 zcmaFF_=}O}G%qg~0}ymDGNw=DG4hzHA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}A delta 72 zcmeyx_=u6`G%qg~0}wDj_?9-2$H<^jKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb1ORos8b1I4 diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-312.pyc index b812002c0325ef9a06a8c1de2e3364cdc4ed5953..3e752ff6dd4759cf20422a8ed098fa12d39d053e 100644 GIT binary patch delta 99 zcmdnWc9xCjG%qg~0}ymDGNy0jSB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|oY9XF05Vk} A`v3p{ delta 75 zcmX@hwv~KQA#yKO;3KC%-(uC?{p}e?~t>0K4TH`~Uy| diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-312.pyc index 7f3862ca6d69e3fd3f094e35a6fc2666e7bddbad..c95daf3efa7b245994c658b34ad12368b0c7fdfc 100644 GIT binary patch delta 99 zcmZ3=wU>+MG%qg~0}ymDGNy0j>0JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag9%DQ+0In$-xc~qF diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-312.pyc index 7bb640dd5646bb824af87dc0069232ac53054c2d..7c3f26a375597de370bf3ea332eebf869edc2cb9 100644 GIT binary patch delta 166 zcmdnTf0m!;G%qg~0}ymDGNy0jna=DnPd~IcwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i;ynR%+%YM{vt z3^#ZM`{O&~uk$Kjl!8i>>4&9 delta 151 zcmX@hzmK2iG%qg~0}wDj_?EVjXF9V%n|^3KQA#yKO;3KC%-(uC?{p|Yv!raTYx4sFx=o3?2qq^zs{?CkyrULuj&T|UQVgW y(^yP6E?aqjVqoW$ntYbUQVK|a=LO1qkYNyznqhN+U;P4y`gd8N$Yw>>HB10R%P~Fx diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-312.pyc index 89bbd5b6405901639de98e5cd0f5e686c9ef2d2e..bc9cc8017da4f61541ba112d9b1eea9d0f35458f 100644 GIT binary patch delta 99 zcmeA(S!Tj>nwOW00SG!68PhlNY+&-3tsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ZVg;_})0KNJe2LJ#7 diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-312.pyc index 25ca06bb0a6c3a6842d96e4ebed3eee6e95a954c..81acebc29a95d219d0a18fa0c233e75009d6ec62 100644 GIT binary patch delta 144 zcmdm}c0`TmG%qg~0}ymDGNy0j31;$`t{+;QT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~Ia4d2P6E(~28J8L;@5>$E()uBVqoVK>Tv$R#KtRh aLqKFY&qSUX!B+(oKd=JDHwO!TWCQ?B(qv Z04S56mzblUk(!f}U!Gr-lQOZb6aaR98bbg8 diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-312.pyc index 254ddc1f820dae6fe64b6c7a531df111866250aa..a5cc537dc9e85b7edae4cd8380315b8e469b1905 100644 GIT binary patch delta 239 zcmVV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bd!Jt zo+3>N~Hf0Nz}D+2%+C$kIJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=f2FpB-PYg`Ld^i03Cp)mpuzq9)awf;KK4G~L9R6jq zJKJPNNim=mFBpC_FkBKcUlBOL@VcbLgtgdurFucpmJsNJPtl4#=6OCx!gG} z3#tGOp_a`Ccov; N1}e7OEX{k65dacxNN)fD diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-312.pyc index dbe6ed6843b0223f86064f2e0530c4cafd806fcb..e59c5f214591d9e9c161d2b548d347d10b541346 100644 GIT binary patch delta 99 zcmdnZcA1UmG%qg~0}ymDGNy0jS;y!xO+U0awWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|iZPH80607% A5dZ)H delta 75 zcmcc2wwsOTG%qg~0}wDj_?EVjXC0$KoqlL>YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{nz6H_1~0K88c6951J diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-312.pyc index 8405149423dab84202145192c4ea4c42c1bcdeb4..2e656a45b0b3d0c89d30575a21f123046a238d3c 100644 GIT binary patch delta 99 zcmX@eeUqE#G%qg~0}ymDGNy0jiDUAZr5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~6O%eK0JNGKW&i*H diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-312.pyc index bd3476a5a8ae1790d3f790586116a7dea5c15963..3de3c52096334d1f9566659c97a22710e2257ea5 100644 GIT binary patch delta 143 zcmX>gcv+C=G%qg~0}ymDGNy0j+05uMUq7@swWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|p3##<>^sot q28J8Fg8lKG@z;5kFY+p1;Z>a+%+|}yz^69(F`EmB-mJwwjS&D=e=frS delta 124 zcmcaCctDWnG%qg~0}wDj_?EVjXEUQgyMAbKYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{nzJCi4i^dF!R4GcGU1^eSW4i<^rNO+p7D0u(? diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-312.pyc index 11e72a5862473a1ea3d3461367fcfe6222f8b99c..69386d7ea1218900132ec1f673308732fa0de629 100644 GIT binary patch delta 99 zcmbOsy+NAiG%qg~0}ymDGNy0jF=g?Xp&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kPx# delta 75 zcmdlWJwux3G%qg~0}wDj_?EVj$CSmOK|i!OwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#lSQ2q0GxUm>Hq)$ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-312.pyc index b1ee8dea2e4e97aef0e099de4910c512d09536ab..26d20fc566cfc34f424d2741149b2372e1dfb86b 100644 GIT binary patch delta 99 zcmX>b_%x8`G%qg~0}ymDGNy0jS;FiwM?bVUwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|fcdQo0DoU2 AfB*mh delta 75 zcmaDFcs7vdG%qg~0}wDj_?EVjX9=@Gi+*TvYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{p}59YTj0QN5&fdBvi diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-312.pyc index 808b1e781de80a2c843063ec80ed5d0567b29421..64fc76d49bbff03a7ff2cbfbb8b3e30095043e4c 100644 GIT binary patch delta 139 zcmaE6@Y8_jG%qg~0}ymDGNy0j>0Px# delta 120 zcmexq@XUbcG%qg~0}wDj_?EVjr;Ej)K|i!OwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag9!so%x;D^=28J8L;@5>$E()uBVqoNy>u|ooBhc^D U=`%z4Dv#_3W}wjKSWy{f0NN)g4FCWD diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-312.pyc index 97508f7230510b6bb9ce93c40b1d974a5b8213bf..218998f7d6edb8f5e9caaa7f4cb0e93973278ff8 100644 GIT binary patch delta 96 zcmaFD_=l0_G%qg~0}ymDGNw=DG4hzLA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb3;=gP8b<&C diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-312.pyc index a4dd045b46a26526ad061cc3b3aea6937a761ffa..6b33eb735092c8a6a3c3fd0af21d9bbec9bf4bd8 100644 GIT binary patch delta 99 zcmX>h@j!y-G%qg~0}ymDGNy0jxx(ZzOFy(YwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9iz-++@09mUc AkpKVy delta 75 zcmaDLaYBOUG%qg~0}wDj_?EVj=L(ZSlYVG%YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ2D1ex0N3Lhk^lez diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-312.pyc index b5a7a6b925e721f9f8db52a5d4b824bed35cd14e..9e4e22ca41a9a9c95ad8442341e8f3d4e2099bcb 100644 GIT binary patch delta 175 zcmaFi^va3nG%qg~0}ymDGNv!&VfL7=A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}TusE2GTJplG;RMb?D{02TB(+W-In delta 153 zcmaFm^umefG%qg~0}wDj_?EVihuNTBKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv z04S56mzblUk(!f}U!Gr-ld?I4SzCy)b8>^I1V?x52L=vKcgD%HM56^jjPGFXM=-hh skLV{hiQPb}8W?W!OW#mXxvpSvQNiF71EZiT<0M&S77)EzP1c1407msMApigX diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-312.pyc index fdbde97bbf0f089222bf756d932f9555063c32cf..480f7870185f8033f385edde472648f90588a096 100644 GIT binary patch delta 98 zcmZ3>c9f0hG%qg~0}ymDGNy0jQDX9#p&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k%B2-;NJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>KjOjc8ek2+{ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-312.pyc index 352a1625df7a2de2b89040ef7328e7a5b73cf9dc..3102ad179f36752987741ca4df00cedaee3d498b 100644 GIT binary patch delta 99 zcmbQowvCPFG%qg~0}ymDGNy0jX=n79tsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agHe)m+0H=W(nE(I) diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-312.pyc index 46c3ea85793eed7df05d785ecbda9a39e99d8915..c572d4a320830c055f7a9235d4ef09cf8d9c9087 100644 GIT binary patch delta 271 zcmaDX{aTvmG%qg~0}ymDGNy0jDPi_lpdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kgUbwTC^>C61K7dULcivmr! zAgHJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>~1oJA9PYg`jd^fc9CJ0Z+zapUakr~LH+{W@wV;<1x z9}NsQ_=T_Yt6kz(`@q8>BsN`sqWpD1^^1b)mjyLHFtG7DF;1Sws-ps8eBfi?6}--) ze33`_I*-;x9<7gHqm9h28+l$d^87OSDXTmeSRq*7W-hiCR@whRTN)UETKR)J Ax&QzG delta 75 zcmbOs(;&lhnwOW00SK5Md`sKNbB5WVQ9raewWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Yqf#nA$0I)C`y8r+H diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-312.pyc index c771b01a50bce8cbdac59849551ff7ddd04805f7..44f31d72cad43529a9db8a1bc23b3aace2775bf6 100644 GIT binary patch delta 147 zcmex6k#XWAMxN8Wyj%=G(80)RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%H~LxSZ!Hvpb-rWAGjF!g!B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i%e0J#QGD_d WzCNZYT$3aD8<-gcr6=FvzYG9fs3@EO delta 101 zcmX@4xL%RxG%qg~0}wDj_?EVj=OLp(vwmoCYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJDbq3@Mw!WX`1;rlyGfSkG%qg~0}wDj_?EVjrJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agBGXT90KV-Tg8%>k diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-312.pyc index 3fe4227538514ff2cf2e601b48198395ea0618af..78b154b28ec79d4ce7720750f1563f31ff27a041 100644 GIT binary patch delta 96 zcmaFP_@9yIG%qg~0}ymDGNw=DG4hzFA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb5&(II8dCrO diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-312.pyc index 51c40885e8d6645cb17da4a8ea2fc8aa4fde145b..178b63777cd11d6a0505dcf75f38fbbfccbdba9e 100644 GIT binary patch delta 99 zcmaFD_J@tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag5aTXJ0Lw)iQ~&?~ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-312.pyc index ba13a9d272c14e16ec1a84eb5cba0acbdf7f3dc0..a164c47a99ad682bf1acbba73898d979a8e7c03a 100644 GIT binary patch delta 215 zcmca0eOH?2G%qg~0}ymDGNy0jv10a^r5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJLWZkUG(#6bpYw`|u1Li9t zx|2V!D>E~Q>TMR|_{b!k4Rqm;28KHvyq)Y9ITWsNC_Ug6?2qn@?unhO!R^D&z$e`w M+ZnsLh1-V-0R4YMdjJ3c delta 202 zcmcaBeLJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>KkGY&NZZaE-vdjlgR!P2ZtemP`4+KO$@GuC7T;P}g z#LvJh_=$P5A4?ZAdqv a04S56mzblUk(!f}U!Gr-lQP+w@g)F}2$qryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ZVmr0lf0Hy*NoB#j- diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-312.pyc index 062a37b605315ea52a580cd27024c1d5acee7a20..e6f559a207e68b8840f9b0a996bad4dfa1f59004 100644 GIT binary patch delta 178 zcmZ20xm%LwG%qg~0}ymDGNy0j31{+HtRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kAnN4)yQOj6ku?+c=Dw c7|SNV;<9AECaf}9o7;$)K}2JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~HIpE#v@9b7Lj%JNUcvtO&iL!R$`^T+FY~H?U{K)H zn0$%-fjE%<;KaxvAT`700>AnN4)yQOj6ku?CpnCn7^^4$<+9|sEUfa0frFE8vL&|> MGmze#$L-4q0AS%WPyhe` diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-312.pyc index 93565bf22a45f52cdbc4d2ef300af19c50f78b47..09beef49ba4eac41244d6e4754fa6033a1b9b7ae 100644 GIT binary patch delta 99 zcmcaD{aKplG%qg~0}ymDGNy0jna1ofM?bVUwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAdiJ6lN09vsk A761SM delta 75 zcmew?eOsF6G%qg~0}wDj_?EVjXBx9Xi+*TvYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{p}D`rkE0NPO-7XSbN diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-312.pyc index 8fd13f09aea4a07d5faa56004074593b6d0c40f0..5290f314b5a104f3ea390ada50494fe3b101ca74 100644 GIT binary patch delta 99 zcmewq(iO^cnwOW00SG!68PhlNI5K-I&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t^`tDh)GY6o)~>y zRQHOg?&Q;ga(oP8dLK9#q~)(m>0Oc1oBT)6k(ohSf3t(oRz}9a$=`(4#jc2JOklnt zATph2BF~KAs{)EZvn4b)TZnvPXM8(GwnL!4JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKg=Hd_sU^^e9}Nt5ICwkRFLKDt2))9g{6JXzy0FSc zVU5JkTK%;q;CNSR+5Sh+1 zk!MEmRRKky(Y#8VZA8AYGya-vEaMF^nuAkla-)nVGl)JbBgp|amm6sAOBrWzApJp# fK}>pj^u*}vqPk$WhyxYc$(~^b(wlkZo-zUe%dA~u diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/__init__.cpython-312.pyc index 39a874e517c3e749019e03f37a24eef9252b75cd..ee0dd82b9e5fa3896212b48f45135758391d8c35 100644 GIT binary patch delta 98 zcmX@X_JED&G%qg~0}ymDGNy0jNn!Gss2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f2h$1wn(G?N diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/aggregates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/aggregates.cpython-312.pyc index 681b016496e6e36e1e9b6a7f1400aaa387a8ba6e..c2965b965a324e6fadd0755516008db507a13604 100644 GIT binary patch delta 147 zcmbQBzF3{-G%qg~0}ymDGNy0jxy$4+SwFNmwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i$^4U@F<`PV xw}#3!QLPTwJHk>kOc!Wh71p~Wrf@^V=QA^txX=d%CPASOtPEn>n^U-TH~<9{FZTcd delta 103 zcmZ3iK0%%5G%qg~0}wDj_?EVj=Pr{$wSH)EYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJA@fgm#?Z;y+!`F0MYTRLuy6`Z4&#<%2GX0$xpg=I D6U`wM diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/fields.cpython-312.pyc index b2fcecb4940397d82a33f5a9ec68fe35c2f393af..1ec152d6ccb976616efbcd1c74733d3c6390ff2a 100644 GIT binary patch delta 109 zcmey;#n{u$$a9*Pmx}=iIv5$#H}dqddGzat7N-^!>!&0omZxSV>bvA8m*%GCl@#l{ zrj#ZpmSpDV=?5n#=A;%WI3_2iq~=!Y`}nx%0~z@)S&4b+`2j`wS*gh-lTWg(VrG&O K++4=~&lUi(k0qi2 delta 85 zcmeC_X8h8{$a9*Pmx}=im>+yg+sM<)W>BslTAW%`te>4&l$fWNl#y7HnW*oQTAW>y mU!Y$Al*!La%+b$C&B@6x&o9bJnf#D#6*B`PB`Yy6JwKo*KPxr4Wbzx%9L9H( zBe@iquL!G6Zsgj^%pjt^*^>JN8>8@KCLuepu!oSl3Q+ii1cRu=bl-`-*G1GWil}vP z-VheQF06J@SZzV!f}+d9T9bDOB>?qnZHVgJAZWPjw{d_^k3N=6dsuNMqI8W=8!I$u<^UBGxqa6;nr)TyaJ&Su}x3`UkK zs8%GQ6W2s92Zb7Ovs%XL@yAM?oiL?tJ$lrmxZ#Jc&3RDzYH7|^*d7=AP`ToQF&z<5Y-LgMt)si_x5oi`_h zW-zi`R<*sd`AnD*ySNBkp`g_a#|etlRi~<66ttQw5%-DZvZCdc&3y5D*?AR!s(wJs z6AYYuFkP7WB9MNcb{It_2r3ga`C9rB#+8$2XQ)ZtaQD6@;B$a^g2;72<%@#K3!GO7 st%@loFBbz4bTBfeZ{(5X@R*<wn8wFLly C+9HVn delta 77 zcmaFX&3LYxk>@loFBbz4FhBT~wvk7c!=OSxv^ce>SU)?lC^1hjDI>8YGg03qwK%&Z ezd*kLD3hO;n4_POnv;`Xo?n!cvbm6>)D{5x(i@5Z diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/proxy.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/proxy.cpython-312.pyc index 0bb62fb312dcb5b212e8151010704d8ccbec1379..9503ffcbf3830dcf820d362b42cd60743cb9ed06 100644 GIT binary patch delta 99 zcmaDT^;3%HG%qg~0}ymDGNy0j5oY%2(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKomq$r0K2am761SM diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-312.pyc index 456d2785d3bfd7b7b35443ebb2d8c8d449b968d0..ea611155858e4703ab3afea51a67eabefed2fc3d 100644 GIT binary patch delta 96 zcmeys)WOVinwOW00SG!68Pg~7Z1R|@A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv a04S56mzblUk(!f}U!Gr-lQNl&u?YZ-g&FGr diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-312.pyc index 8adddb28fe9b5c6fc3aefd8c6c2e2a53dbe9f591..c9298d3c5e7addc491d93592568f3e5d7f502d9b 100644 GIT binary patch delta 99 zcmbOvw@QxZG%qg~0}ymDGNy0j(Pi?Ot{+;QT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#k!d9l0GT!#Q~&?~ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/__init__.cpython-312.pyc index f1a4c8e4b20aca5cc969fc958ee22d482d95b009..3ee3d674ebc7bc7517d2a773a18f98ac03929fa8 100644 GIT binary patch delta 98 zcmcc3@|lI_G%qg~0}ymDGNy0jnZxMOs~=jNT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{p|2gYUqup}EY diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/fields.cpython-312.pyc index 84e61835bfa8d0e5b235d96188731f7d9966c249..b0c62c0fcece6e9ecc3118c3ecafd917d9dca4d9 100644 GIT binary patch delta 99 zcmeyO*Q3vKnwOW00SG!68PhlNxUhP3>xUMn78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Z`SicAY04|pz AFaQ7m delta 75 zcmeCt|DwlpnwOW00SK5Md`sKN2(K49; delta 149 zcmeyT^InJNG%qg~0}wDj_?EVj$DP@rL_f4RwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=fHgln<8_d9V|UuH-xP}F)(r(PL^SjUJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?iz$ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/base.cpython-312.pyc index 8c0ce6a50746a230fa119b2cf248080090faa3c4..c03019cf93a193c2ac61de0439d2f66aa5f22f2b 100644 GIT binary patch delta 97 zcmZ3*a)^cJG%qg~0}ymDGNw=D`Qy={A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9a7a6RP)05xM*si- diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/driver.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/driver.cpython-312.pyc index db2b306cabda449e0a56e5d50334eda9004247bf..77c0958a354f8d59849764818ee42f0be497717b 100644 GIT binary patch delta 99 zcmdljbyKQA#yKO;3KC%-(uC?{pJ8JjFS0MYRpaR2}S diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/envelope.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/envelope.cpython-312.pyc index d44e91a57d2f86eecb600bc4dbc65ff8f91ba6dd..02aa659b0a21ec3325f08fe84dd386fe88e41e61 100644 GIT binary patch delta 129 zcmez3F~O7PG%qg~0}ymDGNy0j31#-^(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t`Nf0hG%qg~0}wDj_?EVjCzRQsL_f4RwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~CG&MQM)ApwTxz08ct0 AaR2}S delta 75 zcmaFLcb1RmG%qg~0}wDj_?EVj=K`Zap?+v_YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ3X>x%0MK$8asU7T diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/feature.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/feature.cpython-312.pyc index 86f23cfd6b8a6bcf73887ba79909894496da36ab..ffbe414cda1c7812492236965feffeb71d0f9f86 100644 GIT binary patch delta 148 zcmexpIKhbLG%qg~0}ymDGNy0j31jx?)(pv$$a~n_E$u;Kl8E+aDC)q5Yw5!I7z^g{R0<}`H^?CwZJwG0PlYJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~6>|WOTr$vz28J&}3}VtVOy=9qw7)E>{f(Dhfa?Pf UgP_o4DFI8SPt2R61h#Pi05bI^hX4Qo diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/field.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/field.cpython-312.pyc index 3f5f3845192a1aa0dbe211462c1a5655adf4863c..830639dc876151057cea653181edc48afe9805f7 100644 GIT binary patch delta 194 zcmbOnzBQcZG%qg~0}ymDGNy0jSKnr1cg$^e1a7Igtm?3_VuRw6)TQYgDlTsJ7vPp+G}s)iCB&$6Mcd(u tpyNethnW>KiWfLfP@YgcQR9NP!zDq-M!uhy1s#jofMy;x;dNnS0|4>iMN|L) delta 160 zcmdlQJ~^D{G%qg~0}wDj_?EVjXECcmp?+v_YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}cUFHc#VtT18Wb8=wM__-^jB{)T2*7v^ce>SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(iH0?QROv&)-z*CjCO8Ua-{Fnr-+&@tR1 zydh+>!Z-~s?Q2!W*l delta 283 zcmZqL!}MS`6VGX0UM>b8V1Do|Z6nVrQG+u5(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I1Hfkr@)AKqG#y(r>5`BYal%Viy>E1NaDeHrDX5lV&J zR~Sw(nZY>G{JOB(RbjP@Lhh5N_r$VXHgLPL`A5$dHpbq`YbVQc+>n(0#K0(MJo)To NDP|zO`PF0zE&!=MYe4`2 diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geomtype.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geomtype.cpython-312.pyc index 0b581468ede54fb9bd06cf7ce999b5570a8c39f2..39b7619e1eeff66ffdd70622e11a701579fc05e8 100644 GIT binary patch delta 139 zcmeA+T4Ka=nwOW00SG!68PhlNv~qd$=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Z)aK~q90nET2!o`omiBZrdEjN?po`{#8<;1!To+NhD5AEY_^OEZ1@pj*n?<-bF*15iKF+Pmd`(bw@>gyJ zW(Fa(&5}I4EQ}?S)dh@YKl3n1%1&UpAuK-KVxq;2^2@?%H>Bk!d4FI9if^tFxW%cE z1@uA#!xsq#G3gm5^X+HaUlG;*%*!so^^u1`OlJb)!s|N;>vOr~m%XH7l Oo-0%?Zhok_i46c}9;B!M delta 475 zcmX?}I60B$G%qg~0}wDj_?EVjhlS0cP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKf-Q!bal+)SoQYzW%>%Cq2W?=U;Bs9=?V^a&Zd0>(-oco-yQKQS=z zDokLxAuK-KVxq;2^2@?%H>Bk!d4FI9if`@{xWy@#40Lb+0i1vEfVXmW>?CDSM7%_pSnm}LAQN`+9AvN8*BJrEF_tRkxhQs^(+#VF$mQOJc= z;dePjkV0Acc1C-A3coNj@Csh%QMt&YvLxiXs>MZBiyb2SrFTjnNW84-ah1mtXvhnN zmu!r7lP{^Oh}}3tsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k8M9pDywM delta 121 zcmX>nw_A?qG%qg~0}wDj_?EVjX9uf6v3_WAYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{nz4_g~MSU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(RLp%tU>c)Z*-t e`~v*~piF*VVvc@BYEDjmd45q&%H}TCEN1`-;v3Ka diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-312.pyc index 3d98930c66e480a6c800632361adf47f0cabb028..41ee3d1640a93b4fb5db7806d3bc0b6477fc7302 100644 GIT binary patch delta 96 zcmaFB_=Az>G%qg~0}ymDGNw=DG4hzMA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb2mo|A8aDs{ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-312.pyc index 618be931502019d29cf22eb1f33c547355fce919..b3a914217f23be87c4c8715e5e1378d15acdb586 100644 GIT binary patch delta 99 zcmZoQm}|gunwOW00SG!68PhlNOc(N)s2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kV!Z delta 75 zcmbPh&}zVQnwOW00SK5Md`sKNGhN7_Qa`jfwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agwU7}j0Jb|C&Hw-a diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-312.pyc index 239fcbf897e34a04975bf862b10f83801fb3b224..27076953bacca811df282f788e93716674fbdae3 100644 GIT binary patch delta 99 zcmZ3cwoi@cG%qg~0}ymDGNy0jVPx`{t{+;QT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKl0$DisUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kr An*aa+ delta 75 zcmX@0yF!=eG%qg~0}wDj_?EVjr-#X)Q9raewWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag0n-Cv0L7mhoB#j- diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-312.pyc index cb75923af89fd77f61c235ed713146d439514b8d..ec66d637dcee87589dd049a7147c851302939aee 100644 GIT binary patch delta 135 zcmca^^V){zG%qg~0}ymDGNy0jDdzE*tRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agIFBO}AIOXbhBYA@)KJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~G5;J^0Jf1D-T(jq diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-312.pyc index 5838e82bd98373bc59c78295bdac2ec51cce6ba6..4dac6d4f057c2e34a8eea9076c8a16b68b99baa9 100644 GIT binary patch delta 99 zcmZ3jbXbY!G%qg~0}ymDGNy0jk!AOoq#s(GT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#ko^)T0H&H6nE(I) diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-312.pyc index d002ca6c019e7871c73d9aeeafe3a354014aa2d7..a7433b1f9d02da8ba19dbf6af36f5f9eb80addaa 100644 GIT binary patch delta 96 zcmcb^_=S<@G%qg~0}ymDGNw=DG4hzKA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_4*+p68Ych% diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/band.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/band.cpython-312.pyc index 1d6654de424bcea8b8811b2625466315753d0ac3..20ae6de47a7137ac188644e5cc007ccb7c715452 100644 GIT binary patch delta 161 zcmeB(oD<1&nwOW00SG!68PhlNEMfNO*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t$>q(Dm26lU4JIpSh%;Xk)|zauA!;l34Ex9$< delta 175 zcmbOe*%8TenwOW00SK5Md`sKNvxM28TtBopwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag2eYcIxCqdQ7Ysid7%uUt%uwtooZ#47c9BnIv#H_{ zM&=nMS2q7qvSGC_g{itDEHOiHj`ISR*`6yHXZl_i*80T2$f?`md`C!XhRJ;Enbs?q UFAM2h=F$1c3>4p-tzpOl07rB^XaE2J diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/base.cpython-312.pyc index 1a4a3896d3c73122261356963fe78b4186969147..dad237532a6104f66a83fec013703f1744a69415 100644 GIT binary patch delta 165 zcmaDO`c;(YG%qg~0}ymDGNy0j;bZma*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tLWHU}B=4+aklM^^?IT*C8 PK5{ZB>TO=i>COlMCL=QO delta 156 zcmew=`bL!JG%qg~0}wDj_?EVjhmX~uTtBopwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?qvCU)#(wpD0xiX10 z0!?pV_`t`YsJ5JYA@^e5PYhg~LX%xMl{hYIT7F_+;}x2m$!W_0q(5>3Wj3$lbY}zr Dsk<+S diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/const.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/const.cpython-312.pyc index db4e1c138b8a441eb06a8c8b2595d2ac2e987ab6..9793812be8a59e718626d93783b30c9c1ef34f34 100644 GIT binary patch delta 99 zcmey*KV5+5G%qg~0}ymDGNy0j*}>{DK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|g_WBL07W$+ A{Qv*} delta 75 zcmbO(@SmUOG%qg~0}wDj_?EVjX9uf6g??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{nz4;wcV0L20s{{R30 diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/source.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/source.cpython-312.pyc index 8ed7869633479b984820d684dca3e792ff5cadaa..e7b2af0c329ddc5ffdf4c06f157ccb880cccb845 100644 GIT binary patch delta 238 zcmV2rFI978a&s?aVqte>YGE%#Z)0_B zWo~qHFGXZ^V_|e@Z*DJBV_|G%av(utVPs`(c`r;%L@#7zZEr+sVQyz{P;zf-Wn*-+ zJq1G+0j8sY8v+B?97U6f9W?|19Yz6@!5ydr)*(fcaUQA!03t>KvmPIe7#|z}008I! z_<#V=CR52qz;UE{upzW#yfv^~*C#^BMw7@l(F4gw)3cm7CJzgt0RRAi0PrLL2@#Va oNE?&rN6s0_I@26h$vVJ8m~Nx+GVgLXD delta 203 zcmbQcjj>}JBhP7GUM>b8V1Do|Z6gmOt3joHXmM&$v3_=9QDUB6QbuA)W}?1JYH@Z+ zet~`gP$oYwF-JcmH76&(JijO>WpgO2vl!#L#WSUuI4;Y$eqvzawVOOg)|44UUzJ_K zaaj>4D8wr?xj}9fGmze_C*LC>Ck?do1;dX9hD&O}2MU)|ZBX2jyvKAy%yo6Ai)z7> zZ<=3ZKH+v{^I8ive#W_zueg5}J!y4KChUOojJy@e*Y)f!>e*eAwZF9afrqUS0PQtP AcmMzZ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/__init__.cpython-312.pyc index c9e6537ef44708d0052cb8076b1eead4c8e2ca45..5dfdd5700c12e6ca390a242a7c9c519d1823c399 100644 GIT binary patch delta 98 zcmaFP{-2%aG%qg~0}ymDGNy0j5oPx1(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?aQ~AvqkyMFjFHBh=I3aL)_|)))DU%-y P_%bg{xxCp}P=yr$lR9Fr delta 257 zcmeyUb6tn$G%qg~0}wDj_?EVjX9|l!xqfJIYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}3zmzFTIxU}UNHPhq*f{LFQ7&)an z9B&ATO(>kG-tGI58OYy!kIj$CEEcF9q*!u>+eJa84_pjV^4~aF`S?C?Fo=qMVP+5% zoz6dze+l~v#ucU;6fY~7Too|=#J)M5^9rlD2+XcaHh~8UcLeSa-5Yw*CU9~ve+2Uh pmn)ms@tZRuDH73MAUGj#did1viz3>S{|fjrFG#tv*;i176#(8|S)c#_ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/coordseq.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/coordseq.cpython-312.pyc index e122f26ad42587e23654303a644f60d855e625c3..2c3a2d10a1b70fa364ee5867dbfbd4f39c39ea33 100644 GIT binary patch delta 228 zcmewpH#wf?G%qg~0}ymDGNy0j@niAm(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t5@qh0|kJT1=MH P>|JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~5lbthmO9Xg7Ysid7@i1aOIkEDxpyDS6Moy^? z#~VUo6ACA)cl&;12J$!iuvIF^N&(gX0Bg7;>bSyiLfVXy1&%YzuZpQ%6m^{ZRIQuk tvVp^u%_Zt97$rmzYDG*IBu+ztRI1R>G@ delta 73 zcmeywe2baqG%qg~0}wDj_?9-2=ea?lerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT a0Z=ACFEK|yBQ+-{zdXMvCuOoV<8}b9eHzmM diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/factory.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/factory.cpython-312.pyc index a3713b23dbf39b3b63d4f017a6eb33356d8e49f0..433419dc3495d165a5f207949108ed9cafe9813a 100644 GIT binary patch delta 145 zcmcb?{hXWUG%qg~0}ymDGNy0j(PsAO)(JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>Ko;ku|C(wijhA%t}96}S+<|tobm%GC&I6-ZO%4J^p p4-AZ)3Jc6`2uV!Wo~S)px5N26Gf)I9Jeh+flLN-tT+UL!2mo^8F17#w diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/geometry.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/geometry.cpython-312.pyc index a3236eedf3a3e5549d4a9c17c70276163404a72e..38d52a67adf320e1045fbf2190069d786c89800a 100644 GIT binary patch delta 101 zcmZ3wlWFfxCZ5y0yj%=G(80))|XmM&$v3^QYVtHy-qP|Oha%paAUP-aO zYf5QyVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOuJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag7855k0KZ}ym;e9( diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/libgeos.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/libgeos.cpython-312.pyc index 237cb756e5356d94080a039852719492e99d6909..b16bc99227e28888d6201ec6ff97e39fa6fbdea5 100644 GIT binary patch delta 139 zcmdm`dsdg{G%qg~0}ymDGNy0j31Ro>)(JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=f1$!i;;AAF_bfp^-ik}#mImJ3W?uaWd@VG3l+u?D8 VU;HA!@=XEJ59~mh&21d+d;q3DC`|wW diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/linestring.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/linestring.cpython-312.pyc index 6d13ff2c21ca67bca0227642250cec47335649df..ef9f8cbcef0f4fe51d50b3934020091e48959af3 100644 GIT binary patch delta 257 zcmaFv_|B2%G%qg~0}ymDGNy0j+0W(Cryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k zc}-BU!|{fY*o4A~>fOE{fhv_YPvc8tVO&4?uaKMgH4&9gmk!5{!W$x@9ZnsEU9KOP z8AMe##|x{ms5%2pYhd`o#h|FRBzc9(;>;@w2ABB^FDe+!FzhUu;MiM!LBU}2a&ZSv E0D*T_`2YX_ delta 250 zcmaFo_}r1_G%qg~0}wDj_?EVjXFr!gnSN+-YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pIFn1cG*5)d1Sw@ZrlJcJzxOlB6&*F(>2GQSm?Aa&F zePUqe)S7J0>%U#l zx9>-0Ab<0GzBCrbEtA=V-DEC{sDRXnb-Hvob`;(a5$$m5DC~0m08}ToIayeZMacnZ pZUe&?E(S%lCCMvP7H3{oFu2BNIK!~BWP)RF`2{}1&FjP+I01uuQRe^v diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/mutable_list.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/mutable_list.cpython-312.pyc index 6021fd5efd700fed5edb0112ef0dd5a6036e66d7..e8f8b90383894155d032b3ab05469bc086329857 100644 GIT binary patch delta 570 zcmeyF^D&3#G%qg~0}ymDGNy0jN#^vJpdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kryC$L->(7Y(1xkB-(fX)T8u#cO=c=j@BsRJGH;|0Ty28Is| zOd?!2jT}}49&kJnb;%{X!{s`U>O~&a1&P;rG&bsOw&T}kWZt6pd2^1y0yak1$-Lrv zQqy84Fy0Ulna(|tdxq;(0i_Sj3}Q+T_=P*TCm)oNo?I&aM=Ta-Lj%JdexV7b-Bled zcLc>IluVPJ+#{jP#2~bJql7b~SP^z5{8AP`C6hg+-m7YWRXh+7>|nhuDB9t8187`g zcf}0>(HVjhxhArHU}X>z+ngjV!>DZqR{8{JP2n8n87Z?huL-JvGzd>{>@1(5++BA= zTw)RjNQ3I;buwqTbUYxoa|=x{nIUzBTjd77$U)P~5}pT5cR0_HTHw4wWWDT4*{hP~ z2TU(+UZlQ&RnQ!$0}^O=M5Sh!O^clzp{oY;x$@>l-Iq*^`IEB^LR7Db>36zyICd1@ z;1RgaBXf~QW=7xw=Bqp^ADJ1%4T?m8W+byrP81i}{MUe=Nh}D(O!EbSGp(JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~J7*0OW9DQN9!1FuW?|o$nMC+*7#dArxh|l2Q9yHr z;#C2iPn(N*_A+T}0PXqlg5gI4!zTtN5w07$dIua&L|t+T?{K-!qk54?bwT2F9*vJc z6Sy`<@oO_OZ`S*=xkF$98>81`O>sS`$uXZ873O)%}Q>R`DeC^n&Fvh*hgc23#J^CXm+*f}>JmT+d2F2|vc6R1u` z%7TfLb8?u}do5kCvIhc!9jrG5MS)J{l|ayW)m`=nTP$ToYM8umXiQXGzO2 z8rXx?KLOfWI7fL#%52Tcf+`?gk|15e6C69sXDD~q-4K_U!~xPJxp||^87>VMh-0{g zCYa2Sy27n;gJ0x;=`{(@9nN#47C5gESueX%_Nt`$rOhkV7qE)i098YR@Q$d|4716x zpBPwp%_m3csxbrU&CR+mnHWnZ=Ng14Ul!8`h8Cx4r(1_(NAV3Ff$Kan7kOl61TJ8{ u%A@j;87Q^+zJV5#bU2EU<_iL6T3;4b|HQz?Ydu-s*peAYZ;mz=V+H^)Ikm2psMz6nLr82w;Y9Ur-;c};LQ0!ugaUW~iv%#; delta 123 zcmexw^TvkfG%qg~0}wDj_?EVjXAY}Dp?+v_YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}2UaN_Ep?y~FBpC_Fgy_yn^HW(WOC(YLB&rDjGR&( YjyHtFCKOIo@Am!34CHUt7Yg730HUBO{r~^~ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/polygon.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/polygon.cpython-312.pyc index 6224f30cb75d0336bd3bd86a440d8e5e610f28c6..eae23383bc81f8510d1768410f87fc604cb86c6c 100644 GIT binary patch delta 326 zcmdnydd!vQG%qg~0}ymDGNy0j*~I42tsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kFnnNRkdo`< z>tO0|n!q%{>9(Ng51$5bAm0=LSY5WToLnEwEeybRFXA7D3J5V5_eW3!-eLdXooiQ&^@r^W)g zll5hyS+3~VT;AL#bC^;20|T=R*F#a`35*|@8F)=Lr0g)W6`159c`F3UieL{26 delta 310 zcmX@+y3Lj6G%qg~0}wDj_?EVjXA_%2v3_WAYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{nz8~Z;-Ep?y~FBpC_Fgy_yn^HW(WOC(YLB&rDjGR&( zjyHtFCKOIo@Am!34CHUtBm=KE)@;aYIn-69WsU+2q%J2FxH@j$cRUgy=N`{{xO2M7B$Bl-?1z zRqoQ}1pWg&GLk^ke}J8HNyK(R;e?PGiW9@9$4-sCC}KO=UM8C5vX0G_>dqGb(># zV3y%}ARzdGnSs}2L&^@r9fdnhH)e0o-Q+;*1BqQ+k~+sn5z0|0PS BYZd?i diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/prepared.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/prepared.cpython-312.pyc index 65ddf233a4228aea6b95c283269aa53c884124bb..8f31878567e14de06cfefd77971627f50708361c 100644 GIT binary patch delta 99 zcmZpZo+r(7nwOW00SG!68PhlN++p(Q(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tGL_f4RwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAfH{u~0J7K`O#lD@ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-312.pyc index 1a0ed00cfe8b2537d4da15c2d39b680852e46048..aac8bcf18f37b2b9c2925ffe4c2c128a2a3449c8 100644 GIT binary patch delta 98 zcmdnQe~O>yG%qg~0}ymDGNy0jS;gitT|cxqwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i=IjO`2n7N{a_ delta 74 zcmX@bzlopcG%qg~0}wDj_?EVjXBC@4y?$tMYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{p|KejUfrH31D diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-312.pyc index 965dba84e0b947fe5d66da95d4a861f83fa692d0..4350a70f9ce3f1873a6daaad2f7e38f28f5d9cd0 100644 GIT binary patch delta 99 zcmbO!yHS?sG%qg~0}ymDGNy0jkz@9lt{+;QT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kN`UO%)rwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#h}oVS0GN>(*#H0l diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-312.pyc index c916b88bcb12dba8d456897b1ee48b4525f7a5ca..38b583fd6be99fed04628579c71f319ba51a2089 100644 GIT binary patch delta 99 zcmbO#u~vfTG%qg~0}ymDGNy0jInC%XT|cxqwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY&cw$B04^UO A>i_@% delta 75 zcmZ20F;#-+G%qg~0}wDj_?EVj=QN{1y?$tMYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJJQE)m0Jk3*>;M1& diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-312.pyc index bdb9efd22b35911985b71fddd07a28ba3f6a47b0..c38fc5cb0dfdd0560afa0a387bb53f1551ba3071 100644 GIT binary patch delta 99 zcmca0`9hNCG%qg~0}ymDGNy0j>0$PmtRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag0W$|D0M3~j-T(jq diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/io.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/io.cpython-312.pyc index 58c677128d3c6642c693b79dc9f4d80ffdd18465..2b6acffa5ab1c0f28d6f5c8eb00599e96b679a22 100644 GIT binary patch delta 99 zcmdl|cBYKyG%qg~0}ymDGNy0j*~{uNQ9raewWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|lhxW30E~Mh AA^-pY delta 75 zcmX?8wxx{cG%qg~0}wDj_?EVjXD_QkrG98}YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJAe*%*0Q-&`Bme*a diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-312.pyc index 64ac5baaf3e258249395c15e863ab3c5d1795c04..ab3117876e9db503ea882f519013fa7b6e98c441 100644 GIT binary patch delta 99 zcmaFO-OR&tnwOW00SG!68PhlN1TcF{)(Dm APyhe` delta 75 zcmZqXdCkppnwOW00SK5Md`sKN6Toaxtsh#PT2!o`omiBZrj_(YKBG%qg~0}ymDGNy0jDP;DTsUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agD6>2(0K&~0sQ>@~ diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-312.pyc index bdba7034773fac11534ae619cd3fb45b8633a223..d8fdbb6857d7f83515214866530b481cba95120d 100644 GIT binary patch delta 99 zcmbQkvxSG}G%qg~0}ymDGNy0jDPZ!Lt{+;QT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag2vY$w0HgC7hyVZp diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-312.pyc index 608cf38f3c4adf2a7b9ecdd607ffc0d17fe50986..51b4c9bb4bdde12b1fd150a3959cfc2376c1df4f 100644 GIT binary patch delta 99 zcmZ21vs;GeG%qg~0}ymDGNy0j;b8KZsUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kVY<%^00M6z AUH||9 delta 75 zcmdljvsi}bG%qg~0}wDj_?EVjhl9zWQ9raewWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKhUq>x0GbaPUjP6A diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-312.pyc index e2162b5ebb31a49a977ff6ed95a36f2eb2d401ed..7a1a706243af9a4d87a0552344a17d6d61064c89 100644 GIT binary patch delta 98 zcmZ24a$JPxG%qg~0}ymDGNv!&Vey!*A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}uvR;JeG%qg~0}wDj_?EVihsB^?KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?I4qv Z04S56mzblUk(!f}U!Gr-lQOX_7XWZ>8Y2Jz diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/__init__.cpython-312.pyc index 7850c297e2c002869ed9d3273d10998fbfb09871..75e61e89b4a1c06bd5e94591cf7844be2a073cf1 100644 GIT binary patch delta 96 zcmaFD_=l0_G%qg~0}ymDGNw=DG4hzLA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb3;=gP8b<&C diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-312.pyc index 15eaad3d83e12954e5955d6c31281042fb66de3a..a15b323f3f1528f074125b98a1972b6f523437f4 100644 GIT binary patch delta 99 zcmaFJ@soq+G%qg~0}ymDGNy0jF=q0ZqaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#o#_)J0KHBd6#xJL diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-312.pyc index 7396be6e0ffc597ccdf6de9d990c9e08d2ced20a..31284feffb9289ac44f722b0aad4c638831e893e 100644 GIT binary patch delta 269 zcmZ2udclB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY#(Y;u<^uz> z6yHO6yNT`}m>JXzH;7+WwcKTXMZo!{yxr#iqOOdLS0=lPJBQBU|H8^5&h=12eIm;Q z#tDWu_ywl;F3`R#qIZ#BZ-e0m+YhV^ynG#noh~;d)PZbHk&g^O^&hzy%PPKlC1k>K@T8v2IC~f3$pH$uZw$0UeR&5BIS5d$6=w%0>=e~GYn@W&NR88<8W!R Ri9{&NC3(Bgn|meXnEKQA#yKO;3KC%-(uC?{pJ9P?cvnNJMNQhX0Zq(3k-s2Oe$zpQGx%lwLf^G9Z& z@Mdu_S4PGYlVio5xn}c!XJrxRdMF?=d5yT7`Uhqpr-S<=1CaX2#UQ7-LTE+QMOpV9 z)LlNG<>X diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/__init__.cpython-312.pyc index 5fbaa3bebf150b3a8825cfdab0128f78303addde..a7aa8b98275f5c636b873371436d6f9a42829fae 100644 GIT binary patch delta 96 zcmcb^_=S<@G%qg~0}ymDGNw=DG4hzKA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_4*+p68Ych% diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/geojson.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/geojson.cpython-312.pyc index d7716631833c949ec58632da0ac221569aa4d223..134265ff8460a34b324314d7efe34487c7d64131 100644 GIT binary patch delta 155 zcmX@3c3+L>G%qg~0}ymDGNy0jS;g!zNk6nWwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|j9G=1F?2FF zr-8;5NzDnYcZ8*8m@d%1Dy(-yOMkuAO05YlS47lrib#HBXOPnRz{KQA#yKO;3KC%-(uC?{p}KV}tH#;D24oCX>fB{e@WF!M@HV7((OHN$j)_EllM d8(RA7wN`3PaJeF)ep5v9BRf!ja~bDLP5=%@EH?lE diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/__init__.cpython-312.pyc index 00cc9d5362fa0e0ce61a91be5485c2a8ff679971..12a1ed8778b1af4292b6d22d346487a8fa56859c 100644 GIT binary patch delta 96 zcmcb?^nr=zG%qg~0}ymDGNw=DS>iE4KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) xIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}8hC0s!*7A`1Wj delta 72 zcmeysbc2cKG%qg~0}wDj_?9-2XNf_DerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT Z0Z=ACFEK|yBQ+-{zdXMvCuQP~3IK<58w>yd diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/kml.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/kml.cpython-312.pyc index ec6127f18d4b5ec5486504f58a8894f759566502..38df07fb7ea44b191bda11a9aecbde502d13bbd2 100644 GIT binary patch delta 225 zcmV<703QF$8`B#M%MA?*00000hyej-u?*w^NQ*C3b7gXKFJxk2cV%i}FGO!+b!}yC zbaO97WOZXV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bh97= z3k3n(lPm`vCfgPrh(_EG8JH%dCZ{W*E7u}7(IPk04>;HzBcEKET-O~i)EzLBdIv%S z03I=uzXwbM02dy!4+xb3Ha7qO0Du7W3IGrn*AE}j4 b*dQdQ51|i;Ly!#83?1+T02COr-wEvl7s5*1 delta 191 zcmcaCeMXw+G%qg~0}wDj_?EVj=Lw@hv3_WAYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ1rs-``U{{D4GbRy7{nzzxNmR^b=cn#lbW7CG5@ld zdWZWBG1*TH!koU0lT+9gI4;T>d}81bl$zYm?!*kD&#?QjfMhpIb4+Dqw3)n-Q&#qd lu=pniMoxnc=Nk$t%lQ}bcQ{Yrxx^#;ff*>c`5EV1W&nr^Ji!0} diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/views.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/views.cpython-312.pyc index 13c92efc3c80bc5e36260599dcb7592b287451f2..7c182c3d74ea3567edc89e813679c58d538887b4 100644 GIT binary patch delta 122 zcmZ1_zE_;*G%qg~0}ymDGNy0jk!1Ji)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f7Sk>OjENeB diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/layermapping.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/layermapping.cpython-312.pyc index d8e91f26afc2f0682477b68d37c89b6c3084ca6f..c8516a5a61d69e0cc78c22946e3f5bd434829679 100644 GIT binary patch delta 348 zcmbPnoU!vbBhP7GUM>b8=wM__-^e4+;xSP_v^ce>SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F( zPRWwc8M#-ubskH|O@62@#>^lozxkJXAv5Fo$vN86%-2*bCiiQ1gZ0Yl$TBhdPqx-G z65qsqS=eSH_X^<&&NIXoFwc~}D5A1~`{L#Xy}LY;tH8#85MdA%@8GVT2_gLt$B5 q-N`l)(||5g-h3_M7!#w{b8V1Do|Z6l97i$SG+XmM&$v3_=9QDUB6QbuA)W}?1JYH@Z+ zet~`gP$oYwF-JcmH76&(JijO>WpgphFKNaHlk*h3I4`SMd}at^|XC%Cl`C>qH<|- zyWU+Mx%ChOMHocIJ2-Es=wDYcy{KY(S;hPl12ZSz z5=x&LJQ#V!CdY^Gm%5>;^NE2`(O`k&4Hb>$9t%BI1TOXdzzh_bY#cF-1*C5CnTTUd fjQ*1+N1x@mECp1~&nq=KImVM2NN-*rbBhfCwo!t| diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinfo.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinfo.cpython-312.pyc index 2a08caefe88b842894661fd27d9d5bb91b299bdd..2d49bf86a407c1558c0862d1f314460c1b944076 100644 GIT binary patch delta 165 zcmaDL@=}E7G%qg~0}ymDGNy0jDP{NQ(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tn$YJOs6 Qkhc0L$snpdc@O6j00m+=E&u=k delta 156 zcmaDU@<4>=G%qg~0}wDj_?EVjrJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>~Bzpwo`pHTh_8gZ*v_3OPvC2(O;W)2xS<3Pg10Sbc zr&ot#NBJEd!3#o43j!|+sa@ewzagVI-)E-JCk7r~xygZ?>AXPt6Dv^hM@f+Oqnt|s Dl3_H? diff --git a/env/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinspect.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinspect.cpython-312.pyc index 3dcad0c0c75d7dfd91d524e20581c8a4c2547134..115cb2db14ae1262cdc8c366c66650c377a73d96 100644 GIT binary patch delta 224 zcmccO`ofjxG%qg~0}ymDGNy0jxy|a)uOC{RT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pIK3g>7fyv!$J{%VX^*%AMuqsZz#b(G1q&M@is|nfr z15N+Yz;K6KbVBN!lqIe+Vy|#(-%!`NCak+aaf0J?_lfRPJueCCUf|Ka$t!e2-SC>Q r5t78_YRS#4jPob!%kSs@%*Ouoc* gPUMQZ`(-hYi|XzR6eko;FPmI;LEU}xMs9CL017=WoB#j- delta 103 zcmbO(^+%HDG%qg~0}wDj_?EVj$C}HaKtHrNwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>KpDT*7aq=s!bAp%E-LHvxEKrqv Z04S56mzblUk(!f}U!Gr-lQOX_9RO?M8Vdjb diff --git a/env/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/apps.cpython-312.pyc index 4c88d54f49c007ee5d803cfc8d175592762dea39..0186e0786377d2c047e076e2aefcbdebe461449e 100644 GIT binary patch delta 98 zcmcb@@`i=yG%qg~0}ymDGNy0j(PZ@K&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>Kmhn9Rk$@Vd diff --git a/env/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/__init__.cpython-312.pyc index b00d3244af7c0d613001360ec1e637ea5f489733..48d303136168140640f3bb3562fcbf6375448e14 100644 GIT binary patch delta 96 zcmaFF_=}O}G%qg~0}ymDGNw=DG4hzHA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}A delta 72 zcmeyx_=u6`G%qg~0}wDj_?9-2$H<^jKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb1ORos8b1I4 diff --git a/env/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/humanize.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/humanize.cpython-312.pyc index 7418fb834fd585adf0981046c828d40c77625489..ed3d224e3a98314d79bc7da15aae8d6a40a2084a 100644 GIT binary patch delta 297 zcmeB9n3TYCnwOW00SG!68PhlN++y>XsUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k74h)Ni~@g=Oa@B$o+!H_ z5e6|?4rKD?a6wZ>sH^5kTu?H(Uq7LSL8|H%^`=s?Gdd-f;3s(L`nj1*6Tn HV)rBgR`XzF delta 278 zcmbP~(4D|@nwOW00SK5Md`sKNbBoQOQ9raewWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Yqk6n&UR1j!H1H+Vx3kt>;Og&DhT^0{)V3-`w`x7cN zhvR~x=>>D|6JeJnLVz;ae0Ac&P(3$zlrN~->`42}%p}1Dl>5i`UrY#Yp4kNpzY76j zm&L<@Qi1}1kqiV%`JO1dED_eguvt;Ck`X2)aY4!Cf*Hsal0a8%UMuv4iE-QHMWWgq nPvi|hF|f1pO}-$S$P1)D2r%#nHu(JbB0t$)QektP*cM3u&Z1mF diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc index 9ff8726a7e7876127e92aaf4c7bfee1efc9e5d2f..b45767b2679d9d1cefb3105b977a816b38160235 100644 GIT binary patch delta 21 bcmbQtJeis2G%qg~0}ymDGNy0jX=elgF+Buc delta 21 bcmbQtJeis2G%qg~0}$vO_?5Pir=1Z1IcEjA diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc index 3e16cbb1a9b547df94f7f5d4c91acd72706b3ff6..3a9c62c5f4642edcd1d7d14a8dd48df4eef268a4 100644 GIT binary patch delta 21 bcmX>tds>#~G%qg~0}ymDGNy0j+0O?6K2`-s delta 21 bcmX>tds>#~G%qg~0}$vO_?5PiXFneRMt}yQ diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc index 5e9a5b435b904dfd8920c733394a1ad611f1440f..ff9329c4b89f0498a2244c323cd0696f0c8c3033 100644 GIT binary patch delta 21 bcmZ3*wTg@9G%qg~0}ymDGNy0jkz)k_H4y|g delta 21 bcmZ3*wTg@9G%qg~0}$vO_?5PiM~)Q$Jv#-E diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc index cf57f013dedd0cac738a746c61fa4eadea2a4dca..f3ed71bb8fc84f436902e1876ef869627c76a464 100644 GIT binary patch delta 21 bcmbQiGJ}QZG%qg~0}ymDGNy0j;b8&*F*XD6 delta 21 bcmbQiGJ}QZG%qg~0}$vO_?5PihldFOIba1# diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/context_processors.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/context_processors.cpython-312.pyc index 6952a1cd0ce07080eb2718aee7e3ddd11529e675..55c3db06d9b95148f15cff9198d14fff091986ea 100644 GIT binary patch delta 99 zcmbQlx{8(OG%qg~0}ymDGNy0j@n-axrXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kb%7 delta 75 zcmZ3*I*FC%G%qg~0}wDj_?EVj$D7fhPCv9bwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~J|j0H0FXu*vH$=8 diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/middleware.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/middleware.cpython-312.pyc index d3257d7bb4fe7eb59aaf2183505f728f29c84144..484d93eb43d04a98199637bee8f8e256fba56b5e 100644 GIT binary patch delta 99 zcmcb>{eqk4G%qg~0}ymDGNy0jX=e23(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agI-?*90K*X)s{jB1 diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/test.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/test.cpython-312.pyc index 6594dbd962da34a3783617612627b760d29b2c42..1cdbc9d588cfa62b5ae33fa0034ff8df97d6193e 100644 GIT binary patch delta 99 zcmZoJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAfGLv^0HbRf2LJ#7 diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/__pycache__/utils.cpython-312.pyc index 38e4d478b4765836e7b19121ca81b47fc44fe5a9..854b6f6b11bcb9c0f9ac42643d4d974ff752aa2a 100644 GIT binary patch delta 21 bcmey*@}Gt0G%qg~0}ymDGNy0jDP{ryLL3Dp delta 21 bcmey*@}Gt0G%qg~0}$vO_?5PirJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~GE*=U0I-M}SO5S3 diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc index 5658bda01bc4e7a645b810a499888378f32aa1e5..3e056a7f52538d621ea436d8015beb3e185c2092 100644 GIT binary patch delta 21 bcmbQpHj$0zG%qg~0}ymDGNy0jVPysYFkJ)S delta 21 bcmbQpHj$0zG%qg~0}$vO_?5Pihm{!sIEMv0 diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/base.cpython-312.pyc index 194b7d04c56a63cd089a41b8a18a8be68f26351e..7024f6b9aeac6c2bfb4d73c416349614600718f8 100644 GIT binary patch delta 100 zcmeD8?Dgb1&CAQh00bS3jOiPB=5R`g0y!@jel###5D&Ph?y-RRl=B>BAY<}g&TJMS yeR;DE7ps7r6i`_M!)Fc#355>#8$80-d1Nl~$Xw--`^XFwnk=O#y*Xb>feQeuy&Q}H delta 109 zcmeD6?Dyn3&CAQh00cS*ex+^XnZqe61mwJ6_|d>{NjzWy^C{;!%ooK2CLiF;X1Sp5 zab>eU7ps7lJWx#o!v_uq358D#jGXcv?l*XZuk*-UA0Pk# diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/cookie.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/cookie.cpython-312.pyc index e4d8a0ed54063e6cf0714d74d1e359253f5c65cc..a37a77c949d630e9adae766b59d5adf276706dea 100644 GIT binary patch delta 276 zcmX>c^CE`lG%qg~0}ymDGNv!&Vey!xA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}4tth=LX?jt_^aS^%&C;B^m`v?~?rvcC$j2Zi z`I(npfa@aQT5p@F0aE60GN(negFUf delta 220 zcmV<203-kCT*F)p%MA?*000001K{>%p$r5tdM{OTWpZ;bYhiL>ZZ2YIVRUI>FGOW? zYjkgLFK}gYb8l{8Y%geKY;13LZ*pv8vs45}1Ocg&oCr-Z*gQYh6F{&;kVMxMDbW-u zs3g@CFVYi0&I|;f1E;s-H0Du7S z4geMz_6-LR3h)d75fbzZ01Xk3N{LF?5E0lLCEOGu_6GzF4)O!DDh&S;6%hac0Qi6a W(Iq^&TgVZ+UehH^fB>^RA1n`4GfKt) diff --git a/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/fallback.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/fallback.cpython-312.pyc index feaf4d1d88e7b3ea24801117afee62edf50b3b79..df2c52b05e55e66ab410d7b7a12894cd4e1be5ea 100644 GIT binary patch delta 202 zcmZ24a!7>dG%qg~0}ymDGNy0jS-|8mML)DSwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i;yhpCV;XtE!( zoa`lskk8Cal3X_(LRQpv`pz)9z@xRm>@ttm1&5H2n_HM)Gm5kTozTGWfrCLps)Of- rxb*beDYcV3SW}o8Bvd!QXANZHPlBirV33djONMaxf+d%5bTa|~`!7Q7 delta 183 zcmX>kvR;JeG%qg~0}wDj_?EVjX91HzjeclxYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p|7p6i+-^pprauOFELcTFGNpjuLx9RkqVRC^-Yk}Ei z9<5KC7c#$QlJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAj@gp~0L$wdk^lez diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/__init__.cpython-312.pyc index 5345557be3776726f8f0f7073f3abda0ac9d2d4e..4a79f66daa0881e4f14f723a072953f2c20c4731 100644 GIT binary patch delta 96 zcmcc0_?D69G%qg~0}ymDGNw=DG4klq4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)}0|3igAqoHh delta 72 zcmaFMc$JaoG%qg~0}wDj_?9-2$H<^WKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_9RO?M8Vdjb diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/apps.cpython-312.pyc index 655a095d2ba638b532a2e3f955dd3af60a6e399f..2f77527f32af3101cc3e01866cc42d87fba98192 100644 GIT binary patch delta 122 zcmZovoubNfnwOW00SG!68PhlNOk(rs&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tt<8 delta 103 zcmbQD+NjENnwOW00SK5Md`sKNGl|WhKtHrNwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag8QVj4Mytsu_+&Y*h**7M;Ndi!{DLot8Axxo)Nm=4LBla?n_9Y&>EzBESHgoO>+{kyC$L^%{<_r#9 zCKjN|&zom*eP)tu0GiOia6?R@gZqxQ$%c^Yrmh!FU9V}oOHH{y|42q zUgS|+pmmu?_d1WsWge3QH6NH6I0ZIu5I-Z%s5`k<-__)bP4E@*kc&3KD}7eDZZMt0 zI74+d#{$)v{10rn3ko;tE168GK3MMmH?ntXHNLk}}Ra$R@$#%<) dmIv4`8N1(-QTo8jplCWd*&q$#_cI3F%mBJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag98*23paIZ`7Ysid7(OvD33J_WcAuQUAG09%jOMSpPA%ZfJz$}Ziq>AaNp53*${Hw)b*mN>t$`XPYkS_+LQP2`ZELR z&HQ}(7-dqyYVU|jOb+efx*;xoU0nU5xcVmsW=;pj$&dL>SU`-;QUb>qJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agHsd@d0L^S0TL1t6 diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/functions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/functions.cpython-312.pyc index 1066779a3b07e9bfa3fb570287702296204eae75..f5e5ca5c08c61e505e22d1c5d9119fba1b8181d5 100644 GIT binary patch delta 99 zcmbQlwu+7CG%qg~0}ymDGNy0jF<|uQ)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#g>e}p0Eyii5C8xG diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/indexes.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/indexes.cpython-312.pyc index e5e8af1173f90a966c6b6fd4d8dcb1f3045bf2d1..85fd093aa41314db6218fde3b8c7edf1c87f6b7f 100644 GIT binary patch delta 187 zcmaEu^ec(yG%qg~0}ymDGNy0jdBo(=tsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ8FL7StQ63Q7Ysid7%mB!EhwH~IH7o&{fw09_7m(c z3Yl$Q!M%o&c}4n_&EdR@m}NdOFv;`X)Y4m_xFT=@&jQ8;hBL~p3aEZ$1`1CW6+Fdq N#VF{@=Es85H&dSHG%qg~0}ymDGNy0jiDdHV)(^d#>LH>*iW+q0E!nbga7~l delta 106 zcmbO!|5uLZG%qg~0}wDj_?EVjCz8paSUJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~EfWi?q#V$Q28J7ITFWyQW?bXfpOG?!d4kJS&P$um Iv7crK0D;>jivR!s diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/operations.cpython-312.pyc index 5ca7c0460cf64d960113a49393a9706e980bc0ba..83fb025b9734d38fb05afd4cab03fe1556cadbb8 100644 GIT binary patch delta 200 zcmex6mvO>8MxN8Wyj%=G(80)SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(2vT;$cc!mBqqnpcPWBLgd^_H|yp3%q)pC-N#QsVM_hzhL;$ z!0>^ANlECYt>;SL6>b|`CzMUdn31@Ebw>FW5%rxhn{VrDF*5Io`MjCK@T)8U8tg?1 delta 181 zcmbO*kMZwZMxN8Wyj%=G!2IA_+D4vwW`i>Q(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I3?=&786UKqDF$ZtzN7=T*JPt9qSR=OVApWnR4x z46K~mlk<3WxW0o}pFqUsrM${Y>MB4TFBpC_FnnTQQWCnUW4Xd@gX@H{2^ljI7qHGK bzapakkr^nl`JKKNBlGT@loFBbz4bTBfeZ{(3<_2|+MElw>e)=x=FEKki!)OX2GF3nBND=F4@ zO({)IEXmBz(+^Hg%t~wHb=3>iZWVG z-XWzba7D@CvoIGg-$x+^Wk<#dUXx!*S#o?30C7GFZ&sC-lVV&s*~QdVZcY6cW+n-) zoBDP$b7!P2NIjr>(J8pYZGvm3?~3|Qn-`mAFmZigV3rbksA)Tsce1dB67x+>+sRfI Qzgezm+J4?_X&K1{0CDh2KmY&$ delta 180 zcmdnq&N!)^k>@loFBbz4FhBT~wvk7U)u2c}v^ce>SU)?lC^1hjDI>8YGg03qwK%&Z zzd*kLD3hO;n4_POnv;`Xo?n!cvbl&gR+Q0T@&zeX-pfi3--Nk%`926Sh{{i9m9}L1 z#Jt%}T26{_>Eu*XSE<$Y-txNgd6&q!O4dO-D}Q*ejd1lLaA&znz}W-xJlVqlgM fdMKef*~&tR^&>NoGdbSkH_K&B+b^5rEF-x9TX;Qw diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/serializers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/serializers.cpython-312.pyc index 152d0e72756c12ed97cbefd36923c77e728a4bc2..6b1416516ae2f21ac1f269b1afc274400cce1534 100644 GIT binary patch delta 99 zcmaFH_K%I{G%qg~0}ymDGNy0jSKQA#yKO;3KC%-(uC?{p}cgA)`0M(5ffdBvi diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/signals.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/signals.cpython-312.pyc index 8b6c36ef45f2d33389c5701e26ab810c15c0387a..1e704113bc3e4c5afdcadee3dd4e3710394620a0 100644 GIT binary patch delta 201 zcmX>pbxw-sG%qg~0}ymDGNy0jdB)_?tsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8knbyAAwG%qg~0}wDj_?EVj=NXehv3_WAYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pI6?3d?AJBvbhC7@h7erMra;jbD)V;{5dzn-J0|O_k z-sJVniX1nDB|kARajH$e%&f)?qW>^UaD4|!e*zJkBS Z!UDksZYx|is9oi>yx<&sak2#KRsaOtKH&fW delta 153 zcmaFPeU_W&G%qg~0}wDj_?EVjr;f>>P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>~5>pL7H_(J14Gb&9HmI$XZ(x`l&Ad`X04gTBUUsGI y4w;LZu0RPfmVU;`lb5mNi(hmOzQz%BS!UDksZYx|is9oi>yfoQ}bt?edYBp*B diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/validators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/validators.cpython-312.pyc index 51279d845a10dd2d48a25101319d807632589f1f..a1bf2858f13ba82a74c7da6b049dd3bf57e99bef 100644 GIT binary patch delta 99 zcmeyTFinx?G%qg~0}ymDGNy0jIm+bGryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJBy%k<0MP>)t^fc4 diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/__init__.cpython-312.pyc index d21c4f3e2ac542f5f643d01093a7caa92c986f5d..40d5ef41a0094b16f319d113a71cf8ca64edd943 100644 GIT binary patch delta 96 zcmbQnw2q1AG%qg~0}ymDGNw=DN%EMkA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}wVpG%qg~0}wDj_?9-2C&{2*KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQMBz1prnK8Vdjb diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/general.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/general.cpython-312.pyc index 16cd4b2c5cc9e7730be5ee076ac1b5af7c073349..5f526958995630b79b20d2a9f64a2cbd3b6cbf0e 100644 GIT binary patch delta 99 zcmZ1^wo8oXG%qg~0}ymDGNy0j`N-rkO+U0awWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2%lwrc07Ta! AG5`Po delta 75 zcmdlbwn&WUG%qg~0}wDj_?EVj=OdFroqlL>YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJEAv-&0LV8RGXMYp diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/mixins.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/mixins.cpython-312.pyc index d3e6965aa341de7d28978a694d94b2019be1b398..617ae02089a53c46aaa0de185ad5b60e979d0ab4 100644 GIT binary patch delta 122 zcmaDZ`b(7OG%qg~0}ymDGNy0j(Pi?OsvlaMT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#ktvFe@%H39961~}q}4w$Fml>W_U4ph2GW~zIQtj@ DG4Ud@ diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/statistics.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/statistics.cpython-312.pyc index 28915d85ec5c09b5f4c1a154e648f621061341ef..c98d7493b51e5b967fe0e81c2eb2aef17150c044 100644 GIT binary patch delta 99 zcmZpWoFU0`nwOW00SG!68PhlN*fD#|)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tcgaf3OV1A|%FjwoE}3|?769X6A<+N; delta 72 zcmaFFbc%`RG%qg~0}wDj_?9-2XQDy1erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT Z0Z=ACFEK|yBQ+-{zdXMvCuQQ(S^#`F8qxp& diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/array.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/array.cpython-312.pyc index 0911f0119ff8be4fa884f8bb55e933ebb48eb117..cf1eadb301f2acefd86bc783d8427a3837a01641 100644 GIT binary patch delta 620 zcmcaHjq%|$MxN8Wyj%=G(80)B`Yy6JwKo*KPxr4Wb--pJM6k2 z7+Ca$9;zA6;JPEOxIk-7+WMT8IakE3Kd>?==`5F9EVn^wyXbA`$Vt{q-idE9SE$O5fe zDF2j^v2=2~qB8SiVe!eE6z!N9L?kwUR(!%L_Y7$851?N-cstoIa!AY&UBGvRL;sGn z%7V~q(%O@MsVizQ$mo0#Vc-#)kTN}gV*ZkkdM=?-tM(Gs}Rk(4xwB(tA#%;c%HJ_bv=Hwb9UFO@8GLttNIWsdz$!`8` zw26tw9%#S|kehA`icH>RYQW4OB)a*nsTvz&%4886E#}*z(v#h6^qCpNWHwjWJm3QW DRyEdm delta 568 zcmaDjjq%1bMxN8Wyj%=G!2IA_+D4v9>;@J3p~b01#roNaMTvQONg0VHnTh%?sm0kP z`33p~K$-l!#2o#M)SR6B^8BKll+DlB@33=xVqno1dLW@R`3%1T>qllFXY+ghU`CL* zAz0i;5G-yev^ifelab|tn&FqpcZ6KPjLj;-S?r4bKvy&{+~F3TkUA%2iR+BmE8N;2 z*chbbzp*ll@I4R_oxD*>n&}hs=8ICL%#7}n-Q{FuZrD3t6LHzWJRxLy{KWX{qIwra z^;Q&L6*ayf;j-Aom5p3!WZh;Ql8^RJDK0p&C<$xv%a6J$Z`M}J;E73^L^ z^CFMt3Y869JG`#)xC1RYBL9?;v1;-vMP-f$!s4G8SUK${Ur@AT2GW}am7cIFKL;B8 z1L$53-cI(591=4`7w}!-(7z+CvLN)bwDuCXa1CQ8*lBkqg$ul$@H(O{&vop?{JjFx`J diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/citext.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/citext.cpython-312.pyc index c58e225813d5ece5ff5d62324fe749ee65c42c1e..14bd54a6e13d0c378f70b84c30735627dd76c2b0 100644 GIT binary patch delta 99 zcmdnZbD4+dG%qg~0}ymDGNy0jabWV8s2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~3e$dO0IB~PuK)l5 diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/hstore.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/hstore.cpython-312.pyc index ad47037442a5bc9c8dff254dd99e75310102aa6d..e5968099a6abd95b9ffae394dd1acf443ddcd3ee 100644 GIT binary patch delta 201 zcmcbhcVCa^G%qg~0}ymDGNy0jkz?_gs2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kq6_%0aOmHVke$yxlY1WTyqiaxX`b)o zw>%nZ46<4uxEMs`J6xY|i%v+L6LN)H>87^9Wf8-brVC7_1kVte8o9!BvlXux7XSiz BLf`-Z delta 163 zcmcbwcR`QmG%qg~0}wDj_?EVjM~=myQa`jfwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#h{c?lF=g^9b{Y2Byq_4@IE5ykV0UB&(wliW4ze)z zOg_h>%|6@r69Wsc+T`Cn8md700~dp+e2423ZqW&;b3(3gE8WmGxF%w_z+_7B43Vjk N7eovB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i;yj`1r15Z@wX delta 74 zcmcc3dYF~xG%qg~0}wDj_?EVjXA+}9g??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{p|Gsdp~q0Sp+ diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/ranges.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/ranges.cpython-312.pyc index 267f684ae1cd5d880c3170ee354ca0143f38bfc4..0962530f7f0b8641bd3422ed06bd89f46b55d3d3 100644 GIT binary patch delta 147 zcmex3o$>EB`Yy6JwKo*KPxr4WU~TiEidDQ y$@9cynQx10PCg>0&dea8wfVi+dS=FDljlqMG2a$eo%~hGg_%J_ZL^K^Rs#T(4>AG( delta 158 zcmex6o$=#zMxN8Wyj%=G!2IA_+D4uy90ry8p~b01#roNaMTvQONg0VHnTh%?sm0kP z`33p~K$-l!#2o#M)SR6B^8BKll+6~LwY=)nfkrei+~F3TkUA&$3b*1DVe#o!6Rl>X zUKUpAaJeC_`H6vv*OhVdH8FJ-5Mz`0dS=GelQ&5DaoiAA{lvh=X*Zcs+JzZNZ}yPh GY5)L6GBl(B diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/utils.cpython-312.pyc index 916b40f0a53da4c79d9a81dfd717e7f43ebec14d..87e54d20e7064411a35d46061dfc502f57bd93ff 100644 GIT binary patch delta 98 zcmdnba-D_eG%qg~0}ymDGNw=Dx$QAQKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) zIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoF4-*3sKE#TGTI>@ delta 74 zcmcc4vY&qv Z04S56mzblUk(!f}U!Gr-lQQv8830`^8ZZC= diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/array.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/array.cpython-312.pyc index cb985122ff26710172247324a4df5ab70d45c4fd..8d90329c57ee26983edadec679411acde9c1ded7 100644 GIT binary patch delta 502 zcmaEn{4Sa2G%qg~0}ymDGNy0j@n!Mo*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tVj^H1czE}(i*Ky^X#RROIHsTViTW1GvUqX~4xj~5I-8W=t> zFsbw1w0GH|IE8tF%XI&V{?|neFNzp$P`oT+a$Uf5XX)e&jy@KkiqD&WacpH`JTZ9# zw=MHEY3<2hxiy#>WOOzw@B}d_&Ig&;z;K6yx0C%Mhr|rgD;)AS1cf`;?ntXF2n8vh z!6y$=KG|L{VY3wfT}HvT1`M%U8 zW=7G;o8&r~uL&AWc9zd!W)L#oyh*;FoiSyyle!Y~H5uEG%qg~0}wDj_?EVj$Ct&RTtBopwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~AudZr zD~czuOy{4-e_cTJqJZjxo#wLz$#DuI$!Q8g%C}002ZinneHr diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/hstore.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/hstore.cpython-312.pyc index a371ae8227d19a7407ef3418192e146f1b5d3c45..2c4b753ad31f33450441ba3621ceaaa2d45cd4d7 100644 GIT binary patch delta 147 zcmew=)FI4snwOW00SG!68PhlNENAkVpdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k1m+u(G99iHl)Jn>uro-iZ8l@GX9fUeJ2MRc delta 102 zcmeAW{wlJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agH`8e*#sia&v&ON{=KaLL%qcrrolTw@NN@IJvu6eX D7LFns diff --git a/env/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/ranges.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/ranges.cpython-312.pyc index 85e371061eb72a3c032e4f6ace733b56544694e3..66aa53f560a8bef96b9e1b20028982ec7de0f4f8 100644 GIT binary patch delta 99 zcmX@7{Y;zZG%qg~0}ymDGNy0j`NZTgK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2$GkuY0CZR) AW&i*H delta 75 zcmaE+eNLO_G%qg~0}wDj_?EVj=M$4bg??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ8}kAo0PFx8X8-^I diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/__init__.cpython-312.pyc index cdf4fca81a1c97254f8c40f0833a413afffe0e5e..1f507f514b452b07f4267d4566b870ea8f58ff51 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}ymDGNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007KoAr1fl delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/admin.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/admin.cpython-312.pyc index 15864db77fe931f86f06abede7172a674d461ade..fc184519437b34c653acb878cb1fa000d24974be 100644 GIT binary patch delta 99 zcmbQqwvmnJG%qg~0}ymDGNy0jS;Xkkr5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{p}H%4nl0H-V(lmGw# diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/apps.cpython-312.pyc index d878a0c4726d50b8250e29fdaffe89c12968c97f..ceab9711b877c459e7adf0657ed347e5d777d797 100644 GIT binary patch delta 98 zcmbQlx{8(OG%qg~0}ymDGNy0jNnrHo)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=f3*$Ecc^w*= diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/middleware.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/middleware.cpython-312.pyc index 100239166160964b190ee554df9342eca852ae14..74f7f4c4a6cb937e840d3c33c02319a8027269b3 100644 GIT binary patch delta 99 zcmaDa(k{w#nwOW00SG!68PhlNTwwC(*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Yqg*llW0K^U&ZvX%Q diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/models.cpython-312.pyc index 34387b913beef99f80616043dcd5e78887ded170..3fa86918585c49a639925175d9839b7bddf4644e 100644 GIT binary patch delta 99 zcmcb}_mYq2G%qg~0}ymDGNy0jVPo;=)(JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKiiMvU0H_%mxc~qF diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-312.pyc index b6da7621dfe2d313ab94a19502aa48f2cded9c43..f7c303250702839e3f23a07e60968d889d20b36b 100644 GIT binary patch delta 99 zcmdnVdy$vtG%qg~0}ymDGNy0j*~sECM?bVUwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|mgNj106@4R Ar~m)} delta 75 zcmcb}yOWpaG%qg~0}wDj_?EVjXCsS2i+*TvYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{nzE9)6X0K&T(ssI20 diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-312.pyc index 207349c0c0af7a65e5c52f86e3ca6928d3e84ca7..142a7c9bed70eb4583fcf4a67a7f92cc186764ff 100644 GIT binary patch delta 99 zcmaFF{)?UGG%qg~0}ymDGNy0j$!7A{rXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{p}ekN;10M29@=l}o! diff --git a/env/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/__init__.cpython-312.pyc index b6e5316e645c2924f16a9333c480df3a327ba86a..5bb61668045955e4f4e7c7b3825bf5f843f4ecef 100644 GIT binary patch delta 96 zcmaFJ_>+<6G%qg~0}ymDGNw=DG4hz9A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}ht3G%qg~0}wDj_?9-2$H<^TKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb7yxwo8an_0 diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc index 2108280d30726ea44bde2cd5851440e2f6978e12..45807ea06461fb45e9bb4f40559673229be767e1 100644 GIT binary patch delta 20 acmaFM_?D69G%qg~0}ymDGNw=Dc?bYG?FB~w delta 20 acmaFM_?D69G%qg~0}$vO_?0%1=OF+=#bz!&CAQh00bS3jOiPB{%`{TGnWMM delta 21 bcmeB>=#bz!&CAQh00cS*ex+^X`NItWJHZA_ diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/exceptions.cpython-312.pyc index 19087a3787dbccf13991ab174108dc7b454493f1..be73cb5aa0a88f3bd79a72a8b5d753f378ade291 100644 GIT binary patch delta 99 zcmZ3;zLTBjG%qg~0}ymDGNy0jv0(J*(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#hf$Xa0F*x&$p8QV diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/middleware.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/middleware.cpython-312.pyc index 4fd31d76b4bbd687ec3e9295c368ac01fdf1e79a..c6cf278a1929bd11054e593d536723bc689d9065 100644 GIT binary patch delta 99 zcmcbw@LhrDG%qg~0}ymDGNy0jDPZ#G(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tn+a delta 75 zcmeyaa9@GvG%qg~0}wDj_?EVjr+~?zOh2?ZwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag2-9X>0MyDGdH?_b diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc index 71738a0707f95f8dd68ecc5a692d6f6a949ff3be..9730125106feb7fd5dd024ce8410813fe843d01b 100644 GIT binary patch delta 21 bcmeyx|BIjJG%qg~0}ymDGNy0jdB+X_L-7T% delta 21 bcmeyx|BIjJG%qg~0}$vO_?5Pi=N&r$OdAIb diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/serializers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/serializers.cpython-312.pyc index 186cd3ceca808c1132638ed0876955d373b5d01f..fe94a7b30f84a7143545b8f9adfd0c78b0f6e640 100644 GIT binary patch delta 96 zcmdnQbc%`RG%qg~0}ymDGNw=DY4PaS4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOC}yD0szccA$R}) delta 72 zcmX@bw26u5G%qg~0}wDj_?9-2r^TRLKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQQu}5ddpO8hHQ! diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/__init__.cpython-312.pyc index 5dfe350ff8926951058444beaff475032b03d53e..5915e2695135954580554e4865cde61ecd73351f 100644 GIT binary patch delta 96 zcmcb|_>Gb0G%qg~0}ymDGNw=DG4hzIA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb0045d8ZQ6< diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/base.cpython-312.pyc index e52732c3527f0514d4911b2b4ce1cee129f7c8ff..7a6114cd7f2a7fc7f71408e6bc77231b73f4f430 100644 GIT binary patch delta 101 zcmZoT%{b#UBhP7GUM>b8=wM__-^i2CSU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(b8V1Do|Z6i-UlR>3^XmM&$v3_=9QDUB6QbuA)W}?1JYH@Z+ eet~`gP$oYwF-JcmH76&(JijO>W%FUCt4RO_6&#EJ diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cache.cpython-312.pyc index a0d23166bab677061bbe60445e13aa59e1ad6c46..f78a72569c172dfd12f895f77b0f90d301ad73fa 100644 GIT binary patch delta 158 zcmdmIamIq@G%qg~0}ymDGNy0jnakucNk6nWwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAdlW8eCe-_Z_ z28J&@3_{`)N~g(8p2TIs%pfGU`6SmyMu8fjKQA#yKO;3KC%-(uC?{p}N2aChBKbfg8W_ItFbIiHD4i_xiGiI{c=A#%6J{X2 h`3~1cM$tx~iWdw&8W`>fiXoKD<*@}TxyzH!4*=AyF8=@k diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cached_db.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cached_db.cpython-312.pyc index 148a85a8b785bdc5f31583e3b6f4768a7eda9425..009df2feea0f42ab637b054bd8dbceeea47fe0e1 100644 GIT binary patch delta 99 zcmX?Tanpk5G%qg~0}ymDGNy0jdCTN6O+U0awWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2$t)oW0CQg< A;Q#;t delta 75 zcmca#oqlL>YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJBeR4g0P61=;s5{u diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/db.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/db.cpython-312.pyc index 7c0a869c4117f4632a17952a01cbf634365fd00a..fdbaf71c72c7e45db214268858afb48a6d1a5a1f 100644 GIT binary patch delta 194 zcmaDA_92YtG%qg~0}ymDGNy0jxyR(uuOC{RT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ5p$sgjq%%0K2pW83VCEH?%r7G=45Yt9UXB+?e+O~E LBAbuNui^#(z~(k} diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/file.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/file.cpython-312.pyc index 9dd87e31b2a0220b1f74eeb642ff2757c0ebe9ff..25342bf1d9c1fe1cef711986b9535b234e7fc34a 100644 GIT binary patch delta 182 zcmaFh|IVN1G%qg~0}ymDGNy0j31Ie^s2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k2nKk6t;} delta 168 zcmaFo|G=N;G%qg~0}wDj_?EVjCxF?YQa`jfwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~33Cu1qx$6Ug7UIg1Z_SrF!CB4;JG2Aaa~6DqKxik z8T|>I-mSwFNmwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~6LT9s0J0?-$N&HU diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/management/__pycache__/__init__.cpython-312.pyc index ed9e98c4e5a952d420fc8758cf42c8e0f18cc381..f22e94050ac9f9537bb030b311f1147cd09a2237 100644 GIT binary patch delta 96 zcmaFB_=Az>G%qg~0}ymDGNw=DG4hzMA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb2mo|A8aDs{ diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/__init__.cpython-312.pyc index acf868282fbe05d9b780db64baea9db018b5414c..436ab095a600a5598b95bba1534fb472ba433d01 100644 GIT binary patch delta 96 zcmaFK*vQ0lnwOW00SG!68Pg~77 diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-312.pyc index 20c5fcfaf9f42cccafd2f4281414398a58aaed14..473d4e40d175f61f15525dc27191c33bed16de7a 100644 GIT binary patch delta 99 zcmey!*~!IonwOW00SG!68PhlNoMrM@svlaMT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8ki_@% delta 75 zcmeC=`pC(1nwOW00SK5Md`sKNbC$`VS3k5kwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Yqk@*E90K?82>;M1& diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-312.pyc index 4b86e556ad40d278c058713f3b6388b94d0564ef..4807dc373bb4716a742f6fc269f4aab2ac426f58 100644 GIT binary patch delta 99 zcmbQvy`G!rG%qg~0}ymDGNy0jS<37&TR*fowWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB|ka-&;03dN9 AF8}}l delta 75 zcmZ3_J)N89G%qg~0}wDj_?EVjXDPEmvwmoCYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{p}Pv&im0Iq=>FaQ7m diff --git a/env/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/__init__.cpython-312.pyc index 491d102a44694aa471099e854124f7685497a1a6..85a99f0cef5b45347d9b083a3520392fe74b1a05 100644 GIT binary patch delta 96 zcmaFB_=Az>G%qg~0}ymDGNw=DG4hzMA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb2mo|A8aDs{ diff --git a/env/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/__init__.cpython-312.pyc index c0bef6978c9848e6515d6ac0ee4a4a26776f1d0d..9ee666c06b389d7c0ed3c6e887700f88f05bc1ee 100644 GIT binary patch delta 319 zcmV-F0l@y8L8(Cu%MA?*00000hyej-u?&?0NQ^I4b7gXKFJxk2cV%i}FGO!+b!}yC zbaO97WOZXV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bhFU{ zsR98ylY0dp71Az1)DJwW&i*HfB@JF505#DIq(Vq z9U-4enM#~Y^aTVJ4&fXqkVM!aCD$Q5(IGszRMsIvkV)_b01_6EdD0Le;2}cr1ppBu z*c>SE1po~avo{Bg0RdQ(#Rw$>)e%FJ@(3#j01`w2&=EtkB?&hO0dSLD5iA$HJkuLU zxje8mm_(mUnM|k@)f_IkJkhh95kmz5(v#p8F9X#SE|V7*xC7fEFOxeMBa`|U9|Hg) RFq0e@ivs`^FSDu`@(0tgYp4JK delta 332 zcmZ4KILDFaG%qg~0}wDj_?EVjXDX9HiGFBtYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}OQw}f`X)dl8W?VH^Y`0z+FjsQy&)_<-EN}Y1s=sa zdS=)494_iPT<3S3nKL7Eh2SL4%bSn0+A;=a!!=oUS$^PRkX4-THPdUh&v#Z9QN9Nv z5;qi8uPfSIRJ7R>=+y_<$A+ZUSmjo0)FayPIKnGajEr%U z?{TPdTo!cx$iT>JJeiGCn*&IH0C6^3aGG;4=1eXS)Dhlob4}V~gUJk+`93p!R)}1c z(Yv&Hv!F98EYis*f2(Bf2@tSP>O$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9C#F@6OA)?guw delta 74 zcmZ3^+Rw^!nwOW00SK5Md`sKN6US&!pdVVCT2!o`omiBZro diff --git a/env/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/views.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/views.cpython-312.pyc index e0ac51e204be1673cf2ea5fffbc9c56259f9ccd7..74377e903fde043bb3c0e98363dcf7d83db64aea 100644 GIT binary patch delta 184 zcmZ3ixki)cG%qg~0}ymDGNy0jabWW3)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7ty1Qb@~>~y)H=y<^9vOvIBW+q;~kIW3B)*loZ jq_j43^UAO=hELWIEMvYcAToKGU@S9(py*~cp}9-|w+%YS delta 179 zcmZ3Zxmc6uG%qg~0}wDj_?EVj$AQV9P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~3R62LqvvE99z%}HlA50wgjx9}2k^|-zbs<)iGi7u zufydAk6^z~r_UV$g;hB_T`nj(93`MWCL|lDsl3j4?oSq$dXo bMswT{5c$Nw$7(ovyG%qg~0}wDj_?EVj$Cl9`Pd~IcwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~BBKH$0FC4ssQ>@~ diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/apps.cpython-312.pyc index 42edbc1208f62648e2adb044610b9f4069cf30a3..73a641428a25d705b7ac9b7af22c6d51a142dde4 100644 GIT binary patch delta 99 zcmcb``H7R~G%qg~0}ymDGNy0jX=L(f)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agDw8Y|0L8Exx&QzG diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/checks.cpython-312.pyc index 35052c678086048f0717fbcd62ac72983eb102f3..bf2025f8ef6f31c6fb15a773498da7a4872cbb88 100644 GIT binary patch delta 99 zcmZo;o5#j;nwOW00SG!68PhlNtY!3Q*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ZVkx7;j0GaF=WB>pF diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/management.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/management.cpython-312.pyc index f2badf734e87ae8060925ee2f493cb04003d52ac..e99784a4f97eba34bb396308f617f761afa0ff46 100644 GIT binary patch delta 153 zcmZqV@8;(@&CAQh00bS3jOiPB&a!xP>xUMn78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9CHS(6#LC+D&r zQMw|ivw`ily!Hh58zNHE{U-V?Fuy9I{gIhLLFYR&gOKh8!O8J#imVV;JKHY+0fsW| delta 143 zcmeC?Z{+7W&CAQh00hhrzNKyCIm=>DtRGsOT2!o`omiBZrJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#gy{em0G99?O#lD@ diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/middleware.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/middleware.cpython-312.pyc index 1eca72f19de82396c531e6b8466c94c878f6b1cf..c917ab8aee9140901eba2dd8fab141e439c60253 100644 GIT binary patch delta 99 zcmZ3_cASmpG%qg~0}ymDGNy0jDQEQP)(JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agG-C}T0IG)?tN;K2 diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/__pycache__/models.cpython-312.pyc index 11e230744d60d22e0eec0a6c67649f6d15969c72..9770b4a66681e09807d33de8edeaa8ef31aed20d 100644 GIT binary patch delta 140 zcmdn5drOz+G%qg~0}ymDGNy0jdBfzKQA#yKO;3KC%-(uC?{pI19OvvDA0r-FBpC_FkIp_n^D+NIKj22>LRb%JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAl;t8L0L4KX@Bjb+ diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-312.pyc index a4bd0afb9f71cffea0634acbff2968721eebf2d3..2507db6bfc4499b794c93dec7c839b9d5c914aae 100644 GIT binary patch delta 99 zcmZ3$v4ex>G%qg~0}ymDGNy0jX=d_Rq90nET2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kgr02`no AsQ>@~ delta 75 zcmdnNv4Df;G%qg~0}wDj_?EVjrJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agI#VJe0IL8RssI20 diff --git a/env/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/__init__.cpython-312.pyc index 6e1e5032217d025aae1fa52a1c7604d72caad701..7c25475f3b4e9f20bdf1bf302efdf5d380a912d7 100644 GIT binary patch delta 96 zcmcc1_?408G%qg~0}ymDGNw=DG4hzAA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6} delta 72 zcmey$c$bmqG%qg~0}wDj_?9-2$H<^YKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_9{_Rk8Y=(* diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc index 29e0fb30e17e2f5aa25d93734d8ee2e51379f978..5fb4fd6e2a113d9d20436872a72024893fc9fc5c 100644 GIT binary patch delta 20 acmeys_<@n(}BVg*nD delta 20 acmeys_<@nd4ZGXG%qg~0}ymDGNy0jIl=+}JSGJs delta 21 bcmcb>d4ZGXG%qg~0}$vQ_?5Pi=Lib`L|6uZ diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc index 50f1f7f1980adff54bcd9a5b7ed345b0da1d0f6c..d6fe97d7ec7b09708fbde3e7e9f7e1133f0505ca 100644 GIT binary patch delta 51 zcmaFDb)SppG%qg~0}ymDGNy0jdCer?1LQO?JmBSTaJwTUJ56^o53>?8gRsJ8LuO+p E08Bj#@Bjb+ delta 56 zcmcc5^@NM(G%qg~0}$vQ_?5Pi=QWdPAdu6*@PL=U!R?Na>}1_f3~a2Lli8V-n1S?W I9cE)D0Ll3dZ~y=R diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc index ba2dedf3e294d129a2cef4b325ba3019b3862ba6..d2455cca21a0ae67277d024dd519ab7a6cae1670 100644 GIT binary patch delta 452 zcmeCrzm&&wnwOW00SG!68PhlNFmf}loy^BA#e79Xcd`Mu8xMo1-UmJgS;hH&bNnW^ zb89g($ZBui!fnpVs5|+MfCuwcusZR{!GcGafoeBP3Eg58Nd=nM!0>^CL0Ghd{f3MJ zSTnDPH&}DD2sevR1W?5bh96)>P{V5_^rf!JxK41nAtkqfeTMF35%rHi4Q`AdIYD-w zl3-$Gd@=c~te)ac4dcsFJ}bEwC~YX(UcRyXfaWE0?^#AGxI4TrNcr5BQk|?ISI5jC zt+sig+-ych@5#0b;>_2?btlItNaC=9l|e#p^JIl5j3PxSZWk7xZaKwr@&u&_W(E=2 z&99ZxIZX^{am*qYSeKzP{6LIQrxgjJrgJnL?Or8ruDwlawfPN5l zX58GRvz=A81Y$NYJms&jh)pcKz#@5rPoTm5j*#p$-O0&Dj?4_g3X_)`-BD45*>Oi) i{<^sF6>;MZ?mK)EGo&x`sb1z#1sW=0vU!d1V`c!A*ot-l delta 530 zcmcbV*PqXGnwOW00SI&t{7T!%!^q9JeKH@n6vsso-A@c`oMw}C1;r;jaq9~L*&p~A zWEJQ8&Gh@kz|3hnxt3dt8Axwl#cj^YXf*kefCos|X9gKgA)v0?%s_fGx6my{$thtEYNH!}yw%&jO_lMcd0a zmLJf(WbQr7=z^3_hc}S8A*K3>fgR|p|FU&Ji_JDS$jxR94?(h6LS}mH#M$`kzyEbGXiSR>sQ7{6 diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/handlers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/handlers.cpython-312.pyc index a7cfa574642da16349c178881ad8f3a34a091265..7e9c98b2b79236d3e64c834913fff057b02974fb 100644 GIT binary patch delta 149 zcmbPYvciPtG%qg~0}ymDGNy0jNn`Tp*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~7t=#wM%~GC#H2+&F)#|sPjI;*B{#+EBQubFLB?V8 Iaj`^Z0I?z@^#A|> diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/storage.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/storage.cpython-312.pyc index 21e89757e422eaea3b86a258f77a27d106d3e704..54251a68966436552f1eb46130418cff3e37d98c 100644 GIT binary patch delta 558 zcmaF5jB))kMxN8Wyj%=G(80)SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(`wrF%0uDDMWIK4D2#QT8xh`&eQQY{Nph<`0 z4H?A_-y7!E*UddIntR?55WOI-zCs3Qum#`b4sC4#ApMDtK}7MUfanKN1|ieUhqVJa z$f^B>jX_j;hUtQ=9V*vF>@SGePc}D^XTBn+JUPK+z2r50*NYO`GdLGm z+>zE^;j+PUgU(fH``f0rlTA#`I2g?AKCm(vxJ@oLz01uYq;gSE`6D-jsKewWGha3c zfAem$YpiU$ff3rkF!`mW+~ln`#?03QEhc}k31DUrvfS)!dy0iId@`StqWTp<`vVp? q#O0^gPOP0=e_dSnqPXs5asBVijJyUP8GyufLHi4W_M4-exCH^BqPr*n delta 572 zcmZ3#jPdC*MxN8Wyj%=G!2IA_+D4u@7K1YV(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%H~ZhD>)fYO^)I7kyvQ^iGiInjPW9me23?RiW}0( zpBUJ9!x$%T;fv=2F+MVbq&G|RFJ)x(n|x3}LHe?&>L&(9PQ?z_8$3e&zMZ}^RIlDWNz!&ABLl+=h93^zcbwgD0ikjJm zk{u!Y<95bfRrBd``2Z5Xz#%dDxRwI5Pzx)fWYoE(kbuumXu260#kdSDWKmNyP7vb*D^Tg=VAH!oU=uz<4Eo3oGJdkPnJ*8r z@a8_VYpiSsfKlDRFnN!q+~f`$V~)#$79fx5Pu^z}zzn1}3)-GyVT_)9$59a|Xa9kL Xk=J07lO)%75Ca%byat<9oVW!6!Z5Lq diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/testing.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/testing.cpython-312.pyc index 60d39aee15fe9279c6da9a3db0a2b0f83990be27..cb7a33dad36770c71a377a7f1c5543f2dcbd3a01 100644 GIT binary patch delta 98 zcmX@f_K=O|G%qg~0}ymDGNy0j5oYq}(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?KQA#yKO;3KC%-(uC?{p}3&wOt0JX^);Q#;t diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/utils.cpython-312.pyc index 0e93162082e9375417c41b3051585afda13fab4a..89c46b2c23ee4f8101d7f58ca2a95dc67f4f3a0f 100644 GIT binary patch delta 105 zcmZpa_#w`7nwOW00SG!68PhlN>}OJv2XcPAVEEC%aDmV3pu~psp7QJbN*DQ+7MQFM zzs_%XP-5~Mrby<45|=l7Fn2LAuAO|DRfG99pYUX6HY*MWev!{23ltb&vOvs&>2=?@|d0@9xtSXpf* PJF;0Z1L@6mY*nlPq%9;7 diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/views.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/views.cpython-312.pyc index f13856dbfa7e7f6af96cf516eaa0fdf0269ee5e8..93525d405edd5675ae4464d1c20a1c397f35d56e 100644 GIT binary patch delta 99 zcmX@X_kfS*G%qg~0}ymDGNy0j@niMq(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t9804Lxf A<^TWy delta 75 zcmaFBcY=@SG%qg~0}wDj_?EVj$B)&ZL_f4RwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~5$iri0JV@B=Kufz diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/__pycache__/__init__.cpython-312.pyc index 3607e7229a8b462b9bfbd29f509551c3ef8f456b..49f685d9cd964b232db80472a87b29a0da070cda 100644 GIT binary patch delta 96 zcmaFN_?waEG%qg~0}ymDGNw=DG4hzDA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb6aaR98bbg8 diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-312.pyc index 32b600101f3b7274e1150e44af8e0dec68f92ab6..ecf841e5a96b1664b405be1b9d4d51f5725d07d4 100644 GIT binary patch delta 96 zcmaFE*uunfnwOW00SG!68Pg~77V-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bhG~h z9SQ-hlN}Cq9lm#*EkV&OLDnHclNuL$2>>EP0q_F=7bKIN7c~RhJVle+7mEV`Jw~%> z7#$D+Ba??HGy~fa7L&s$qACCq7xN$h5*CO-*bESlPKi#OGM_h@H=jJ2Jg5YyVbdEh z)eJH50{{{hvy>?j5CO!Kra6o{)DbGEYuFGJmkf~%*AOAm5Fwx~up876J@*3u5-Z>c i4A%%5(FhsW2q4i2AfO%92ru^q01_+E5h}BDI>-X6$af?F delta 300 zcmdm9wY!SvG%qg~0}wDj_?EVj=P=Oe&r}5;|8jE;=^alk7A)p8& zr_tn6O?hS@y?MH(paA3P$tx{;94`xMePCeZwOf&WLqKFY&qSW<0*V&}6c^}jkiH^d p`<)pm^?-xtI)~&%4$12r3KuyP7RX-Z(ErW~lmKhooNsl42>^A)V-f%W diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-312.pyc index 826a19aa965ed5940d22f3227984f4a787826c86..529894017c116f9d98f1dcf38d9fe669ef688a61 100644 GIT binary patch delta 180 zcmew$+%Lj&nwOW00SG!68PhlNXfk;$)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tI2qOtEaIlmRobBY%j&#kyLS)Rj~d574Q&7mB-7y&`! BHM#%* diff --git a/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-312.pyc index 69aef86c64f876a671181a19334d614ef80bfff8..69af6b1830197a115a75788fbcd8300fbc4c1ab8 100644 GIT binary patch delta 99 zcmey)*U!&$nwOW00SG!68PhlNd}8ugq90nET2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAjoFh00MT3;uK)l5 diff --git a/env/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/__init__.cpython-312.pyc index c07fe130b0f17a5321234098c1a7208b5259759c..fdab0df2501eb590dd6e08d11d8858ff7e3a8d02 100644 GIT binary patch delta 96 zcmcb?_<@nqv Z04S56mzblUk(!f}U!Gr-lQOX_3jl5?8W#Wn diff --git a/env/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/apps.cpython-312.pyc index c6b3297128338905bc69be9e79d1654c9a2ceca7..7960bba379a76f8828dbff917c7122ef5976a7fa 100644 GIT binary patch delta 98 zcmaFJ@{@(JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>Kjqx)8o0J;Z diff --git a/env/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/views.cpython-312.pyc b/env/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/views.cpython-312.pyc index 9ead41a8cd9a0fc45d620b5b2447f60cd2f1756e..bc35eeb0381d7cf99297c91111107e17485187d6 100644 GIT binary patch delta 124 zcmaDH_$`pJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#fO(%B(@j;c1 F834GQB~<_b diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc index b0466a761a0288890eddde1ec3d2aebd286cc233..ba9d383f3f8f801b87119f21a11a8af0629f9cb5 100644 GIT binary patch delta 20 acmaFJ_>ht3G%qg~0}ymDGNw=Dxe5R{83iK% delta 20 acmaFJ_>ht3G%qg~0}$vQ_?0%1=PCd`?*@MW diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/asgi.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/asgi.cpython-312.pyc index fc2717d2d99b52e50ad882b3058c2b1f3bcf5f25..85c795c321358208737cd1ddd48dd05034737444 100644 GIT binary patch delta 98 zcmcc4`ks~NG%qg~0}ymDGNy0j*~{orqaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pIAk#enug@B} diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc index 67c00029924e51a66e502cf1054586adbf311128..4a376ec53765d7f4fa6d10170af8f99427c98358 100644 GIT binary patch delta 136 zcmV;30C)f4QpQpY%MA?*00000hyej-u?$cb0ZWrz7k&b!Ka=7YFc|Iq(Jm8Xlh?oF9|@9xMX@8Y#0ZA2kY@t|x5( delta 163 zcmX>W^e~9$G%qg~0}$vQ_?5PiCqSGrbaJeC9s6SYPYlewwv+FQ8^{6aFI)_K5;NGB zh+N@SyCJ90;nL%OLt5z*13Rz%WHpH-W+1(}TjD4)W7Xt985z#Ysy3e(7h*K_7 diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc index 9f2b1fff3ef23a7e37dcbb4225191a431ed96c30..5ce47bf423ec39134a543c58c1b37cf3a012bf1f 100644 GIT binary patch delta 65 zcmbOcKRKS~G%qg~0}ymDGNy0jQRh%o26A37{AggfAuT`OevW;I_YEPj>6#NYXLw&0 T(zwi{@sXK9MtgG{hm|@2SX~n@ delta 70 zcmbOnKO>&!G%qg~0}$vQ_?5PiN1a1k1IT&7@S}m@hP3>A` Xs5!&?vXI7Q9*vL8K+(;S99HT8`tTK= diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc index 053ac72a0813cc181768e2a73cbbda0975180a3e..ab25b6e03b6aef8808dd44dc9c29210356852948 100644 GIT binary patch delta 21 bcmdnQyos6TG%qg~0}ymDGNy0jS;hzeHd6$< delta 21 bcmdnQyos6TG%qg~0}$vQ_?5PiXBi^^K7|Gs diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc index 69e2d5d1b1e9ff6d2ba3fe67ac14c8212711f1e4..ec2967ec598edd83fbec24af9b6e180cfaa48fd4 100644 GIT binary patch delta 67 zcmaEya5I7DG%qg~0}ymDGNy0j`NGW@H<^*gg!#6h&}3U4S!MCF*54x)_R elV>Uhaa<5K`ozG*DLeU{q8u}j-psG$#RmX;b`>H3 diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc index 9857ddbec895589a98c7fcfe1ae39a58627b4e3a..0b36f14303ed59ef564e5ecfeac7a18281654c70 100644 GIT binary patch delta 113 zcmex#hwdH^cO=V7t+Kz&Z@toff%63B>6{ZeCv(qm RoZ&Qye}(ezK<_D121s=K09gI#D8h? Ir{s1n08>{aWdHyG diff --git a/env/lib/python3.12/site-packages/django/core/__pycache__/wsgi.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/__pycache__/wsgi.cpython-312.pyc index 5642ff16ee2e2cba0118b87a73a6553d752c57c2..49dec4220099249805f29e12772c1910726338f1 100644 GIT binary patch delta 98 zcmcb~`jM6AG%qg~0}ymDGNy0j+0W=vqaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pIFw;E%v1b~= diff --git a/env/lib/python3.12/site-packages/django/core/cache/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/__pycache__/__init__.cpython-312.pyc index b41a5d0e686e502cf434aeb53a100d7f6a6d1c5e..3aecbc14dd002fe8eac5e09ddecee7c6cb1e6114 100644 GIT binary patch delta 21 bcmaDZ{9KslG%qg~0}ymDGNy0jxy=axL2U(s delta 21 bcmaDZ{9KslG%qg~0}$vQ_?5Pi=Qbw*NuLJZ diff --git a/env/lib/python3.12/site-packages/django/core/cache/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/__pycache__/utils.cpython-312.pyc index 7c26e1c448f861c0dc087b7203ff6e81c13682e0..d10d3ddf507b8a5f4ea6b240ffbd66f094bc1a42 100644 GIT binary patch delta 136 zcmdnTc9D(eG%qg~0}ymDGNy0jxyR_ytRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kVoH*X0-D^w laEDi5f#?-p^#->a?0gs4rEUvLO`gT1&deYpJ^2Vz6#&*nEC2ui delta 117 zcmcb}wvUbHG%qg~0}wDj_?EVj=N_X$wti@FYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pI5mS;}JkW#&hC93h3q-H*syDdZVCTEQE_Fj#>JtMK Qr^4j5OzO-a`Z`k;02P-eM*si- diff --git a/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/__init__.cpython-312.pyc index c76117db6da61e79c7c82ecb2213b2c4010835c5..be736c853afc942fbaf294d328ea541f843f517d 100644 GIT binary patch delta 20 acmeys_<@n(}BVg*nD delta 20 acmeys_<@n zc)-I4k*-p<084LGUM^^A2+=ITAT2*%Yo^vboldU~=Lw=Wcm(=AIz1)?&rn?P|@XL?!49%lFrDLIJt$urHAKbVet;<8$x2!btdY}C|=<{LFclN$#ou+i##SkUy4X< J4zfJJ4**uNSeyU= delta 293 zcmaDok#W)_MxN8Wyj%=GpnKp~+D4w6LRxA-P6NXi9tH{B6~ULq4L>n3a+-9w-{BGI z_wDqZp}xfaDv$9;W}x6^F5%aFq5)v_9|Rb9`8ybI2#S7UVCIyb%&KI{45T;PD#i9n77$}37^LOrYt7V}tpl>xnQ?NQsSFF4QEU26 z!VPB74JkQrHmG*ej?9H&R#}q}X&apQRK~)^xMBKvKC!Y}TSNqJyprUb+N4~>(g6ItP+p_8tIB!ZR zFK}NGwL|K%l*>eRpjJ7J$)17<%s_>c*9gk70kvM_RoHw zi5gB`CqF^)3oDbBE8`511NAL#DClpH+7ShGrM}!u{}1dSsmaL-Kjaw1j6T#bGDygL z&twW=KQA#yKO;3KC%-(uC?{p}FXlJg){IOH3=Ir7`Gs!?i*|T^U}NxO3}XDo%p}Zp z!_Bk9*b1pfM^MpBOke4KMP@cQ{WFoxy%XR{awLBd;st1kRgM$_w0AMD38eEafth{R1;d zbaIejf+kS?2O$Pd-s>E47dhl+)Lh}vxxp{m!Ta-5AS2Mm??OQHKY}dVd{eNOhtYF# zx?B_|*a0DooHCP-$UWw`B5L@N!BS9l@+$cW+#gw)v|JfKF|bO?O?FTaX9m&H3O^Kp z@*ip#86;%BXEK3weqaER-*rIZV9kY!YFr43&2tqsnUpPoVco!R!zbVxf8c@O2`twI zv@Qy0tuWrfenCL%s(`}<{=m(zls7UluAe+dEdUZOT%4Md->dm^eP;l&K7okMp6UwB zj1MNSSCX3CqU8rs#?5Is`Kne1P#KW*2}Er6&|bpEm^b;Yp{q97gN&S}3*2t-2=)7Q h`dyILUXglH+V~2O$#-U;#CHZD@exF94l%M}0s#I$shj`+ diff --git a/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/dummy.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/dummy.cpython-312.pyc index 5bf998c150cc45ae7469e4b1c46f71e8c752b61f..570c4577cb74e83da1b46cb4759d0cc6b9ac745c 100644 GIT binary patch delta 99 zcmeAbSSrACnwOW00SG!68PhlNOkwos(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag1*0t+0HYfkeEjKIb1(X*!E-2r?dPTtOJ2Qij!el01bygrf zL2k1lZz8kOJ)k8G3?G>II3@20icUzmE~b7_Onn9Oitx)~rW;DH2-;5GDX@%#K{FP{2%uAx)qu`eka$B{{<^gGMQQC7j+dqNE{N-WXJ+Kp|HuF&t_vz%5L8G7caO=4=iSG-F|mncOa_%mH>CBd`ACwW1PS-+{L4e*zJUFNiWTHcq}Mktuyc zR2C@2snFqigGZp>r_*PK=v5y1kIX=!%>j~`tU4MHCvY%`NnID!z9_1FSyUINjt6q; zER2DZIg}MuFH3rUV`UcLdLSVBg_(huzu&#n9c;eHe94)T3tX@AXnkVd9ITwp1OV>S BXl?)i diff --git a/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/locmem.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/locmem.cpython-312.pyc index 519526ed76822c3bd1de0877fddd05d5cb876206..f3eb35e0c647e8fcd1951076f7f639c3087abf32 100644 GIT binary patch delta 414 zcmaEEwcm>8G%qg~0}ymDGNy0j(Pj4N)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tm6_2GW}$M}{rF&=@*trM1-yiTxK0I2hW2!nv+1rCYtqCn1O zL!mIn$*nxnlMDD*AucpTGUTPO5;J4%WFGNgrfD&g)5JBH8N`$}PZZ~5VzdMqEdz9& zu=sSFi8c$EFAJ-DXJ+J7{m1|$z)rX$smRD{3JmrJh8w(s{ZYUG;Fnfmhq>NCTAc|1 Dk+^?H delta 464 zcmdmQ_1uc*G%qg~0}wDj_?EVjN0-^4R6n#hwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#k$DaiW98%tJf`fOQ6CvtI3*{CvYB#y2eH81&6C-< zm>4GkRY*RqS&K83 znK2S%wi?K6Mo!%uJOcfmot_htXP7T=zrv&Qof#B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2!=lV9+yFGX zf#IQV;AdtgVXm9Lfd`T&CkTqOp9uND%)luyxlT|+YK`_4ezTR@3sn{BepyKC0*}^5W(EnP&9PF_EJB80 fRSyJ(JJ@cBNlnk4k~_IyPMVoPTxIiGxv6XbdM$9I delta 365 zcmccSb;yh7G%qg~0}wDj_?EVj=L54rg??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ3yU(ZeihJ&28IW|f!~;!gt>0Gd3Ly5=TW=Jqqd-U zgZl*@waYvMA*dm?TKhV`*+P{CiVFfKu+Lze$Th=pBJbtRw*>iE z<@&+q-4GG$;JhIr)xmp1N^ZW^Os&~EpBR`qwI(x)8#04vQ*kw+4{QwDX4m-5fTr-y zNW3hdaA|X)xH_Y{#i*(X zR(MBTXGQR3al=mxjGWpX?stR~7pPwr(z?K-^^qAUvbju3n#I%%;!Q!}4z?R&QqyxM s=7N-4bhzE%5$gBt^qrx0T}t<&ldLlmGw# diff --git a/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/redis.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/redis.cpython-312.pyc index db818f09826ce6db544e4044dc889e2e9ed94ee7..66651a62cc0ff1139bef858ed0dd34f7f95fb88e 100644 GIT binary patch delta 366 zcmV-!0g?XIX!K|d%MA?*00000hyej-u?*}1NQ^I4b7gXKFJxk2cV%i}FGO!+b!}yC zbaO97WOZXV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bh9V| zW)%TrlaCiD476VK0|F2V*)>C{RFlCMAOo;o^0VR>dISNDldv8alXM&zO~ee;7EQqn zxdgZYxG|7%m?YO4D$yD$*BUU<8ZfXC(;73;7c;;N(iTnB2u|P&63`1C^9BGI9FPOp z5Ez#akq@8)pjXupE${;X7#y?P9PJJ;SC>pFQ)DJePE1@KyA)rx^2bcko3YbBW4X7*9 zvo$Pt0|94~tuGk@o-C8iFD3&38z-~&FE;@dMgRZ+fB@MK6W9zA*-=%~6jsquRg*t4 M6#`LJvsN+x0%j$FQ~&?~ delta 322 zcmey8aW#YIG%qg~0}wDj_?EVj=MAGliGFBtYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ15=tPWBlah;u>6=0Gd3Ly5=TW=Jqqd-UgZl*@waYv< zJCZN*IDP<0cd$?KwIEh;#8jeQeTZ3NN*N0FlW?s23vKLU-$-((2c;*Ya(GMlqZB-7uCNgs=tAGNB9L% R{i~v`7evA~mm2;&CAQh00bS3jOiPB%9sH!4Foj+ delta 21 bcmZo-Z(`>;&CAQh00g=Rex+^XDPslzH$MfD diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/caches.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/caches.cpython-312.pyc index 7b99ee88195e3c9969444ad998c3aaa1f63cf1c9..ba23cc8da67d937ffb836f6c1402cddaedbc94e2 100644 GIT binary patch delta 270 zcmdm>Fi(N!G%qg~0}ymDGNy0j(P5Vo2XcPAVEEC%a6!moqv{Hk2_`eFt_rJeRGl2i zenLSOAuZyx({+Q(gpe6g*JbrD%IaSc)!*ql*@EMUoHT}_s0Aj=Z5G;qm28&eT+Ybv z#|X5if#Cr!e}mf{0msQ#xYU?$D{D<==C)#HP|=?3$gRjUC4O=yx25Jr)yqN_SNJV% zNUKcbxFaZX8Duk%xFYCuLs|_5fmtJ|IA4CI c{B=pai;{ZRBn>7v^Cd7dNEvQ^#^=Qd0JR!e^8f$< delta 288 zcmbQIut9<6G%qg~0}$vQ_?5PiM~7Wf49NNMg5gI4!zCe$6)F={SnR=p@>F*%6+ zguDzwR>Wz8%Y={_QP*YlFUsm)5!Jsa;xyTc8^C=$mA zw4{OI0WW`p+YJH7&kPEze3LJ6sd3&=*80T2%c*K@w>CW?mjo tCWSVj)1cPgkyM;7KU4m?q~1kIy~~mYpBT7-ZYbnSU0suO_T^0ZU diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc index 78611d73d59a4e53874de9a071fe918d18cc5ff2..ebeae45f314f829da94d20fd101e80178ce959ce 100644 GIT binary patch delta 59 zcmdnYwvLVGG%qg~0}ymDGNy0jac7eB19BP|9!F101eVGBStOWmO4v@m!!n%(DDru8 IIqMHz0JF#umjD0& delta 54 zcmaE__Fj$WG%qg~0}$vQ_?5PiXEh7QCkAFqt_K1llMk{;uzq9)awgwlna=V+!uHGN Ia@HTb0NghcJpcdz diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc index 00f61a02a955d7ec909a9e192753164de6ce82e7..1e2d9dc4a642e1546abd5824d0e66849d44dc1c8 100644 GIT binary patch delta 309 zcmewtbTx?QG%qg~0}ymDGNy0j*~zIO3*@|D_|d@dfq_Yt>!z9G3a$>X>pY4Vc@(en zC~wT({ETxUGo!%d4qgutpzLR6psLRdOhQ~8Y+u+Igd`@v;$6mkMOtt2Og?o11{wVa z3aZPw7jj=$Fu$T;KKVMICI^F}#Ro-@N-lnL=4(oplRf#v`52U~K1eXA>MZwN=)25+ z@@D=rK?YTm4>Al|rq?yCE^1m`)3ljvFHpwJpk=#xhk(C`iWAVGKcFsU;pKa%s6WB; zhK#~>8Iy}LCL1EJ$kkS#hPpp%@)xBAOrhnc%OZ^EW0K#=* At^fc4 delta 376 zcmcZ_^e>3#G%qg~0}$vQ_?5PiXD6qk9FX&Z;YS0*Ck7@}t{WOg9bVUY6fg29UguH% z$P5(P{FHMcGo#7mc3uyu8)lAQKw_U6n1r}G*gmi^2uXZq5M=daocx$~8Rtc5y-y5` zoDPhWd-&AFL5v3qs>`_-a$i?4zo=jik^`zd%%{l(Vth~pYy84z&T(1E@)H9$E8k>2 z{%|QE{Xv33RcE>HLf^&ypBQ*q`7UxObZ|}ZnXD+FI(a|8ml#m!gA9X~>2*!3i<(xK zHEqDECQAvFF$1MGPZsbO@$m$D><83mEWCUVL}YKsC|s8@xhP|@A@ZV({U>&yD9{I@ zk{?+a1Z8G;UJ!7&sA0K7<+6tTH35eY%s}ZI0uCQR^kj9_>3pDYYhak6I$v|9W&^|I vQ>rf+uT0*eX3u?D#_&5UizwSe9*IfnvP_?uCo8FYvpi7L|FXGI{RtxgCZTbk diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/registry.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/registry.cpython-312.pyc index 6f171e70e45dc331a83b51f69d44b0dcd604d2ee..f0dbbbc36cd85862a60c583a8cf1addfb00c6082 100644 GIT binary patch delta 98 zcmV-o0GOV delta 102 zcmeBF>s8}9&CAQh00g=Rex+^X`N6}ucrq)mBHIm3{cEBTll6F|1TKh1bhrVD2cpuS z7}z=0CI|7lFazn$GkH~*gg-GbDe&EpSDC;%oog!BM`j>z@&*2GmdhGmUpB`JtYQKH D5|AGT diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc index c39d35b25ee4b6e485ee0f86922f4aa2eecb0136..6fbfe06948de373a7feb334b7b7293c85a802d39 100644 GIT binary patch delta 42 wcmeBU>ty3O&CAQh00bS3jOiPBLYNqhCnqwAF-_B*T*oBF%pj~Vc{)=$0K3TvDgXcg delta 64 zcmeBV>to|N&CAQh00g=Rex+^X31MQin4HKYrZ8Fe69XfwS_j(=4!(ZgPTmP=({m=~ SOwPN?q56RtC^2~wQ#k-U;u9tS diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc index 7e8201a45d56f359b1fadb4673549125708805b3..e5fe4b6e7cad457829d72f54af05b0dd8926389c 100644 GIT binary patch delta 107 zcmZ24y;GX!G%qg~0}ymDGNy0jdBHB74CFL0eBojcm%lEiaY;<$3o8o`+e0ypPPfUt z9G0v%#56v!Zua1K!YCaNQz{~JU0Caqu-0d=QemwQ=gEQ`rmQ!FwLY?LuHiCf1_0_p B9S8sb delta 97 zcmdlfyiS4#zirW@2o65Y!7*aCi8Px sGJR&=?91_lQ8EgqN<`+mu+~Lkt#2Sz4|w<|`*4{uePZ6+#%0V503%i!m;e9( diff --git a/env/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc index 9e0776fa82e1ef3b662fa20ac1429cfda07d3ce1..12a4fcddb6ecaf9ddfc943f630a6805f5e6fabdc 100644 GIT binary patch delta 207 zcmbPe)L_JOnwOW00SG!68PhlN9A{^oHTep=t?HWkD>6PS>la!qFkFy&K=p*;Va-{A zE9x(>NM4ljxxvfd;C5S7YqAxG7BhpG_U3dBX(rV*KvNnRzHl&zNYAiX5Vs-dvam&i z&qp=}5rxmJEJAD#h2=Y(CokpF6uKcS|ACc(mHz_+Q1~+!P{HJv{+!cAoYOi3B|*jvjQ*3 z_*`I-yeQ*ygO|U-?S`ntv&nv9{>(sn^FpzB FCIHyHJ%a!M diff --git a/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc index 6984a64eede445343d2ce9ec7666fce1799d87b1..fad2642fa5cc9ece8042c5801d0ad93d60ade366 100644 GIT binary patch delta 20 acmeyy_>Gb0G%qg~0}ymDGNw=Dc?AGFOa)>9 delta 20 acmeyy_>Gb0G%qg~0}$vQ_?0%1=M?}#A_l$y diff --git a/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc index 61a637e7ea1bd1b7bce369bb692335642a2d090a..12760f1c0a430d1a9fa9d498569e7e6b19f1b903 100644 GIT binary patch delta 54 zcmeC>=-}Wv&CAQh00bS3jOiPBM3_bVft&`02fX|ZZg+&Ft_$g35z?P*$!yBZAZ#$X Hka-ROKU@s0 delta 59 zcmeC+=;h!!&CAQh00g=Rex+^X5n+}L0dg7`9`N!vxZM$wx-O)DQAqz20~agbWD{mn KW)PjjJO=>1%?|GX diff --git a/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc index ce2da3a106bcd005b9457151f030086f4421b6ae..9140079a21ce1e2fe8c2cfcb534219c2fad38dd0 100644 GIT binary patch delta 20 acmey!_>qz4G%qg~0}ymDGNw=Dc?tkJi3L*t delta 20 acmey!_>qz4G%qg~0}$vQ_?0%1=P3X|Uk0xL diff --git a/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc index e69e665d09704565a8d82c3b7cddcc8775e43c7b..b3c00f19f4d758df6feacdaae4aa76e7c2717bac 100644 GIT binary patch delta 78 zcmdlLy(60EG%qg~0}ymDGNy0jaaUwqF*!t0k@=dG-sD{#|eqk(3rIE5xxDB3au>CHP7xmXz+ jCLdO_7rv|+d`&cDf#Zb4>FE>Gr)FLd4cRQAzJLt?>ZTey diff --git a/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/csrf.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/csrf.cpython-312.pyc index 186c35a7e707c0cd17aafbfac64515a52dbd62e9..eca57f68fd8c2a53f874a55afa3928c7618a2ec9 100644 GIT binary patch delta 21 bcmbOxF-?N!G%qg~0}ymDGNy0j;o<=RGvovu delta 21 bcmbOxF-?N!G%qg~0}$vQ_?5Pihl>XQJQf9b diff --git a/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/sessions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/checks/security/__pycache__/sessions.cpython-312.pyc index 5ed69d46fa14fe999e2f37712d4aee18c0a05aed..26ff73e4b6cce157cb5dac9b2ab236ccac6a5841 100644 GIT binary patch delta 21 bcmaDV{ZyLgG%qg~0}ymDGNy0jxycIvLQMsb delta 21 bcmaDV{ZyLgG%qg~0}$vQ_?5Pi=O!-zN`D6I diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc index d72d5635c041cd31114bcca32947c0ed83f02809..3ca6914e42cdbc616b3c57e9e1f9f9df678d8ce8 100644 GIT binary patch delta 21 bcmdnNw1bJ~G%qg~0}ymDGNy0j(P0DtHYo&4 delta 21 bcmdnNw1bJ~G%qg~0}$vQ_?5PiM~4vrK3fH+ diff --git a/env/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc index 256d28145fd10b7c8e0fd0e9c3df3e55b9e30b63..1327604f8c932b24250d04006706e35e984ae8a4 100644 GIT binary patch delta 78 zcmaEAd)t=hG%qg~0}ymDGNy0jInJ+M1LVA5_|d@dKuD~E{f4OI^yrDv(_%YZZ%D{q hm(aKAk3-U q;d()%=pG`Q%28JDs=b7AInHOotCmS9~!cxE%fFAV|D delta 21 bcmdnSv5kZ0G%qg~0}$vQ_?5PiM~ejjKJEpu diff --git a/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc index af3ec834fb04831b0c063b10884b5c744038c2b2..ca290982f5fbfa919ebbb981e552e1276ab783da 100644 GIT binary patch delta 21 bcmccSe9f8XG%qg~0}ymDGNy0jIi&~yMcW0( delta 21 bcmccSe9f8XG%qg~0}$vQ_?5Pi=aeD#S0vY-+6%| Jo10aQcmU%y9*Y0~ diff --git a/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc index c45ea62b84ce80385a1bb954e3d15d25ad3c91aa..161b29374b60c726e499bbeabc1fbd6ea383444a 100644 GIT binary patch delta 21 bcmZ1>vOLUWHa-MM delta 21 bcmZ1>vOqv Z04S56mzblUk(!f}U!Gr-lQOX_1psNB8UFwP diff --git a/env/lib/python3.12/site-packages/django/core/handlers/__pycache__/asgi.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/handlers/__pycache__/asgi.cpython-312.pyc index 6e365b45766619cf36a91c1324988d2f77e88682..02d61d835ac8219e5f6983bea781d2110c00b167 100644 GIT binary patch delta 395 zcmccK#JIYNk>@loFBbz4bTBfeZ{%ra_Gr})Elw>e)=x=FEKki!)OX2GF3nBND=F4@ zO({)IEXmBz(+^Hg%t~wHt%PC$H|zv zc^&U&M&@hM7LzmiConU}SZ@Bq|BH(;Z}N93Q|s%(+E<0OZwQG^*Pf_7BXvReij>Pj z#@Bg_FYp+DXJ!!50V=pCto`E#kMWNWApQ@a07Ptag>*0{qw?l6Dol(_k3}Y5RW)X2 z5S7}@tyU#0eVvhk;RVBw28ItD3^H;TI3#Y!s?Lv_8Fx)qck(jJU~vXHy$?JLLQ>ZS z6)y@ZUKiB3D5!BwP;0W7l_fKSkoM#tD?5ej;s#g54K}#nRMPy;z$GX(L*<5w#&s2w ziz+4?LawP;O+IL)CCQ*_{XvdFLFKx<{zZBH4II}E94;C-T$6X4%xSH~&!FJM_`#Nq flk3L^DFz9{$&S_{{6HFLG6Y=~H`ttG{hAd36zGK# delta 454 zcmZ48#CW}lk>@loFBbz4FhBT~wvnfq*&tUxv^ce>SU)?lC^1hjDI>8YGg03qwK%&Z zzd*kLD3hO;n4_POnv;`Xo?n!cviUmmJ5I*D&Bu5*Gjd#(w)n)r%c(cHhJOMxklxHM z@QaJFelnM|sn2C$?e7eXoF*SZ#0?>_>Dm*uXQVC&Uy*WI$oM*s@dX~^@613cgrXle zc#MC10Ezto3nFATS4jtRGHPr-r^3X@{y;?X6N4b<o~~gcTW>7#LnK z{AghKz`-CRcY#CVhOFxRxS4U6WpzI>uyQ&xPM&KSEDK_M;9(Gwx-O`AQBd)^pvFZ( zjmv^spBR`q`6jblSu%rYXDd6y%i;##8Mt|+K7fb~?l+V)zcX+N0=Yn9hRO{Ujq55V z7gbC)gj`m!`ozE~Dm8hbm6jZk{vgMopmJSa|DwG929E0n4i^m^F3UT9VqoVLn*78{ z%MwU`uw~=q`td;uX!4H_Oh5yFd|=^_1d^-_%39x4P;y!ZJTXH52#)n>k;Xg0Y#H$e zQ*oHgYT(Vnpz6rDIoKeJQCAP>#|DNETntKT*A=a=C|Y0Ok-aIdu|j-<=4El44v$;> V;y1+QC-Hw^XHc@){NB)?836y%S@{3} delta 269 zcmdm%wJ(e3G%qg~0}wDj_?EVj=OLFtu6}57YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pIDR&{G-Q?xm{v4O(Z9X$tavE>`$=$%n3}V#q-sfjr zI5|dEo8zLQ*(U~8PO-^dvI@)~daZ03$3<25PYj&ALX*|x+?j#&=0dr}{Z;f3 z8X8nop&FznA5zIfXfjsy0&8ki4dY^Ln0!NDjpMS4!zTtdPTR?h2Hwm-dUJq57NeLk l(1Q&OAGjEl)UGR9UsSaI#K6p{F!{8hBr}lS{M^u=834%}Q5XOK diff --git a/env/lib/python3.12/site-packages/django/core/handlers/__pycache__/exception.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/handlers/__pycache__/exception.cpython-312.pyc index 8fb0a6078e0a73e19285e8eb97e035d537848ed8..9446ee43ced762c5cb951a3c4f11c12f08798432 100644 GIT binary patch delta 99 zcmZoMnPb9pnwOW00SG!68PhlNJYe<{9 delta 75 zcmbPZ(qh7MnwOW00SK5Md`sKN^MKW$NI$eVwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAgzbee0Ky|13IG5A diff --git a/env/lib/python3.12/site-packages/django/core/handlers/__pycache__/wsgi.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/handlers/__pycache__/wsgi.cpython-312.pyc index dcba12c93ba27f890b1ee4da0c4bbb27384d62f3..f861ea5ace02e1f4eb4112b831a82d21b8291714 100644 GIT binary patch delta 153 zcmX@<^~8(kG%qg~0}ymDGNy0jxytO(svlaMT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kwB>yn7T(J(hyjeink_!L> CKQA#yKO;3KC%-(uC?{pJCd(ZWWd)!SFBpC_FkIpd-H_N(Gb3<*#LS2lK{FyQ c%NktaGrY(fx>;ND4yRs(wWTe&0BBk-5C8xG diff --git a/env/lib/python3.12/site-packages/django/core/mail/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/mail/__pycache__/__init__.cpython-312.pyc index df639b9f0b38604ce4d0f6ce09aa581384d77547..86f2229ea8e8133b7715437fddc03219825e82ae 100644 GIT binary patch delta 206 zcmaE*^IeDMG%qg~0}ymDGNy0jdBe?-2jny`e2|;0$RWk|k&nT|_8Tj+0NX=jn~RgR zcw{(k7~6bcWnksq?920%iBAWp`US&}28IiKp$Fq9_Y2E20jUK37mQOUdkRQ1ABw*` zIbFb5WK#WQ4)uxk6BIiHI}E!;Ce&Z#P@lX{#Ax#!f#pp6dI(d(FS>>SjZt6%QX7Sr qGR~bGE+WTr$u;cqqifh13x*)D`aq}LLb&LQY3`FJt delta 194 zcmeya^Gb*3G%qg~0}$vQ_?5Pi=M6VUK9JME@Ih{}B8QZ~2R;T9+wZK*0&E`{fW*Ve z8ay)WADDs629M1?JWrW;w1LWBF#Kp>xWpGa*`8mX`67@`;D5n5ak8g?H1omuE0fa& zjQJ+kU*k}ppx7bUVc0ElY4aL^+bCMYp<2Ty?+{+fIDK-Qh#bpB*RU&-8$?V5FN$ki U7A6AbVG1R)Ob1^^u~kVKPK9UcSW959o49p(ho95C~5{1CT_L3Gf8~95%DIFNgsFHj_Uw z9TUhu_mZdq$8kVrzWu`lYdCe1FNoJGoN!8OvoEgD;zt<^I8LEduC$V1IoMGs| zrRWFrL<7SYF$MvV2`=4L9V|C^1^XjABPWz}$A18tV>bDSwK6Y|{tn`N1QDCxSsODm zE}E=lAIo`BP7mZvSH{Ur_9iSK#^#;&b2!9BfX2RH_|d>{Nzrme;1cBpiObb4Dq2p? t^*F=4LG8+B8&4w+#+J$Xf#IANqv Z04S56mzblUk(!f}U!Gr-lQOX_698>y8WR8j diff --git a/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/base.cpython-312.pyc index 18c9763a0fc740c9735ce9c8274835757de83dce..af70d82cad009adeadb8570f14314627ab48297b 100644 GIT binary patch delta 99 zcmaDT@>7K8G%qg~0}ymDGNy0j31sr<(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tdYNI$eVwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~Dbp2p0LMNXKL7v# diff --git a/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/console.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/console.cpython-312.pyc index 680a8d295f5478d9950aed2e7526c77a731bfc0a..3969cef3f1da5bdd88c24130a0243fd26742cccf 100644 GIT binary patch delta 183 zcmbOzI$xCMG%qg~0}ymDGNy0jab@!8)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t;vYl_czK?XjF$ugWe%s_gxH>VpT001jF5C8xG delta 153 zcmbO)I#HD8G%qg~0}wDj_?EVj$Cb&TR6n#hwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~CX*@~JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~B4Z{a0J*aoi2wiq diff --git a/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/filebased.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/filebased.cpython-312.pyc index 6594faab6da18aebee2af2886384af2847568782..7964a222ca078a97c1e1fe1ed34f06bff6111f53 100644 GIT binary patch delta 99 zcmca8`%;$YG%qg~0}ymDGNy0jkz@7f*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tF AdH?_b delta 75 zcmaDUdr_9>G%qg~0}wDj_?EVjM~>B?TtBopwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#h_##(0Jtj}djJ3c diff --git a/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/locmem.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/locmem.cpython-312.pyc index 68397efaa3e93fc1e71bb64e3b06e285c1e85e76..7f91dbaf95f4c50dd6a4e2d792e2daa06ff7aea4 100644 GIT binary patch delta 127 zcmZqRoy^N~nwOW00SG!68PhlN>|*lh(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ZVk6DsQ*av7t1H%Im(GJcV;_{yum^q~4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t8{;2M#$%jNum~YGLPW~qO(%YxK7h{-Vn>CK5^{LG9OCKpP& m%3QV#{>IEC#&yHc^a_v6jF1HuS9x?kfJ8dDHeZ!o%>)4aY&~uO diff --git a/env/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc index e76ada4d97f9a6c85b207b3102a2bb95de7618af..92e3fab0d135c5179b4f9bb7254675f15fe3613b 100644 GIT binary patch delta 911 zcmYLHPiWhA6#l7_;yQL>$FgNRvn)4p;5ia%M-?a7L)3>vr*$DfAFq4oKP$m<>5pD<1v0sw)U2X z6Y#m|6j~u8&|&WLt87|v&C6`M7#8fpN1HctH)QuvnN7>C`Q4M38aQx{O0S#$G0iXN z$6x#oUSz>D!o4whYmz&^Z*dE~Dm|=P7>(}PT+gjnX-1}*3LWC(d-R#Ys6vOT_K<83 z9iYG$ZnObsH#8oYfV~%f=lX^A{C~6TOUYx&A|rN*SH4}%uYOJGr3BrpC{lp`dOkMa zTsp!rqOI=mb1}$K+EoA1L*BWJBTA`-In>Ijp=YrzfO7~gCF_cZ~>_|`55qau}G;utrLq)ilM!2d( zKqUg)dCg?~eB!f-Ljy3HpAi8a+-TMukrs)81E4P)S%K9H?|XxoI+j$R=Dmxy8rSJr z+a5EikW(eEc#Xfdu@2XZUa3OAVK|8$J61X&oeNw>kO&k8l4ykr!9NCAJMe~^X5jF_ z6c^ifQo>rrIS8jtGjzoh;V)=*_eS!Ir06PK$kV%aMi-bGZ5V*-tn}sSjZRxyG5%dZGmi$rmuL~ecfl$pJCHNOI{v-N?#mqVU($#5SlAO&WN z`6>D!`ZKo6ri5j&>#N0*LHZ;*jUYAn_*@g+VHNn}#1MLW=?MNcK`zT9am6*O=fZ-} zwdu?`MdFS}T)sn>N8++;mYb`!@D*~7i#PR`qLdbro)j|8#cO96+1k$=1-4FjH9I8| vvfalp;}Zs$Ytyo}m8$@m5HL delta 939 zcmYLHO>7%Q7@f`T+FAe9c6Pm9H*2qByS3YZ$vRdEu}NBJaGb<0xwxVQm8kp#K@_1@ z6_7(MB#^}c90nnw-?q7>KwTKB+eBUPmzIi4O+i!zQ4@yS0CU6&$@{|b^3$ko zGQ%n}yoV#OWdN?jklHgN3HTNFGw=Riz2-|-MA;!O8Sel7n4Io#vW!NTowV2XSlb9FOAAM+ z-fKRnRU)(px-2`ed)vT4Mxf*!B(#y4I=tgu!@Iyc!lXkN$G6y%@|D7sl_j`TWlt(U z39lGUhJ&CgJvpEZhR$Kw1pGKW)2n%qXQXuqHo|c?svQe(`d~UgvF-9m3!3W*G`=+o zgU7_6#-ju=N3?KSXWT0@%QG@pKD{b57_n<`v}Hs@DYzQ-iU}Ts<(N`p+tnXIQKkJ=lL}hjGKqXo%dyQ3Kx_ z{ZZf_$Hk_kOBK2@yUuRBUlS+4xTLZv_;P$V6nxC#GhY*BtSoMb-z9D*?h=i7TAGs` z*Rv|0QC?4+!mwZAt!F#<-FO{-ITpc-7dr5lG4|DJG`Yo1mS-hL$yId8^fg|dyC&4Q z$$aVoo08wGv#ETtgZ`37<1-awozG}&CZE)gi(R7zRQu5aCB=7Xug-X6T4jQT)VAGO zc&lOewJ1bTUKoF1!YIW*^?T2N?mL1Ubv`8#I>(o&BGu%=DiumCkTFsu~Z{99&*GPf(3 z_nC`9L}Kz{2Nh-@z4?@bGaFRdM#s(K?yrQz!hp(tfUW$%z^*9vk%vJ^V}|2o(I|Ts z4j^-LL{udszYbi{1-_7zQj_mR%P|3||IwW=(*!q9im75`{4|+2&f4*zwCZPOCNaL7 z(y9{@R|u{bUn#!DY`gVF>&u#U2MUkZ9;`iDKZ$XM)dyw9r1A$=240~L3_#(Jd=Lc^Pz6U23PgblB;X3fpbD7d)f}NF0IgsF zS^+gd5~ARau;g_6iS`Q;m!~gGza*@?A#r=|#@sFWpI8|Lg`gV6Ca1-lv3?d{P&b*p zJYJ3s95|mRpN`jI1_}L+&t^U;b$N4U!Uk5xf0L!syrphBx?T}*J1BBd({_dA2G0qS z*9BEB3#uFtxwN@DEu6z_AvjX*a;SV@Vddnz=^c7mD(s}yj?5V**QNC?O6#qtyee&Z z!m7jjf>hWCE(Rfy4z}A;s*`#0wU`;C)izt^hqLi{fX%oeC=8Snm7ct~6euSqv-v{l GI%WXkJH#Xa delta 586 zcmezViSgejMxN8Wyj%=GpnKp~+D4u%Zh09X=LN%$28K)G4jY_jIM4T+>9@l8vW)%} z3H^)W4wI*GPhs9+a%HnFPbN2`(&Xvl3al5EgBln%?-Dm-4XS#BBTzN3`zs-l5TNQGV9P%-uq%pv;9-!J zo6H+!&%z4iZ4QX4WaQO`E4joMGWkZd9P>pW{Uf>)W*Ero&X_7j#@CZs;;gwJNUMHh zW)kDOAtpZACr(oG1Blb%_JILN0i7kK@{N^6l<$Fv=;VetHJ~hz)8YDo0Z4t|gUCvN zWe-7QCHOi#fU**BSuwCIOT3ybP%p$}AO+Ja36i}dEIHkNqWyxz<>?F4FA3{zNZg*g zF?UP;CsqbQA)qcvz7EgH+3{xF9|RcGO+GR3@VYQgUKTIM2K2v@#+S*b;&oWSVn5@v znNLVv*_@uRftB&sWQjCyu^W!A*9F`zYTB-l+~7Gu^17hPWgyyIn-K13pVG5pfFH@s5D4{&g40zAO$*`PnND@1^{R_w+;XR diff --git a/env/lib/python3.12/site-packages/django/core/management/__pycache__/color.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/__pycache__/color.cpython-312.pyc index 28ef7f7dcaadcad731b4184975edfd2afd22a5d2..18791fb6d5f958e10b1e32ad47bb2bdfea67b0be 100644 GIT binary patch delta 45 zcmdm_uug&JG%qg~0}ymDGNy0j`NPfFKADrpkok&${bVN|dlm*k2gc1UJnNVN1PKd5 delta 49 zcmZ3dut|aEG%qg~0}$vQ_?5Pi=MOhy_he2ULyn6A_MaFySv4oy^4K#2>CFv1>zDy! C^$n;1 diff --git a/env/lib/python3.12/site-packages/django/core/management/__pycache__/sql.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/__pycache__/sql.cpython-312.pyc index abf2b15ba8a6b6c08c737a33bf6b16e65b39a0a5..2b42b083dad993c748edd88cbe0af4f59c394c0c 100644 GIT binary patch delta 172 zcmdlkbX17vG%qg~0}ymDGNy0j`NQbZrXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kW#B?TWahOhC$?DC@Ag)^^wD}fO2;*d5_G8#pHZTKKOqv|WhjG%qg~0}wDj_?EVj=MSSno_=U?YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{oe0Fx@S_%xsq4Gd4jq^^r;T@=&0ET;2`fuEIYvIU3f aLE;bn^JPI2?iYD*o=mG%L3oeuZ diff --git a/env/lib/python3.12/site-packages/django/core/management/__pycache__/templates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/__pycache__/templates.cpython-312.pyc index f3a781cab05a92a46e8704e30891f60303cd8a31..ff9eb9bb75ef247cae0add6456fb187cd566bfe0 100644 GIT binary patch delta 448 zcmZ46&)Cq<$a9*Pmx}=iIv5$#H}cqWc=YIp7N-^!>!&0omZxSV>bvA8m*%GCl@#l{ zrj#ZpmSpDV=?5n#=A;%WI3_2iq~=!Y`}nx%0~z@)S&4b+`2j`wS*gh-n=3g!@biJp zZeUmuxITPk_?pPgl@cC|QsO|d7Ysid7%nKeugqB?xFhj^@$QTzhAVS6-;(TRWxB?? zIbB|Yk@<><%H$3OB{K$5)dym-)3YaLFVMU!rgMQ?r^6gb+?G|DzEsjoWp!w(QLB3QXtc8^U38(P8lV1&o`5ALHQL4eUOy>1xdTfyeg3#Kr=tcGANl(&QmdDzM^C{dAW)X zGlR1EbLQPOU+iK>ba(>KP+QRch(t_UhF2wM}fL1Tx@64 lx)zG;40=wC*98?Phgn?U1F+yg+sI?fVNjwUTAW%`te>4&l$fWNl#y7HnW*oQTAW>y zU!Y$Al*!La%+b$C&B@6x&o9bJ**uZs1HS+d(1-?x6@lx+SB9^SY+%^jFX6!`DFzgM z!SJJj;gXX33c($T2aI=TEHS*O@&s)`U38`ET4^W74c1rPy{r( zf#HJ`gMd(j$8CPe$vzxv+zbLzPlTjrcw7@wo!rEs#>^nBws|#205jvW$$z-hnIH3u zP0r?#;$RRE|IEd}Cp38yk2dpdVX4VSd6YO9M5I4(0tGj}=c!?l+yyrN3m*dyf46Ca z%N<^U?$8Fe$AaRMI|YN78H6M@-xEB>8oCm!?4hpdWqz}j5i1y{FimHl$bMZw;i7=T z0>P^S$}1uoJTCB?-7vGH_aGl|CSwv++Y=h4QVdonnVhz5x zg{3>#Z%e67W|YvAV31b-z{S8Tb)84yB9FoX@vA(VA9xu=WH!4?urNzY0PX$pg5gI4 k!v((Zi+W)T%sa~_r1#eYnUj;HTUf5>gDG%qg~0}wDj_?EVjXFan)fqrOlYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{nzGm8(4XbsSa28It(3<5$89yjEXnK*Fo+pQZ@wXTj5T&6SnUH{ z(`)=@D;TFRO=q9TeqBJ}qJY8z!K(tw7x>K@Jb=UvGs`_j`^|QmZHT=l?7Tu^f-BHR zA}SYzof~|B#0?R#2HzXP(w`XEShYIXZ%CsqyPW_ diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/__init__.cpython-312.pyc index 9635d207b8f712ad74a9841f69aa0a91c0240957..0a231e6351a32da7c7f1b4027fff29482671a565 100644 GIT binary patch delta 96 zcmcc1_?408G%qg~0}ymDGNw=DG4hzAA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6} delta 72 zcmey$c$bmqG%qg~0}wDj_?9-2$H<^YKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_9{_Rk8Y=(* diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/check.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/check.cpython-312.pyc index 88462537936af616255be4d9d08e86a0434dc828..f1d7f73d5a22c4e1560aca0895819e86a40ae694 100644 GIT binary patch delta 170 zcmca4^;(MOG%qg~0}ymDGNy0jxyRx$Q9raewWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i#j4N3^?`v! zS?Hm>@(kw5ft+H@H|3Q#=WwPlGBGetzQpA(dDA=evQ*efs~wqhOs-4oU6j^aQF&F` V@`Tl7OKxQrpuW$W6SzMy0s!rVI)4BF delta 162 zcmaDYbxDfnG%qg~0}wDj_?EVj=N^kerG98}YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ5vx9n@+SrsWuXTW(s!g4uS@G(l-5}he8I^3inPxc zRt8atkIX>X%`KcMj79N9G)p>(Y7`rS(=+UX`}IAQd(_h+CQE NfxPmU&6V7r7y&KeI*$MV diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/compilemessages.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/compilemessages.cpython-312.pyc index 86d6665aaf08f887c53ec0def52af5b12994340b..ebe7069ce51629c282fafe48145b1cfde9ea4e1c 100644 GIT binary patch delta 595 zcmZ4O*67A_nwOW00SG!68PhlNq%wKT)(Kotc44e6kU5CWOo|xx%9W)W#?KfrEiZ;5#RfwRt6r0`|aKF_~s{^T5t$k*QFHoGrvodq@N5TJ$j5{ZP6h1F}UB~Sr zk4A_4goqiHPo(7+aLlutd|xDigF!~?11p2B`(zJMcjnvT@{?zXx-v6JC`^7Rs$LJ| zcevl=7klU*_L-SULg=P{*nzMqPSf2dx=;6+=(9k4h1v$)t0E33%0DnO2#S7W0IC7H zRZ?L>g$Wwcj{%QA$$w6BmPkjJ751ymPgUKKF-APaQf=Cxv09GaF) zpfLZ!!N4bRomc)Mul#jhql>&oS9nc!aNH1+=y1QItg|BWy0ZCZY57z}DFzjbFJ6oc z(yG^`bS_HiT$i%EC}p`r{hE~1u@S6PiBE=w~`H6v1Q1X_D T#0O>|{p-6lL~gUW;ul5$-loFL delta 585 zcmXv~L2MF16rEugvWq(?m7S%avIMcU#jZ4@O))X10^3@edQhVmD@L>iQW|JtI9cO` zrU#a+2_$;p*u;y?nn+K2_h1NZ*e00t;KAd9SQ>lKfyBAIH}C!TCVyVV-p9DF2w4F+ z)Zx+79WH6Q`dYf1OJ;LYDv?dBPCQ;otUpgkkz_8lo>`ODh?7}Oq@|T)I-Plu$)=yE zyQXJj4@tuY(AiT(VN*~XTjvb`&F+d4j_4It}nakk>z=A3e;658WL5@)>z1GqCimN4xjEuv9B$sYd%#~Yvn zOn$6i9;*dEhj+tYlKa=<6`|^V$F(V9Xeai+5FV%}XTN#&0m6W05vYE5JYxIAFq0uQ%FC=Sct|~a6RJf%N)JerA6XvAHa1w04^HF5rF%z| z$vLD)7v9X4<&s>Em*Q1n`_hLi`;Hq%-%{u{AV78)7L~k0>rPi;UU#1B02*P1ZiS{k z$vbi_qAhj+Wyk7mEC~9DR>ol_v}o#of0qF^XA^nq z$kRlVbu`&PAp->2@fxFJXF+cH0^1K7zUg1UhoVsXb0G=EKI`6s!0m6k0(DoQ>6)p# jW@;l1*K7w^(YTryQ#OLVB}j?}ZE9P@%>Rpqyj}PYXP~t^ diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/createcachetable.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/createcachetable.cpython-312.pyc index 874f488530d05c0d7370a9a9465d0431e8b3a6b8..c42a98e7414f2aa04f2451b45b012327c40d1ec6 100644 GIT binary patch delta 296 zcmZ3bH%*V{G%qg~0}ymDGNy0jkznzdqaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k(BHg| zJ(i1+ZL*BeS?1e<;*&oLonU4Vl9;?lSc3VQxZdPD!Y0fN68e*cMU0tm%W6*c6A=TN zqcu5QL{|74GZP=z2Q~&Fnd^c|7X_8B2&zn8C?c%%nTJ71Z-VCy5sB$O6MYs)UKP;> mTCSw`U64UY^*cLI)8yMCVIa;0L6u)%fe#Eo(akQR&lmx^KU;nP delta 391 zcmbQHw@Q!aG%qg~0}wDj_?EVjM}ozmML)DSwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKhvgmiwO&MSYBSN?{O)Pk(*YL*w(EU&A1 zT~zb>!py|S^^t*xQ|AL4gOJR1L8Xg=N|yyyJ}_|d>a1Y-z{Dmfc0)vBy3a(P1#(wJ z3_kEMC;=V8D5x{R6D%$Ul#skCq7C${pw4$epsw%iK+`6l6bTasa=_;N0thi8009{x AAOHXW delta 75 zcmeAW`XI=2nwOW00SK5Md`sKN!^CV*tsh#PT2!o`omiBZr?xVzKErK+<7E-G%lzsWdDJ&ZU);>X%*!d<1lILHP`HEbjqv z04S56mzblUk(!f}U!Gr-lQP+zF_lqf@>)h&rUr)1XBkx(bqs;VH84CeG}#cgS^64x z;0niso+lEI`gAzvWVJce)Wqy>X$YvGV^juc7k<05ESlUyCW<)L-(?< v#wP|gPEW?kjy#zxAjamkJmE}|cfjgypsM5LbZ49_&cBBR#Mpd|-+&PSkYGjK diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dumpdata.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dumpdata.cpython-312.pyc index 3015d837c5f2c05e3986201771388dab39ee7677..7471f5149a9a33f6177ceedef718283aed102e8c 100644 GIT binary patch delta 237 zcmZn)?G5EQ&CAQh00bS3jOiPB-Z6Si(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tX|FY!!o?t^uz8Lw7b7!>u}Y4Wh4KF64N5g4TjVZFJ8YC&VKl>OzQ;_Dxn3LO kE>5;lwr9DbWbt`&y|NDTZAsS$vt?udKsyLsIz@g9@*~KouJ{01%); ACIA2c diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/flush.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/flush.cpython-312.pyc index 7443598d4b28cc329afd7acc625b8143de57317d..f1b2064aecfe6c2ab84b57214198dcf7a83ce8c9 100644 GIT binary patch delta 140 zcmeB`T_DSInwOW00SG!68PhlNoM-l!s2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k*2k}mzbat+ft5kpaPw2{6-)r5uP^QZ delta 103 zcmZ1=+bhd+nwOW00SK5Md`sKNbDr6tQa`jfwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YqnZ=o%v37DgcL~R3DT7Z8ES#c~?{SMW1L@5_xK}U% E00^@pVE_OC diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/inspectdb.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/inspectdb.cpython-312.pyc index cd7c2ca0bb4c89b3f1b0011314e9a13eeef86e5f..d959563110cd02e1a351511e7af9baa960c5d15c 100644 GIT binary patch delta 482 zcmaD{`LL4bG%qg~0}ymDGNy0jF=z3ZsvlaMT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kt46S=PoC|(p$T%dAQK>Z^#gQUe~GxjJx5ka5}UNHP}7W{}aH{9dt@he1A!@w+7hpW+3e?JY_}jPUdeHo`qW5JP@5>TC UUzwRi#Xbl#h-+_dvPxtE0O|s!+5i9m delta 484 zcmaD@`M8qjG%qg~0}wDj_?EVj$DGBWRzI{jwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#o27?IE(B;q1H%Upgt095;e;YS0*C5zAlDtkmOT7+)iE}F(9@ri-SKm=6B}b7**{Uf%3rc zl3|dR?cl$ms&#=w>4uo%buo>LVj7plv_3I#bBax7u~JlcAg}g~nMqpchLrRQ#g)1{ y94|PAUa|?Dgx+>U56OXGyzA+S6q7ZVeYEb98x>icm2!O*iFn?4)&1&t&zEl-?1> zb97mjW<{EfhhEJjX0~WHO}9xz70v>Il{)e?*4F-+`N-&!$2&hT>x%GnbT%@Z)z>HW z_3s(fZxp4^9U|E*SeUmE{6gRBsucxX)>?uHc2jXgW0hvK!}j1swOFnfH$v1R%D^%j zZ5XfG?(!z92RGpt`KoM=v(JhCBoGi_k6t53S!OhuZAcz7sC!R65 z&`X;g$Bb@a-{zBptEkKQK(Wiz&0R)!wG29PMkQQUc+_%50T{IB>cBHbE2?+1+Jq}< zY)!ag{L?c_H4)>%~H8~ah=Py2_wi|6p%AWAX!J;fm XM2IYH5@}ORlcvpauPFR$1FHZ#KuLT7E_}t`tXj+&iNoXn%6eh-l!O+dn zZ19Tohi29AE!MFiK8?f!05vCNmRlWK8Cr9vSyzD~27bskGenhQD($epp}x3v5p4Fv z`#1U*f%HWmqu@P!-PG5eG9Fie3b_)cvfY^n(C7;LWwSLp92t(aX3Wk5idY4T5J#9o z1GchI`oERFneLXtA9##Et5sM~)tCorO&Na9m!Bi5FaVY9yBe0&Y378CEIH&!B2Nmn z9uTTSt`*2WB!rR7nWKh?A%-%XTcL=xZ?WYpZAnX85$M2wdA^QlfhNBc4xH+KXM1hS zR`hO{gl|L_A`3Z7L(0;yThWWVtx1MJNAsm}+bb6S#GmS`wTG0dU3&;xG$#DL{-c%* zu{-jBF;?L>&OxfEI@cscV(FGEset!%5$1GC1rJb)jVY&hqQQlyh+ zeCJDGCEn@mVN%xSJV2T{tnG5@6P;OWdn~ZtvNrS7yNCT<7rZ1=>_CH7bt}5?V4A6w m8TP0?bKf90iCKdu0UxWPbcD`vHA$`}X3TJoJt^7sLH7@K<=yK5 diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemessages.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemessages.cpython-312.pyc index 773de3bc4ba30f95af4bd1bbddf5e2b4e2b2f356..afd632bcb2996b17a97c3128bb25b74976da56d9 100644 GIT binary patch delta 1245 zcmZ`(TTdHD7@hUnV4GdvSligx_yQO(H3kF*Ljol=g+PE@pzu^-jEf2d5<`kmNtKp7 z*eVTcO(cwj6gPdrYE+C?N>TqpU%bH^Zv|37$wQ?m?Q&5aRjJxBiSpFW!)P?;e78B@ zH<765TUtc?LXvWTRv5!3wuwLS?wEUME*P3~kB|8mf|Gu?Z#HmqIyf^w=k6T88Su}4 zIy>XO7Vv)-3|Tt@{_)`SqWjV%pBo)!eUtu~iP_7c*~wsF9@dMeWOc~%ZLn8Z41W+; zNdRR!0q~{Lz#NOWRSgf$KtT>vR7PokthDol<~gaR%hsx*Rq+XqtV!B=ybiboeMmnSnZB<)5B@PoP)e6vN@|ploVO>S621rf*H{@;6@z^^y)T< zmB+F5%8b#;8l9WX$&s|NjoCB^QtT(VZg0c)C^LL&KaT@#3AB`&i#b{APKcMvSEUgt zO|2+U5c#=`td*6uGNYwmnT&em_P3nlleYY3lbos;L62e$!Q)a zwlgm;iZJV*rGoC_siF+!U@1p@A(_WfO~*K}RvrytITqEc5Sa|`(kbdp7~>tu8{4-w z3S(F9>k`KA&-Y>YL*p*1| zIuIF%b#X+QU;|o*UT7lUCzw}4(w6zZE z#~N^8tB3t#UMad4Dv&L+I;Ih+0%tj+rqdh31$(A)_-Nee%2D!w-IcM`v$pytwg#3k zhkIfYltYFnWr@;wPg24Wo+BLC8yQV-pg>iN=Q>+Zy!B&)pI^U&1G63eef_TGu*SQq zYe`IPis;bV5?tDx3KyhwE&HS;KFEec-Z^dRIloydX3Ny~Y?Eu;6adQWnGSAQ-lMz$6wd>yLLJu{Yvdw4>Z zAxc=Hgd?n|hGGY7o9nKA_MZ_CR9ZnMCUvim`!S$zeM&l6(#iZhH=Qr~2ZL2#{GsL4 zwaE+b29p-&I;IZRFZF3TGKah!%)yoZ++5bd^`&o=h>=p)p3P-limYXtZatD|Uu@XEq) bflvkXB|;_oK*9xC3o=Y;JOH3PA6n*3I#2zzakMa1A@ds>vF+UN&CV)suAw-6@{32CVYd%pb2p@xFIi(T} zsbti&*m{X@t4N{h29#Df87XDes*7&gEST7?r%D!%)J2s_?O+hDsxJD*q}jEzct^VD zzVqI>@80=1CR>los2^!s1<;4*jxXP*j`7CThS8Dk%&@O)@?3J%C;)U8Ni6$mL4nBP9B{~I&p-YYCNaJZo}W+_D=4bdr>89>Kv>8S;rm`K&#tS#1&b_!8496 zZHB2p)v&3f0TCcLQUPznZr@IyKrxBR?cUwMPT&Zac~ytNLmGIhI@%Yzl!&0Bl~sP; zljt}E8rlFO?__9%q664Ghd_rSW5KwRcQoYzu6M!b!4_OX=Y&s*NU;h@aT61zGX2$} z2~h=%=4gpfhUz0DPs1BiwFZRf5SKUWZ04QKDQ63M6tWF|J7q>K*v37X8YKD76d0-*ypnu^8F5!0zpH$@PeLore+p<__a|N#K8~o7{v^=HlTO(<@Rs;l+oLii% zLwKMDRH>lR-!VVdxCED1YJ!^BfWVfYG(m=~7EuG#z{281>;LhWLOv&QWUoaEbZ1N@ z7@b*TD{pK~E~kuV<8q`zcfzkiRo0vZ8Af9i9S|r(mMZ6|@(krTIGMpve@pJaZ;@m4 zA}Oa0f9D4=VC*Q!BnOfm?yaS(3K=bfkFNb;NoyOWj&UZ>y`1rwT+)^Gu(@h9bsmdI8eV_Wa kMpM?hSg*jMiPc3*#2Tb6Rs)8OmK5x0cTu0qthLMk0p}v9P5=M^ diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemigrations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemigrations.cpython-312.pyc index 7b5f17b1d480b1921791c4b0b41f4db877b19113..f16fc093645047b19fb202fd254b603c7cee3a8f 100644 GIT binary patch delta 1237 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 diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/migrate.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/migrate.cpython-312.pyc index e063ee55ae6061a93210dfed23510c1001b6fe7d..e80f3a34243ede4b24d144c0b0cb7a911548b14b 100644 GIT binary patch delta 765 zcmX|;T})D87{}kkD+G*l5D^rxb3j8Op@V!W4r(+}bGjug$MPmZ=5#5AI`ht}=GrRi zy~w(9>ms!aKTcb^ZnP_1UU1|jI9t=ZE>U#o)$&>v`S|~zXHSkJHaSA^oh0P| z#|%LXt|(r}IuUzsERh;x2Oh>I6T>mKEg7E}NsNw?})DJ(X_b|@*Pp`o%y}UX2q80 zzrp!5C;%}{9hVWc&FMRb>YCZ!*Zw)*uG)5b1*r7LBAiG4mX9^M{{tCqg!hM+rRk@0 zEkaczX3k)}fYln@ajBSbMz@t4>d)>q_{F!a76L;P`s5le z6FQ z7*O_t0?70^sg;*n_dCN`MPyr!UInV*mYhfPfprOP$&fZ~=;nutt}_CFi)nC3R^>>V zCuxB+&b8+?Oip9xHTImw$7_6R^;u1Dro99KWjfUYrY=W2dD z;LyNHd4ZbtHk!cJ$b6A@=H2r^nTOFgX_Rgk0xZWN6a7FD&--m{EncahmE#s9XNch_p(e>7KQB_Qr?G?KSX2BB~ zJ2cVx)y=6~Dt}0eCzW`zz@-ZAlxYVp-hfusoO3%;TU)9P2KbK=*oUhFF>N7eX`(Gc z>4C5bD0Ux#F19_WSP80QL)8Wg!rM$x<=RQ0n=ye>0uuf!7H6+x2OU;m*exiNl1MPQ zQ7zc@d}QikuJMISl@GUXvB8fu1#~U`%B#|$60lQUdc8NhU-v~cUtICUO#taG)YU0P zv6k(a8%{tqXk?Q@HtBnlpPi}vrQ63f+ON?5r{c53WFprxw_f^0x6h-Ooo`92!x}4} zOFUV1q{aro@(oa=>ol5IXkMk)8GxX65EHv~)~B&yg$--0q_9$cqsn$?cbB0>7dhZt zuklfZkE*=5R6}tN{7)_~I^Nskg*eMP41nb)M^TK?0GgW1cIa^|pxNFvi~(_&B})K{ z;Y7KP`q&&V7Mv}*KXVh9A^=(BTdaeM^#p)&6%#xreYkmsZ~O+a$5C vSj!}SmDhBK&o4!nwOW00SK5Md`sKN)5C1gsvlaMT2!o`omiBZrB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2#I{V3v0?H_ g@qFRyB32zPH+Tg4y*j;meLgTVh+1zBka)ok08mFQga7~l delta 111 zcmX@@u)~4pG%qg~0}wDj_?EVj=NYR(t$t{6YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ727gF#@5LX#q%Yuh**7MVC0nSaJj)F(C^jh)$8+t M8OYz9Eb)RJ0I8-Yp8x;= diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sendtestemail.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sendtestemail.cpython-312.pyc index 0a2833abf63935ca038f14bead1362477064a153..f5474ede0541e6e7499909d237d6431b08f9fd01 100644 GIT binary patch delta 99 zcmca1@Iip*G%qg~0}ymDGNy0jiDvegsUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~J@Y{p0L4ZdGynhq diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/shell.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/shell.cpython-312.pyc index ba694668051ec2dbc223eebe198fb0d8269a47f2..ceb5447d88bbed593326c0344753f0aa1786b1d5 100644 GIT binary patch delta 206 zcmeyb+N#ELnwOW00SG!68PhlNu&{Vc)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t)D#nwOW00SK5Md`sKN!@^=vsUKRLT2!o`omiBZrw-eWAW+qv_PYis#T9XBMl*}i`ePCb| zG+I!0Lq%)3_d@T*z7u@EGXq6Fa4-vM-4T(PBfda(1IG@v%aV>4oP)25gnW<$=}qB@ t@5{exjADCEpRqqIhTo+KjD4@K+TF6NFx`fdLmK%y{*A-1JDw=Evxvprnd6ke1BL{<$^#^7KN#n`qgw=tx(&nGS zajeE35Zi=AI-KuFDJ&3KF0)YPnv~uIwi^P%)43*c%`jgOwmfQK)J19is{#f<1Elpg z_e&ZxGS*B!EM+ErMa|-}SinU!iy6f`oDVSWbUToF$;N+D@dY)D$%4}IqMz9q#N|5N zZpbQKmo>O3Yp_A=nykfSe`zBj202ThY2tF91lTymJ_|62N=}|B-OLQ6H!H{-W&{8m CGj?JC delta 341 zcmca){n(o4G%qg~0}wDj_?EVjr-s#_Nk6nWwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag0_#B*;cTE04GcFVWIK3oNGN_{VC7VuJfBOP8Axy5 z$>q<^#K1I}ODK~20~>>+(q{%`P7lV(8A3*~mnDooGsyDlPGGsAsCHe^1C>m^D6Gx`(zyAza2%_QFT_S6kq+lOQVI)1mdh-Zxh$pk ziGh*VaB_j9Br}lS+#_ks$k;XcfRvfUWi^XyVgWOXcQ_wl-05~8^OBAKq~Z%=0h0x# z<>i6S5|;zHTBF15hOE+cS%ZtR1{=gK%UXP5VByu6>?&;}0i-_w{iE?ofQ?h^g8+l5 XB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i$Gnpn0AQCQ ADgXcg delta 75 zcmaFQd!3i(G%qg~0}wDj_?EVj=Mj@ZjeclxYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ8S_qN0Nqa;D*ylh diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlmigrate.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlmigrate.cpython-312.pyc index 0bb54115b53efe7c09f2b842c287dd94ba42d2b1..a24e052ca178cdb542c39fc894a054bb8aac5cb6 100644 GIT binary patch delta 99 zcmew^(=W?&nwOW00SG!68PhlNJYn{jrXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAf+d^_0MmvVw*UYD diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlsequencereset.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlsequencereset.cpython-312.pyc index 897ed6a854d218b2688ae30ddeb084b5f7cce875..0f790f494f015b126f10841fc576643a0dd99b27 100644 GIT binary patch delta 99 zcmey!*U8UwnwOW00SG!68PhlNbTE0$(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tt{~40qB9k8 znQu$!O}?k#%6vu6bh5T$B0qz?*#`jzd6iE84~h)Z`jclXK4-oysXMt_$%>f)sP?4N zcloQlraOdg@bL9}bb3q(yDqAFQB?J^sQMKijql71d}f=UDC;t^0T~y0O*c!bcC!Eg D$_7za delta 239 zcmZ1)yd;?CG%qg~0}wDj_?EVj$A-JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~0voFYrHq~OYNQO@)e13Rzb zWGlr)ejxopfI(iR)Bl4aNWm(_=bSerbw4q%aJn;2o}y&M0%lxP`p$8M*YpDeBd6x% a)5?;}Kzj3YWnD%NAmbxQbhDIdHwysIph#o@ diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startapp.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startapp.cpython-312.pyc index 41d1d7a583cea376be61ca365f5ef67d2136a272..474e0e52954aa5e4a13fd95a6464def1f657f657 100644 GIT binary patch delta 99 zcmdnQaf*ZIG%qg~0}ymDGNy0jabWV8q90nET2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~3ez@50HY2XjQ{`u diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startproject.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startproject.cpython-312.pyc index b9a9ae46140b03dd371726fc720246d47e3029b8..9d4af3b957a42c69c6c1466f83d4d51bc37b2a3c 100644 GIT binary patch delta 99 zcmZ3&wTFx6G%qg~0}ymDGNy0jxy$4+LqD`QwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i$;{0J05y0a A2><{9 delta 75 zcmdnPwSKQA#yKO;3KC%-(uC?{pJAu~4<0K8}#3IG5A diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/test.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/test.cpython-312.pyc index a982125b04b09cea65e204fa2b006dd45ee7c84c..3731ac42b2e8777977bb70a206b1673c9f493673 100644 GIT binary patch delta 146 zcmdldd0vv|G%qg~0}ymDGNy0jQDF9%pdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8knSoDd@+~e!HXwb0S9>!v_ijc2$}TXk delta 129 zcmX>vxlfYkG%qg~0}wDj_?EVjM}gU(LO--PwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#g!vmAFmhVm5Ldb`u5(dbXGQd7 bamx;m@615K$#1z7Ie_#Bkc!PB+`Ab8IAJSo diff --git a/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/testserver.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/management/commands/__pycache__/testserver.cpython-312.pyc index 2cc0c22e14210b77ebb05168fdb16c063af514d2..badf3034f92fe4fe627c1504a32e72db7cb89506 100644 GIT binary patch delta 99 zcmca6^iGK9G%qg~0}ymDGNy0jX<_!5rXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag2J0XYo}ce%yya7bR^kiH|Oc3n#6qLj`RDZMM) zp%@NwME=XKqwIKhpu<6c{%_4FVjJjGt zrC^mG7+4j=KC&?BNX_(~;kv*CXqBYgeD0at*CjNsN@#v$0?JGdm7giV19sgf#HJ~gOtn#7O^|L0^OkvZg-TlCQne5W_}_nKY6pFzQIjv z`^(Y}J54q?&vBXWH`8y0@l_f99VQc8E=oH*5SN_5@_~avN`AidOzG>A+E*mCCyOar z3o%IPd=P*O8(xt#oSdQLtH>Z_^nr_kSN=MW>O~&a1*I!e7UW*zG5KW7Ag1tvlR;T~ c@--!U=A9*%Crc>jvwdX-I{)+LUgZWx0L`Y9tN;K2 delta 474 zcmezF+3Uq~nwOW00SI&t{7T!%77B;;oY(Li4JG=0|3r)Z`HPnL>PE=WYnzA-FMY zd;G@u28PXl<%<{@eJ2+vifZ3b()!FG%W8U&L#~5sg4Ydh(F@$NHzbv>OX^*e)VnNc z(Bbt!RQ@xAB&X@*Ws3SHH>~ZiNjq$Cp5rp#Z>HZ06y~kCABX~YJXy2;nknas$?w=q(2D24^ vC|!}VAom)N$tPo=tsgjnuA6*7$)0&f$(6}W%K2zHBa6ZeRoeb-J8@ diff --git a/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/base.cpython-312.pyc index 8d49aeaa6adceed10a5da62be6ed03185f53bdf0..7f269923ae9e5abffde20d2419d0f3d56551dc15 100644 GIT binary patch delta 175 zcmV;g08szTfdR3B0SwCx4GI7N004*q0cWucDHH(!lQtA-2G<%k&>A+Arxb7l)EPRH z9~FZX02({+8~_?9*BLF*87lZGiG0{|~Xv#TlK1OZW#j4m4k)*?QWuP(I%03$!MXD>_(0l1U2I!hYc5*mm? d*bEYnO^HpJE1+VVFVzex@B;u78?zoet_2t)G?f4V delta 202 zcmdnk$atoak>@loFBbz4=pOi$wvk6ugpqr)nMfwb6)CgN3~HQulb4DVa9otM`ozG? zYdcv&v{@2Je~@92(zq_Edr?yNx}?KJNrz7iY`j*J*Na**gXlM+`piJBo8`nrgc(aF z8*AEgUej>}4RpBThAttZda+sX{2HwWtb wa5L_mJkQEo{)UhgP$Q>yhtmxnp?=>^-4nXY`u;Z01UM|od5s; diff --git a/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/json.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/json.cpython-312.pyc index 31ed2ff51dc96f89f5100b92c294986a62618812..1fe11138886c22684d963367eb2a068bcfd318ef 100644 GIT binary patch delta 21 bcmX@9cT$h%G%qg~0}ymDGNy0ju@wgZKam9N delta 21 bcmX@9cT$h%G%qg~0}$vQ_?5Pi$5tEwN5ck4 diff --git a/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/jsonl.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/jsonl.cpython-312.pyc index 24bf26bf0a708f0ad76c30264dafdb33877e85c9..0eceeb1695b32ac636a462ce365a82d75e60f76f 100644 GIT binary patch delta 122 zcmZpZnkmI|nwOW00SG!68PhlNtYG%&)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t6P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag4|50EGX!Otnl5%MA?*00000hyej-u?)fz0k)IR5`-A>2mnk0Q~}c{RLMBN2dNpb zH`OUS$T-onXA=z!0a=rEA0h+f4H%Q5AAJ?nI8f6kQPDV1ura6suLi3I&^S=hlPw@4 d1J@@yvsfS*0RsRiJCk%FF9QG$8MCM%kp$nYC>{U+ delta 127 zcmdn$v(ty?G%qg~0}$vQ_?5Pi=a3NNrpf1pT0}l@F!(TrFkaILIl#VBa)bF*P3udW zvxRwi7!xN~$}4d_;Fb8y;Kj)5#yEMNd@cWFi-2qDfg220Fs^4?&30+Bfr2u}Wp%61 d40@bmo5K_&8JU5M$wi9#tYAHxmncqT0RWC2C-MLQ diff --git a/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/pyyaml.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/pyyaml.cpython-312.pyc index cc28ea3bad5b64ad00434ef97562bd81974bb5fe..d56a137ae4c9b3fa2f0f3dd2f1d65573c17f4e1f 100644 GIT binary patch delta 99 zcmcbt@LGZAG%qg~0}ymDGNy0j>16ik(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agE^{9b0MgMLYybcN diff --git a/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/xml_serializer.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/serializers/__pycache__/xml_serializer.cpython-312.pyc index 67f95560ce034c7dcc8c07f00fcbb6ad4da094b8..dadb54e1b5903d37f89c51190c312a782a163c12 100644 GIT binary patch delta 538 zcmZoZ!Z_gwBhP7GUM>b8=wM__-^g>5*<+G^XmM&$v3^QYVtHy-qP|Oha%paAUP-aO zYf5QyVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOus*o6nLJ+$s8>dJ^CPVi zPR7rZ!%Z60uc+H!7IV0$ZofcrLgDnX$z>PR?K`+Hh&eovlDjTtd{N4HgZp(Un@Oh2 ze6MH(e&J@*6Z^=;pc%wC!{Y-hgRbdy9nXt8o+mV~=!AS`WtNnBs1ve);|nu`tmX=d z%Q8mSWh^erSX`B{x&f8{zyZ?yiF@)>(=3%Mirzp?dSVY1y=OQAHA$*22%OD-T|)Pw zgzi-d{TqtjA6X~onbiY5WV`u;*=|4)_)0%?@wlwydC+A?;S!q-jEn8BD_dMt zwz#Tnb--n_ub8V1Do|Z6nW3W`ipI(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%4S^_K4Hd>lWoLvI36f!d}3f0G@iU#+<_TLZ+<6! zj)k#h@?IGYjvJ~vKsizK$uDGpa-!y&wPh!=Fdmt_S8BmSOY2;e2ARTXIC-%a&=gL?&Cj$-I2j*Jjy7q~ zysU12P0V3|;)KHKWs}P;h&gm{1BnMxa@VDdFG?A2aK9{N^O?bjQ*$zt=`#Dv8iC)r z+4RIda52cLeqd$LHNCFmc~QsngyvTxGZCIUB=>~jKx(M zt1rwzsn5)lznW&rUsm)6s?-yEAR`M@DXF?3a5n#S3Ehhlx>qIiKQT{kHmhd_+P9h2 zd^aoO%E6^2GFxVfW8%% zxGt`HQCxRL=4Ek<2`o2-#qsF;=2XnYxMOmbYoPpPQ43H&>P=w0As{xLcOvi1>=lZ$ z^R5c$egp=n-sY>WZETXA;1K=5#vmlp;B`Y#bh`XR`A-a-tb&vCeG-^~^yW)GcA@}i Cmb&`@ diff --git a/env/lib/python3.12/site-packages/django/core/servers/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/servers/__pycache__/__init__.cpython-312.pyc index 094b9cacb1d2c5c39289cafc652268b6f2503f49..f1010e09ab9f7a32c1499131bf5fe56743ea9cf0 100644 GIT binary patch delta 96 zcmcb}_>z(5G%qg~0}ymDGNw=DG4klp4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5(e0|3V}Ao>6R delta 72 zcmaFKc#)CkG%qg~0}wDj_?9-2$H<^SKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_831V78T$YL diff --git a/env/lib/python3.12/site-packages/django/core/servers/__pycache__/basehttp.cpython-312.pyc b/env/lib/python3.12/site-packages/django/core/servers/__pycache__/basehttp.cpython-312.pyc index 9159f74818b19be2e0f78427c60275d1a88b90f8..298c2ae06d0cd6ca56983fc3c9527ec0e2a7c121 100644 GIT binary patch delta 166 zcmew#*B8%onwOW00SG!68PhlN7_)nH=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9cf*?Bk_T_@KF zC`ewDcbLdMfptR34OPu4+%sG+2`GJFW>9cs+`Lm@v9N$C(Ec9{3?H}{gv6%HOp%#f Qs3OM9ASAcBOXVvU0Nw&M)Bpeg delta 151 zcmeB+{~yP5nwOW00SK5Md`sKNW6W+)pdVVCT2!o`omiBZrm>oD56nQp&1VG`3yWF-?fTKc@PUg#NNl>yM43+vOq?o{8&t%Yf%N8?Dqpz(H@7iM diff --git a/env/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc index 66cb2a9fcbc92a7a732cbddd6dd9aeb548ab6418..36fa20ece9fcc6bdb3c5ecd649b19e49277874bb 100644 GIT binary patch delta 116 zcmeC=`_IdBnwOW00SG!68PhlNII!qy0yzx~cLb!T^H1d8ATojfnt)jc%MA{m>l_jn sIV7%g$X(=+yUL;Pk(oizd~zMjNp)r1I=R2jny`+!2tT&OecVgUAH_%K~Pf7#LXtkW0)LU|q3 diff --git a/env/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc index a45c23d0d6641f0d18510e049b59ee04e9ae4952..5942c261d0dbfff2807f022d04579ab2cb116246 100644 GIT binary patch delta 44 xcmX>ecQlUYG%qg~0}ymDGNy0j3DyacRY^gG%qg~0}$vQ_?5PiCsD38?Bv z1H&yr(VODZGeRzi>nsSnD6aFJnUPobBLk3_E;2!6vkz}6E91M#hlE1?uP6n7Wo41! zdZ-jUk#7Ry1d|z}H~B?oh+I%LyC`Y)iIss@@TOAm&o3Y~7dRw7F#zcgTns!C7hOXy z%ZCBU1B@3G%y%eWR7q zs=m2Is)>~`cJg<5HKr-DlT{S-m>GoRH-{?dG70xWynI7Kro;1wl-zusIXaVPDd{sa zNULu?qm;_Tn-5gbz;HuMYI@F;oXO6rM$8Q2%9|@xQyF=~QKa6hL8MgFS(q(s!BP(d zrLPOBT@+NiU=wgbQ0=l{U<{9 delta 512 zcmeB)+8M=jnwOW00SI&t{7T!%Q^d_UcXBR3p|P+_!#6(KpIUaa!p{K5PCyE_PT(^MFEW!!Yfj*3YdHZYB&9$4YXx*xKtA> zW76bX@@ni8Wj`^naw<<|QqW@t(wmJHbeSY3L4!y_ro;1wl-zusnL3{sIC(WE7c1#A z1L@66l~S36N`R_>;V33GJ!fJLP@Yq9vbd@dGmzfwqngSn6oV?y#VI>^pPCUfkly@R zjfL675-k5fQ2M%{+C@RN3pN241l2AJ26nLBP}aQ0A2>sGMaXqs*NeKY2a-;xUeyhl M#CmD7zSdnP0LTuU$^ZZW diff --git a/env/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc index 6b7c25868c83acc867546a4361446ad486044f09..3e1a5d2cd662c8a75a1dc6ec3a7dc50b1869ef09 100644 GIT binary patch delta 20 acmaFC_=1t=G%qg~0}ymDGNw=DxdQ+>Dg`(I delta 20 acmaFC_=1t=G%qg~0}$vQ_?0%1=MDfs00xu* diff --git a/env/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc index 351a7a5e6ae4beee080fab4802352076cb9902fa..5ef37d06a5350f3e81fb0775309b618a1a5ea7e2 100644 GIT binary patch delta 364 zcmbPR)mg=JnwOW00SG!68PhlN+!T;=0CE}_ZgBJWTXkB^5WU1LcSlicg~@uGl{VKD zEhcja$}ux2S#H)8Jk28Yfq_Yq>!ykK!srFTE7UsOC%DaUzRsg?(ZqW)pI8yg6%+5z zn_I+Au|rrva%*_FJ}@u~b3K&Mp1?AhONOGd$@dN9xfnz> ziui!i$t;r<*hMDG8vYS8!>-!YNRb(+dUKRfEHh)(h#H^e@7078|xWUceZ`ElvL-Z22+#N-&6(;L#R@z)v zwD`op#A`Z{cLM8#vKzvZGomgFtKZNvncyx=uBli=mmyP@`^Z0#a2CAE^rd`N#Swj2E=GodUj2tk% zlQngfSs@DibyHvpxEUuO(yKrya?w|UDB7HZTo=%}D4??{gIBOWyfgedujXZ5%^Tv<)2k;| zU*}P}z@zk?nSoF10#J}g=?9Fx`61hRR>n`0H}VuP1JzH~;w|O*$iU9&&ImLBsCM&e z-UZBzK9hX}m1M4oTXwkL5m&e_u5nRZV}U86>PW_X}n+G4@QJE#?9? z$5q6J`y&G@rv=oQZV`Sa#!Qg3I>=eV;?u1sT3;8|x+tu*!gvGMWnt^@%#55i9~poI zR125*WG1k;pq`5BjGN)SKN8D9jw>!cT6U`^uFEC!gc3D^-q}c$Z+2A^_+XY^? z%{L^u7$r@CVS=JrYJ&<$v-u=x5uocBL9R2uz-zu)PWlutcM?!_1H)$y20`h`KQug< zf%Ik3zE(T7X8Ln42lo}jw^9y${-{9cv=jh~^AUs`aqSR!Ws~mE`kPr~r JJlpIH8vsCkg(?65 delta 482 zcmZ9IO-KSk6vtJ%n{;;ETM2%5ux-h1=j@4Yv7g^z;t0HFxTS#6I_Z=@@3YlAqS zU|0e+^j0&KOczEvF!Bu;VbPX@^`c(vO3JgO4BRBrbHb7`{PVEQJ+aKtFr^E@DVz|} zj1h#F(g0Ai?=O diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc index ab4e9ff9378139de4ab9dfe3b64a01d7f30104cd..e5f140cafa75201469a10fd364f1a3ee810c2368 100644 GIT binary patch delta 655 zcmZpg!1Sk&iRUygFBbz4bTBfeZ{+!-$rw4AQ_D*6vY^%t0g>rE6M3faeP?D6(!L<5 z^?{p#NBKJ!gtIwUD~6fTfAT3^W#-GgYLma|%JY0=VB~aSyw0n3fmdy_qFxE3QZUfu z28J8l{QdTw_7}L-?g%O^Fj*mSRnTaI%XJgq%O<{)59+H3+&A&PVB-7hx}XsdT@*Ch z{9k`EF3nO`1x+@jTsQN-Z00|CpCM4Qng0bdf1qX)Ai5}MviXl8E2E?}n$0%^MXw8L z0lhU@-dLXPzMvM+Lz_K}1K9bEAS!tU`=dLfdtxWAv65$J;FIo;?Tp=g!zzFgLxHW0 zJQq~KucB>}3w0zX|F_z^+10j_jWK`nd1niqOBz;RSy|+`9%@)!6i}HUGNEKf*bRQ6 z87iIiA6OaqgeI8G5WB>qa6`lDGwWs}mkdtEBa>(QR*78|Gz5nFbpaKit_4w71Pnky zZ#3D!&wv$3Ul81!?)P6vR}1Xm2fTv7kOl_*4Po)?!nzlQbvH0x6gK?M%*bg3iU=b} zJWQUR_>Er!=0%8($qSQ&IT`rWfxL^rm^zqL&B*V8rX(Q67)i;5l=<9@agz-SRMe-) zE>OE6CNqf#O~I~ zZ$)a2PwCO(L3*q#2300>AT=sLMoIND(z$~nG$2LcU-nl19G(Bt{(H9i)uvS@>h6mR#` z1r=sh>Fz8(Ve*NUi|_diXi&*!G2^EmhBy3Yes!HlyYqbE1dEgYtWUE;q7_P+q0|~O zLn;NbaFMJAtJIov?G&=uDS4m!6jH8;P9M?PQ)m}Fp* zL7{A%tK321vwtIftV}*n4sz5x3^m(ej9B$)5KWQSHxdfzh4Fh=Bs;qQ5e8ko+ieUV wgSQ%}1)gBKBtGU)oo=Dwn<;tGHBz1%9{3Nm(Zil* delta 21 bcmZ3=vy_MDG%qg~0}$vQ_?5PiN0JQyJiY~o diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc index a2565e889afa8677cd040b8c04fe3108c80fc6a4..3bae36218f1b3381ebfe5f66cb45daaabf1bb56f 100644 GIT binary patch delta 370 zcmX9(ze@sP0R28cQ?vW5J3>kQ&eK4&Fe_4u>s(4J;yCvPw^|ze1DZrzQog}{3@r^c zM8q|;HV5GsmtRs-(9)ztTs3vnTi)aG-h=m6g~wGW++pko4r&l?T?q>qe$o@ z2XakG-E8p;HI`ay&9#G_rqRw8`(`0<)`302S~wItQq5?%0%^1)LtS<9+_p4*{9L)!Sb2=a`=3hr!@loFBbz4=pOi$wvoq@m+`}7H{M5Lm-Su0F*E52-O$jU;5^-PqUVf~ ziTp(=ww#w0Ej}@Di2`{p;!C(djE}q^$;}_c zud^^doP0t?&Fu=W!AAyePItx+Yz#tT)8!}1Ul+8#C}@3I(Dow(E3YTx9ci`e(nc4h zjc$lY&2U-4vYvk>|8))9iyF3Hn3-gRJ~6NedNNK{k~QQ4F}^c{^h}PHl~e{B3O4#X z8%Xd2*tlQc*%1<(yJdfHG4@Yx(ePEf%&YK$L6K8of!hZr1zv?40wUK1bS?_$tO(l> zcOdMFfX{bUpzP*P8bXZBAO^eEC2q+;U?4Rxd=OyZ6S~eTcac{PYzi|c-{iNZdb~jT zI|GpT2qHGCn4M!$F=hm5_|C(?Y5YJ^cE0>f`RkH~7bOj^OZs1w^#8=b&Kb-&S-?7t y8OWGiX)PmhSr#bD!5PBX>D%Ep!S#l$5>OFu2;=01);XLY#z$tL>}F9LHg*6DS%R(r diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/features.cpython-312.pyc index 507b355dbbc92591e86f2b1338b19ece4a1c086e..874978b06c1ee4afcdb42130d149522026da4ffc 100644 GIT binary patch delta 76 zcmez4^xcW)G%qg~0}ymDGNy0jDddt^59Bm3d|+eX6Y7uejK9vSe34iA3a{$qSzJ{j d418)Igct-wXE1hFUEq-XE({ddtic^31^_hW6&L^j delta 81 zcmezF^v8+kG%qg~0}$vQ_?5Pir;tl_3y{;m@PUniPpCh>GyXcS@6owl{b4q$R^JJ@NQ%|HJqD|Gsbi-tW63KM)cCn-+wR z_D7zlN-;=iVo$3&b5ZtUdv3SBQ{Q{}VIk&$oZU>mOGa9iZl^vbe68B2^THcgr{9GO zL%vL7p~wT}@`3D<^bJ0DhfxQ=z+e@`fX@g$qv8nkSw@}ck|l=^rQAkytrNEYbMCqva4ei@65E-jPqE2G#HO40 zzy6Jtu7YC`D462baEM8Or#w8>#bvsmuPGg3_j$JY7bK7vr$GKHg{n2y(+hoWC@)5O z!FkYL49uEm);_;DG-tmyI_BbAxHS`V0A=0V>OTk{(>fVPJ}xs9I}Dc{NSma{hq!#i zyW7N0Oi1v|BNhPBTPQ^GMq{lJppu75J~H?6AsG$Gv`3}`Ql)9*A?Gvy*T#JfXxEM~ z&}L3JAX>2nGNT9Q&YxUj!Tn=A8HU&CvZ)(g?N;k%D3PrzhtgQ67TV*UI@!rgvbX8; J(0y+X_)~^QnP&h1 delta 512 zcmXX>O=#0#82-{EO_TP^-L_xg>ikBhXF}pbM zL-ZoHUN-Tf1n=`C%!~085^p^UqNFiybtk_}-^=^+ywCeS&(DjG`h|}WN`OXtd;jL! z!dtvj!3w=ms|2Y-pgs==es57{_9e6J`9|Jf-`noAA`= zZ@@u064UVyvzZ^4=62bPDTk(ot5#8n(#AdOov{8e%ysObR-T^O<+;?RhVP(SCT6|I zsLMGOCVd-80F_)ALTzJZeI(4dWz@{JtT5(7cA z@s-L|o92l@kv*0&q9#zwpK^!xj?l&)3Ctfk7zBjB za5L}56t?+Y9@8ylx{nK^*n@kNY5PHleN%(xZKS7Z%7v$6=IlL1cX0wFbD{L;b!0! z_{ajM5S?4VUD-HyAHqSoE|wb@`9PyHF@t9#S0V{I4>|=!MKR)(&n|gAuJN2Kpj88 zZnz|4w}E+PJCg%dh z**ps~H!v>FxhP?DLELY%lW{tip*7h4FJcUGYV+e}#;tI^ENk$Ml|=yPH_4m)5?@#u zct!jDJN;*PZb-StWBrMF^L^V6VaC468G(99Us##>xIQwlacX?vU=R|UEP2#s5dmX>+#Oub6UrFpVA;os2I3*1 zH~V1i2!t=7r8={xpzp4b7+R6w-xqpMrfWVr7yWZpE~Ugrc2*jIr3Hy3odh1)sANIm z8Ni1f0VQdDPHHOYO}xIjpl?nQC6$(u&B$g))6Sx5i$H(|H%l8{509$xL{)NXdwx-78?fM`-&ZR|=7U~{#JSGhTrJ40u+ysD$z z*oEG5uNiQ3PQ_J6PpZFMZ^mJ%wW)qaQFipO)1Kos;o}4V-yZ=&EigMyb)V?wO&tYO zM{=+n8_es5R;1Y{Q};88nFLR@a8yesUZmQVrD(#}YzF47*h+6mN=xecq`0IrGI!40 z$?JSYosZ4p(vRjH0#1t_m^+ zW1=-jPvy;tpw4c=N&D_g@ZAxRv-hvK7Dv)r-Vx>;;q2YKqjSZ@J{Nx#5-YAeOKoqh zX|&ydx9{Ud_Fm}8_VS@#F4Vg`!iTow750IC4HV%?o_%)Ux(x0?2lu{66f9x%^WFml zuy&vW`+P(}*N(c!w~`wqph7IS?+!x8Z^|c#0cH95-P)6q9%)#`1 z>r@LWJmek)das}YX8Wn=iD)LYZVLW~KFPkEZm1+vO%F{C&1!i=kTV3cxC2|3)GdG1=WgB-<^*FIkkD@nL zJIIO{*uCi5YEvy9g*xEcjg;rwv}>J%dD{@zIhc7eO}-;}Q$SDU~BErz@p`}|o3?~Sf&JCnU7 z88y9gYUgYytu4x2*paU5iq^;s%?zatykjfp*!pj_i@Z?Q3YVT@Z?qhV46$E!d;Gv$FHP1)D}k0dNy^1!sxc6zhq1S6It zCvC#gSlktLomsJ=!n0H_bM#g?X_w)-paydMjNmOn3ly5^{ZspSc@rmZD#&TZ*bRLY zP`Ge+*J$x8V0H7>0A~%XTU(iXy5U>{u(b*H&9r=fJ&JvNi+#9qa(aQ@1_cNYGgJib lq49mR2b05p=~-dU5YFDexIb^$QIzf6z>)_SmeQXow8GqlLFZ0=V{*DuW+ligni9bqW2b`2Rnc|d?kSwqUCakfwYfBYHw53z4 zsarE`+MH66gtzR1kcJVH2-PIg9h!r*kE{@=nlkw?E|b1w5Gm($y8r$&?p&d zxdW%VPjpMJPSMp_K{d=SoF9^Vht}$b$(ERvDghmcg*EC0c|K;>igmGDsGaE&UW;jK zngA%zVdV1UjqmHt@SHDrYU0F%sI6TKQS(6@Oe{Yah94XOO}L-gqsy6zub8Y|eOKuQdx7QZhAwu$~h;XB!1 zVQRVghEN&UQuCm6$G&&^7W<`SznJV_9+Q%fi5>fd?4Si}N@II(2>W+dSbTtt?EQsS z^nimpvy(`BzefXA8py8K9pv$S7KpJ!O+^pU=eDvNG@uv!;Lwvb$YmbB78)DBGd=Y8eA59E|vYDkkLipURxbEF{aWM^wlA z9YRPedz#L%G|e~QSE2sXwO%0AGYtD{6F@`AGUvZG6eR=v2b#7 zf`0WitWL^$yyN`Dxd|zr730}YsG5LI_P6GD&Ws)zRn)(d)}tVxkmXE2{`17e38`mH z>=|2g?OxQ)?>senab9kT(@Kmi`MW$UD=wDtes_RXUQ^@ z{{|egYs-965{?}HfWp5alP|r(h}NK*vK^Rw^pY1`+<^t|<(L!ym~>FtYpwI=Gjs^-y4?V2jMbSdEw+Xo@i zkU^^9Kq!E%N|V?{Pyy3rX1P>3x^xWq<^JT4+-%{ zLCg&QudXyPDo_}>CU35^o5gKIYrf%y9~S7dx-+_xZTN( zUFrH-kNjli%HI24!7vA|s$K!;yE>$;t~U*5Co@;m6i{LH>KirMbzgG@X*mmd;@vEz z(l_7znNG2zAoQlzY$xrjSrgC=3t}5&AM`TjTFKNk8?A1|R&sJx(XRXBw@^LPN{+tw zu?~{rkNsE5t_2w-rr!Pf+IO|G6BexM!DrXDS3Su5)e^;Cviok%3R#LL*DT3G7MkKw z@@UDD6yCm@qww#E@7{Cw%Qu^|lZAW!Y6(~GeMsX!@fS3>mw`?EvgbJ>=3K>}(^#s-f8cX0esZvE+onF$lJA#U`^?Dn$b7P3 zyU8{~yiCiw&B+hX4Hq0zV5=C|`n9sfdn|sj9wYuj1jqT)L42tGo$}4x7Q%TA-mgkNVU}YZ|C@(mxD^+So(t76RGd(VlDFjODj9g~woO%0A1J=ujTMZ4!autmKOTiX^+TgzW)$Z~ nW!5w^JUu*blN>40ky?Ce=|I`B>n1z00jV3s#eZza&4$kbge#Kk diff --git a/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc index 0304f056515e1dc7ac06d6d1f120f542fe981156..5d31ab933e2a3335de2b319eb3accbfa02d34c2a 100644 GIT binary patch delta 74 zcmdnQw~3GEG%qg~0}ymDGNy0jIl!X&fq~hC@1eZw1otn@41y9fSmyK3jI89& d9j4a>96vGxPh1G%qg~0}ymDGNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007KoAr1fl delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/base.cpython-312.pyc index 53e876e54995294bf790c2c4620457a01ccec4a5..135c515003a18cc2fc74b4cf189200dbac354690 100644 GIT binary patch delta 99 zcmew))+Nq!nwOW00SG!68PhlNxG;Nk>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Z`m_M-t02z}Z A>Hq)$ delta 75 zcmeAY|0Kq9nwOW00SK5Md`sKNi_@% diff --git a/env/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/features.cpython-312.pyc index e75cc58a041aa6557b586f75797fd775dd900b04..4da9756c3711285698ffb2858b4e4a2080ab7e3e 100644 GIT binary patch delta 98 zcmbQovW?)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?Ph1G%qg~0}ymDGNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J007KoAr1fl delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0EK8V>*f diff --git a/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/base.cpython-312.pyc index 0ed886c7b881e10bb1fa041c66ec60c7154ecee3..0b6ef5636ad37e0bc8e995298dd57d66055928df 100644 GIT binary patch delta 518 zcmez0$#}h!k>@loFBbz4bTBfeZ{*Qs^XSwMElw>e)=x=FEKki!)OX2GF3nBND=F4@ zO({)IEXmBz(+^Hg%t~wHfOS}5S9`L z8vTOdM+3tJ#gL0;!5ah@sI4$uss&_j){rt|V!2`#e0g({%uE)>nUnu06lzV8U7&VD zKx{hSM7|j%^DAdou8_VgZ+b<*>^n1qko*MM56lca;`asRCdh7HqG-#kqX{&>f#C+P z;B{WL%e-ngcm(?WJN>Wos9oeyTTpd{#|Ws8PaPNaAAtP`^u`rljmi8L zsz7IIPByo2VFS_^cr`XRTa+&x9GX$rHEsUEiV11r@N!(=-lgs=j R7dT8NPvn-~%xd$C0|26Krq%!e delta 571 zcmccK$@ssMk>@loFBbz4FhBT~wvk7d&7e>}v^ce>SU)?lC^1hjDI>8YGg03qwK%&Z zzd*kLD3hO;n4_POnv;`Xo?n!cvbm9Mg|N5?(1;fdKN=V=DTZtiT%fkXaH-Zs#gNU; zQf5pnm(7B&Y_64=$-=m7vbbWQ`DED-42-8e&x){71EdGO|J-; zeP;&BffamUX5bP3&IIFb-lS;DY-$9wse$1Jui$lFwTrxJ9~l@qjc@P>^!s=EU*}P~ z$fLHP>I#n$&=5}J?;ts_g3Z#Zj~R_1T0ihG@Co%tcSd)|0&U?mpOJQhN2uSg)9-?` z=@lN3^_=Dp_=Uf-0_n}#>h~EL6DD(OYUo2;Z4Gzz1$oOW0#+c`T7O_;P&VvvxymE| zogKsl`p$ZDl;&|Z8+AsIYd;7eS*gb<1+H@#g4LPOjat0UW46e)BT$Hof5q4S5 zWdipNIn7TD+PqSegALrdE{m#tVpkEA`p7VOzJUwJWo46341A(elb;!w$^hw)x*$1z zpz81JK!d+C0Ev$vVzZ&)Qa14pa9}-v1=eL=jSmcboGO!Fn5!~_XaNfs4j>H{+#F?5 k#)K4+A|?wMrv%RsoE~;j#ANadtMkl@uwO)$nG%qg~0}wDj_?EVjCxXqOSUJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~4clxs0I(1m!~g&Q diff --git a/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/compiler.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/compiler.cpython-312.pyc index 0c420431ceb9ff5ea9c04480a313e2a7ac38f753..c205d2df2f6421e26d9f0a38c88f7d6e41c6de38 100644 GIT binary patch delta 171 zcmdn2azcgYG%qg~0}ymDGNy0jk!1Gh)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7twN*H-F}LU;+Rp<~d0K delta 150 zcmX@1vRQ@aG%qg~0}wDj_?EVjN0Ql~R6n#hwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?345T-62skhS07&&R A6951J diff --git a/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/creation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/creation.cpython-312.pyc index 5b9bdc1f324feed12465c194dbe90c7e62726d7a..74eef97a93f99695610614009b70f555b972f834 100644 GIT binary patch delta 237 zcmeyY@=Jy1G%qg~0}ymDGNy0jDP!{J)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t{B21f{MEC|nd!xGtb}Q9$jAfW~)zpu~4}pt=tX VK;kzxFG%qg~0}wDj_?EVjr;N#JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag6jLwFr1OTsdLJ|M~ diff --git a/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/features.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/features.cpython-312.pyc index 859ce20ac6b1cf03b5cc1bffd6209e7cd5663818..80844d2c02524092de9491b2da91a7c46ca3b864 100644 GIT binary patch delta 99 zcmcav^s$KNG%qg~0}ymDGNy0jF=O-S)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#i|x4)0Q0^Z{r~^~ diff --git a/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/introspection.cpython-312.pyc index f81e833f93b6ea4776abb2972e48fecdf524b8a1..e596e2a67b42bcba68d06a223579983afa16b88d 100644 GIT binary patch delta 517 zcmV+g0{Z>=dV_lm%MA?*00000hyej-u?&m{NRlsAb7gXKFJxk2cV%i}FGO!+b!}yC zbaO97WOZXV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bhF3@ zr~?6KlW_|l4b&GX^92JC3gH(hkOPyO3o8ZK7bx)sv&akD3jtV@qZd#V)G|ZUA4JhI zL#Q*L1E4{p2GBA?lLQ!H9n?Ea(-lq8J4~=NkYt!Kk!PHEs1%rg(H1VyJ4};*7(fHm z6ehFB7#slu02L>*<{3=^7C`_20Du748XnggG|?I~uvWNQ)*48YPa7l)02@gG@CX19 z5{Le^1+yj}pamWq0002! z0Qi6a&=FM8B{-Nxzy;SpQ`10GlqJz6IJ4m-4FLhDlkX)e3)Cez(-BmN2HO=IlPM-^ z0{|8rvzI194*?^S+BGZ#);~~_4mO7c06+mz0h5?EC>zu!RPzG@7Y^AbRG4It1eXbu z3D71~@B;u16qDFCI|J4%J(C+ZWdi^$K9hqtG%D04H}eAmM*#}iCO4oFh(U;Ah;fKT zkWr9wkyVgL(+nKYCO7m00!IM~lj1kx5&}m73h*ib8z$EpEYTV))*3F8+&CBm02?o} H_&9+C^<=Js delta 532 zcmZp!{#nIynwOW00SK5Md`sKN)5C61r5{?HT2!o`omiBZrLijflh8S%-Wej^cph_iOXss-2q-u1o1$l+w8@rT2+}k<)>(!|RTU#tNwoo)xv I$+D3J0KR^&@&Et; diff --git a/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/operations.cpython-312.pyc index 5c5db3ab42be1e8eab1cf5cef0e4f06e061fd57a..13bb632c84191145493c47131e06b259e6328536 100644 GIT binary patch delta 332 zcmcaMo3VKgBhP7GUM>b8=wM__-^g=;&7)sGv^ce>SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(Y=F2G;p` z@KHn9BX&2Lq2GKv?09rRI%K}q|wAg2J=M*$#f0`KJ8>R#+0_<-z>f}7Pf7AP>D xoqWP0U-62f%V$<*L7|6=E;Cp^Ff)kCEf8O!dO^Y9vWUSAMVF7Pn}a=@Spek5XJ-Ha delta 287 zcmZpk!+32rBhP7GUM>b8V1Do|Z6nVGHiL5g(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%4QYza7pQMpb-rW5BWuJ2upt8V~|q##>+0u^?`>$ zP;BxH1rs)AAg_ac^HqgvCJ_gq+8-|%el#$AVqh2N11b`gpPZ(w&B6@iZJw%Z&nV)D zq=W;ggb$?Tm5L<`Gmtk~UG)eXP?xgim&qSh#o2(eK;~vXwVRBh*BVXpSqRTf{Wlo9^PQPNNNe&I z6<0POeL+xjGoxxFvw|$h?iV2IFDSU~Oxq#2K;*ij;YCHm4T{$lO?IYjUZ}yz$hv;fVgIuZr delta 216 zcmeyLb0>%AG%qg~0}wDj_?EVj=N+p-v3_WAYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ6WdH-#=yyUBqjJSnz&yV_E>1Uz-mR|B(KYxIi)6X zGB!@0qr8vfvY_S%26kSd$+0R%9N#(FRD>Q%s7+p=qAJJ?WM2?a_{adHzcYiB+)#1l z0McOfo0U}?ndN1GF8uL=;YS0*B?Z?Vf(t~hD;i!@G~A$gUD4#Cg6rlZ8k~&GJJPOf JzM#3D2LLRVN>l&< diff --git a/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/validation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/validation.cpython-312.pyc index 61c15e88df9224c1a8dbf009ecf8bc2d45c3fcbb..7d5f72ea4a420a27b34ee4d36dcbc549fda36f0c 100644 GIT binary patch delta 99 zcmbO&vss4cG%qg~0}ymDGNy0jxy0zvuOC{RT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ8WS%M0KD582LJ#7 diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/__init__.cpython-312.pyc index 1cffa3fc702e1cac64e50f23772b0c7eca245a49..c006e217ebcda506d05198f57981e1f54a0e9bb9 100644 GIT binary patch delta 96 zcmcc4_@0sHG%qg~0}ymDGNw=DG4kls4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J0szf#Arb%p delta 72 zcmaFQc%6~wG%qg~0}wDj_?9-2$H<^eKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_698>y8WR8j diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/base.cpython-312.pyc index 1bd7b1167d2065b46ac9cf727dd801bdd0207670..2888b00548ba2fa62d9a0036c6c0ac91f8821064 100644 GIT binary patch delta 1111 zcmXw1ZA@BM7`_LPTDcd+i^^9CesBv)hbX9vEf#WVm5(7)><1}0Qd(4se^=-0^sHzyk0Z>ku|&+Us$xp-i^K=pN(4a`I+V0@x;=i)e~Eu zi7vf2pRkV2MCalQ2G>k97Qek>_4{$F5X|GV(ZtR9(S`Zh_{d?f+2`MG3)p1S^|+Q}{+O9W21uD={R$ zD5Nzq>Trg4xHb{5RSfr62I7W8I z=};D=Kx%-9rY~pS;AAGQ*2FqSo-+-$ZY9u@E{|SZP=}eACnMEs1#_pb&Exrr9N5-U zAzDJmO6uPH1gZ9?MjK=vE z8>h7868mU?g#&-`XyEj){=)CVXdZBgs(6*qf@gm76C&^f_LCA z<>dXKp%!Yjo`@kWMwWthq*^~Tm}%@MgY9*>r&?ybqj!OKqI$Q#$Qp^hOn*VvUbgi= z(Cz8I(HGFGd-`1^t)N|mi%4#*Zmx35j;wwky~@H@kGpI<+Oyk7MG4ndfDF)m93y|b zP69qA)e~3Njyt<~)V7OJA%VM`Np7xe`e`hMv#6~MD~R!QAniFobUV!z9puCTuMx(| zdbV+@=?fp-w6C@1CQ?3DgTIhMnDy(W`>VUFxd?9^DHy#kYQ$RkvC+F35Tx%2lPI*A zVJi8#pKCCcjoy#b9`)vLW$OqZRmUs4a<|S*c#qtHl6#DEj}_cu z;oY0%2ktO;(YbSn2DBqPNXRl_uAz-}hXs8ECG|H9%7VqoqeGmOj-pse)d2=?Dk(5-IIMpROT2yuC%pCdcRI3z{ Mx1BY3Hg&J|U%zCKDF6Tf delta 1196 zcmZWnT}&cZ6rKU3ATv~)5fNO)AE=-fP}JR$1to*K%TFy?>8`~-(CTIzsjh!%b{n&# zeS!4Bv11}_ZFWo_IwnmPGfhg7sf$mOnji5KJ=x@U`#Q6XnJA$lcw|VoqOl| z&iT&0_mrQ&e>{PaA5pXs0-wD6+noa>)!EUhHxsA59`{*)S3UhNT0-DeQ2ekl`56Qo5%Z~+po4$;%ps}9nx@k9K;B`Y42u7Vn_ayJWUSCpIdU}mj z8TcvHnBS{4tV5k<-|l%Ta|}Eyhw22>%Ar=ksNJG%I8AI$Wu}UVwF;cwAW7}6Q|!9+ z7}k61Nm3)EZQhJ$;vc*&K{B<6iuZM(AXaOeN)6al-*>WB9H@VRE>h5uAxux~V%g{; zJ!c40xBKr$g7r$}zwLRnuVxd0PcZ|KF!3O1ZE8b>xyO`@2ftixTKUI02L*K>Zo0(x%XTSwgp9-gg~QySQxp+ja=hL zZdBzmBai|(8FW!)Ck~&p7fuk&lr7NFz_-Ox5E~3+m6wd5)r-H*LFD0G6CGs~%$(3R z%o&Ie!x`tTnji&9GPybci(caU76mMFFqcc@b>zhMyR?g*V+g+0#o;cV`ZnAq z&%at^Pr{_k^|XEyKWmyvPj-3BOOF;cb`jU71ESG#2FX!3sT9rD&yhXkGwm59)43^f z%B%uWk^_>;Pq|zFRi2t{jFmUL{x4*^UU?7pzxYn3f}xqhKV`Apqw}$m;lF z?eWI`Mn29vZt#|1wLxyu{)Bgd!Ve@lq%&o&)5{-)xu!mFXp=S_sz4w-lvI!}2$!&6 zu8|DUjXd68z=AdZVA&rL{5LuOP2L{^FRj;tm)2`fUhwWcU|?n>=OH!O7}wM-)wuK| zxGo?8Bh$Pc%etvJhnO<~(AVJ5mp!>VY(GEXEnz--nY>NI)NBFs)l7V>=T-%V7pTFR zVKt9-JsV)^%^3^wpW)n|S(d?hN;y0B+F`uZ8$E>SX~A-tvs}*WjxC;}-YADh(`r$L z2&zs_)k&+1D*GwgSuZJ9YelSe$Ft=TFgu6Y#io|Lt<*~7qFIGt7~~9tOybz!Jfc3H Q?NR};1OZ@wn0=)B69TB1mH+?% diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/client.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/client.cpython-312.pyc index c6148eda23303f2f729b694aef9f4777687df7e3..7eea0173de585d15f2041aaff157c8ead594c035 100644 GIT binary patch delta 99 zcmZ3$y@Q+QG%qg~0}ymDGNy0jnZxMOqaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{p}2gVc30Io0_F#rGn diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/creation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/creation.cpython-312.pyc index bba5a42703db6ba667b439b494b808dc55e62863..2a99cf0110dbd8182ac08adeacc8be4bfbcc3670 100644 GIT binary patch delta 246 zcmZ3tnQ_@>MxN8Wyj%=G(80)SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(M6+C0?lhp68W?~QlFF0sS?e+b>CJpL3uFPSrAmPS delta 245 zcmZ3snQ`4_MxN8Wyj%=G!2IA_+D0C8R)aGA(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I0p?%RG$jljDVyI4|?+eqe}X2( z^qh$c#QF%9*nC&iLxfR$vYJ*4L^TIzAmikJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#mN%M>v1js4VI_{sys94<*f}L8{}Ybk0McO2<^&OT FegO1MBd!1d diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/functions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/functions.cpython-312.pyc index 584abc7211bd54e0bec9fed1d62e464d4bea4038..3df3154fd7fc898f38541a8f2c2161d15b72206f 100644 GIT binary patch delta 99 zcmZ3+vyX@8G%qg~0}ymDGNy0j$z$^9*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag5K|2^0H?DWoB#j- diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/introspection.cpython-312.pyc index b92a8057fa3d6bd13787d7f364466af8ad6b1243..ed628351713975e5550f6bb06c4068b0e2961a46 100644 GIT binary patch delta 365 zcmdl`b)t&rG%qg~0}ymDGNy0jxyI@-SwFNmwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i#8%GAm^itM zTb}odxW;EzW&y5;;u;f}CvV|aWxXM;@sV}&ZSEDkjGU8OB-2H%2r7M7782$9$N(ag z7=)BR3Qqnd>BFf2WPVU);1rtdBNfklMMQ1#W~sx>45I3rE2XEhGA^FXuUN?XS%^VM zZgRJx8Z(gIyjAfyGvoBhwW{WVSM2=1a9ENL;CQRlx9qt>4AX7Mkz)7#k<6 zTj(-hGjpFDW8ucaVD7;KQA#yKO;3KC%-(uC?{pJ7F#*1b_~#n28IV5eEoc#d>@#Ed3nAti*j;(Fkq07 zn_fS${<65nH&$i=t_K3blh1LhGJRs+{DXT1FC*LJg_7y~mj#u+D+`HoePI9+AB85% zNcpfa1DPG1lMAKdIWCH*ePWQ}M%2q-aJ!!Dl6lv$@+?g+#iG(gycRkFmXCF zPF||0#sXq&KBst`nQ_wOX{zQzm+kz&bF&F>eP93*AGsI=tta18wPE_gyje-@6BDER zWKm6Zsmr#0*ZBQ6Bu`+uE}(f)Ky!uiio}&_R|O0&ZI01=$H&+^+1o;wtGZlH<;%VcICz4^FhBQpTsrE_Bd diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/operations.cpython-312.pyc index 418cefdd4760b89eacc1d700a54bb3a252d3fec3..92b6ab4ffffa293f1f8b82a7d87062eb37f30413 100644 GIT binary patch delta 795 zcmX9+OHUI~7`@Y>r4MFGJDomx6kDFs)PfFmveFtPq3pCtmHF6 zr~x`GhD~jid{Omrp5b|BZr(F_H}a5)MLa$6=;AapvoP-oOfE(v3-{wQo^UksfSI%V zqmfBw`jKZ~pvQwiyeAf!nTp?@i^rJgf}m0-ox~`TUItmcfi2F_@X&n?2gVw~<@t&^ zt5EAV__qv1P;6F9MYx&da7hVDsbdWwN+lU0gi0@gDI__9d7-K4rwscJ^)1b@bnD15 zF0<<&|Zj$%%4lcMRPZ_F{ts^21bfzPKMvfIgU&i;o?n&$Fv+e#*9oro{ zzO*H{?OPv9L^qpxKOg0X`TDi+s{5mlQ=}}xeN#Dq@2z8VA!F)*n=MWpm^+0`i%ElR zz&~9yo}+EB#D51_DHEprKNNKA+$EuVGO;p|Asi{fktX0oUq~&1T2*z1s7?~X`#wf_ z>!qxa$DWqXQZ#$>;Bx1#&9}9bVEDj`{?-2Hq0ObF(wwyU_Kg>-QYV%mES<6CM)dYNR*<1JXv%Od!v**@Q44nl+u^UF#$r)l5Tv0Y zT<1;OLwR|Tg*>o_xV|i9<8P!WXNGD>Q4PCPWAaj0it0L&1Dz#n4~cR>7=>7vz{!pC zz{pY-&z0A}$0MsasHhccMo(neH)tQD^*Oo{`KGPU#-EO7Xjhtc!NIXtN?>#syxN7+ zF$HbHutJ)W8d&Xlm7+q8evj48$)R!9TcbcwQ~{Mu1gImDKu59i9OYoUv$Tor-M?@# a(f!5^mu9cxz~P1OX4`OJa0=q=spdZq+yVsv delta 830 zcmX9)OH30{6n)c2hfeDZ(@v-D3@w7CdPl*Itx@SvCY2GTdUbduoED-< zQWK)vZl5y!+P}8E>25Iqq#a3!yn&22q3$-tHmCgZ_a+u%P5s^Eww1g+T5_w1 zN1T9M9?6F6oJ1nN*Z>x)R`zv_L5%91jvu5re;f#He>m}AB18K%+P^^ubWlmjv%LdU z4nJ^Am6ZCaH*OhAn)2}-P3EP(?CI8T#cip$(*3M|rT^(by0|TE@!)&gCCG8frdxr_ zYXFjJmAX-=J`;*+p(tYcRi6$)xS!YqrZ8gwGuJXdtDiCbS2{g^@dH`P` ze;9n=+=H0vK~NGtD6$kWIsa8SPnCvg$Q`GM7*>MFS788# zDv@7|u0V|Hh0BMghMnW+jmpW@(G4gM5_%_!~3g{05+@PD1KL jyj$woK2?+Id=WMPMc2r86K7!_-zUx$`{N*Q delta 74 zcmcc1c9f0hG%qg~0}wDj_?EVihsmHyKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld?I4iIWiklI$69 diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/schema.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/schema.cpython-312.pyc index f736cc9b5035de681e9b8a2a0b703987724f06de..f34456d0609f09593eff4f43ac834acd3948ee35 100644 GIT binary patch delta 212 zcmX??a4Ui5G%qg~0}ymDGNy0jdBp0`qaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ8QVe;#-E#SNG)gNxGd%SiGhVzY;u!~Ei;hbd|1Yp zTe=u%egne|UcvtO&iL!R$`^T+FY~H?VBq1@nXIM}$n_n>`UE02H))tMOUL0*&(5ha U`K-1LP(6_K2}Eob(Q#t|0J2Iyg8%>k diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/utils.cpython-312.pyc index 8a30131db868c74e89e3b02eabfc215e7e41c2ec..e5db90775b176fb66bb8ea57f1451bda0b9b0662 100644 GIT binary patch delta 99 zcmZ3ba7cmYG%qg~0}ymDGNy0j(PZ)H)(JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#mgOin0Ht{vlK=n! diff --git a/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/validation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/validation.cpython-312.pyc index 0c7796d4847c33b1f934797264b3eb0dc82a0c45..d34bbd461255d9e717b52d45a6d05b91ac5fbf0d 100644 GIT binary patch delta 99 zcmZqVn#sj;nwOW00SG!68PhlNd}Z>OpdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAllcN80IjVWumAu6 diff --git a/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/__init__.cpython-312.pyc index 418b686a6a1dcc31a59f734da40282c8d5dc06c9..41ef6c89aa968facf67b78c0826feb1a84ec1b98 100644 GIT binary patch delta 96 zcmcc3_?eOCG%qg~0}ymDGNw=DG4hzCA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_7XWZ>8Y2Jz diff --git a/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/base.cpython-312.pyc index 91a46701815dc8e4111e23262095558aff5bbcd4..25ae08775758ad0c9826583fe4d42478a2d991f7 100644 GIT binary patch delta 672 zcmdmVkn#BeMxN8Wyj%=G(80)SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(p=1i{FvShv@s51GWmLea6km>_r@f-Xi-`Ro8&7ZW6FtX=@)!&%x zC@M1fqK+uj6~W1Gbuj$LjKOL@a53-+^+$I`_r%UfyTK#W@7L*fLE7pHk2RcQd4?XS` zM#i|w+4d?5R|GXzgxwGjo6a|pZ${M>0WF{vLRvrrMI^p+16iB5*negDaRJ|gozQXK=n9L*|kXDWBg6bCq)h9o6wPU^}r$1TU zt=M2r?25D-N*c3#fC}Wa=f}>B{RIpiN!j^aGr8vS{FuQ4Vf?x!BKbj?LEd2VRksC< zLPlV(Jpcy-(7#uCH756XNN|5-VB|Ev&Z}{OS7Y-!j~Wifb(6INotSUSC`>L5)MaLn zRouKZFp*Wr5E6=lqSNIj$}Ql$3Ji7GaB+}!UgPV6TEL*+Y!|+iQOE{G9rIOSWdDv( wL3WV|k@azRjKvqq#lBctc!f+#Vdyu;-FC^fLWCs5wuf}q3ZgHaz@0ab6-+yDRo delta 742 zcmaEUfN|47MxN8Wyj%=G!2IA_+D0B0c7rng(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%H|061+rXhKqDF$b_g~wY*L-V%2+aas+J|^WkHn> z42-;fjFT^FDGGoX4}`^U@QZwB2eCJ4A7NxHntW78pB=1_iFfih9ZdlyUX>4Q3?dRB zb(}!XW_{h4ObU%)^KWqT_uF^cU*J~zz`-CSc3n{GqM+7C22Nh%$;Jl0;z0TXi1UGy zfk*v22aLOUvVjJ-z7E6$Ucu|UY8QFcJ~A+Jn%vMd?r`b%@ASXIqxPK{DDWL53YOaZ z(E2K)m>pQt2QCIaq5kO3=Kq_T{4&jvrI)qnt@_tu4j>~fTpBRLB#U{BGTh9hMf>Ba)McNG|jafcG)smV( z)smV()smXOfMF*oJD+PN*Ib?-Ggu&uU$;agKPUsWZ(i)SfYH(n?5PK^khsjN0rIi= z4Po)=_7m-|3#(rgR=+N6c2U?26ei}NFfsoGA~sie)Nn9vp8PeyiQ|Th!Y2kML4(Ow zfx65K*iQfko&!jmC*x$7C^fJ) OPp~#m#?56>A6Wr5E#7zl diff --git a/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/client.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/client.cpython-312.pyc index dd963039b7bfbb80f8420e8cd6cf141b5aea0ca3..3df64e6a92a50a181518006ba921e9afe364e766 100644 GIT binary patch delta 99 zcmZ1~zE_;*G%qg~0}ymDGNy0jX<+r3pdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag3hPT&0JB^hN&o-= diff --git a/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/creation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/creation.cpython-312.pyc index 2365f092a995922611e9506a454821d65a114d6b..0080644be65f5d497cf7952bf1d12d8326c962dd 100644 GIT binary patch delta 133 zcmeyW(W1$7nwOW00SG!68PhlN++y^Yq#s(GT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k# fe=E}!-pP#uGOP@IiWhh%FAJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YqkLeySW8h?7fmW@{yb2!}gg6xzxP4#}AG%qg~0}wDj_?EVjCy>*iNJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~DW`@o0L0oFrvLx| diff --git a/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/introspection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/introspection.cpython-312.pyc index 9dca2331461066d1e29d73e615690fa817815e9e..a0a97ac1a68c9ae4858ae78841ced22e80d263fb 100644 GIT binary patch delta 363 zcmbOpb0CK2G%qg~0}ymDGNy0jdBWl`T|cxqwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lB2z`BNoF?{k_ zPI=uc;u@b>Sp>Kqifc?@zQHdv!LYMzM#yzpgNs1KZ}5ecfmduoahLxMagC3xn?<-* zuro0;PTnV|E`Pt%koizcosf+sLfaGc0CLwH8uOtA&R3j!C4U69bYD4=n{#P#ClBQGd+gqG%qg~0}wDj_?EVj=Lw5Jy?$tMYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ1?w6X#-PbhIpw)8i)(yiWf9GKLG&aoeXh&Aa-W3dIE6kkOg^TyluaGT{9w1aQ2RU+ E04v36t^fc4 diff --git a/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/operations.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/operations.cpython-312.pyc index 2092ae6ca9f58000b05412ebf33686e5158a3f89..af92776f02dae269ead440b42ecc1e05d9844e66 100644 GIT binary patch delta 459 zcmey@&)7GCk>@loFBbz4bTBfeZ{(3?@|dC@TAW%`te=vUSe}}dsPB@WT$-DjS5mC+ zno^paSdy8aryrc0n3Gzh;Fz44lA2qo@8jd54`k%KWF_XM=LZz!XQd{WYz}Agk>OVX z8vWx1!;c1r3!*_M%_eV<6Jr8WC*^K2pESF?d6|3}lR!C8O#{ORHU@sd4(8jkYLg9> z5}6s~)HhF63S`y(1(v~HC{2x2Y_|oe&A)`6xe*;sE$)Y6sQ5> zDNWyg_%Lobn;GHOXfYbmp6a4oyNqtd~%ONfYKFJkI$^k nqGAtKJ!ZImU}lg}oT0uzW<~0X@JkY=H&i`7vTpwAz{(B)em$AX delta 477 zcmeC1!1%A9k>@loFBbz4FhBT~wvk7g$)H9*v^ce>SU)?lC^1hjDI>8YGg03qwK%&Z zzd*kLD3hO;n4_POnv;`Xo?n!cvN@m0M@CH^MfnTtL`G&08Ck7r)zR9ji ziOfKH^Gc;aR#O&6kdnI`Dh~vOJJ@dU3iii$#&pj^u*}v zqPiDFbw4u*@k&ir)i}Zdq(2A(m2Cc~@rqd~7;M!|ZowORCf7xM7jPZWx+LnmLv&K= z1ySD#AY$_`opx5~a)>&9(Hp{&ANUxg6u$AY3v+$oVGtCXJkQ94jTy-6VBdV(sE$)y z1gI9`V@=;3iYwGNIIh*csOdYo(B_8HS)d#+EN%!0b+A6<76STFMSHpJLfggm-&vW( z`5ubMPtLWKkomw2B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i=IiaA!u4rp=% z!wp{X>%4LodF8I~Dol=NQRex`z{u&rc%4__0R5y< FSO8?AH>dyr delta 165 zcmX@5vqy*LG%qg~0}wDj_?EVjXC1Rat$t{6YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{ny6HBaw3($lHh8w)%*LmeG^2%N2RrtWb$mzj2xsXMf l=R27B2~2KYz+%oTZi7|1#pIWQa$F$Q79hnIn}vidSO6NFF!KNa diff --git a/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/schema.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/schema.cpython-312.pyc index cfca9bfcf3d604c7bad6e32500f0aa656bf62799..4187e49ac19e2e47c95a374a90e1721c5f52784e 100644 GIT binary patch delta 223 zcmcbXbuWwOG%qg~0}ymDGNy0jIm+rWK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY$aYJ>I2&km z1H%no!T$Kp`0KpN7kQPh@T#s5yCI`6-+!k6bs5WxGM3k6+%L+wpJ2NX5PD4}Y_f#7 ziqK7&u7+1ys8&?RX58TSuz6v DXmd(9 delta 215 zcmcbYbuEkMG%qg~0}wDj_?EVj=P0W|g??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJB-n0R$2tBI?Kd}IQ$zB2(}BVg*nD delta 20 acmeys_<@nB;MxN8Wyj%=G(80)B;MxN8Wyj%=GpnKp~+D4v>-T+`)2n+xK diff --git a/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc index 3cb77aa943efa7e3faf12701129904f366e4267f..e57fcecf79255e47c48582beb60918a2efc9470d 100644 GIT binary patch delta 383 zcmeCFeptnGnwOW00SG!68PhlN__B!z069Mz7$!!}D4bt0vtoAD6;Z9t`E1gBjK!0? zMQ({+(R9Bo;BisYeSydXmkAaVr7vi@U))?G8q3UBF!_>%6Y~`ry~#3?D$ESB`kS34 zC0H0uCdbIiNL}VtyP;>?;nMHl>3@Ys`#UoOpZaxPwTrxJn`g^zW8@D7+S|ZzgIBOW zx-+^bc5<4$fg}T;^cNlm5s4Y>lWi~XD_r1E_|6Ly>xkXFRbGTqT?JLkjI@7c?Tp?0Tj3q6m?y|zFF;=Vz`$xK^pS%>-Dn2a;@*<2z`smsj zIn8IJ-QW@G_v`e#AZ>bu#|&hxImlXbkhSKUZz;TE6>$f7`~}GGpBPvTg+6dFNGeah zr)I>$4CHMVQBP$OuV7?g_}RelL4biz21)!i8$@Qf XEO1g2rwGU``F z?QV!jP4}DVcR|_ViiqQPW(G0)@2m`bY9DwQ1Vp}b0=XAN?Iv>z$}s~4H|q#Ca{vIx CUmSk` delta 117 zcmbPlyxy4SG%qg~0}$vQ_?5PiXPSU?50KNq@PJpaKfW{mI@loFBbz4bTBfeZ{%6P!{|MEEsvtg6${VH{9YF=JU0kW;hdp7BXOqM z0_6pX3)NN#F4Vj#pmV{(^Wx?=Jl|Lu3no7nYGS@Ep)@&HI8=^7Qu(6|gF9m&<9At6 z0j`e>AVLN#a8bZ%@*UxL&JR*h`OQuu^~{WQlMjho@?Q~D`XPFF5}L$vLC5y;W<{xd zZpHnVCUMX7hCoVP-jLpch{-{AggfAQ*B{)nbP00oLmd!IvF^ zr>FwCn^|@A85xBpo9Y^HUs1KVEEv+k_E=PU@>x~!$vwIpU}L81=5R`1Q49IZ%p}ft zQ!Qjh$^@3_oRc{(sD*rBX5bZ>ENvdfd|g;&a;5oH=4-|-lf^9jSr|-Q87F60cri1G zs7~H$ku3I6gdu=2k`d@vUOu2-LF|hn-jnq$Z8(A61#y8M&b3Tul4%0ExPjr0pyYJ9 ziE;~=FAJ(H2)rn$-obVo=&*0rrW`l@!!C=5pDdqjXd}XVqWq$G_$7hx59}Z>2iiz8 zGrpLdYhT8ETTFKHYkOVhYYK*w6&w^L85E5^a52a#PT;(urr+T;q52Y!@&{oCak=u3P#0naMUWyE zA&_PCRhle>2`(yvP#FZ5!JW9VnKYe+__MRSajJ>9^2NJ2=N|4^-0wvdzN$jzBg;Ag z9jX2I`Wr@J;5>QFgo0XnvF9r6@>{qOX{*}#b0u*Q~T~jM>Uzg4X%?z&tr!! zhE3pNC32fDPf$0qU;(bcLBQ*F{sL5f9tYe7NWSw|Mh1vx1E`B*j}Ux7J_s3?#)SvG zlePdA!%8?YYWa=Stk{CEOuqP1qL!FDaOFR_^3BNx*T^d~%GLLtr`E2ToLD~wcZd?3 z#k$vj1aer0YAb8=wM__-^ioQ&G==q1$PMZH3{p=QP|vdMiay53iKRac1J5R;jnH!*KP=nA*XV#XcrH`H{m ztC?L?GrOW@aaq{%qMF5w;t9?(7$>`3P_wuwZ26s)iPP#M1CaRn2*hLHQ@g;cx|v;d zGqZv$&_zF9F#Kp>xS$+%vg|pQaXeWz`KHDf#^aOEY04;^EW4~6 zc3B|oGc%JIUx(XA5e6xR&-@(xTp#&>tO=}>IkYU*c!10g{0y8t9~eL~LJU08H_dG? zOW18JTah|LeSzsENzDyqo0GMEFfksS9HZMOdDAQSvPj5D%^k86!e->IaK9*La#_^m zgyzM~|8@OjWNUy9Y+!iEFM2~*5^T|DUUp%wk05)1R%UpaaB_jH@}pKC?25iak{InBn??nL$PoXt~Ua)D_{EBusCpdVFNveBE~mD*#nxj#dBw delta 427 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 BhJXM7 diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc index 617eed587a4d64fedf9791e4e03aa74bd8e75b77..119efde64ccad736146849449c261e51454dfcc9 100644 GIT binary patch delta 21 bcmew<`cstWG%qg~0}ymDGNy0jdCLU=M6LzB delta 21 bcmew<`cstWG%qg~0}$vQ_?5Pi=PefiOyCC@ diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/executor.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/executor.cpython-312.pyc index c1a2a6284764fd4e0e0136d11adf8a199ab6d05d..bf12185cf8a7ef03fdf827719fbdc2490f07b5d1 100644 GIT binary patch delta 1080 zcmZWmUrbw77(a*8Zl%2!%3W#8y}gC@axb)_v?(nF3^2A!R|4!$5RI8J>7ZdEgABSL zi6-;ULuX7Z9+%Y&4fDa3L=%>)$#~jK_U21(3%wu59;YmG|}_&`|^F? z@ArMb^L=>>mOg>h_cUz=leP zdx4K17>UdQFf=k5%Yhm2tr@v2`tDu2dr1>JRk2eO2UT(K(PT*+#_!X80+2@FFNpN% z6!1#-xVxO@39Fv4<~gN$PCc@hJaPP#zGw#CA*c^Q;BYIknokkj#=CVd(*>@Z4D{CQ zaow3S_%st{%3QZ@1au>@MT7rWp}bzF|%pSO@vRpTW@$kZ0wM)Y@ygv2|Z| zX{C1~g^%o?JL~@`a|0XlT6<2&Ev*b~$jaA_H>yr-q>8LubjWFH$H}Rcj-qmsT}Hxp zgmwe$n?YNs=nAbxRukEa*=u)R%ti91hP*5EgGYNCNqN)#)-m=^_?%$-KLOLC zNEaMY;>&H`b3`);_ljXt*%2kasyVzUx=}^$GjXwr$my+svT7Dj!Qv^Cfby!8H!pN- zQjsUFCfqHB$V?BOk;uu!ZhS}LP_a3RA4<&(5Igl_pw7NqYfDplEs%PY-y{~nA90=k zit$%aWoPhv{xGWG1Ao*+P_HDFXMPO3#-2Ogwb(QZU$F3Hp-mH_n?iKCHdCFAl&!Yg z^fIkk+f-{??v)3IEo<*S0?nPu<2DgN4L=R`b&wHE&2F8$?DS|(pX&7G#C5*t?9Uhv zkCTdS22}lj)bW*&t0IHbp#f8+ry`*gLz{?ml7)``zAS%Mjl^=-vWeBMl^GJ^hmkMf z489xJJ7tG4#bhWOKp%{EYSagvhxyLE z-*>)q?z#8w75Mp8NPTCsSpfcs+Tlw#sXq+jV(i@V?9y^>_3sE@X4Dx!GK9;nKoV?!5FQG11&r2S$OZx!hH!t3Yq86kgxSZmpJ_p$8_= z;n*iIDSd4jhj0qnsIa-};0{2y`3Z>nsZO%&eY6ftbRU|by2)~QvJMD$A9{xxBr)!r zbmk7V{)objJ}_aU17PfA@>b0PxDYN&C-Uj45WYThZAKMNDZ(jL7*>Sg+vm%|ICknt zpto!TA&hkbYc&dV1+ROqc~m~G@Ntz-DSYa-qs)(DEsYzxZ#!$%18ofI4N8M8TLk1h+ou&ajed1}?6m*GdWLSCEc%P9+hdAnNczkDriLtRMeIG%Pd!{jr zn$@maxssKu`g>G=Qt{(5&^CbH=Iy5a za8cOh%C5n@>8M$!@N}t;|FKL#B#K@m#1b?q4p|!7hM80lD}<{9w{!g0g>#wWVj;WJ zx1CeC40^ZsQ@DsC$tYL$4dCZyPQ3T{`eS+bJ(eqTncXq9cSPwOsi1{qw*`|+`onpV zKniP@zDTZ7{uBQiGgCLiyZ+ske4-Fm*{H%s_u8WhGbPQO`O*O2M)YvNs0^N~p#I?^ zS+)rpXf`wG{%|B&6Vr!;A;eTeJ^A#96B`p(CpCR7w*@qS@yLpm8Ut9r>W(Vz=mAKW zMJYA%J|xQ>Q9Lx-f$n7dHjEkxI)im!p+$6@8OdPO?7++KL}gE`WRGbtL!7GRAfThA mwlP^8`*vJzotDYz-|DZyzf0}wo&A3FEYuBkcWG^O5B>=)6LVVt diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/graph.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/graph.cpython-312.pyc index 6089679ee7b29a9ea36fcfa29a02876121b1abc7..cb0337627511a4670ce82ce947c5b74e489331a6 100644 GIT binary patch delta 722 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 diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/migration.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/migration.cpython-312.pyc index 2bff491d550f7fca149437bf06724be74e08ead1..0fcd3e5c92855e9ebc0e353d4d0b5cfbeae828a1 100644 GIT binary patch delta 296 zcmccWx5SU4mE zZ0;B7W|zDNF+hevNTh@9hKOPZ=L1RE`SL)!EM-zTfcn13Fc_FkUMq7QY;KP%+}w?_ z-oiks4;E;~3dxl)`&nW0hfNHd;kLkeg~(M=y&blbFDP0w&E}mfq-4#^ MAgQ)FK#7$V02@D9uK)l5 delta 408 zcmZ4Dch!&QG%qg~0}$vQ_?5Pir;LZub8<6}lFCf^PYjHl4vZb1H+V#^^Qc_pQCSeO zJZ@p!hRCZt_8*u*a+?qF=(34UV`N}xVE7=!ASE|ney03q21QOs#>xMLzUW>Swf@M! zEGTwEME1If{zVb}8xk_}`DXI1;N4JpK=%tXlc?BtW}y5BkfO;FB0l0Etsh(%83bf6 zaL9ZYhskZO5b0)@{|d24hCxWAgYAZhVh85~Nm-DUpBT7-u9++&lgbZbe2`%}7+e%FKscl7fCaiU+GM@OKw3XoV7TImYzed14PaOSz01SEBhYWtWphJV z=7F8l{`{T!*ChOQFwGFUE@^yO()faeUk5LcxMA&aO(bxG$tjm9LDRz~hRtwW;JiZQ js;J%tk-*7I6s_53@P1-o<&>HHP|=zhNN<)`Vr2yYi;#V? diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/optimizer.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/optimizer.cpython-312.pyc index b1f30d39cd0e61a6e4b5057d1842af011b6d410d..a31ad03a1d3126d64b3a1768d099bdb3a6ada9dd 100644 GIT binary patch delta 195 zcmdlWy%I46@cAbQlEXuM4PN6i{7|c~!vRgE51w(d1V=#{j7!M5q7& delta 195 zcmdlly+NAiG%qg~0}wDj_?EVjXC|9Lk$z}#YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}Teg49DvCfOe!O7#(ZFy?ChS1ajG+0EGb0z2uE@MB zYq7)Simby$nXt(M+_xlT85tOUHZVMpl#~gDCk9E*$$zdNFgo@5Ci|AP*Lp!{_K)r$hE3o@??7<@36u8E07ryB9RL6T delta 182 zcmdl`Ij@rEG%qg~0}wDj_?EVj$AHJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#h50*+vI5YE7Ysid7%oYLZ4f+Qc!Kw`bLb4i`BpQn z7NlO6*10GZws}5>FB9{I%qyGUa|!cn-2m!nV7S4-bDcx#B8Sv<4uy*x3JW|ISY6@J fzay!%!2GhL_9q5LPAA66YEr5!AjW1tsU#%;PJlkZ diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/recorder.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/recorder.cpython-312.pyc index 92f46cef6f5e79aac02eedaa2798b1d9fee51a10..5dc905e4bc542653c97c6d850f0a652738421d9b 100644 GIT binary patch delta 259 zcmX@Be@&m~G%qg~0}ymDGNy0jk!ADf)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tLlf!wn*nso}Ue(Rr zymCy8S(8`st0`R(G}z#FLqP1hfbvBF5$Lz;w7bGB{eg`^N$t9#(IrKr&#cTMd=C|kCU{Pk6B1{=p=k7xb+ft9 GG*$q}d{uP- delta 206 zcmcbne^#I8G%qg~0}wDj_?EVjN0!Z?P(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#kZlVaWA$V;UOCRoys94<7&+Y;C%f~?v49yFyjol! z21I=G3|=`V#^TA_`PDcs3mO0gc}*ri;1}Zs(%(Uxk04_6fBt`rjQ*4V2}-J5R5bd= q$}Gb7Kt%QfGlP)yblHir3pkhaE#$i(pua)#qJY&W=FJX5(^vu7;y(TW diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/serializer.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/serializer.cpython-312.pyc index 2237a5b1c68f62ec97dcd9cb4b1d283270624a0e..3089b71d08f8de583100ebec9b5e997a1268e234 100644 GIT binary patch delta 351 zcmZ3#gK^akMxN8Wyj%=G(80)zlCn3jtTUdPZ6bTby1`&xb91Ie2Gt%bg%*>gc zcTHS(@&gH5W(Enp%?gq?SY@Sv?t8)Tqk-XqlIKD3ogzB~cQ~#p+^Bd(+2o-3WD)t@ zj4LKzkXL5DCZad_w|t@qgQ)%o9tHui86xu~XG&fKX}Y|*KtY$8@$}?*%0>Ji*%%Zx zKC?0l3O!U%pTRO&Rz;chhJyM>*3C{T)A$)H(cP?T@<4>~++;pa1J=(R3~I)cJv`Nz jf%N7=&qch9%#%gJ4>4a;w4Hn}T#lJR$!_!ia03$Kx~G{e94)TKy?SiuWT+=&}C*kHhHmf z5$^{!21Si;tjvN!4#JUMCtE`A;vqGS@ zkv`iO1o0ERtU+Ff&bnf)`{IYnAM*C6r6GfN)2?=6JOMJmMd zm0_3EWY9MxCccfPYIlsiwJ+TKxz-YQBn-3cjJ7u1@u^sQ$L`J-fU;^#sY1EpuZnhI zN*(3Nm(%w87$DinQh-sA(dM8A;PzWpXIGGwwP+IH^t&lr%6~iB}nO)dLP1 zsdK<(yANHi+ggDkZCrz-(XIrl;zA6`T`{XpySBty=TA`j9wx8`Nu$M(oXSY^xvrcT zIQ&RcAApPca@1X41A!q(qWb%6;&pVYX#_4R$`Ge{Pz98MoE-2}G}l0J4JqTMEVq2w zyA_>m-UWfLkz8nAVCi?Si-jqaMtY_OCkLrQ>m7snLT`A-vfGb7ZgoT8DI=e>F0uN) zT(`U{luq=I_tQcvCA2OG?aP6BO5%+Oqpva&`4n%GM@u}E#FMC<^({!+FdZ8kh$j$; z9QcV?Y$>h*_j>d6=GbOhSC-Y4p~~$gcqOpP2fiBgqwN7R?sGE06Hf5Pc{JBTaV;rp zXn|Y##EWl93GL)Z+gl5WJxJ7D1s5&VXlJ*953DsWIWfNH2_$WklRxYBu^O*F#j7(- zSI4SpotM&i7j^z{2jeKC9U;mQq8+uAqju4O9k4|B(PqZrjBw8JG3Me10>?pLhBoxM zOrL42;WkDfp#?5V;7VwcZ3}`rysfpZ767dU_4k?a#DY?C9U1Mr&cf>N>^H#0;?3x# z{vHUNRpcN0e?y3eo-!>r(Q-#t?m!m?x*<>$lMe>|O%S8#{-DB?^)_USwou-Ni#_q3 z2_mv3^5dyvlgH4=-H3NxW^p_zO4ssQ`Kjeo%Sxs7>o8+q%`1*U`tCJvA z+&p(6*&9D{W#s*lxdY^%elSLq?IXb2UQPh?#xOg}RWGl3bw_5PWu=s?G|``tg~E-D zMn7$g85cEf^x6;I{Xn~xsXrX};8Ww~m#$1{b7?xx<#^p LokD+BvL%!01QcA8srFB6CV; zLf3~a&xYh*hrc3-BWUqxDa>Lg_{Rb`G#;|XBt89!6zKgq7f@=a z_D=4NyR(W?^yst$v*|@29MF-KuQ`Q9-@v#qXN+7KZf4YmY4O`)bnI*h0*wpJoV}%% zKiyCE-WZ%2q=T(gu=Tby8|--R=ZNs+095i<)XoU|Ap|aeVmP@w>#Pm;OzauoLkn$b zp>4iABWzhxJIUE!6cFwlU={I~cJ01xKeH#we*5{1(3%!DU3wuYzkc+_D>JWTikmXR zCTiDi@*n4_S-Nd(0KQ(YJ2H8=fKh0t1||n+g*U74qOH*m1yK6()-^&k#%WzlM{7b^ zO$c3yy2U_SnbU(JMR>#C>6f0i$r57vsHCnDTGSuPx$Jof)|Y=L7U8rr8M;*8D~wP%o=`BakUl zMxAHt7_})5V}d*fsQU+)#d`FaD60M4yS{wjb{ewgzRi>xUBjOtbN>+>67R#k!?ohNbeDkXn;;UP;V zT9@PO&^$5s9lEYNUDu7scmIiBb$nU}mn~)J*7S1_SOcUh-on9ggIdvwzBtl^*VmkH$C$Jtj7cF1H{)biS##s~ z%yBx@N`+dpq4un}g9^1@EljWz`y=eg{;7kL2hod^#Fh%RlmEJ$Bs?|i7%}1hmoJv6 zSUxd2J{s-Gh%Jmte^!74r1X-XCbkeIwNLG}#_7^nY5YW18w|HIV$H{0=X#9h9xoz{rQ6}Y!)6N*@s^j;F?z=TP3B*|HA(P Dw$LcS delta 2381 zcmYjTYj6|S72d1eHM`QTCChrhEXkHFKja7a0e%UC1;z$@@B=X5Qj@~aQql*6#3m*l z5{PIh$iAhPAc@UDKy;>wm`#hBq=`HE(RSKNyRF+*Jole`cV%n*G z-0$e#bI;?R?;PpD=c>pf7596dR}=6F%>3i<9nQwqK7cQyM2aD-wxq=`TKtlw&ca59Z1kyCY=A=kC8tudf*nCFf+tb7vdL2H?ZY2SQS@uI@*_1K3 znoU?r<291G>M>1nU@RBk)VNe>Quv)lM|rM4Q!){p_Klj+)LNfQj% z{JVB92`F^y9x>>bxWU@NNVPp_g5(?Ud20y?DBQIsXf%(H6kg95Rn&8c1AXP6^-?H+3RHhQ&|Mdnla*jk7GP(-^BO~XU(*(s9;I9Ie zB%t6fAJn36;4@8~UHCwnU|D@Q^w8#+^2MFglw@lPcl=3fTP!GsSSuUgg^i{qM`?;A zeAS7U<_dx_X6Ars=}nVxutL&4eS}`nc~UIc!FkP2zv!-iLX#!gO9lsAYHUUKb*+iP z=*}tsm4Pu!0*N_Q^Sag*5+7^!F>*n9n&4OyzTCX23LLIg99nHl?f~2^uAR2b`CDRb zGb5ryacH%H!y;28bh#^~Rc`UYDpqn-Lw@{5gj<4*lp+YD!M{-mzLFL(>p^>b~iS$kkj17ny z@1oOvwJ+Q$7gs1$(c_zK#XuFkFxU2(>IjV#t}pR9m-^55CwZ^PdnLYLnNYFqNUjQ| z3BBB+Z?7rz9z|+$b-rp_ay_( zVxUe-m)&Kvobxk%zU(iV)%j#6 z^eL6o7zw3Rq_I)9I48LnH`TjfDM`_=kH0#;nSpC5FoSH36plgvmCse{BC$v1lwy6Eqwh ze$7V$3Kw77#9R6x0eEKFU{gZcJzVotF*eda@%OvOsJ1;k=&@TMr2{R)a z18G7B!QYzbumLW6l^3_VChakM(po24>tF!#CcGwEoC}z85V^+inni7smZN014XpK&x-~B;f8~TV%f6s7dQTj{(|qn6WkDMU!`GZ zg&>XD;SkKk^^JE=-8q%4YZL3*q`LN`w&S)YPQ?#JsK}v-qhm+$F;SO4tL+eW-b|p1 zmQ0wk(fWVXQ?X8_E?SQG%qg~0}ymDGNy0jStnqc59GXH_|d@dL4ZNqV7<;to$FdQ7qx7zY1v)m wP`kh(Im7yfwAyuP-HXz?*QJdwN*iC3Hl6%az?6eQ#_S_AgSP!B0BOY2^g*1axmd{Nr?vb5W}w>5I)dg* E00R~w7XSbN diff --git a/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/writer.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/__pycache__/writer.cpython-312.pyc index 50943235a45ef88061b011d49405a318450b88d9..3b31b907b06a56b957f5bf62c928c4c3f272bef8 100644 GIT binary patch delta 381 zcmZ3T-;mF9nwOW00SG!68PhlN6f$|V>xUMn78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9cDG6iun7ER)d zX1=CoF*%tpRb+A10_GbED$6++a;{Kb%J+epLBnYBLp}#)26fBHD*Oh_w-vM|$MBnr zEUv^*Xb4m&Gx-F+1T%x8_T2_mzrW-#B7keSaplXHRcT##uBTAO18q8S;TC+`qE z$TTf~a)Xef1cSKR7cK@~fe9?#o*j%2B-9oZE-1Pzp*4A*kODJrk!3Oe2p5c$r`Amqe&UC{BOpyRI( NtPC<5n;Z4DH~=hHdQ|`b delta 452 zcmZq3U!Bi$nwOW00SH(gd`sKNQ^;hHuOC{RT2!o`omiBZrV3gHg zzl9Hz9AtqpK~VX0_C|N!$s9MM+-zVGWt&5E_jfAa{ea7<81FygYmTu1u#s?B=3knw$U624;%*?6N;c_8=(uL(`!WmK7*si4GqLD{o`VRN6tQ6|O{lS7pCI4(*Wfy^qB;SM-K}$aiKS{T;*si~Rb)3RJW?Okaxw06kWViU0rr diff --git a/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc index ea8f1535c93db9776fc29ee44168f66a239d5c10..63049492046a9bc8c0459bd77016f73edbaa3264 100644 GIT binary patch delta 21 bcmey*{-2%aG%qg~0}ymDGNy0j`OFLeLyrZl delta 21 bcmey*{-2%aG%qg~0}$vQ_?5Pi=QA?^OTh;S diff --git a/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc index 925f2da1a6f96c0a5c705f257b8942ce2acda58d..8644d0ca0c0808d8fc943fc58969307aea4ccc3f 100644 GIT binary patch delta 62 zcmX?Qan^$8G%qg~0}ymDGNy0jDVLNI2XbC8{AggfAmV#b+h;-Igop)H{MHOTQIL delta 59 zcmX?Wams?{G%qg~0}$vQ_?5Pir(9B81ju>8@S}m@l8Enu#0e1#7^lWu6!D!rS8@-_ OWo@4;n`5OuFaiKapA|{~ diff --git a/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc index 724360d9b3fc15b6505f6211cf5d100faf726443..e50f47bfadba732cf7395f1df32835812c5fb38c 100644 GIT binary patch delta 23 dcmZ42&$zCik>@loFBbz4bTBfeZ{%6z4ggM>1`hxL delta 23 dcmZ42&$zCik>@loFBbz4=pOi$wvlI%I{;S82WtQT diff --git a/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/models.cpython-312.pyc index f850950207191bfa697ad7b180f63f82870d5891..680a47f50206cc22a791e6dc18d441e07ff46152 100644 GIT binary patch delta 904 zcmY*XOH30{6n!((=?pL}rL+`^1GI(GRqBa#ezgbbYY^=sZ)P!^p#YjZ*%X<`P}nz-_v>O**wKP zQ7EzzK4%ExXoPz#Q*FVQ09sPz10C?b%FTxlGCPe_8VSL~NRi;CSC~RA=DbHg0%+Fa zo$^I0C(0*@am|!Z@GABa+UrmgQjSp=sCkzyBFb2@ zY_*5Bg3nPxEm-ZskmCf&d}a{(89-3&(t^q*P;s3Dp18^=ROl2wxfqfg%Sq8xnSR;g z9F@VZO{H|g;`~BGnY)d8W!eS+4)*SMrEpP*@IQX z9SOdC#CO>jE{^f8;nqbRkGHY5M#_;_>yz2I3&~Sih&M`^)Dn%;e?=5uBC;4wrg=do zlrvYjPGr(EMGZ{5br7w!{vTLYSCJXLw(gBBZfKHdnMu8DXbRE^-I_~-=LSRjZXFms zFsH+hLRx*o&?M3*uMBE7ONzMJi|Li>WwSS!4fc91n=pIRaJjI(e!Yf#M?mAr0yw|( zI2AW;h1~8(S;*8(q|B(G2%`OKvI>-ES|vHM+JWua&*CaJB5nta>hcAD&+|Oem^Ro1 zr~8l4-zd_mgjD~@bQO*r_7@Zv{@wJf+7orOgyqAYVC#i0+yZ@SnwxX9#MGWxu1BOP z$Q#lKZ%?gM5f|b0Se16Jp*N=A6>aDZ4_3=%}ydO{C86V3XN7&gMuP-Tf0F<;R=1xM*ma0BhziMVB9jb zo_9ykW!-CbrgyO-v`B|v(ri+lw@UtTU@a5j@o*YV}8Qp=*1I66)+>>e| zhWc5rVl*rPxv~U}v77W5MFYU9_VIQJ$Z&UsbwG@qvNURN*l@xh+58e9-HxQEI^H?! zT5j&)n|l(CJyXOg#BH=t(_d5dAC=91)!eSYW1gGf=O}_{p+^knSY@hf>CUQ@decaIk}aR; z9q*kiPO!BjtuGiBzhI?zEk|Bs5>>$BOe+CvO=Ty3UB%a%1tW;3i5vPq`o+~DY7bl25A7xxH^U!p*P zNrZTFM2GwhsfvUngt<=4wI&(MxuMaaN!KmUHIKjqGTbuEbsC=L+PLkTJo)5T0yXV3 zqO;o%(!8}v0(y-BX*(an3_kC)t3)||LAE9wD&NDQPiVXhr75t{Vro+!M{%-7=n}Xk>FVCnGW6%M8A&QlkvWmMQ-+}(Lkph0Ow2bfbkOuMnv7T^Twy7gRmizXnN0n`~@G^K(TCF;g6G KxfiEm;e$L1q5P^N@~}YtS%~9ePUqaRGO^9;m8c4SFuTNZswT6 zDA@{8B_h_rc|%0vx`@t25uHyA%$%l^wYfAUfblm-h0kAoDxJ4(V%n4ayI>Yx0x7H1D=}!zCyjGKEON20k=uZ+_ Z95-aufo|uun=CIW&J3hCTS~I=0sv8(Mr8m1 diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc index ee3275d43bbccc585a5a4a27bb959c97bfbb84e2..e7bfbc4b531bd1fd4616900090dc5cbffc5ccfd7 100644 GIT binary patch delta 21 bcmaDQ@=Ao~G%qg~0}ymDGNy0jiQ@tQK@tTH delta 21 bcmaDQ@=Ao~G%qg~0}$vQ_?5PiCyomMNkj%} diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc index 8c69a57b3c139cc45bcd8cd19964bb8dfc5429cb..d9092345d5634e99466c321f3e7f81e3ad2d4510 100644 GIT binary patch delta 180 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 delta 4260 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 bdui|3?(q#L9brwR=_X&1h|L^;OZ@)=&0kkA diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc index e4f069563ce7940c726773d735003f39d726bb7a..2ba652423cc5584f4d61f5147e5ed3278aba4b4c 100644 GIT binary patch delta 21 bcmX@fa*~DTG%qg~0}ymDGNy0jv1I}PIY0!1 delta 21 bcmX@fa*~DTG%qg~0}$vQ_?5Pi$Ce2IL2?D( diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc index 39531bd825c9bdbf0d30bea06e8af1ae70f5375f..cf688706bafb0265e615c7e460acfb1cd007db29 100644 GIT binary patch delta 639 zcmX^9fpOahMxN8Wyj%=G(80)>VNS+Fo9B79Ffm_|)0?dABg@PnufN&Hhn*Q@=;U%W+0DiN z&lnlYCr1U!GGCF>np_`f#LOVAy?IOERVLdjK<5Fy>*jSl`%v~}!JvcLJGdsOPS>8O zeO*ZXqLBIuuB$@E2eLcZE(iuaaQ8l5bExJsGm|jaP50m(Qj-ND#Muwjd|+na6xjSQ z|Z3xd`-n-a!!#9Fj_4qcY|nU^VP%!! z`^W-hP4t=II>Qtg8G=F+R3~%HP@TyCfe9%7ft7(*@*@LK*#{m5amfz%8xk_tB{Z%` TXiVlRE@x(t)ZE-se3%6Qf7jin delta 737 zcmb`FOH30%7{_OKN|$cBNVm0*?Ni)R-iHblNC*Xo!j1hg(Pw_2$iOK}8ShG@iXVhxyIq|K);Cf66uOWCIDq}zcjPyd#3;moi&sMxz@dv`jn*aI>bmZDysfIH?qii|m> zN6jl{z6#(uy4=W}K;UXg(OV;VXWz=OFtu_eGnLbaD-g@l(BNZIQ+BnUNQI$29q~?D zzxyueuiY~AhJ{ZOYE#AtZ=>FpF;x|Yd>0X%wnh@qQD)LX|0C_!4oj3&84@#Y#@GUb*T)tR$1WfRQRCG2a7h>GyA$dbw`E38zPPY zdYzyLzU%574WCS&uVauOYp~bv^^@8rwgF>oNCGI}C&aiRAqvk#O_N9*a;TEDjgmGw zmFCi=b6^pQY%5i5dWq3i3OQ6IQmR&M4=jGH9ij?UscNM@Y(PpQwMy4iIaKN#M&Hag z-+yL)|Ct}ZLVkOKh`*CangHMC5#;i!I3Q_}@q<5agAM1vdh5FS8!zh^WzI^zN1LiZ zAQtY(yXTKXmz+c^@@|-r-w_n#-Fr+y{sD&Efzzr^a;rr(KU9`A)6PwqwT!D5Wec(t zTEuNt3@Fr0PBkV(E<%)a+6uPeeGK(TcWlE8C#VqJT}6SMpsvwZ7jCk+wQL*S#h4ND z1%iACL#8fA!8Wpw3G~E{ZG;YPS?%-?FR9Tdh0DTitGyl@%eE1|=Dz7op{fc{T)LwV zQ^C5dl5Q&EmWn>ikoG2oze_!73{w%<;n1QLV;CkJMJ+$AZr(BbXlx$^N35DJf`UH02N&B6f`X9`*4jwHrrEd0JZ-z$puNv?yA5h0(BaP${*~*gi`2En z8}LTmADu(qqZVdy{+!VgHqO*Q<0DU@mP<(BL3bXblC1(@4(x(7Ed5yknc*F;0J~*1+eO z_JIJ3d;u>H-Zht0$0+n^3sDKh^On)aXV)%#63BMt(1)T`QPJAFeijl#eiW$tU}DIQ za;gw~f9Ni{r7^+g;Fxe9<>mI^T=1j_Xw6j}P>11@;H0tSj<90qe4Oqt6IzaFV~MtG zPi{6(1m`35+DOQyt`}gy6Gf^`fY2>YElhFB_JXnVv%Er3xu6&DB}taKg!}q*9O0gK8mitQN&|BOO*rq!mgH*`vj|S zQt_0(Y$&qxMBWX}X#II@|7TbD%apaQ4)N(pw5W{0x2D?! zfQTY6IUSLeB!kGkmRs$$R;;JiWB8|1vh ztarHNJ;CCh1u3PZv6Qr|)l-McDh(yrGQ+QD0w}O_KxB5Rc~y`%bgv4sE%b%trR7UG z0So754d+2u9I3hhX-Q5jO>hP`YjBqg?NnnK*KoL*#mz0DbY@e=a|^rU^TRoWE~@a`g0WXxI5&q8ypL1%z4R8E#gA z-fFB{2^gbTLjy++EKnclC2FuKRH%;)*hg^A(QlSJ9V*aSLhv((6GtdKbW9tu*Wn9a zv`Y$392oFk+b=Z7=Zb?04k(7dR=m1;QzQfXxR7U`W7sEfluI6wf@cp5dM{J=a&jQ7 znvkg&fsa!Rz~$XA-Zd&X3dv3um3_{=VMLeWq^(XnwWjuB+aB57z)?hSh1)PRd+X2x z;}JKS9XW6!vgbx&XGh)XYvRD}E#}IBOpQK{j-4GsCVBxIm%L+514`ZpIAK!(N!XfJ zK#&cs+izXNyR_8x{{%uya00s%C7{0kP|ZIe`UjfAUe8sX>mH)^7EsLKXsXJjN|*R+ zYd7GHGLwQU@d7KkPX1-UY4iv7)*tZaid1n~bj2!UT*U<`{srlvQHMV?c`DwS?UCa2 z#@xL*(K`dzPQBB6^zf zeGs-xVDQH19gFPZRNy9%XUa|+_iZNla3Ig1ukJSY!7&CW%o_&C}iOH#B(Zx@QE zWX4@%dPJsY``FHs#AI)exBBRaB<#<{ya*Ko%2wI{<5`hIK6Flj5(U zk*Fb&j`D?4N)E@jZf@SZ|2|p^`w%=k)@MeD_KX@5J{&XQ$?Gizn`U6=)(WeI8XXbo zh&*<_YQ3jYM9GMGlSvDuh(8 zO^a+=Vl&!k4E$~QgV*^iVrQShzBG;X5$;QhsU+m62K8{FC#Fuxske?D!bG0)1{nQ?uwvow7cQnQvV>r z28HSmE@FrelSMe2nHfa1 zC(q*47rQ3w)al#dHo^6VtWt+tuipn|203TO&5t>=8Reuwx?g|{xFBV0r*i5`U6ytF#K6d@-09olHo^6VtWt+tuipn|pvdN1oY{=BQXpeqfK0k1Wwk+Y zhT(kkndS@9u1f1%l(L$f%sr8LL-Li$-?{&48Uj@|Fg#JzSRuS3`--B~1nG&q2belo zZ}5w3P`)N^wt{U2+kEcX+?O^h@`^Jux=gm@QxQL4d`;Yahu93U`7$$Q7L+ZoSy*#P z!sOEA3ce$fa$o}=sA(?GUYLEI-)N@B48<9tlUOfLj^y8mO;&Y*AW(L*iNH=y0IdID A9smFU diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc index 7d55cb456e6f3e1134e7e7bd2170f68f783b9965..2b66a393b6f56f57f28172737e72940303748816 100644 GIT binary patch delta 1820 zcmai!ZERCj7{~AF>D$U}d;7M&tYy2jW0Z9*?bdZ|H{9GH48}@8_u>|U8E+yeuf`yf z#Sg9^n#!5E3rey9y5Z1txh5S%$cUm4P3T=a+GQZ1eBg_uH`f>vBk{Cjgz&|FXr6PQ z-+9jSf1c-@>!+pTr={dCN~MCpzbF7ZCdfx#V+UUJ6TFHr*#)JHQt%|UVi2i)Zdp!_ zZC=T~!U5xq$~DH#^B-%t`zCwf*q)`ZkIS6>=00ID2d((?t6-d zyW%x@+?~hWoWY$U-CVc}-3VKeF0@LV4tEJ`Z)iPGff2aqs^$(xt&o*w6zwiQL3;STOihg9yZzY zYHR_lM)~q1nI5Y#DQ4+l?48LDt|4+_HAe@LdhNYshv(~I#qKO!o}mLA9Z1tb0pbr) zQjiihXS8k3vJ}zlRvU?uikzO%mrawUyb*i$SK{4$kQtExJ^Jm8fgN3UQe-w1LS{|2 zA!SUQqyiWGal?2$Hc)5#moIw#7plh&jfawyA6X)&Ui1bp1mgbjl}RedPDg%%;B_?B zZShM9%i@f=hBMcs&9%5(O4WUHZLBE=314;G76TcI<|ul2d77%4YT>9gS#vEfVgJ}P z1Hd4<_-dz`$Fe;08?A0!E?b9DlC`=qRNEl~=5Rs4ZMF8JLs4;7Z_4OBoZfRw??pYG zRykqt;nGriME|Hq@1I`Da-EL=_yA|-zq7_!=DTYPeF)(`IA3c5pas3zV~4kj ztC@W^U=|TZcA`fGmgei&Pu%nRGu}4N+m`mWr_>S7+dkHmS5uLqDw5uIj=kI42*GMp zw#5YV*)(n`hd3K{=N1DA?xUl---2@%JNj$)R!EdM*q%L4L_QCW{E&FuPvi($nTi*S z?b_H{Tq&LHi=AVNq^A12ol}bIYm@%YG}Xn6u$vv&OTm)XLPig?%Q9LQr*(~WPl{67 zaR0iw=5~}gP$ef?Km_3aqZM~etmxo-%@*UrNlE(#t}YVSoogP0qie8<1`~H2cmfxz zWglXM!GC(2ji zLY369#yg*s6w+ePKRzQ`87Pz{YqCU@&kskmB}LZY}g#{5fUcHrmW?|=PbIX02!$#!YsqriUto zY7HLBVoRpj%N2W{n1 zq-RL_{9)!#AJ_}OJ}e}*RD;b63bX&Ouy`XlQUfdu`Vfq3_(f8SLeQusQl7$Aw3S&u z06ems3NLsKb94ZBHN2(>GfE0GB(^YfWdQV%IR#$u`Omo;ru`VO>*j;0RT#|gkGAHN z%+vsIF#S=`Ez6Plm}+J&3Vct|qD2^$&!e(DTFNvW0}5GAnn#P6)?>h<;gvFcyiteI zVr=2#2aW+>IWNQaO_1P=DG>Pe7GRNH!4pMAiku!(e4fv_nD}wflCT{IS3sj+A{2Cg zQ+A1cv|^;yk94(54=gKNM(i&}!>0;Yw$)&>w##-YCCRfjp%{(M%7yh%m@DwWO K#EKJONc10n!dT(} delta 1889 zcmaJ?du&r>6u;m7`nq?w?d|)qu3Kq0*sG&mw~loaCWY`Abck-_A%QR+L6ox=;Ue&L?R#v2}XB!H(QfoW zobx;PwEu+a`Uw?tL#w3;{HwnB_v+7>I{`}!Uv?9cj<9?0Y1J$(F@(X43_(AcRq``~ z-z$r<1Zkqvfx38fh^b1vn6gv}mMW2{%0R3~!G?7TaY}oR?`dcOkFm938S9s^e!=1w z8UG{fV8n%-jWZNtq%((l8U|5q2N=9F9J2_9*iJez5r#1e?$oE!A4lRgbIC>Tnen2g&t|KT$s z{=RMfjgKJa*s*6qf&+E^&*dTfwb(ZhEJcSF`U*rx{XHer>c-3#^wmNKnT7n#g(CnQ zM*K@1WpeU0kL~shBqCE2iWECZU?=sthS~ayQGuO>J?h%kVCuAd=A(M!fo*X`+H6mm zYXozRXb#|pQ@(gKtvAJYrdfNMVG~hq-jR7ICNSRpQAv%>k_K(a+R)f>2ReMBl)uq& z2Y?+oL8nbe6nRpvu;2=dt|?DYb9+&}Oijh&764|W^-H`O(OR1&02SgsT>u;kd>BK9 zE5+!$CAUjT^SO-$>QaGLA54V@=}N;ziPRK0l%Of>tEBPo!%^=p(@bt>$_+yb4G%-Bsvk>X+t}YQT+B- zQ)ENsc;qahF2TKaV;)RJ$Jh4JgNEAA*IuNr&l#-i7-l;&5ZnLSqQLmKU2ecldl^{y zQyV3+q%~i{E#st=u}Uyj^({I}ipI$9x#{WivxGwFL7!}?hFJ1rTRxa>Gmk$wwfgt_pKbLJqi=kk*2%$i0-thXW=RP2wRQ^+pR-K&Yo8Y z4Y6SqJJ+lb8)G>>ac&s|E6^Wb`ZS_FER(83)(d_bOG!hphPVc0-n8;v7yg7`Gg^G9 zTqBq&vV@i@LwhepAeQ`Iowo6~L&m1QuA`0J zU8kcdQ@LPl;sz#wui?O|;pFRHuoXPPoF&j>IJ&ai!>tx90gfyMOX10N!^st;;1~qE zFcD7HF`*~W8$KBp9hG@PI8QmKgqV?JtQ>4sYTgI=-K;_@E}6JdKWJAUnS(bFRmp{F zKoi7=h zn!zxsfNO~ZA9r~lXvSz+9g@-B$MN(!tkKEwrpCc8yui4taS${-dWCY4%B){tHux8OjvD|<89v$f`yV=;Wg%z__MrA;QxiYkdpl= z*+2R1exN3+Bs)QSaQi_N>~2X<@b*qTIq?);`J^%m1dTgRB_in(%nzWVfV+JFI9U0F Q8;k7{l--i1gP@!I7k3z1Gynhq diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc index 92df36cc2380647fe66697c27f533ef4533c2655..0a7fc02374c91d7c51a68d007c3c58a87e62c678 100644 GIT binary patch delta 643 zcmZ`$L2MFH5dF*VPht7nP+-{=WD5u-SV5}5V$d{bwGd)rV^EX!V$`&uhu%z$P3)0+ zP|Wv$rYMP*P4qysJ@hCZG>sRQZCsi(QEuu*keW0$F|Oj(InCtFdvEe)YpK12-!lvi z^eR%++&a#hT)aMf2Ky_Z;m+1aH`%p<#BM-Mh}B2sMbi>RcL4O#Z6Q>m$v2vVJ3@$< z%?H#+GKhb{`lw2b%rt(w&_hu8w|0XGpq3EoB66QOJD^j0a)bG4@VIrW{l1qoQ+I5p z%V#uKOmW3()0#`HJLE5xFa_%lRX${$MDYy@fEDm*D)(;r&2kSKZ1m35uMt;Co%+vxo<`3dNou_rWLT3G*OMSM9 z?E=WtdlC#Ef=If7XseBdaLS}##AQW zG3c;X*9vT?7wu7m%xyAWj1r=`mI|8hy6-;%JJR7-<9M(Tc zu7Jmd>Tq>Z^CuO5a@%oA{(ABrML9_!?$jel%d7Fb6vYxGM(kZ95GPcAVtrl`*X-rF zin}&XE{Nk?Go4rMSCn+VHddO^*s#im8|l14isHHdV!PsEs4vL<6)X=v$4_u&s5W2B eG`NXfAt)JZwwh03J_reNC+XE6A^d}rnC8o>5AAc9*aR>@)*0_U1i~4GTp!!^ zB^T3$+~T!LPNy<^(4rCL_=SB#1oa1QoZd!udXikee}F@wwTNcvpsfi}ksfWU3upJ$ z8hvc@cU!hcC%)cHC0)8;bj7r;Sb5Uuk~D8dHJLC5H$2;FPscbuw1xqY2lXoxpXNW# zA3$3txjQ^oxb%EtVZxvS8WoWHbt-I7F`bH;ExOQ-mbnO_2@&gldIW89=V7b<Kl;9o& zyl-Jf7L@^=j+@Y;tAtO_OHG)nESsby-_S>;lN zjFr9%A%!S+mU|Ui7ZOc?(WBTBS;UIcF2fm2L}MalqT;Gdeqh&5RnJ}AVbUgS4XN*w GZ{a^UdgQSH diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/lookups.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/lookups.cpython-312.pyc index e1bd9a4d8f1f33d003a29bc8dfce0817d3a8f3e5..4701fe4f39e579010c161eb2cfd2bc691daaaff1 100644 GIT binary patch delta 335 zcmX@Qk!kftCZ5y0yj%=G(80)pMoNg)4*^;Quex}(G^Lf4$qq+vNKXIi>P$E zeqd&hGTwZFPk@E-#^i@Ws?4`VB_{I;=P)yfNp7wcUdAhK0@2Jb*uio`OzOIr;YBgS zYhuQe?G+`N7{oV6DT**LHcie~mSeswqA_`@vK2FfsOIKN%1^`@S5Dq;9Vhsak3mZQ zGcP+Y-$x!GYl7os6&q#t4;(=DN8ZhzHrdRKU6Z#<%JSThlIh?Fx^lk69Er(~?IVFs zQ`&6r@PdWw0|PT3-$NzSiC&ZSU8R_BDw$69bN#?_QOWf4W+%5#;*5clP2*IUrc_K$ zh*RNWkWl!*#vmZl!9DrDg!JZ>aS5!9pC)sqToqiTaaqh}p~j5B6^SczClxN#*!(`_ f3M-@3cSyOZw-sdC&9mH5QK#;ZS>ML35UNN+9{UdAh92{DFWu!H4> znACMK!;4~um&J@h#+ghuP?Th1hua%S)ydfpi!4Guu ze2JMrx3F{SO}=O!$qb}7>pHw(;rPVB%*XdoL~gRYs}$=;W*}#>jq3-N3reP6HXFEo z5@!sXtQ@DpKC$8x0~4?IWY0JiW+1(}Ag+m(@#Eyr$yWsyYFrbunGv`mab@nL!i!=y ln{TFEVP%w?ye=z| diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc index 223db06332a9841dd04d8749470ce7f32069196e..daf504a9850919974af4fc0922d092d0a1d9395e 100644 GIT binary patch delta 46 ycmZ4EvD|~_G%qg~0}ymDGNy0jvEpZJnC#B4%KDv|NtSDJ8NVNh-h7-tRRjPC%L^d@ delta 51 zcmZ4PvBrbvG%qg~0}$vQ_?5Pi$BLh^b+S9ZD%TfgCRwge3_P4RlMDI%n1S@>L;R^C E0CsZ?wEo2TcLkMA+OR3xB-PJHei`LCZPxm(-237GPCG3 z7?)XxO7XH$HVwFGgv}4?TQ;U-vT5RnnT66~Tj7J~l9?ro#WLMY7I#JG-1~6PJ->6$ zJLh-K$+CokdjPwD9tKwkjEww|ZuX=(*h?t(wN!DNnmR6ktQzcExa@W!Yfu1vd1 zjOrue-)RSOusXP(KR`s)Hb`qVGQip&(m-d2g0_o5Qar1@jbjb4*I*%LpL zos5ASue8)0T!X_?ML<653M8+EU6Sz*QLux9=R;PlcSP@?(rW z?DmPdb~}c3!dgeMB&sbd>u#u#^kcfy12dy*;M znG$!edK<$$@NP-I?udU@t_*g?RQX|5enf74NMK8B^8g*a{(xT;O6R0{{(12jPndTE zJHJjF!^VoIS5)?AAsrT0p4O(hVsNKZk zJo~&z7GJoqVx)Ycn|OHLyF{F6u;6+$PS2vp8L=HJ@yrw7l}HQg!0=o<( zL{Jak-0NVXY+Z^(j+3-8MFFK9p59xZj$~2=l!lZ69gyBvj!I+@efui#oNbE(HZKLV zJgzmyv_e!Xz_ZRC@o~45!hVF(o)7Tj4%pXIO+ElpJ{!*U zRLhV|rUNbyE^!fJ8UI@#w_kR{4&nfErv`oKyQla3Z`@gDN@EzbGm{c1tUi- zWL#G;Pl}I@zJupR6?uWGIGuINlz(RR$<;AaaoAKGHMti^i85o(Ne5Te;(t|{$i~uQp!;C5_Aia3sS(Sg71bpM%tp8!u=&6Jv)gb3!+yZVx|88aTWbd delta 1638 zcmZWpYfKbZ6rMY?kC}BAXWws@Wf|Fp1y@{N0>0R#x^8Guuv#jJZKWYf6d$Qp46Xjy z79R_jc9&YiVr->Je`uyjX>6)Q6BC;@j0@e-@?&k9rb(N)EL&(yT6+gtW83*L=bZbU zbLZUee0S2<@dsbx^w&zI0z*&9&BuGM(Hglyi-MoA-}|t8+Uj`OP)n>Vx|7#d!%F#W zV$43p{V6}C1+DOH>nSg9EXrU~r8^=?lbF^RT{o~UzIs|yC>ZnOKHlg`FGFCK#&U}@ zm`vFSV3F;xM0B`O+YdO{1yAR(q@XcmFoJTxPxIUavYe1dQDg>_l&Moj6a2+(kf&Mmy5U++r6ggi&B9|Iw}h{5%EFI5txn$Q znTfsR zMa6wsN}~&tGe*k=X;^um@yGll!QtRY<8Wib>X~BvVd;#eAl{O&Ai_y11m4*a4n%x{ z#XhoTcumsc<1M}nCRc_4{K@~KO?1+Pn3vUJOp!qA@6(a;{$usOduCC!c4j#a7Hmx8h&828$N;90_R7oJqc{g9g!36wv zOX(6uAneH&2Z1c-3>}uC3Com-Z5&tVoI>uC7Arit zp5ngR!QytYQSr-yMjNdgtcy2YX}i>xm0~J25*lg)Z{54p#=cgXVE@iG2nKWX_~7yQ zwktbFcP81Idu)wZqg|@G*fuChSxT~SU#pvYxm^ZUyt>3)4ihE>l`g4r@G8d`JE?Lc zRNk;m&{@P0>EJ>~0UCi0=I+Vk?(S9quoq5u*vbFmT<)GBDd>b;XR&->AL@y+z*J`` zfh?zb{Rsfup{mQgT7+h|K za?M?j2+$7w-Gz%g%c&Z;zk3ydEH~QSMSvTS?x`XZCbW%;Qp4wZ-cTW%F2ERVcv+7h z9rG0&zSXMbe(agY!5GRm!nq?2WWwSVFZL=}d$a~8DDK$N-z52{bN1idw~w|@vg`k$ zpUvSSZ?*zZ1%Ex^rUV@tRt~ihKx3~*pD;b2m7?-V+L2aZdZckeiJ<1*tvb<38^p|X z9;VOBU=$Sqkn7zb5gl%!cO!1d z|0fVAfxFNrQve=bdiS(^*ptE3%9YU7-=LVoWL9+sqg5;6q5cLE*|bu`Ci;z}U~-BI zs(>^7ZltaXjy$stHw71aNi&$;nanNab4%x?B%??%X1M1Zi)RS#%((+N%j*i!EumcD zfIzEKPS=&Sqid7SO5RzSa8@r!CHkC)T06`gFynIstQ&CPGK$+h@EBN@w1-GiX~I%L zXG-eayv{AE#tRR?I;0vecNJa(NQ1aZAz1Rp1IgM@qBax`oDZH2qMxcs0Z+VlNWm9W zWyN3)gJ8Rv)4YEIfXy%xwdT)ZxH)HDDigcbWn~y+h#ZM^kG(dv+?Sy+r5c?f88ylN E0vy{D`~Uy| diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/query.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/query.cpython-312.pyc index b746adbcae00296408820107fa70b6f92e433300..ec8565982f0eacefe00d9cda9f1a1f33b367dd38 100644 GIT binary patch delta 3633 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 JQ(PzV0{}5Wg#Q2l delta 444 zcmcb$lJV8XVNN?s8P-bOfV4SQcs>D9q{u2W;r_JObQA1`Ry}3vaCU}Lbby>1?G(LCTnVCZG@uy4#v0$exr zj5}QWy*s_pb!odE^)HZxFi5WAXtc)xo=2UEhPvP#3KI0}q3cNC(>;LCG1aljVUS z!YSL~c!Ni%-?!6uhT>HonGeiBp$Gh;9lVoeWTYo=GrcFI4%YcZLTQ2VY<`dy)5#0X z#DMBdC(l!q*?i6HFRx+@#Bn?fe8Lk9rzFqNxh$r>Lh+)Q_GMljU?8!YOn&cT&J3hC JYr1aa2LL5BhM)id diff --git a/env/lib/python3.12/site-packages/django/db/models/__pycache__/signals.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/__pycache__/signals.cpython-312.pyc index fe048de81d1113494c962ffbd42c2c01bcc3bad7..1abf02a9a6ea2f2bab43979d4d8c5106832b28db 100644 GIT binary patch delta 21 bcmew&_(hQCG%qg~0}ymDGNy0jdBFhyLqY|l delta 21 bcmew&_(hQCG%qg~0}$vQ_?5Pi=LH7?nwOW00SG!68PhlNOk^`L1ae+5{AghKz{MaaF`aiJ?==2SmJY@a!yA13 zb2t_V&f%UYI7N7c-~~Rd%N$xCnHdBXHeX|7V>PM*>ICY$BQ3vxdA8+z`BEx&+yw&i^Lnf8~Zbv`k$amr18!!6A|)Athti=fxfpVN(SWx4C|umWqcL9o2#RZm30{ zO>c|>km__x_PWqku0HHY7;NFgQ?2uc+V40hHFEV6^0>W@pR0&M_yXOwv`a=iP?l9M z6}zU8*=m-G)D+rdHDEwz=FeL1;*draRn=HR$)F=u3mBkT-m~^0#)d@Yb0C&a5A z3muEmYX7zvMf+tR#7d2`4;L$i669U04Sec{(!fjs#QDcgKUTOu!^~Aha@iF$wGJIz zzYzx-y&y}|_^0bJiMBUWoNk<8%eg}ny`kPkwg!Ey+lhl>XGVc<+#smn3EthRgVcO7l?WR z1IjAC#rFz>cM#K4q8`%wy@CW+SmPu$SU#LB;6Pc*@9MEjA&xGcv^7jNMM=}3JlK?= zi-SFrZBy&Q+vjOlN(O4{VYHw+NN^`&ObORC$JpPqWl21Z3o@W#g2(67rnss|pn$EG z$4F(UrZMBa(HM2x#Uywzp^q~ZzMqiqi^g;cpKUyFy zqgq%GR0XtcCV7OIm>AZ8RB z6+;1C57TzXV%E!SxF&;E2tn;^`ML~h7CZ#jNN0qHI_N;Yib_&8^NWBZ8zE||_@vJQ zC5U1XJKFw%lyz@m$Y`wz4lTuNW3mQ^|r7AFzA+)J^uK}M*KH%Nx2G2{A%|Q!nLEjD) zkSTVR3Lv=!B2$+`n+1};>n#y^v>YK5+dRYhl6aeZGG(6qn<8tCyRW!apeKdsCPky8 zh0hEd^IbD2I!sCao^mbBMJ>m}J03Ksz(Dg!#*eGekhTcCo zZ6824uRiDPOWe=~nc-%bP?8Bf^=1f-Gq(>&C$F)3xPbbHU-NQl`42) zhdW&k%iVvq`CEB*x$>Pa4jVC6ynwMqX_WVhm%hIkWZ(emp9j0w~BDm*b(9#0Evj-THTlSHB{GtqhgUTXgX*`6qO diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/files.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/files.cpython-312.pyc index 6e58f2c6a6ead596a30c457bd105380a023cf22b..4a2f06ea9f4a4ff717fe4621a256b97c1ef39efb 100644 GIT binary patch delta 23 dcmZo!!`QNhk>@loFBbz4bTBfeZ{+zA3II&%23Y_A delta 23 dcmZo!!`QNhk>@loFBbz4=pOi$wvp#YC;(L)2ekkI diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/generated.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/generated.cpython-312.pyc index ef941aa97b04608284680aa83db95a46309aedcf..01e760f173bab30680d4424e2475bd87fa5cf1a0 100644 GIT binary patch delta 177 zcmeD5|LMnbnwOW00SG!68PhlNT<2m;n*4;ziTRpxz+`=H8D<8Rz|DT#ui3ahFtF(G zJybED;4|4#NQe2RiuvXup+rWIxE@sewlGATN8~pn3sC9j$=qUoV8-THF+~=>FFH#Z*u*?Ue$qU8AH}^`{u<$uEqNxa*T%>S=8K`Qruc8eb0HF6Z Av;Y7A delta 188 zcmezA*Xhr5nwOW00SI&t{7T!%bDfJZWAYO&C(g^t0iPHcIh`0MYjVpl0~wn=xL>nz zd}3hH;d>yWFxgf}hxH>fkh3{QD3K8)t_K#sE({jePpFqnR7;Xp(cd*?MlK#vf!6`JEMb8=wM__-^dds$afgXX<)b^DBQtzTS$6xrQmvI24R`a+CuyJ zMXJDZH$@aWoI6byBsI9)mQTcTPcH^(Pi=!-45p4!eWzE^zxV)M8r2w z)%(xPm^XQDGWH@`IsW0qBdSgxkE zJY!MDWq$pI88cF*Fi&uq%DEup;^r7LDSpO7b8&^_=gZ6i;VpzsMGr-9*ypl}D<4I$}I48oj3lS>5GGXv?( zYC`+@CF{WoZi*;$ICq*ZNNRAoA*ud}ft^)t@=rxoW+1&;Q7MC)(Q|T_ZU@H=VX;pP z9Gte3MfLKSf%N7!z5mRN#gp5N%sDQI>wRKiJr6viwm2eDsGYk9`P zjBEV*Gg787PjH#ad1r{@P|pwQ+W!5;+~H72i0jpVo?sr-q7mDgl4TbdIyi1to1gb1?m zT28J{(`N?Kn>VJpa54r@o{%Y{!Y_H9U+E&h(sh1|OZ*l$ES;}Ox@=&bqcUG>rq+Vc Qt5Vt*BwaR}7Z`B?0O1aP@c;k- diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/mixins.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/mixins.cpython-312.pyc index 87f32698ebaaa36141e6cd3133bc23824649b2a3..63e5104eb66c84333c5c3b2640470f5ec3ef6644 100644 GIT binary patch delta 21 bcmew$_d$;5G%qg~0}ymDGNy0jN#O?oLyrYH delta 21 bcmew$_d$;5G%qg~0}$vQ_?5PiCxssXOTh+} diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc index 4468ed95a4e31b575ff2ebece332decb283bc511..40dd3c547e3a425084d9cecde4640aacb8100ce9 100644 GIT binary patch delta 21 bcmcc0ag~GTG%qg~0}ymDGNy0j@niu2JJJNP delta 21 bcmcc0ag~GTG%qg~0}$vQ_?5Pi$CCvBL<9y6 diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc index c1503e717f30b6bb1b5eb5ad02bed8c6af09659f..9ee0e5f9b2710edd2f72748e7a3f23388ffe3f99 100644 GIT binary patch delta 1247 zcmXw2ZERCj7`~_X-qDrbyRPeKZ@=4Z>~3qjwQlSy8yjPmHk1uUJLa+&5P@oph+zRS zIHM$$4;dctb`i50FqWWLypb+3FzIHlN!~E&3A4stncCJC7bV0 zTHM|L_V-JG2`)cT=#vYtz;ZC+HHktYCu-Sd+HGd!E`3a2)mFONGR zldvvono(C6{`}PM_5wjxvn$5l=}q@ZqS6?5&Nj?6WHq%(c2Tn-Z|sG4_kLr+6+GH} zcO)5|-W@NWWoOuozCQ6nPS=3CBjWPYfCOdmy8}eRaLXz+g8r2sDjN^^$Dm9ERa~8zOV+QY0xi(7+@lEj;+E$1~@6g z83O4G46rM}N5YK?Fv8@xP?4rAsueCYO$#~=XjLw8p#n{m8`HxY@S+~v6mHgo=g3@T zyU@vlog|^{NKf-%jsyxJ-~xwMnJ--6_$ss64HT*>rqsbJ<5wqS_n_n+Jk%ka-2k=- zm)gNWV?~KYZCkQ!LAfm~wS^CLV634M-h11c4t0PNW#FQa?FG+N<-HwQXXkZ&vOnSd Rp!HH~N{`Z8H-e38{sU|$w4wk2 delta 1270 zcmXw2ZA@Eb6uxio?PyEy?QLyoFYRp$RA{j+lu*8u0YS#7A}Zf5Xqc0&E@nC-4rfRg zKY}_p!b`X%YUnZ(Yea(&)Bm=3AQGKj%5;dCocS zd(M6TJum<4bGiBkO{)m}dEyVIuBcaOt_(Z3iF+X;scni@q;-`MpQL*nX`3LTMfWkx zhKOA&q0!Hc#+fbSz{X=~lQU{qBQvJPq;UYz1EE8=aO!kgyvn$FJC8H&6$@I%BEERn zwcgF%#NcT1>CrD=K$bC)bgO0HPsn<|Q)JEV9AQ`L;HLL4JGOfPK=9)rs*s$W$k~~; zj3pEt7VQxZrB1wFX9r{f+^M&zx&GqG^n~3Z*&2|o;U784s&-g2tZ8@3_DFH4{RjyJ zxYk*wM78ahrI{U=?5rwq4?178fH>@*s4ZD$as;g`gEJFu5?e7kQ7<>-2$@5bt*D*r zlhl@s+H#k~KD=}EHxp)@Ot!IUQ5mj;bi|rr>oDnL;O$rcu;&QUz-;Tw@+6@x4_B_Z zmR%{<5oI!L(_Io%aPQbn9#`<{vfk$T$*^*TS!NQ(n#fyey$hG|>cn4P10*2e&WV>O z$~IUveX$hVT@%4t6AB)NE*ui6cb@_k)%zpd?(UVkM^N{Oq!~p|bVOU% zg7aLsFUeM?#N%glz+}L(;zIQUsH!>A8VxRvBmDqeoH>KLK9?5R_mseDek8*eG^lQs zd&92C_;v1lAHJAD1zXM@r%*#rUc7uZKv|ZGtr>QX%xa7mXFr*pqp}8bVHK^A3Z25M zXcebJ*JO@jHGkjQcw9L*F3~)q`S6Tnt3$TBw7R}neDZ^YD%(GpFLc@?Ao{o**56c$ zFMr5tz!W?M>#f=6hqp{4@u_gxif!2@ac;!9qpxfn&2U`_(});{&PvNVJ`{ckzi`%N zBjTD1lG z9JdzYyCh-Yzb=W&C1)FQwr%vrhf?-HMjyaht4`GZS0x8mVtyHTA5f^GH!rM{;9L>4 zQNXj0Vkaq}lDT)~WP@&x@N2C|@0kxo=v@Wj_9pbsEbmyESe}r0AL4yELT=~;!qNfY zr}oj$2f!wYlVS@cASMSrLVyNl1*&+qFk7#1f(Dg%aNgJj8rWrERrp>521`?1|KD8Jt5+Bix6r8hlPb^@TNsuF7(U0_+tOO-2lVT143Q zY)qG>ddOO~WrDg{bwTw002dQ+*)oWUt1Pv2Oo&bwZqmfotm7=ciQ+Ny zVArsZvpPoYoOR`RF^ecmI}z8K&|Zs)06H@>XgMQ=0;YBOE@+Qf>R4%kKPy-?EmZ}x z28yBu{2FafkRaQb09c(80m_CRxmpN(GA-^m7QdD~ZO|5#mc?i{D z>?i%5nP!r~&Lds@U7?Oq1^ZOpRcSq*Y5qDU@5OL#?z6aWJ>Z&#K0@_VQH>*_aiBk5 z^Wv0OFl%0y^I;!)?#%%rqb9q{Giv1Mey2EG)}A5>4K-WVJ|Mi14B;7o% zDjQahR$O$PcU-JHUpMaMR2zC5aW`~kwDVx~0$)xaoZ-V_^!{NFrjY@~5Bsp%h|1CP zFQxRWvXY==&Tz|Kmq17mR*7+Ltk6_8fbf4^N|$C%5yb zH14=*2`V^cmjH7qHl{oCF2KZHUs9VY(6z&xG9&dO7p%k8TKGMptHjlVto0 zNwqwg$pbr@m@O3~_*hN~nftR*Asj*9-L4|0WVJ|gr&9>zbx~O@E30J=-H8YUxe%{l z4?r`wtqYKk)6-8t_TSq`LI=A3aQVWcets(vH<-|S^Bn}982WwQ@&vf_QGpcd11(}$ zN=&P?f&F556Yqm=WLGxyWy4K@uPN9kOG-gWMM{#TP$qM*6!ZqRYvBq(LX0m-N#M8^ zHe_N2e$&D&vZNf8)TCrW48~?P7`#~rU4jI*tVzlOpXuN;6fS5|Ry%h$AG@5p>%iFi z+Q+&PEe#W-_T1wV@yPPj*QClcAE+p_t=ALBIW93l7v5c6ItR$rDEZL55c@4NRHK%A S>OjNj=3y2Q}L^PQKOLWo1 z!S-a3MN@XbZV8bAChLrh;Wc3r}i(ALpL0^oGTYa%N6zi%rS> zp2jKcaPQHiY|bny;+p|?yPYgGHOij`Q~j|X$bsLUKUHI8jbm>Ls{ z8&jKiOpEQ~2M1gqnPZl*)$yu&#acfpw#%C~u4P~bcee($isYYDvCh)jG7*2@YOQj+Oee2F_pUNI)bAi)bkNI931a$*qhPa}R4 zHAqDgCnbqoz{t|apEF>_$&2k=p^Z{Q9j+N|;Zjad7O~=Ld}P$gPmkWBqQZ_0 zVuX!yC%J*@NxgR{9M^mERZr6L?a_bC5Rh+wvlldqJ4pE;%MiF0B0O)BPhb1RSl0C4 zx@VEvWh6@{TJifgyevaJeD%gBt}23t{ko5BEtz|`7M*i?tQlp+Ag?bV0?zdo5&c-DS8!|{ow(9cTE}rN-bqW!A z`5%czP>$K0Pg6jdc;ij1z!x7L;0kM? z5&U@ZqYj4Z-bZdd&E^r6nSzurJ#y&56`j(;GEK^CyN?9E6{1iAcUWp&xmyBZ9(F|o zRyd_g>yfv1PR9wRbSaYD(O<2wj!YNz*kI$rI8NRaea!~@b!j8=uAeh#2vkp@Gd5_Y zP;WUrS3yu|M8tfyiqx9VHV|0e_9S}cOgW@gFcE#v0cMUgMcp~K=r$+ZYa43N1G%qg~0}ymDGNy0jspMhgpWMdd$$VQ(cJg(eMrHig#9H?aa@)UJjrpuZ~@PC z1?!6n);k=pD%hRixVZU_urC|q?8#bE){3VhE=z`;j5y$WMM`f)Da4?wQuZezCa_(Q z47)9>Jh@9sgY_FTlY!XeJyL;ST0mNqnL$ovvWB#>*(Fog%MxxEOUa4>-9G%qg~0}$vQ_?5Pir;>+JWO5siC&vvj*-s2yoXV3g@ia06>CIuhcUT#- zCmRc^vYyPiCLKOGURadz(&Tbsf6 ztSe=$dNSggWY_`MD^hwZN;jlz&)Ar8Rm%Q?WY`2YAaO%h8EBKB-Q-Rw4X)43Oa@|~ z7}!OvCU27plm^lt1QHX}CFD6?nXMilx;QPeD#w#>= Pg>nEhkly@T*_{OdMy6dk diff --git a/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc index 089ec298d83d748c523bca86dda58006aef68eaf..ad0e9a456bcaa0e3166417833475c7676c84ca8a 100644 GIT binary patch delta 86 zcmX@v#CWQSk>@loFBbz4bTBfeZ{#VLWh|ZCBI_@EF(~A+Whjt55xB!}zsXLMBf@loFBbz4=pOi$wvne?mN9>Fi>$x+g`kjYmZ2vCcNp$B*=ce__(0%c ov0ZwXHh+-iQ)H~0{NK)&eWvs$24-HV$#(YY%s_f`hW#T(05T08X8-^I diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc index db79b4863369716268533f591cc568ea0a94c39e..5e9b24eb37088aa25c00e0c535858ef37a649604 100644 GIT binary patch delta 21 bcmaDW{8pIfG%qg~0}ymDGNy0jdB_O>LTLq* delta 21 bcmaDW{8pIfG%qg~0}$vQ_?5Pi=OHHmN}C4o diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/comparison.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/comparison.cpython-312.pyc index aca2bbb0ca6c3485545204dc70316e5045b996a4..c82974d857731480c14d54ac2b5e1b32b1728c65 100644 GIT binary patch delta 224 zcmewn^EZa)G%qg~0}ymDGNy0jsS^+~2XY!19!SYumomL5WqM7@eDXp8MP>$Ri^WF; zm>6eGJ|<)*cSX(lGb^*8&_gxn8C+kO8AK&#NUg}aCSrL*&G{qiW?5lvE^`NAaNm$pn6EQaXP#cCSBLWi(HlJC*LmbF^2jY=U68z(YlZ6td84a5#vg#TXl`zi z?Pg~5nJl2FBYx2IvZCif(;X%YG?(iw)Y~9(Rmtpt>BY_dio2N^k5A@SwdA>?8~O$8 Y65Y^?lYLc{S#Riueq!BRq{_w#01Y`w?f?J) delta 193 zcmewx^CO1mG%qg~0}$vQ_?5Pir%piJ2FPh(cpxQrUCQ*Ll<8$D^G^)SoN|-r2q-cG z>BR>Gm>8!{J}6`-d0EZ*8!NM*&;tpjFU$<0k~5@MWL*=n{KULjR#=-$$`xqPj|PSt zViFzPH>4Ei>&(=dt@nw6k<(;ytgJjUkltJ`+s(}AF_~LYNBDs0HAT-ICJQu|>n+sV qAaYg7?9ygG#of$|2Pbo>T5?|24gC(X>)~X7Rb{5n%$v(q**F1ZqdWot diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc index 4b231604ac878956719c84c63753aca84d79667d..404fab04b0768b9fd2d1e9569e4e45a827b2abe9 100644 GIT binary patch delta 23 dcmZ3~!MLb{k>@loFBbz4bTBfeZ{!hk0RT!{1zG?A delta 23 dcmZ3~!MLb{k>@loFBbz4=pOi$wvk871prcw2DShI diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc index 795da79f8edbe15be9f049eee152894de174d730..d17e54cfdb9d46e50840883bc3d44b6a60a5b394 100644 GIT binary patch delta 62 zcmbQ|zTBPXG%qg~0}ymDGNy0jIm^L#YVs|PRDnxMuAh0?dHFu_Fetk*PVk!S!>PgX Pfdj<($h*0WQ$q>>FQgHV delta 53 zcmZ4PKF^)!G%qg~0}$vQ_?5Pi=PU=~!O6EcQh6^bxqjni=jHpr!yqa@*`HH`=@aYb IdQJ@~0L@|$Z2$lO diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc index a7766a1b1dbb00baa118e9de1cd721bbcd94c104..e913e96cd3764e17a1abe3f41c16ad5cd1e76d0c 100644 GIT binary patch delta 126 zcmaDV|6ZQwG%qg~0}ymDGNy0jk!N9CFjaN_0o3(^;YS0*1wN;ZzAFlQs%9w8iMh_Nwb6I;PoBw)k{f+5^EqAN bcDf@hKiTdAkK!F}zKbBGmp3ovb6^AjBWWo0 delta 116 zcmaDa|5TpmG%qg~0}$vQ_?5PiN1lao`eYpzTi(k`_TPBfdHFu@Fo?=eu4GYT`oy|< zIg2BQlsHiF3x*#J443$vRuuMB%}|^ZbDdx7BA?S{X5Pt+k{f)l@Ht)KcDf@hKiTdA SkK!F}KA;>>bn|*X2SxxbBqkXE diff --git a/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/text.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/functions/__pycache__/text.cpython-312.pyc index 079543e52e353784a80803d08234319e57b8aacf..b765056649c3a72636c289f872b48f671018ee2c 100644 GIT binary patch delta 118 zcmeBgWSrf|$a9*Pmx}=iIv5$#H}aelWbB)KTTq4nijvJ|UUpu-k30;@wiCQ2^9bp( zf8YSJKk{z27V>0bj{xdvV0bY3p`gg*`666OAPua{ynGLpY$kYpVP+7NoFTO&bcNC4 T$g2YSHLMHJ) zb3^5AVfK#riU{_jmsO2)Bs~u;sCLUKWqvH3GMEAa?ads=$kMB+(VRMTBx8ky%B_c3 z3Y8*@ChJ4V`Wag(3TEWfRACtcwI+Q=W*DrW5~W2&nL$ye_rQe67^5k<5ml(mc=LQp zo`p`R5$?%irJC3d-gPD;&c;zFyA(<|sPq?-^_iC>(SA_)LDry_pxXjDmYJ z)7k4;l?f@eBu*!(DU~r`DvzitPGIgC zHBSId#GNZ{E`cS;(yXSVY6og*Ud?&E553fUoThB$$mq1w5ltD|<}9MA%w-5UU#2Nd z5nIthbKpf(-DXftTMEKT+c4i}_v*a0=Z${;U~@oeBfEF1Z3Edo_GVjRQnvBu{1MlT zn}#>}*Nhkk51l!2`h<5)I9cZ_jwD&eO{{p^EWj=F-FBTgq%5B2(Q@Ieve?5z8D08} zDP=L1r=5X<4fE($|BmWNsWT#K36?sC6a8GjYjEwe zMV^D+-mugV6dMAi&XA~Op5~+r2f0s+Vth)b7!*wDOi`U9sB=u}iqRAM?2btFnuu&| zuzJlKi6h(*muKyTBJV+8Z#W|_D9;O2uL;T4VjZcHJ2Y3EgrlJ^L0|2ARsV-a!_p1c z9vyRe>Y4VT_NXj7D9et@96_05q+~+2?CPWF%KkojMr}lTw;e~y#IARLr2-CH@eIwO zBSo#K;Y>T1DsBVTduATYGugJGcF#(0*_2F8H2PLXWVur^71KJ@>a$G9^6=W0LiVj8 z5zu6}KRRoPpVd2O-=(AW)#&%=O)ll=0QS(cSNWWuC{%WSJspwfpy$qC#Hp9dmR`u^ z0v|o#v(gb+0b+ccaGLAT558RjDnlO=Q*s-->vDi6v))gg7{$>hO}BR50OWi{#rbd@ zyZaS0D9V2!z|%_RxSSltIT3o%Z{Tt;%YNwp0l0YDJbM4tWtdc^;O( zL-A52F^o)Rbon*26`yg11}9#Ma8|DNzyeJr$%FE2Kln?+a{JishF`~0b69lzi9PuslRmmYlK!Qno3_4{=oj8R-|(yY?zsYT~M(9qLLEBf6B-zZ+~ z3u~N%ZF3wv`h`*xRa!$z>pVMt{ST19!)h@)cdln2`|u-Lm3Ds>U1M-*!$_*n?6<$1 zi&?h!lW#ciBytA4oL^_Ke+qO00nl_UY7Ch%25Hg0(E3bDqPe{nD3Jmusw(r|N<41n zJ*&P9nIuz6E5XbRY;0!If{@xP-E=9Lorq+{XJuuh|D3?H@Yg)qjgP1WJvEuh#Wsi8-%N)15Jo3IFQzB0 z9q66UE#gpq<2+AbR?Ox%dRx$UpF7j1@*C$!&s>5yO)^i3Qzdges-P3twtsz(13Qpp z)<8$HDp1vIImW?C_UP=_9Q{D%FY<@hNM_AVULijH3YE7!A~R2$o6xDRJ~jPcvG%_e zYrpHh!><4O5O5>rrg;?j#(Hwtd zr?=NGk^ijaaqOY{?+H<((jRqLVAGG!bK$pW;lJ>f>#C6br_I>V zTgk!{CZF*h?mz5uy9=2CfLgwgNQjxY0UF>O0~}}*%t)0uFiJJk%>ilNHF?<3cuhW5 z8#ES=bW9jaugZgl#;~d>ENl8grA5xU1WKiuqbUq}=Q;3Y4xea@M?g*%R*+^oAqvur zTU0=rOGjU!p@$1qOrih^!8BSa01p?$qo0W2OFq;vZ%CoP&V(o3tEfcH!DXw4H~QC& z)DEtViZg@aOpN*6QLzR0-<{`T$;Y&MXd4E%2s@g?b+0BX3Yi@;*kUu^SA_3Hop3fy z=b`6mO6-Jpq+{!^u8AyL6%{p4r|IsxH(>Kn@>T^y%VDW_BW~qz{zq4X9NNu4qlUgM zSk^iseW}P#zqAaqcL#_Wzmmwny^$G{!)_2V1_f+_$C(ofP_DzvV$jqH0|L!l5@l!y zJSVJg!*$+*fU@KT^6LWG^+AC#AV~M-VvMbUW|)vSj~^YQFBe4=MVE`boh-+1Kf8Z~ zcU1LW_zg57e31DH~$%00W>b|1^OT+k~G2O7lUwfr#xao>|{1Btn!FK3ns`b#I zz00Sl`Ja6emEjV|s~hY%v+^z89czeWB?1ljZE!iLIzk4JD5}>TrHH5uJ|TN+@xl9KS9#7 zkMy1<&G<3-fb<1Ob29@bkS1;;B3EE)`t}x7u&4DosGXb%QIpToTRdKhD5bJ9QShtiyO@PiFl(M7i<}~BK8d*j8go0c zb}Sk&$ds1BK5j%?IY0VZ85{=~WGv-yd}T3~S_Hfp#ghtgnWjwgkOzr4H7YU(MP}at z|Jo~?hc`#9RY7YNUUH6uMHYeQvBDzAS>k@0`MMlF=Huc`nKVE8Rs~$*K@+pS7V4aY8zrW&XhlT8s-HI6)64 z=9Uv9@G)j>3)IpRI>+b>EpQP(YV<{;%iExuP9drBnZVtDxTpW%-UDte^GpZW5{*P{ z{D34d*E^sXq|9GCaOz)RjGf@b6>JG}xD)V$Rk3vR^-ky$C~?UxO`0y-IKuUCndG75 zXi6SF0l~73OyL%|l0h!Qd$p{6xZbzl+wFrFdWY-py2I${FO`gBE1Wfv>+#-ASI}@x zHdgE3KO+Clk!!MhTbnEaH^bc63Rk7i6SMJ#xw_q5hj+T%F8BA$`E8ID_h<2*Jxt<&;e87@A zgscG<1?Ey*`zo86w|2lz97b(7Wb%E)93NBH4Y}YO-P;Xb4$hnxonI$eT(37fa z#^Hh{E|pOO%n27<%eqD;5uy{|qqGEj_jlAhN6yPwJk-}lw?7EK22e8#55bDM6cWpm zl+PU1JA!)0NLfT*85eBBH@S+a(qfXskMHtlf&u)8&#t|$huvF9)IK8P3Cyvbpj@pZ zJR#*|*{yi^ZhRwSLM|`urYt?8svJ8qDQm)yVwEAF${R9%C=1)$K9pUp9np<6k8Jv_ z^@c2HZwrgsa5Utrm~VDMN8eeyG`#=LXndkd} F{co&w=6L`B delta 4988 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 diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc index 70b34bafa6e91f063f2f9e6b5e8d25b073700db4..855408a348943b526109f8148bfbfda29695c95d 100644 GIT binary patch delta 21 bcmX@ba*BoLG%qg~0}ymDGNy0jv10-NIcfxk delta 21 bcmX@ba*BoLG%qg~0}$vQ_?5Pi$BqdAL7WBR diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc index 85be2d0e20ac4c38c78f45b7b86939f4b17e7549..8cb061070e982a02c3054ce9c790f716aa28b813 100644 GIT binary patch delta 86 zcmZ4Ezs#TKG%qg~0}ymDGNy0j5#|!o19Dz4{AghKz`(4`_fW^?;$%H88RnZhHk6U?IMoMweAz6+Gn<34c=8SrN6s4(%AXkcI6WCB{}DOE0%B}FEqYrJ0PJKOC;$Ke diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc index 1666e997e50a8ce54d4ed34a113e3341c19b6091..7bce037ea4ba0637dfde409993ec217d99cf240d 100644 GIT binary patch delta 3568 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 QzJsr!>ge}w!DH&b0MuOH^#A|> delta 3681 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 ef`zeua+J}(Hb0YAU;Si| BJTU+O diff --git a/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/where.cpython-312.pyc b/env/lib/python3.12/site-packages/django/db/models/sql/__pycache__/where.cpython-312.pyc index 9fcffaeb1c697d1e74e6c2952d21f730f21198cc..c1f927be82236025dafd77ac97e9e747eca4904b 100644 GIT binary patch delta 497 zcmey+#CWKQk>@loFBbz4bTBfeZ{&&PVdR^f#j}oSitJ>0-lfb8Lh_rB^NO*nC<2wd zVEEC%a6!Oxr|pKsDI!x+W*9CooRYty@VcPk1wq4|wwpwI85ubz_lY$z@3Or-Sy()s zX-e$mM)5jk1~KK$OcKi&h4g{OG%(!Y7wllUAu2gN7AU`8QW7kGTk;VzW5VQpvJ%YK zq>Lutmvv=kkT#zDQBQ2Mom?U#W5nbI@+u$$Ps?j_0S)}X!5|>o!83WHvGitXg$5?Z zg2{7~JU|NGC@F$WoGhq(Pe&JQ;T?XV?ozmw9j-Tc1SYsn_nYWHzhH&4(z$|hh6(+vx{EK?=0yZcS|v&y)F ieR@MfXFcaC&ddBpD>)YkPhguNJeg+&=jKdnb~XT9A)(*^ delta 579 zcmX@q#Q33!k>@loFBbz4=pOi$wvi{6hf#QP7SB5NiL##<1US_uOYtsc2GW}k@rto4 zD*)BKVEEC%a7n;(L*f*XDJe4y7Z^^-Ur~5n(C~tw;Y9(@&3{CC85#K|cZoGI@3g%# znO{7eePZk<25C->$ra*t%s_hcPw{1p;wC_|8W?Wy3wE&F5S5%B3sS_$X*_wOq$D$t z-h5W_5i?`@-*yhLJILa<{w+*cN6^ z&B+_(wV8qR=KJ!Cm>A0^Hz|2=K+N`LoP0(}k%f^H$oQai&(H|$f;;>|-K8jQQ0;KN z!6Puib-Ld~zsn*j7kN}VT|NNaq`LW+axO=AAKDHviGs#V9ET z4_+br6|56XuL~<*6;{3|WIy?WRv7a}*(;khfnIZ*2X^-pZlMV#Go-F?tK5*3oi95R z7+;LMj*JsnZwM$(V7@M(cu_!cf$9p;3jz)sL@o(9>=3&w-~jXnP|fBvy`yZRRxsP( z!Oy}eGuhfyi5W<5PB7iiD(wQc>4t{Rdd`)c*Z7SV2v1;}Av~Gq0>9B_Yio8k0EH~O A6aWAK diff --git a/env/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc index d476fddc642a716b55223b7cc3af706aa39226ad..5d7a8a3a5f4412f886001ab7461f209a0dbd83e0 100644 GIT binary patch delta 21 bcmZ3?vY3VEG%qg~0}ymDGNy0j5oZDbGXw+? delta 21 bcmZ3?vY3VEG%qg~0}$vQ_?5PiN1O=&J2nMv diff --git a/env/lib/python3.12/site-packages/django/dispatch/__pycache__/dispatcher.cpython-312.pyc b/env/lib/python3.12/site-packages/django/dispatch/__pycache__/dispatcher.cpython-312.pyc index 5acce8672fb2ef10b11ecf5c820890297613a0ef..2a2dbbd7af18fc1f6dee31369cebea285ec0829e 100644 GIT binary patch delta 614 zcmZ9JU1(Ba7{}k&bKKOuex1$Z@mrho*xVW&1uLQS!jE91y4XN=AseGbFzF&8h~)@^ z#x7D`2&-Le5M+1OxtQBc2!j^g9MSoKyU2?{mktSc(butvsORE==ZpXE&y(GRwHFY5 zR4NrfjK>fzzd>JBc8ge?eg>y&K%i%KldtdRQ-y`1Hj~;?9O}n+lRT?lfY5{2HBHk- zyn!@zOIGkhEjI{M`X}-AIA7AvlW+%HXuo75j^}A3Q8Re) zD$Sh*MqdX3rM8aPGGgm!vWzCHXsV|bPdgOQm<5@sH!K!>gZ@6?=m3JI+irg@c0vGy zLtw&rvM^U>!o}1f6K=ZwxMz7viVIzwwbtMkzGaINEyjg+Y#s$LuqOimnR+D7`kcJR zt{YH?`fk_2C$lvpZ`se`i!KiV98>(Vi-QVLjiTC4Z%&4{*%6}Y^zwVG9Fk(I%fEMj zkn8{DIbUGv%%wiXEAGx83J;EWi|`o#@Lv5za^1&?=q&%pryo?O|C28S#GxpE94Jdn z%->IFXG@79Q>MoA7wVL+l)%E}FGML(;Sa8CL%4`zHR?q4H delta 699 zcmZ8eUr1A76#qW&)!pmv)qC%@ySq8JnL4kUVRzP|QQJVb1PuZWLMjvyf|4E*f=CQ{ z(4HnAn30%5fxg7zKC~V}1z-B}aIa2x10NQ?L{HnWCQ;FM-9yp$aDE(qzjMy-oNxCj zoLzv-2bQe{_;sxR7<J#16wkuc!m8=`x5Ea72MN#B1nHK=((WttT4JYcR_`9m12nbQkd726Ya5ZRB z&kC8ktV=!Vi5;n@Kwu8-*UynTIdp*Tdw1arG~i26h7>4*3Oa}ueeDEB^`kFZWsjSy zPJx`qo1_i@39R75s4jpNd|2%bD9{`x2sz1*hdJssdu*vYCF=HA`qYj+hKC7)y3j&H zGS?J5P*>%5wDVtgCsR^ZI$QQMquefg`lal{ujq5Ix9rJ6hfqhCLSR%!x||mK!~Z>5 z_z0Q~V+9{k--h)HxAX4@@q=ke7ur_NWQ8uBA4IF?zY*)#GwO0=8Om3&4lie|&02k1 zR-e%*Pj_b+f4&O1z0bT)yx%KHZ%xkbKsRH}6-7dwi*1td0UC;5qGnwMz_1q}dKvdy zHYUx(M35F&@L?jzk_fs@GVcbB%^HOpBF|a#X90YE-lo zKB_oss=iN*kfDL{o_khDa%|zw^TGLB8S8PwQC9?zZA(Ifb0y(pdX}DV(z({9z&6*K MCorR4>$?m805!be_5c6? diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/__init__.cpython-312.pyc index 59e66a99173f6e960dc7a1a92146880f3849f0ad..8cf59d06aefb096a1eda0d60d3844923f88e9c6a 100644 GIT binary patch delta 21 bcmdnZvYUnHG%qg~0}ymDGNy0j(PshxHuMBp delta 21 bcmdnZvYUnHG%qg~0}$vQ_?5PiN1q7*KPCmW diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc index 91377fe1749f6bac6fb98a8c191b69b49a742a7a..e0d8db74dbcba6cc4acb7998bca3d0b44dd3c5a6 100644 GIT binary patch delta 88 zcmZpj$k;WJk>@loFBbz4bTBfeZ{*?RV%$4fjH^QM3j>oh-)B}<0j`fMK-L7d$+NkX q*gr4<*&kUq@8?R@loFBbz4=pOi$wvmUEi*d_jF|G>U&kRh`eBW4E1-Kpvh)tf)rNs1! ldGiUb6g|em$-0(PIWB7leqvw|6q|h1(wrGcZ?fv*0|3$v7tsI! diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/fields.cpython-312.pyc index 1ed9b6b1b5601b869a306cb18ed573aa1028b7c0..be3caa215a88b5997a5445e035aefedb64aa8291 100644 GIT binary patch delta 847 zcmYjPUrbYH6#u^7wp_v5UfSDxOH2RIwIb@2GK!lCSlf$(lHf$66P>{zb0*U;H%v4d zA7*l!Nz(GQ=_OjZ8Xj8Yq3mM`h>6n|AB2SVHuM&FSi&BbJ(#LX^hL8Jw1P|f&Gh0=9=tFvao>-xp(ZBjS0@V62X*i>XDRkcCq~i`g zP*!PlyGjNs>Pe7g4XAbD2PWRvHl#GU31kDEtclei9k2PzTvs$V7R-%&XIVw)EHYzF zUXNWDkEJ^$rX_D^QOL{=Jap(*_=gLdZH~7iNQVDtt)t?q7AdUul5DStfzWA_T_166>ZfXPY06 zNUqkB)lsGZ?ZV%oSxBlkJ?H69c+iSBd=rzW6A@p59ag;+CN(dwj=0E`X4pA4$uZgihB8{d$imgNJo z#m)ytyUWT2SbQn-Eo}BFL%+KT{;LLCwneHUy6CwAX_IM7vOnI>bF#^j49CKvMlyLL zoI*3Z@Q0~cO~a*+G`ZmmUR@v^>!dDHl_S|4*&z7yWWyT8pi-9GlyS}UL%X$t|EHp~ zT>tfaI6Ev1Ok5nlm_Ayx`{u)F{P%0bqp*Y-yr{LZpJ2N(HZd?q{po$=xI2(hR+=Xv ze2ugVUDgaIIS*$zaX9_NXg9wDY| z5`Ovkh8q5%xNEYmyBpKgbTF%a*i~>>jLy0J!ob*1%Wgj!f4Y}g`7DTXPg~T$6N0$v z*^w>qI6C C@-xT) delta 883 zcmYjPT}%^M6uy^f%M7-bVTS(EcB-|M5O$ZJ@TUZ9O2LApu4v*enhhJ}Va;k#B8f(W zQIjFY*mA)RL1bchDC|B|uQA|HLZ9|QjI@I=?DD|FKKQn?vzj&gvU`W8y$|<0_ndR@ z`ObIl@~_n0-ze)Fo2>+p^~K6RLr<(lcG!yS_Ci=;>vRB_E+|G+D}O&Ro_N?TN7lj} zD`kqe^Sw2uQAQNQ((g?0F&g9po|K>i3sWOTv?8;uW~-D9R%r4>;&x9Y4&Ur$|^PiDFlXG5X1K{JyeKG}Vzw_=3Q8Uw$VyQFgTtyrS+ zuJqB=Q611s0BI9Ez2hepi`WCG82JQ(8Vz{26qz_Edw#y0t^4VUvafNgLeN-p0Y}j@ zSYp|IG1ET=@V}EI7MMUIGcBxU0io&*d$rU*NhPCGbOGmPZbLYPx@Ifs9nNL6RfaCk zwonA|;_N7dBWV9zQ&|0~X~WShpPRfaHBMb!b2N*4$fnlRZg6#S<78AaPxY*Eb@=8S zG!v0-%{S1hqrzyQ3@y(GD1vxC?)4Zd3pl>;4LsCL zxPKl4A4>qUcf5GqmOQskd)0DxdLT7mTndXZm3OCmQ@yfT;VZ{?ClubX^P&~iPCM}* zi;|h}7PEd@Wt|3zAX>=A2#Fy6Gdlo%9;3hqqej7ZBs(k(&Rv+kkU6pGuh09ApdX%I zqn3Nu@rS3Y7LW6Psc|{7#I97n5FQTZeR2G5nTGHaQeVWKnb=0)m^_^Qdg<(Ddm`VS zC^RM>vkGc^d5Te7U+Tca^gxt;xoFxoI$vF(7QE~D^{X2u_#Cz61e+2x1eOLTE)iYP z`CKin9Ecj@@S;b#1~LvWexEzez)@87CRwe7I{pGyTOZ7q?n|1IXQi0RIXAgrfeUW? zf^ux;j1H*sJ}5!dx7zR5ij9NuXNR9hiw99bWyu)-ZIt@ucPjPPf>- z&2ni^$|H5o#i!#6Td4us)|v^c?tl)8*;e$+>W?(RzbWEIZErhhg1b5R=G!IVKbR0Q AO#lD@ diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/forms.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/forms.cpython-312.pyc index 6a68c56e99285c803934ea6103bde2cbda7fc304..e21aa94332cb94fcff9944990511acc658e4af1d 100644 GIT binary patch delta 575 zcmdlpm2vGFHh&(;6rf=Z3?IZ8c*HMo z%iZ7+x*;gs!FF3%ZgRA+JTrrc{N`F=4`wxGpt2VXKN=Vwh)7KLp5oo%azjXL2Fr|) znOqlylrHlqePm`3Rhaxi?6jgBHl-6vCTd;gkpZjP{80QSxBfK=?M{ylmkCNY_yzlG zx@v9+i%z$kWO+kG?gJZxlFD+)MUtP{S(L>-0(sgq94GUr$gn<8)cVLiSxd!$nL$!# zbF4}dC!_7;1G-sE%VZ}T>Rn`JP|}}lB`>{MLEnc_K^EwaA7D3M5DK_x?7u>Fg6VXt ziB=0lt_rIH`I9>h=CWKe_P@MY%g}{IXf`+?Zb-;nm(aW@p$T-}3`M6cM{75Rf|iTRc(S98LcN* z+DbED6V;qN$5w)wK}>7&cH5H>he6#He$gpxhbYipHWO{G3!7XOHUSDuo@<}aa>Xg^ z@@4@CYercmu*Dy_7*sSa^II=8nW4JEbiMs*`$?<|OfGItadbjcVh>hQy1ssOJw(ZV Hr@!m~7xlWs delta 625 zcmZvYK}^$79L8U1*R@-hv3Bdag%z`|Yy&s8un`@@=>my{=pZT_;GzeKTuemI>||!* zVdaHv97r%;NYH?(2TV-xN{9)io9hv7ns}In=rA$yZFn-i%a^?G_ul{e{%=;W4=Wh6 z?{L@vI=)1~f+M$3nNTK7fYDNE%wYK{QN6QjJ79x46a0>&TX@Xx_euZZ10BBnMCsR=o;Dg# zKY7pWlr9XIz(xHA?NB)&<4fOu*FKL3G#R2QxoQuv*;eNXMv{FhH~%$G57 z$cGX*dZyk8-KViUd>vb`z6zMYNynfN*KnljxA;63@S`lPPWVH1aziesD;XuT?yhsP z#!kY;#2TRu6>6$GIYxNb5nBX?(9;m2nh@v-v%=~9@HSKWE)(n&ZRVV20qI@BJ})p xO+CwvU_P-kuxSIK$Yp`c*hVH#fqC;J0L5t_v<+sz)7F+5Zw;=!pA?Q?!Ue7_%_XFb= z!{#TRG}@O8+7S}AkmxilvZKDH;8RS-C(wqJ!!HV>IHD;Ekn?>GWU@}Wyp}H8{BbK? zZYK=-E_;V<<*~n;E?eZB_M4`50bVTB|HBuM2jZx%NK4w^V_JKDz_jM?>9!E>Xck$} zcNsY{5bXmh&u-0a>BHA1Z=vTtm;9XkPQe@4J(}e1&$$fk5A@_Q;{=XP z$Cyod%=0@o{dFkS2WWh_r&d~XeFP#Sj+nK?tRogJvG|g8#Mv#iLKZ4#AUuyBo@~-< zYQ@Frs%Ly4i?38KQa~i{s)!zm4u0zHFPch6F?1)GvVtimIBF{RbFGd{#U?YSAM;7| h-wH#3#K6eu!8rLApA-v-vH3fn z9;>hbQ0WVX9}Ntbq&-%6&+)z}?J?O>rGu)g3RYJ6_{=TA(ogU{2+}C+zJ~9Kjlk=^*m^X5N+5E@q8xv#k;JrI$YtY{|>@|mmMCpL~x49vP>4`kFPJGzRoeq;u6Hb=SoGBT!2Ug6fj za#73m%VZsQp!dXeJ~41|>Q2sZPiEre+OaN}X Bo~Zx; diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc index 183062bb98d6b598f09182288883c616ce575027..b4a61c93e841d81362f83e4662d559881408b30a 100644 GIT binary patch delta 1076 zcmX|Fr9n6x!alx8BRReW4(QmX?@)|SfZy{;`#D_a$cV2 zIlt%s<39Q;huDpxA{C%30O1Qa*_R99Q9MytDSP)gSt^833Dl-@yS1$x1F0k5^DZP+kK!J|bTYpu-Kd{m1 zV{$6Mwc=CGA(Ypzoa?%!$%NFsIJqzu9*vm4^eh?@#!OC6Nx{pVvW3l(xj`gjgN) zrZ|3XV0vKoN!oX54XJ-=M5)RExv1SW*Mu0nFy=;Sa}C)VlS6$gef?YheFiAa+N>HJ zw1*(xd!<6Iq9HN8S|pSGF2j{)?RE1i3fidJrSSipI?BC&q_nAP?Hg65e_Z1IYquE7m zP`S?n(VYFin;bTepJs9_uzT=(^FIt%COJpe2Z6~(3zs+U_d_65;k)BT zw8LA;zvC)uM0$3B?h?(pO9v?bxeHAw!P#-@!crm7S7anmQWjMn#O?`!d^)uYjR8u8 z;uJ~)@`RG7EVnpYg0tZpmrf#}FDL5D&sNx49zst$4#kcB#g=gSYQs0)JKeXt@ATj9 zk3T**&qP|t^yjw<;3W312>kWFIPY8N3ym(jR~m0Nt{#oodFM6ZJ~FjZ3)ySOa|~;u z7M7@mzg~TjT3E`HG!W<72U>U%Z)^;hwsk_FGo>}mIi?+<;keckXDxKVoJbmf@LHfB zpWCxDIW^Gn__I9^%In=dn>k(MimPiEha&LGnVCZ&cW4;5CyT9-p#X}iYq#mGNAEY% zG$!)={VasX@R6*OOFQf0y86YDh=xKoCplYWBu1`fZ$Wqw59OY4BwW35Lto6*8y=ZC m6Ka@!E$ZqG6h;kw>FV0J&b{ajH_UW~nAzTlm#pVz75@RGTW_iW delta 1209 zcmXw2ZA?>F7(R#FTkgHwe%H3x0{x;8D5X@210!TYLB3SBITPHL89x%YjEsqynmCD$ z<+`{CITAa!nBpJF<`T$B6lXGV`{5F@thG{ZHnyQZHh;0(TObQrvc1=A_s4nO=iGDN zujf4*1?I;!MqDr$1O#8*{N}M)@!b-9h@35{F1~oMfVQ$b>CF<14PYoQAY++|FxyOK z#4-kuro|x!UnXtlD3>+tQ&BM+C-0f}34n?jiRRH>GW?F4J~RJhD$m$L8%$A!UN)L; z)yxdc35zxDA7e$^O6%O@sW%`Lm?ERTfMRTb3O*S-z{nrNh%+jB&;#+W2r45KVMBAH2=*2 z()pH;82kt6YHi`O6%8t~@a>p<*gD9sxC1I;4ZxnX)(D!Rlxjbzt*w*6>tt|OEthpi zR8++KiL|SN0i<8-y368wMI7IW$-UjL>okM9yZde7eh_CAEt?$UBgr=& zo5FIeX(`s8iM3~AiJZ4{dLU)FX`iyEhNqm5=(X1prb-{&_-ho&9`BMTobiOAMoVzK zL$$SKI*)b5RYrzJ8rVDogx(m@VcQOH@l109Dfz655tVKw z_fA&nSYY(`lZK)q9YfaN55+$fKp7_}W0y^~%V#g1y>u?sIDIY?XjNHcuz*rdK`K!Y z07$gO3uD4Z$(~dDy8#s|vf3s6N-(aXARo?%Ua51uZ`tMkjFq}&7xdF_2#@R5^jea> zx-}MXoLdu-$Cv*vukz3ud3tI{P(&1pL2pZUlKrQ>oq!65wv=lHr>Yn2wfO`FUkVFh zls=5yH3j75tEHa*gGF01VjV>9OeRt-5W0ZM4Ape@w17DyR1wcd$lkFd z3?RKd_GVQ;>$N6V?e?5=AXPaRpYM3s^`Prv--EvFj(ykIv~z&Ae0874XUOJlw{xmD z=Sn1pXBzG_%{I*)$ZqSnW=XpewC+w63lj%7Sh4i^LpeV87CaOnl7ap__qi1xC#M$r z%VnEeoB4p$E?XT}YbR=xhqG3HR`hG5AE3W3bolWg39N<$P~GOz^0ksZt1-yeN-nGh zE9JWSoH06$FP*ruJ=u^vOxhMrfwVCyF|f$m4LzLvezl1Kr1;M~#;=ls5;4n>Z8=-x zv;`FLE!u;RXgq%(<59A%zF3v5@5woOQ%A3yNX946q#eCd2`q9rnzJ>e;#b;}>|{^c L)<6#xCiVXU0g8{c diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc index 96a1180e6fae043c4d396dc16897787cc222e341..768f35fc44f3e24676f7994365251f9ba3185753 100644 GIT binary patch delta 21 bcmbQLIaQPAG%qg~0}ymDGNy0j=@bC~H%J7- delta 21 bcmbQLIaQPAG%qg~0}$vQ_?5Pir&9y~KY9iq diff --git a/env/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc index b9dc74d14f26a5b4ba32e6dc619b2e1220e4a0b0..bdea37904d10e07b5a692c4b856e9fe5b45c3201 100644 GIT binary patch delta 204 zcmbQAI5&~!G%qg~0}ymDGNy0j*~cc`3FI^|d=O(0mu&FAAtKh`dqZ4idiBKWX|+NT_bsV)qr+)B`KLp{>8(YNgd0n=AYlD{U5K&*pz@&yIy%`M8(ya2G7L`DDr delta 195 zcmbQ6I6sl+G%qg~0}$vQ_?5PiXCIqFACS|)@Ij10T(ZIchKN{$?+tO8>D3dfC)a*r zU}ZI${FKd>8AxwdW%m_U)dH)&p{>8(YNgd`o9p}*3r!XnE=ZifIKgnb<8X8C z!b76-z*omXYkCl~9k^M$6Jtq?LbA*)^Mb>vZSg13%!^%YOR>7RWEVT)OicFOeBb-# z{dwN!ecun9MgKg5V!x=>N=P~s4DU~25zO_8BpikAYpij%sIgOM-a;g_aV-_eyZqm7 zoZgsqHG?m(iXh}B3n*l*DJYmH!oRg z1zqieYMH-|84#0KO7ZwN=dI zwzkv=w=ez<8%(^P8Ug!=i-F}egbz)S#xANI6mq-L$+|gtwz8h;p~5to$26z9#=2w zGJzOMx5pIRtAcKQ8W;GJhaZ~#Gf#SS6uPa#>HYEHjLN;zyF+yD{JC#oM=Hz)Ir4lc zy;rE-^i!VzxCz3Y2}VR`w-AgZVRjwoobfFMBZ9M=3TLpYmCh}qxo5Ej+?_C?3oQcw zXyOI?#WH0=pTnIbKIA@}An9r$z9z(25&6 zm&9VF7bKYd^1o2Trv$pGV^41W^wb@=`?aUNRzNj=j?DSn1b z?UQ}ueF8>|ZI;j&s_tq{6n3CRasWgAa$Y`dLMqIX^mMchn^GZe58aqE`feC~sSs$I z89=`ei9DFOsel{6;9Rvn_5szEchpc)9X4q|%r5?$IUYlfAmB~LT4lCUSU%ABUH@Fa zXl|YD=U_%3?_}Y#U1wBWKR-!R zFVA<#5D1>Q@{#58py=wIA54CHp_4;rBImazk?F1JL4p7B%2l{>*E8t%H5SGuYP`}{ zWiV4Ew@hZRccD$%7z;SRka7Fh7|Iil9MK>U4Oyazir%bpPKTC^4a-=AM2)SPPb~f@ vuP#8SS$U5j=~79l!A}j04KQK0MpXN`;f%U@g&@K4YwyV)Q%N3q|t delta 1399 zcmYjRZA?>V6uuv{^yA)s(3ZAvOTVyETDG>d1C=ts%0NNmf?*#@;>Xlv8^%qIVK|A| zva8Y9@?y9Z2p3thi`kEwn+3?Sfmt$tEH2#M(%u+MFyY7c!=+ThblH!+#hLj2Iq&

!50v+n zzo>KCu9-{Rh17ZIrD94ZRY?`QXUS44=xRl6*OH>^g~&f7)R?aZCh`0a5WP7sLu}5;&SWQhQlRQKO=?n;HzFo0m^L($ zn=*J@$D!?u0tTKMhUL(w(gA}S)1_u3gxktCZHsarjh|p6lOGGVC^$p?(6F+V(1sDw z*hSJoV=I+TwwjZPm2VUfnUbRS(Xn_~A~ZMKueQg-*SjF!1q3I-L7QEHlT=;?jle}) z6P`Ms;b(0-F_Z-bdsrbDtBW-W0I#USbOG+{Hwq~8cBtVSKYLn= z?ggF!zeU>7oYlUaYGs^E-3T6U9g%bI3c5GbeE-0PdHbzmRfmujwJCmT{9Hy|Ep_)~ zore~C?#0*$7rxUpcT8}#q`{40Dkw%evd+#F%5LMF)84eRla6JGDrxuLta;zu(eVM! z`F&5u9!jF)_#7%&cBJ{W;kVG&DqR*~gYn?#u3Ni=vIq!`^x`u_hQB_tfMdr{aORNJ ztJdb!R9a0*6;+e|q`x>Yjd8i;sm*yB1W!X;zN~XY?#V`QjX9-yhGSk8e7#ZwHkm6p zl>8UT$Ed6OW&g;L8Xp(V`J#d^I(KeiaDGtS-u1T(*QuU>OJjEI8O~3Q-9UB0A_xCZ z4sL+T)(N|89fw4BlmfS14-%mD7Fry`~I5IQ>YDMnLaf zS9#)-BAl0QmmD>8`!ZoGHiVbIc9$p6A<#VQHqLyIH8*l7qaWYRqGRp1)l23^{=)1& zR5v}CEf2F!24#Z77naJyAU!vu5KX=!VibHiPeG_CKQZ4{g8hqtCqJDr{@9;&cc(u8 zb~lGlcih>Z!lw48`O`lyppGN2l3vqT7@Mfs4u7>WGhHef%>_gS$E$5IiWlXT#f&$w z#fwBaa#TQ|0wNVEh78hOkE)zgO-qJAng|pL3GxH?f0eo5teRD;I!hi$G^U$jEBg;|;^Q~~ diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc index 01a2dcb10d481d6555433975c60544c61599642d..7cb562799aa3d1b28dc42eb6b96e6ff57fee674b 100644 GIT binary patch delta 21 bcmeys@qvTqG%qg~0}ymDGNy0jNnrs1KtKfo delta 21 bcmeys@qvTqG%qg~0}$vQ_?5PiCxrz7NOA^V diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/cookie.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/cookie.cpython-312.pyc index 19ec632140822583cb0d061ffe2f664b9eef7af9..6ccf9c13834a3389790ec549cd4af41c41f4a72c 100644 GIT binary patch delta 59 zcmbQvK8c;@G%qg~0}ymDGNy0jS;!<=0pv6=eBfXZ5^34@X05+Zxng9R* diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc index a3e259b4ee7e45c3933b6bfd7e44b7c94217319a..6eb53bb7db0350e344c22ed8eb1c799b5a27e08a 100644 GIT binary patch delta 581 zcmXw$J!}$T7{}k2drll+GN|M%p1@Ci0PLgGD1 z>VY~12(QW` zvNBza7jL$PyrsiUvwf3XB{vKT2AsY&1{|Dl&A4nBu&M<=!Jj4Y<;cm}9PcSi$;6OI z49SG6HuqTT(84&vU6c5}4wwf~#&sS$*cI0;OdiV!0e4k{wLC$z=k@7;H?(gB?qOv0 zm9YjJN3VS2^B{N{DkCawry=ljYgDHj^w~;h8njQD#KG|_RMI%09WA@3IMt*XnPx?r z-K9gS52#|DfLZ+P}?W_~7jt+DY;(@6oEckz6rc0{+5>PSYEKkVJi0F(otS8V_ zHi-cyD%996Exe7M4JRy>ykwiL2g4%juw#og0 zdVc^-b4S%%j|q8hpadmZKZonH1g4vhAuJEGvi=fph< zV(3CPgtht@^e7v|fXODj$!_T3eRSpWTddLTLcv^wc}ms$PSvQ2mWO<}m@64K&8y~h z>&lHPg_d)p8ekN*a~CzE!~fs&&En^|C$UOwi+*9>wo8^|fofU3h16b;hu7D+q|}p= Ph?If@#wVOxe6INm=R&^? delta 617 zcmXw$ZAcSw9LN9vyItPqZgYCm-ED3&_vE!s_mD8Re2CO^6+;w?inK)VMK2@hmGmN3 zAWZ&mrX~)0bH2*BHwHn1L@%=NcDg&E7riJ5deL@CL}c_|(C^KM-vi&@Q{^38d=IT} z8O8#zo!1N<=q}$nv&^j7Yb5roBrcI}I3CzN9Pac5{9FL##(pWB zAJwd#inUX-29?JCr@#FscoQ85hAp_e%WnXSIf_Pu6J(uFg7?j8@8oxIi(mwq3vCj# z9_}_kBNsxukuC19$+G+{ z?t!g|e@aygaCx-0sL~e27c~cwC+Q_I<+I85W-M}TMC6rF>IY?FY#-T^dP_&?YPm%; zDB$oJq%4g*wm}*trg~`I>8_9AMRQZ#cnq&xoLaNM0_vT9O{+~o1K6n$`ZJy4Wt-+4 z*f2>@iWO#xj&;|vYn5NRv*#Q@6EkNBJ0(AwxlUwK|6lfj6Qty`%tmI5edT-MQ@OFc iP3Q5;33C?a$3HcPCCh$tOl=-lt>ZPS9+mmom&9N7k;Pg7 diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/request.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/request.cpython-312.pyc index bbbf9350eca7fb5a6b072200e9b934e9a8c4e32f..002f7fa60ef2d85ede5302ac15d81404fd8b48c6 100644 GIT binary patch delta 716 zcmXYvT})D87{|}yfPDD!C7^OZ$VO<0A890|%N=1en5ZdTWI8v4nr*HL^J8;1H(NWb z8rW-#HfOlCiLDRlT%>J%-c>gqJ_6QFcI8b4YMbk-H|o85pY8YmKmR??^D@YJ8svaa zVzCHAkH+!KaWEwz^B6}V%2Do^n094=o(1}dC%wt=% z18hfs%o|ljC!SQIFLY63xDCFbYILcN{$%aIXVpLm&&uTY_>26z!UBPnyYW1M0k~+a zU@AJ>1*$G&hODw>N}8XoGCUZ*KfE#m$DIZO)73LePO{{by_hpEz-k)S##hH5Uft&r zGSRlt!paVZO2g-np;(pyS{7)-7n0y;)WU+MtkJT|W4`r81^5qm^ZYd;rE@^}U^y4l zJ8{M|xQjQOEczAzQinKUd(@f&$7%eFLPOiKKpgB2bcYpTZyFd-1ErSf9s0n-DX1Pb zkSpeZleUFaSx^@23G{?pBD^#(B22>!jXuV44-|TiaaPQ*(_@xmnwqat6)pA|P``@= zj0=^_9Zx-u_rt=N0{$G4s&l7pNtu1q8}lz!h5ZrxnrqdSmN##Bncv<@Aj)F|DcM%* zLKGx@CL*WSL5FW1zXCt{P8e4};0#UClYg_g0iqAydM!%u zZ*$r{w!JrQk5Tc7N7d_RQ&o+qhQgT}+*EsSl7TbNMRm1^J}Bboq@*ReF84+k%@4H% zBnd(5azj)ZolcUiNkQwoIXJQ4;38lTzFzoV-&`DQ*3|UOyl#&9Q>M0Lsf#tWMN}J; ZZ)P`VU(MZegwSBMTc$RaNnGFI`~d*f`HcVo delta 719 zcmX|9T}V@57(Qob|9)pX(=GKlXUg1k9)D`uq|8_wndZzjC9*`QO^6b4Lk*-5jW~m1 z%TqK_aMFb{tTxY0KZFq!L^mC`xpQe(2@z~-m2}m&1${Rk&&%_?-}AlC`z#=M6%c?= zI4(!vX?*)vsfu>4qWzZ$tCsH)r8x}2$rLbfz!08}3X`BMi?Q#Ur&OhCDA_~yXOZnXSJV^H zL?)h=adj?c(0Uc^Vz#VCUHrtkM4cXh zH1tTMfR+Q=(8V~YkF;^1B;-i~eHw#B_ROV^BJ|XPTUSf!R!obgB`Qxg z`g>?wP{V`bK%c)aWDbjxz>pWPuFD%JdTqgdNcxZIL>aT2B2bwV-BoI6+^dIQyMi$> znVOw*H=?MMiF#_v_)gmnVUPMAREB(E`)wiYdj+$b7eu?;6N48}r|dR3Sm$)bgBKr=q^N>DW$@BdmEbxi#~0=FQE! P-9b2G?Kb=2_MYG`zkBho diff --git a/env/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc index 7cd2bc9aa13e18d43c2128edb0d4f890020a1638..45ba0c034eb99b0dfa1d804763519e204178cb45 100644 GIT binary patch delta 388 zcmaFb#dNrfiRUygFBbz4bTBfeZ{#szV>F#?&n6>&P0?~9?*z6PtT*IUCa_Eho5b^x znL){Fb2(eOIAhY}`?Au!SCq`Yurl-VJybHA=rx&DPL=hBlG!KL%{p?|#S}7tMm8|q z5Rk8^q}eFVCU`32Td<;=5-Ndk&ytKcw0oW!{r8#K)+X~*MyR*JTgFMiArs@ z_c+1MrvW$Zrjqve%~Aoc?==LdGpO_gWy%;wuN4c_z34x4nV3-jxKXzv93X}ErEA6ky zT5oPhxWq0k4w0J^yg*{P>_XWUCF|=~)?ZcxDsb4GpYfEPmlLR2-P2i*lZm{hhZnA27YLnbSp(MNt-Fs)!`et(>wQ zE;o1t`n@{6CX`&|kpViDQ+BhN#|d^}UAT!il(fGyFbW!c*vu0k%_eRPlmOdwLrP`> z`we9skfhd!&6Z(N%(C?`$q!6CoYFVsl&;H}T$D2bD&dv>FnM*PkH`fHPf#F9PhbIh zYzo&WVBkn^W{+}ZlMn&f*uXF&Vt(w**cB%0?N{1gmbGqR*qoGbiCtC_B0DE|fy8pz rg|aJ3*4MABzpMyU;s8|QpYfEPpBt#8fnfp5f~boM20%f_0wz%aW#Nd| diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc index 9fe54b04861335630ee6a77e991cd59708c79129..8929756d89748c2255c8839b04d305dbce21ced3 100644 GIT binary patch delta 20 acmaFP_?(gFG%qg~0}ymDGNw=DxeWk00|hkz delta 20 acmaFP_?(gFG%qg~0}$vQ_?0%1=QaR8*#?mS diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc index ae202a63701e492e2bd6afd7354cdddb2fe6985e..8ba8381fe88242d7b44a6877488de724e963f891 100644 GIT binary patch delta 53 zcmccSdc~FJG%qg~0}ymDGNy0j;T4h+19E;eFw97qpEWaUe%{Qy6_Gm_cbH$1bKYz! Hv`_#5qkj=f delta 55 zcmccOdd-#RG%qg~0}$vQ_?5PihgV2O0?7H%z%V0ae%8#a`FS(*Rz&V#++luM&bfhM Jv$4=Z0Ra6M6DI%w diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/clickjacking.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/clickjacking.cpython-312.pyc index cfc858a765c1fdd7a94035f8a0eb5b38619ae4e9..d6586db1fd2322312e040ed9a8f19f1db3212bb1 100644 GIT binary patch delta 99 zcmdlYct()tG%qg~0}ymDGNy0jnabkPr5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kjxJ8iXG%qg~0}!x0_?EVjXDW+9k$z}#YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{p}OP0sX0K7mOcK`qY diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/common.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/common.cpython-312.pyc index cab11314ae997ffb23586baada7a2ab65c8bf2e6..c83415a1e7e9239e23d550491ea108828dc4e779 100644 GIT binary patch delta 169 zcmbQ_wA_j3G%qg~0}ymDGNy0j3FGi+(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t zgZYYz^JGg-d1eMxm(9_f8$}dkffoLF!SJJj;et@mMYF&a<`c}P+fB4vpnP3e4ancD SDd)w=a>*?4^5$~+*^B^g=sAi2 delta 148 zcmZ4PG|7qQG%qg~0}!x0_?EVjCyc`&M?bVUwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=f6-O!KwaE&c8k`qZoIf!z@j5e3_U4pl1~NA1a&8on yl>!?7;|0Ty28K&QK`YEBm`}HxXtzN5y0F?sp`guna$bxq7tI2%Z0?bt%?JR2J~FBR diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/csrf.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/csrf.cpython-312.pyc index 1e1696e864e81e930da7d2e412cd9753832ad4be..44bcc9a7f7202eca0d12dc1c97a17c92ec4f9c2c 100644 GIT binary patch delta 597 zcmex5kMaLJMxN8Wyj%=G(80)j|PSd0tPF^7C252oi065dPd-M zxs_r+KeGU(o2BI#C)X>BP5!}~Hrb0yM;1wsQNT%)1Bn|q3_WjtdGWn9dNK5jazHs?AE*$<_kXL2iy4O{mE~z?Q=8w3j>NLabK=Osa@Jnvt zlh`h(I$hlSU(uII?gImhIK<=|{6Z7bI%~hMf-ShtBXd*Ad~%k`dd8^9QmV2XKv#TY z1*)Cws;bKjq&JtTM)OL3U|<&JdMM#Hfd%9+=^1t_Os?}7+?4R!{K{wzBg+*Dzt5Xz nnG~|f0u}ND6`I2on$NeJ2~%voS;O)nBg-WT^Us@ktusUbs5aEa delta 555 zcmexAkMZj~MxN8Wyj%=GpnKp~+D4u^oNAIl&W{%iKN=V=2^cJJoFF<~dZP4_ZgxhP~b*->Dc`U=r20{WK?{ZFV|G4#L8699A)H*ddrr}y4Bx8DAXR!bP$3!S* delta 99 zcmZ22K0}=6G%qg~0}!x0_?EVjCyLD=OFy(YwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=f9b2og1<-^aFBpC_Fx*f#|IWZ7D)nKrBYPGL0Dz1l ArvLx| diff --git a/env/lib/python3.12/site-packages/django/middleware/__pycache__/http.cpython-312.pyc b/env/lib/python3.12/site-packages/django/middleware/__pycache__/http.cpython-312.pyc index 5fc2fd1227f2fe234e6e8c8303848c4e6f889c5d..10f1249da63e0f7fcd4a0cdc64ab61606ef37850 100644 GIT binary patch delta 147 zcmX>scu$b$G%qg~0}ymDGNy0jxy0oWoXSH(1x delta 120 zcmca7cvz6KQA#yKO;3KC%-(uC?{pJ8p|#wIccB~FBpC_FkBJ}+2A(8Y`V=vo5^+yqOJ<- WUla Ap8x;= delta 75 zcmdlfy-=FxG%qg~0}!x0_?EVj=Lw5Jj(%uyYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ1#2S*0KW=&&UGr5U1 zNAi++*k$?fi{@b)6qhh9=UT|M!f+|?1@o|rn;F@HnG|G!*8h0H@S}m@f_UIXn}7}C zGuY?z&E#89a$Q0P$e&!u@rUJ-O~B>Ng`AlzjJlI=^IjCcqTzm7#N(od`vSuWfz!h$ RhEI*Wpy7UL^IpC@MgVb@P;3AI delta 178 zcmV;j08RhWAgdq@%MA?*000001mN~&u?*h?Fm5kZb7gXKFKc0PVQwyBXkm0|VJ}2w zb8B>Oa4&FWa&vEPVQepGWo&G3cW-iRWRo)mW&x&?ngwhV(KlAsA6Kv;qync3p$e!m zr47=v9|ltb9U1@t0Ql$t_<#V?7g4Ymmb-mJW$lLk_l-9 g0Vk9E4bc(PC`Z;5NT4y0QI}VdSCv`Qv*ZqL0ffavT>t<8 diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/__init__.cpython-312.pyc index 6037c98f8a9624dbdafdd3f00822cd148c4914df..e7fdf80f877a6218fa89b85819a40b41e283b89e 100644 GIT binary patch delta 21 bcmeyu_l1w=G%qg~0}ymDGNy0j$zTTnLC*yp delta 21 bcmeyu_l1w=G%qg~0}$vQ_?5PiCxaaTN&yCW diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc index eebb806091f3e3dab48b8c9feca13510caaaef07..95815a9dbcec43a36af03fdbe261ed79856fdc86 100644 GIT binary patch delta 338 zcmcaCwONYiG%qg~0}ymDGNy0jQDae(2XcPAVEEC%a6!cHqOscw=TpiPg6EhoFrIC5 zRa6})GC7dtkJ<+Y7D>K`ibfMWZwkvSiQC|LMb+*DD}$iOl=K;ym&G)$3TWI^G@4w@ zx|earWJ5MZrfIg5BiWS1E*ZOB7V*2n;rBpHc6#2#yz647SHw&wPh(ROzoKaLnH6a2 zR|XbdzK`q-;$|Os8AKE}pJ!8L5~>F}tAXJzi}e#>sp-}et%1gIb4p48^>(=3;1TNg z>GbLK`^XH^#17On*^yI27>nfOM$Z2{ATKsBJQ3BsCaOPqB9{m=gP6hQ6pH81%zmLp7{s(rD3Ik3J30x{BXLJ77PyrkLL{#^(sQxDgMpm5; z&Kn$j*Eu9Ea!AaOT;O(;l)>#V@jp&oI5jt^ibiN5bH; tgwZDkW>$#~o*UfaGc2!5>s*x9xx}q=hexu<|E93`M|Pm(<`3M?i~!>Zcu4>N diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/base.cpython-312.pyc index 6f9ca7d3edcc34a3fd2856fc0328e7982a083f94..a6290ef0eb2e258019dea7ecfe4eeda59ee38c69 100644 GIT binary patch delta 611 zcmXAnO-vI}6oudGD?!MN(+)H33=A1;p)CcWiBrHK{1q%nx-eqmhOn`Tt_o^dn6f}w zIGFgCM|3bGV8o;wBhA~e)Qw6^OkYYn6UzdPMiV!<(zww9Z*muRbI!?k?!(Wn*PmR> zdzP&S&KMA0E->wicE>pu!9FWkY>=`+i|wLpS3X;2HJkHUoJu*h$c1fDvBW49qj{|? z#_)AzO#CLsiel`Kv%hM<@wmlml+{Q@`N+a+xDZXEiadn>MsK=7<1i#k9WUz?eB@<& zc%x>IYc#d>fz^Q$*KWA04SqZozlwk$k+<<1Za9la^fpvc2609oMxc3!6!e)|n8u!j zf-0hpwL~WZzJ78k;fB4Mqx&8FUIezJSdvC1ts?ap6E^R&_z>kooAdcA#c(g>`?e!R zK2c&4KM|07$@9^O%dz@!My;=ebjk#blo`Qux`@5WC<5VrGMK#Wf^+!I#09zPSB-I- z@mP#P8O6L`i4dP5ThCoXzewxi8&=e-> z{E8$`x(?eq;6X#9QG4JTs`J_YrpF5_3z*)WcG9$x*u7iza0U}If_8-n{$e_u#C9UA zzJQTaNBs9V*$k|QSHnB$QebK){VKhoS;0OU?A!L2gCp)ESo%6 z%Z=l*r2Qubc20@O&$Jquf%N8V?e(0BGr%_95D@BMy~8gx!(_hgOxw%+njI`RgvCEG zaB|8`HZv_`2GW~XnO3qemP}T$QsuZTWA}-Hg;Qa&kCg*6klx&H701q)Ir*KV4A6O2 zAUW~LyiPhmIq}UlPArVl)xFI2PUBcv|gvn(Ivri0+oX(7sL!ISWK#a}h z&KgWW8y2|Ab6i#fo1!rJkgFTm25z@@CdSgqlRZLYZ-~o-bgFf@-{29r&LeY?M`lL& zRUXw3%s|1-|2-^(8S5uo#HjIYsJ^D;yg_k+*$T(SR+lyx#FPj!-kkh2SDWL8sLW>u zSx))Q!g=nD%pgW=eg_L<%;aaqrcyI?J~0Sz%5{2mxJ*#FAuieBaYJ4i=qFyQ$=W3b z%pf|hq?#G1Wb>VpDH4qSlM8#r*eBL}Vld>@n%vnN!wjT1zvyk^VoaT!Jwt=@qKL*P z24;{~r_In|0Wmfoow1ftMIRjYclae|D9u-&seU5mno{tAlm#Z&l`SqRTkH_Os_b}a z^Q>6{jD|*#bODN`8zK@Q-&=RM+~5)H_v!SRA#z<(|DvS+24DLn0yzx~Hw1(_SZ@o8PPX9DWo8f(+nm9Z%WQ53 zmixfPAS^yzYogYSpow}N>~{nuXQ<5AnyGb7P_@JH2EWjR#IA}PQqmLHZwiQhU}q3g z+bk$x&Zub!*8BvkYH^7f!V}9T@qS|(k1jKi-ki*n z%gpFJ`69n8$7Mm)PYleQVv|4e3o`@h&Fli^jN)cs%})d+XQ<5AnyCd=#Kb8#IY3Z^ z8AxwV7kthrAqrIV;|0Ty28K&Q1`8M`7|&3gVsTN(U~;-}D)YjqE0fO)9}_nMn{)@K zN&7@>nYDGmiau~K0A0%hbnSGhiBg{!7&)ao9B=Rl^m})D&tUBJ`@jqo*{mqBT7rq0 eaq>9>XO0_^%AXiGI3*{G7%DRZ>CIM#7g+(wxk=^# diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/context_processors.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/context_processors.cpython-312.pyc index d558aa52c0e8f82f5e41db9d6c41568daa44bc15..7417410553228314b39193809092fabc0d2a40ba 100644 GIT binary patch delta 189 zcmeB?St!GEnwOW00SG!68PhlNq%wQ->4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Z?GM6wb$pel4 z@q*z;1H%UfCOx5>CiW`|CwMPloalF5MC+=E)<*Bi7VO!&njmEj3{zb02uM!npU8h* eK=-16?q{f$&&)urK#ri$7iJbwzRj1|t=Ir6ggzwz delta 147 zcmZ1|(<8%knwOW00SH(gd`sKNlgeyRrXO0IT2!o`omiBZr3C}kMfGri<>{VwX;bpz?7)#T;|qUm^!1l$8$n*uit{y zi<|p=yIJJDfC_#zFx-}qoxt*eiCNI_hK%9@m6_fXT|clgNXl)t4GLsq%$eLDAuWC} zAoQ|97?3<+c*W59fa6s|w+jKG7dP*Y5MX7@n|vl#hUuE%x(JBzg^fW%ae*jQ!h>9XEyrPpeo28PM4#{Dn}#TAY#Rn}{*)LO06z_3}(WRZ}h99YW- zJ_ZBRYuu(Qn6L22%_zRgqkL)eQ@3_DaT%Djy3RFjof*YFo)eOL{Vr{8_w8m;@drx& zXkfS@A^VAeh1YNb%LgWALBks|iVIX`dQWuyzzP)HY#0>Crke&ahK-F?^d`6H9bwf4 z$(Mz-t_$m56xP2G5PHoZ?1bSJL+1mIR}I}RZQdFoz^YOV(Za>WDtd!ou!H4}pvZ*a z$r97$Cdw^fzAUH$w32i3lUNmI7EYDT+;Ouwl&hi65fq)lGEusN?S`Om2ir|KjTMrY Z<%~ZuaB>DPPCk_8&H`d==1Gs!0RT2~fe`=z diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/defaulttags.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/defaulttags.cpython-312.pyc index 57ab07aec3dca4e620871ba9fae9bdd41e58c9e8..17bff8dbd3518e7e38939ce1bcc4a45bebe9cb8c 100644 GIT binary patch delta 923 zcmZ8eT})eL82-L~l$@5H{+*U{pnrw~ErS+toQkcdGKQnwn$0W_(6|(JWlMCBklu)i zhzCN}#t?73Ffkn4a=Od}7Nha9og_@%g+~@|d@tUgym|6I z&-?sXMVnP*_<^SNKn)4Pt9ip;Y|o53EP_R>F2)Dz_a+b_D)}w?y51Y!tgS~D@?D<^k$=FMmR!H7i<7EDRkE^-9>_q zHI4O!;}bQrRnn@U_0U=fAGo>^u(?Q!ThPN3_*6HqxskxHb?4EZ!;kqB_ff^!hv^=N z8@T!(Gy|KbP64}fJ-!nE@O;!{SF>3fttgkIE0ErSdL30(i=6_ zqZmB0!P7v%86@+A-$GOJu?XI$@M47*@o4ZF1Ue(+o!|k2Tlm#b!g{xFuxt~yXR?;` zOPMF}basZwp-fY&RfVcYGD*c7k-d@P<(;95H;$K|U4-vpYIwwdh%_$ap;p_WZ#1dh z3YA9b@k5nodxrn&xg2xn?4IGNx<*|+(2{Gz4=uxC_^)gG)X>3zP|$s?E1SZ3U6%Pz zY}MSE(@9Ocrf^Mox)9ID72%95oT&)WiX|osQGEL%s}Z84crjpbryeU4PbuOBS-hZ# z6S6o_5hp8_DOsFcO|YCeDK*QMsT$oTP2Ie-d`YJHjj=M#V=8&9T0RN;E@ zt<(?#ZGKWoO>5!1SXfB3m6Bz4w3N)HHkuVKAajB2^ww1_A1l+5d@MUIT~Um@Y~(YeRbzK9Ms~L9$hvy`gF^}!?H|0j zGrViKb?H2w^E=3u&;QiGPw~s!3mP252itB0>@EVo)YI@2Y$)_= yKAOX)3o!)PE^?y~b?c~Oo9Yt~TlQP=Th}T4cXbZ^Vq)<8UP5JPBR}muV*UYfdp{2V delta 1053 zcmZWnO-vg{6yEjNW^HzD)<0bb6PvQGaRMd|m>;_~sbeS5S_w@-MX154gq5ml8Yyzr zmPA7IlubBftx04@RnL!0-Qbzk>dxqbC48oFewFsiw0{@i9C~NyC(`xdk!-$K*vvZ^7TkQ~YyaIBwfFnR=`{9Uc*g(|dqmIwk&xOx5}Qn+>sd8=PL7_dM<-NvaxGIyRc?r{ikC`r z#kumQb$74q=&iAnNV*iJrxuSyCf-mJ7v;o7H8CS6X6lJ|Rd#lrs)FjY$cu&2?c!}| zw9fU(j=mZ@E0|?=R%4C{v-dCGy(}|)`8+oI{G5iJIo`T&z+O`iQ92i4$Tf8HBaY-Y ztqnF^b&5gNp+BJl6i0uJO~bFRCAm$i!KVJVmqG{EQfBfS7%wC!+0)k|%qAOLEQ|t- z2o4v5q8Y8`t2=%5&6FJ0zuxBP{*Gjx*bi>cPyy)+>XEeDAcOIW=gV$R`n<)St8ESoB0dg7`zN#^B>fGgUejp}0J$qvIwA>E2JN%L} z)E4MpB}M>m-#&|aCl5El$W0TO>lygJlL|E+QygpO;%bgNSwkqqwuPL;tGq4 zljjJ%(bES@-w+h;V7nouJYRpN{xvD>POlD^2`YD_HCL!yme%iZn_$xA^MRQ`T4(ca z;ronyRuDZxA|33v<@G186;)$qP%zkhO|*qsqy!=-Ak@KnLrm(rnD!Mh?a9TGy37pX zI-3_u{$XeAoV-9$TH&^=euwV|CRSd_8{*Q}#WgO9YpjsHEN*^Dz#QmfIfKm)6yGxe E04Y;x?EnA( delta 290 zcmdn%dES%fG%qg~0}$vQ_?5Pir-xt05y)v^_^QUhsdJaZ`GJ`1^z4b*lXE{YFmb9* zUe7PV45T-o;&)|~5Cy7y!SJJj;gX2QijXO>3rwzyYFrfYn5-qZnB{`0`<2NT1viUH zgU!34ZG4U2WI^H-z8QsA1r#q$o+tE1$^;@MDBQtzLrQtR{!IPLQre#w7l&leVB z2GW~%2;XNEwuh(_66s*SA+P_5ftgc%@={SXW+1)!oM;QPWFt<8 diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/exceptions.cpython-312.pyc index a77ae1acdb6524925881f3c7646ed35674cdae9e..45feefe7c1008226c138fe4dc30909ffccfda59e 100644 GIT binary patch delta 21 bcmdnazn!1wG%qg~0}ymDGNy0jS-n0;VoU={tq0F?X8#vmXv Y`I+H2W)OYf$cp8XaoFX}vc|zI0ILs8IRF3v delta 226 zcmaE#_aTqxG%qg~0}$vQ_?5PiXDJWk`N^Ajayf2D_J}?034{QtqBA*zvS*0dF XHT=d5qVE}5v0O9`yRuovIG6=OxG%qg~0}$vQ_?5Pi=RA{58j#b#@PUVcm%qXF4xiKv)60B{4emFDBtJ2* zu*!6>ePCkdl(``+d0klTqOjV6+RMVGmv~G+umUAF3o)-`X52b?51Xyf4N2`!46LjQ d9lSThWPw^a6(%#XOK||{56nQ}&C2YJ%mB0CBx3*o diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc index 5dbc2e5de3dd758cd52e6e20050c260ba33bdd43..7979e7162acaac7f21ed275b793ec1ed394757cd 100644 GIT binary patch delta 318 zcmV-E0m1(8f&t)y0SwCx4GI7N004*q0cWucd<73L0001h0N5KLpFEj7o<5VD1t9|f z94fQG1@H#}+mo>kBLa&0MCeS!i@B;t|50hyrHUrZQBa^2o Q9tHpoB+v~bv&|`^7Z;OhCjbBd delta 314 zcmaFR#Q33!k>@loFBbz4=pOi$wvnfXRm23yX<)b^tvKIirp;`-PYjHl`je-#Dl!A< z&AVAYurofGyoOhqy*utB10Scw z`Ck(YSP(d&aC+IqvKfUFD=%$cDy+-RC_4GFTq4Is5uHyAoSb5l&E++1E-Qw8V`Y{T zdmtnGftf*4YChXcwgrqcIX^H11t++DU;t7dI2c5gu8ZgZHLeJ|B4Tn=K=gw!$bk9s zk{p+L!#@JuYchGayaET1{s7`^ek7mC!B{-mN8`2HWs9Ki%uGUDH?>Vxm~0U4aG9Vy xU3;STjP%PwY8QFbK7iyp*d`}vnsHp@RR)=*GkK<_9MCKskXbsL_i8Q{2LS$)VsZcg diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc index dc55f1ae1c72764e5d527155d829f1b510a68e69..f333068367fd267ee46fc1058ea6e81929d16b44 100644 GIT binary patch delta 81 zcmZ2tILnadG%qg~0}ymDGNy0jdC$feKKT!umE;u>jSiO^{K69|F7eCX5RsV?GSTk? lD}$)!<`DK99E{$RbpB)-Tq&T<0RZBS7qb8W delta 111 zcmbPbxWtg>G%qg~0}$vQ_?5Pi=RF%^%;Z08R&p0bG(IsfaVmGX+~60UP;rT0{)ULm zjF5?bA6S8+oBi2ua4-f;))3H8xu|IKiGi6{eFE=I8O;@Hmt_nmaNZD>xhSl0Lso5~ O+Xr@_+~#}%Z4Lm_7b92z diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/smartif.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/smartif.cpython-312.pyc index cfa9c6ed55c232a4bb5e8db50b8bbc7f00521f6b..cbfd3f9dcc672e7a72ba0c1d63e2e8b2726ee135 100644 GIT binary patch delta 383 zcmcZ=awdf5G%qg~0}ymDGNy0jF=ICj1acY}ZYZcMXJ5#^LS((vN~sMY+oLx|UzB&e z%ohwKXDA*BJQ&+kJi)NH?1H@G<^uMg9E>uPvjk+AFKBvC?hu%%AOkjJh2na(m1-Nr zSLWuQj5P4*Dchgp`mK5b>%hVa$-2Lg|W z9Sl3+emMT3UIfcx(FOIki)RVzi00ZlIulVrZ6>9x5} oY>yBl(`0YW!=l&t6&l?eoI8YW@bEV{wYq*_W)M)Etf6HD0M?j_&Hw-a delta 440 zcmX>Taw~-AG%qg~0}$vQ_?5Pi$BbRi56Ed?xS^o3oP8nt3X%0vE2TDsY>(a;eL>#w z8ei}X#RGu{V|$7x81|N3;0xYd%>I*uQF?N&fDBUu!{i=;nQGEt16C-mS6ivJL439T zB`x0_iTl%brX2|1o!`Jv#0!*v$uW7Ky5!_k!Dtylh;qmEZY$k3n6LJ~pkWPD#5q}3 zTypXPA@|8vLVEI0a|PFntrXk9zFK~V<9@fDZU@YF`(M!X2HHJQL>j2J6lQKC>|odl_rviQ^g_UDCjrCbgfKWfCW<6YUL<-9W&y(OhWpKS znjKKzZGTbI3#=(=^K-E%Ax8GePMU|MF7qpVVqjzxXmoFI?hv}c!{6Z4>iU5hC^A_} G%Lo9bmYG2S diff --git a/env/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc index 1af227b6dcd6dc833bab482247049ed80268b22d..58c8e09ae4a0d15d74cb8e06f719401347908050 100644 GIT binary patch delta 171 zcmeBEovg}pnwOW00SG!68PhlN=yEVRPPXFEW}0F@Ifo8v}2namQIVtsmfy-uQ&T}l1azG;+7;b9n zUgpC7PdB8RBNWdoP% zqCpFJ7O*ZTJ;8b*An-Kjq|^(dL7N#l&#{O~0S#$jxS^?gjbCp8>jahwp_92UZGOS~ xib*C5EcHc%L0bO0l-@-ty~|Pt-&k2h*>SP5vNY%>IEH$Z7E1tSy+q2mn}rE!qG8 diff --git a/env/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc index 54b50d25df6c64e3fb3e6c8baa8ea3934f71fa62..1582795fcefe80004aa54410ea89c3f5a8540e55 100644 GIT binary patch delta 20 acmaFI_>Ph1G%qg~0}ymDGNw=Dc?1AD6a`8E delta 20 acmaFI_>Ph1G%qg~0}$vQ_?0%1=Mexv>IS9& diff --git a/env/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc index 18d4eddc190627704163fe05ec6824fa93eaf207..c8bd4bc6b70b31268fe51470ecf75d888c518287 100644 GIT binary patch delta 72 zcmX>kvsZ@aG%qg~0}ymDGNy0japTdo2XbC8{AghKz{en~cwI*Cii}=|&j%(}UeP;Z a@(XxY=q>aOQr$$eeJ_M(REbq(i> z8qU`=TtNy%88qEM3WP*D*d8eBEVo~1e@)qB5}yL|9@)#2mHEt=8B|O+$MA9ROMhTs z5@Wk*6SN|$!>ZrD)BXaN^bFf89GVwxf+p9??qQra*+x!N=!#9yXJ(+nFAPkqY@az8 z#1tmi$|*5llQ5dRLQa)~LDKl6AW(4gb-8zpnkHa}e-U7?3uC-u8~%lviHGf`ZTLlH z%LUdOI6Jr}L|){OyI>psY4ZyOM<&LG$y&;C%+~}RCI=|%urLTYGH$L{{?7;ipVwaZ delta 332 zcmaFn_0NmvG%qg~0}$vQ_?5Piho47W1ju>8@S}m@lA`+tktHe%N|tL~RCM2L%;Ur; z{Te9Qz;H)IehKqs5tRvo!}hv{ z^FV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bhBCm zu>)w60001h0N4-`hy~akA=e!_(H%LsE!G`Kh)wVU3k@&a6&aWN`NI$eVwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#hbvP`@H-^?`v=P;W=l4HdQJ?hD-)drt8E&I}a!BEle{uz>fn zxZWiJy$_N=onNFF_>~vf?qEGoa)r<50*B9caiBV|_TNv0RX#DW@e17#5ZyeTeJYbt zKEx5+LLK%u#3VZ1AJ{nW_uc8c+yAJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~8|x`n8AYHG4Ga$qOs*TaUo>#P#_zF$WeV?%l&b>D zmo_ir?qOlvIay!8UFo8#?4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9boGnO*~0QW5+ AD*ylh delta 75 zcmZ3+*2l(knwOW00SH(gd`sKN6U}H)q#s(GT2!o`omiBZrqv Z04S56mzblUk(!f}U!Gr-lQOX_9RO?{8Vmpc diff --git a/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/app_directories.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/app_directories.cpython-312.pyc index c869732cf3dac9f99ca12a265c0fc023fb660763..174f17a121948354f813e1aea3695c4d6a8a26b5 100644 GIT binary patch delta 99 zcmbQjwuX)8G%qg~0}ymDGNy0jNn!MutRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~2V)5%0GLf0Q2+n{ diff --git a/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/base.cpython-312.pyc index 7c6e4cbad5bc005cb2fc434b09ad8b4f2f41c8fe..494ab45f9f8a1b21225e6f17d7fcf94b18613101 100644 GIT binary patch delta 140 zcmca6_)?JPG%qg~0}ymDGNy0jVQ2K{&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tjN>V>tgyB#q>AuUK6vMEXEqo%ph*Rxq>y0830;KEO-C_ delta 103 zcmaDUcukP!G%qg~0}!x0_?EVjhn>-&KtHrNwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKnsGBTu=i D^=Kgy diff --git a/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/cached.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/cached.cpython-312.pyc index b6cf2a6f344aebd85147d8a11204b324de5b0629..8fe17bacbae41c1f4c0c28baae1aa593c5a03c18 100644 GIT binary patch delta 302 zcmX@2eN~(1G%qg~0}ymDGNy0jnZ)GLr5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kg8{)Fp#f>hC8*Q+?Ebe%n$MGVM<40zY26;XXW(iT4h700e7nNORB%WfN!w6(d zwh`9 a+$&T*Ff;IqPW~^b%K|jx@@4~}Da-&#uxB^` delta 266 zcmcbreMFn*G%qg~0}!x0_?EVjXA+Y^k$z}#YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}Gp2e*Gc%wOFBpC_Fx(K6nw~Q;=Mw`Hr*4Pa9e%M1 zWizU-@@w6YR-A7?)Bduw&UFEuivl_yS%C^RPh-jA6f?rm%gE`(I9Y&Cf(69btj)*4 zEGh(3bV=N6M&c>PIgA&@y(W7L_L&v{Wf~YhNHB;?c5pxB=6|52_l=oJg71cc+6J}j pMs634+)n6THVU7>Hl2Gi_Xm(vhsR_AAzhXW$}U$nI|@x<1_1qXS91UW diff --git a/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/filesystem.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/filesystem.cpython-312.pyc index 2a49d866b7f236b771bbc017daa556d8ced82e07..23d83686f288086232ca00abe136b50f01b2f8b8 100644 GIT binary patch delta 175 zcmZ1}yhE7hG%qg~0}ymDGNy0jdCBO}ryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k-nSN+-YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJEz<`k#)!#!tnx}%1YJKcF!Cy%5V|2QIlX*h`Q*y) z%s~Ekkl-f}u{oQyj7c&YXyFTn9}Ns2co<|A=ljm|o$ddLfrpcC@>h0UW+1&;m18m^ E01Wvv`~Uy| diff --git a/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/locmem.cpython-312.pyc b/env/lib/python3.12/site-packages/django/template/loaders/__pycache__/locmem.cpython-312.pyc index 066c7889e0ffeacecfaa438feda0a79ad9bfd0b3..b1c2cfa7ef9b2a87a3d970d219313751196d5b06 100644 GIT binary patch delta 99 zcmZqYp3lv5nwOW00SG!68PhlNY+&^0(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ZVg=sc30H5g@`Tzg` diff --git a/env/lib/python3.12/site-packages/django/templatetags/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/templatetags/__pycache__/__init__.cpython-312.pyc index 96ba6f362acb8022a17c2b281ced639c8fee1cc3..765ff6c6ab6c1cc6116eaf8d48b0d762b7cb8f72 100644 GIT binary patch delta 20 acmaFK_>z(5G%qg~0}ymDGNw=DxeEX}Q3X2y delta 20 acmaFK_>z(5G%qg~0}$vQ_?0%1=Pm$1CkB@Q diff --git a/env/lib/python3.12/site-packages/django/templatetags/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/templatetags/__pycache__/cache.cpython-312.pyc index 516f42bea8fb107ae2a5f442791939322d77c5cf..81c8790e013aa82de45a5bd335686466d22f9ec3 100644 GIT binary patch delta 170 zcmX@F{6?AQG%qg~0}ymDGNy0jab)sn)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tN1DfN~;Bl9b(rx WJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~DpLz9vg@V&F;B111Ypt}9twRI=D1a#hLhgz3f2*LZ&j2(N+Y6cp}YyTLEm!E#$v zdh#>5EM^8Vna#oS+c+3KCv#~yDPJ)UyuuT7(L8Xa#R}sM%pJiKl&5P?)Si)kSxD_7 zui6Fkz)PDmHDnkiKk_l?8eZl%Ts-X5{11%9w z1|gm6g4!1awKoT9u`x4xO^(o&XTHkoIJsU|jGuweiSYryXb10iRuFUZB3)^70LSiT A8~^|S delta 319 zcmdmUl5y`zMxN8Wyj%=GpnKp~+D4v7YCupU`3gZpT9l;Znr)y8to{@f8NbMr8+U3o~8ZwL$ANUw_4X^PVE-0M9IMHSS z<7E4b0!kP74JWVA?AE+2sQrU3u-xypBLIPU9P*lG9@+#$FfIyeO)$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9benKU>7{J$WR delta 75 zcmZn`e=WvynwOW00SH(gd`sKN!_H)oqaRwFT2!o`omiBZrh($ diff --git a/env/lib/python3.12/site-packages/django/templatetags/__pycache__/static.cpython-312.pyc b/env/lib/python3.12/site-packages/django/templatetags/__pycache__/static.cpython-312.pyc index 6d311450c4f9a9309ca9bb54dd0193b151b09bab..a2d401e3204585f3b6d580b0041f6d41237213c2 100644 GIT binary patch delta 21 bcmexq{?nZ2G%qg~0}ymDGNy0jc`FS7Ny`Qj delta 21 bcmexq{?nZ2G%qg~0}$vQ_?5Pi=dCmVQT+#Q diff --git a/env/lib/python3.12/site-packages/django/templatetags/__pycache__/tz.cpython-312.pyc b/env/lib/python3.12/site-packages/django/templatetags/__pycache__/tz.cpython-312.pyc index a9c488c2190627cf4d53f9de1b2f4cf41fc5d59e..74c2aba3918f854d9d243c4b57173c0234233e9e 100644 GIT binary patch delta 173 zcmdmEd)}7kG%qg~0}ymDGNy0j>1Oh1(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t%5BNnpc)zm(S)11i@bduxJV89U delta 130 zcmX?ayT_L2G%qg~0}!x0_?EVjr<=(jOFy(YwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agKGR%YM(@eB0(0G%qg~0}!x0_?EVjXBU$}hJI*qYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{nyA9D);pW7NK diff --git a/env/lib/python3.12/site-packages/django/test/__pycache__/client.cpython-312.pyc b/env/lib/python3.12/site-packages/django/test/__pycache__/client.cpython-312.pyc index 1a0d14aec9ec81aa9e106f04017b20e211165542..faf59b4e1019bcd1f6f8457818578e2ee6686b4a 100644 GIT binary patch delta 481 zcmdn7hWY3kW}ef$yj%=G(80)SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F( z{K>3Fmr)f;@&Ogf2u%Pf6qKAHJRPJ^MriU6qqU57lb0DQFip#ueAYOe`L=}YWE~SH zk&m1}b3U^IZTQN-Au9HflR;8$a+8S~NJ2&kC?UxQl;Gw2pwA$#ym^mFGq>Ug24-=g zhf3x%*gh~bD5%Y^nq9TR?7Ft?C2iX)B6c^G%r_@EoMdFVqGbMgv#!%L87`m(X|acD z)-&8DpN^AfzNuzC`F-4HmMd!3pEo~?Phw-N*zB1m!^kry_X{htB-cYZ?TK8I^V2n0 zZ^&tXV%5Ywg&Z@3tnKCp6^~U!1wp~pz%a#q ohWi5Vi!uf~)US#-ZN4?vSx!U%Ny=@e|Az3ZBDR~2_pnL<0GZ{XN&o-= delta 470 zcmX@QhIz*tW}ef$yj%=G!1CZ*+D0B_c7rti(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I0$R?|kA#KqFo-{AghKz{JLCaYI`9I|C!9#D~od zVinQ~vOvinVA)R$9ExHOWaK|GGe{~f5T4Kbkr^m3S;puxsv=3g2O{D?MS_wugr|cP zN%Bn=HeSo!0L|l6nS7x_ju}XA{#fx?MO+vZUJVRW+-JBi@V+QxutWWdh*JZ@WQRTCo95}r Yi3uUeyUq095Pn6(wt-=@!yZ;C0GLFY3;+NC diff --git a/env/lib/python3.12/site-packages/django/test/__pycache__/html.cpython-312.pyc b/env/lib/python3.12/site-packages/django/test/__pycache__/html.cpython-312.pyc index 5a5abc230a1415105105a54f748365aea79ddcf7..6b619603f87cdb40f7c906e19c226a365681e72a 100644 GIT binary patch delta 317 zcmewr(-q5enwOW00SG!68PhlNtYz}3(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tp!nDXYi zB8e=I75kZ$Sy1Sqtkw+1$?=l%tT$w}KC*6Zkle>?E957r(~oKv+zaZT_QdBdKN{^-u=8G=1=TZ(rWZZ5mXYkQ#f K;^q=rHbDTF5Nj>~ delta 305 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 Q?eE&KU{8#%_&$yO14#y=d;kCd diff --git a/env/lib/python3.12/site-packages/django/test/__pycache__/selenium.cpython-312.pyc b/env/lib/python3.12/site-packages/django/test/__pycache__/selenium.cpython-312.pyc index 0f9a526efc06d0c336936204b62f46b423fe1282..191934ca0c28763bb3734c4057a12c2c66a57935 100644 GIT binary patch delta 539 zcmdm8)KJ88nwOW00SG!68PhlN$gz1e=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Dc*s2V4fhNCT z_|d@dfq_Yr>!x?aPVXHq2UI&;`u#ioXSiMFQNF}uzJ_Ci=xYAUJmx2DH?y+0GBO%X z?&dINK4bfN@6bpk)mV4^iwwCZCf*#f|YJFN3t{%8U{dCfOJP`u9wlsupek~D)#nqTKNyU1&{`Mt6a zqlYUjFdpySklaW_v<^=D#in*2oFju~jeWNi&ORfxhLA2=8UMW^#lNzh+8+~Hn;SFS*9K{*U0%C05!CA`AIBBw;ptSpaQqV0a*@J4bwh$b!<# zlDd~A^*=H&irP$mCne7H9mE2fBxPkF=MiWt~57LBTRI2uWm6n E0EcL`7ytkO diff --git a/env/lib/python3.12/site-packages/django/test/__pycache__/signals.cpython-312.pyc b/env/lib/python3.12/site-packages/django/test/__pycache__/signals.cpython-312.pyc index 5ca0074d6757923c2997be14e985558afd4b9b8b..ef10e3f6a013d6aef0c482deba6bf5fe3e1d371f 100644 GIT binary patch delta 122 zcmeBjnd`!HnwOW00SG!68PhlNEMxJg*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag7t1|X#&eTzausu25wZHjz{#mR*`HgT8AxxgyB%ntj0BCxQ)Zh=;L$s$zoi9r28T8f1Dq$o)GFx56~ z7sRmiYFMKYKC~$|O~gzMU{fDWjM_)K!?HU=YXcffYaekbHkdYTdfiH6+c+O4H|PA% z@0@ebnYnXF`q4ot^_fCJV(19~&~}#kP+oJ$Q@^iu?>^7A=bO7*cQkwa?JZrqTlaMC z^Hgo?YH9A=-oD3E*V4SJb+4tOrFmQH?iW3^wSEsewEK57?`dn_xVL>rYfC2=my0qo zjuGjan~rtIWiYH^h-t?@CW{Pwj>miX1p*=581D6@&L-#|z!Y$*h$TwvNwQIlSo-xSDi1i7($AvJSaUxWZX0 zIlNrzu^?5vDSSU6WMi1BR-9bI)e($yd%% z_+0?wf%W*QCRo+;)DxH~J1)aa&Y`B`O{bpiSr@1Z7K&=EptkX9+dE}bYVYW)qDnWY z98iY3rc_P@)A%6hWue%kOna=`H9Fa&pe*swOHEfiVfkp8&-q;bUc zwLLpjDH?1;>yNJ=@kR|EM0L1PFX(gL9?p8MmSFfq zZjsRojGJfN(;5E5`r*>{1dD69te1dNxc5p1+8TPAQU%f0SVL%Q9t=RK?QiU9 z-OFg$;+zQyrM8rLGF_vLM zu=se3FJdW-F-358IvcG)F}(Rz9oPKTw-Vrm)iaxjn0_@Jp2?A5hH3!AGd^VSKx)>F z7AuciG5ZSu4KVlCie-YXG$;{O^dLDv9;47K*fQ?Wtq1|m!TPyQB4%C-`ME3!W~l|- zpL1p$ya7#jyok0EZoRV{#|+%-ciNM{BwV<=Rf_&}ZVk+v&xEhW<%#p*_=$h4-487p z96w(nee??JE;o&D>FW-5hK+fnP9e4Uauf6{zGbUUbbUKT$t&wF)m?4+q$#4Tn@Xt@ zmocK%`JVY5GyG=JN?^8p4%|OPy6j6cjbk`XPSo delta 2086 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 bMhCcilh&eS$MejD98o(%N(W!Pd06!?%@Wed diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc index c8a94b315ec50c9338a55b95849ea990e7c5d0b2..573d49f8c69a8818fd3ef8b75cb02b11e1914ea4 100644 GIT binary patch delta 21 bcmaFD@q~ltG%qg~0}ymDGNy0jiC_T$K1c-K delta 21 bcmaFD@q~ltG%qg~0}$vQ_?5PiCxQh4MtTN1 diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc index 8f56b994eb3ff08e2575e9546521e28680b43504..4b0eed9b257feafca3fffe2a8c1fd8e12f24b0ca 100644 GIT binary patch delta 75 zcmca-e94&SG%qg~0}ymDGNy0j3E*J7IXRZ2lliug*yQ&dtC$&t#W&C8%;IHyG?_y@ cjQJ|B!sIk@cV-4Y#mO7QWkK}j3*vlC04gOEb^rhX delta 111 zcmca)e9xHYG%qg~0}$vQ_?5PiCxCco@fJUWJbg9GpUvqr}~nf%FF<1|I$fuODA{8AOymF);Fq-V_k|zzn2+eP;*C KZ$2W<#{>XUUm#Ne diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc index 6f7d5fc96986753abac3ef4363f51a71d1796dc7..457575a7b5ded8311b10a8af6a39b773b65664ce 100644 GIT binary patch delta 44 ycmZ1?HD8M7G%qg~0}ymDGNy0jsbFIio!rXS%Y0i}d9oC{E;ECS%4RS2TdV-+APR#3 delta 49 zcmbO)wM2^NG%qg~0}$vQ_?5Pir-F@9YH}-EFUJjO#zL^k!G~TdV+1 CM-0vY diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc index a17614f65719e4b9b72e26c6674647dd941fd97c..dedac9afbbb64bdb2914b95cc0f9002c6d9077fd 100644 GIT binary patch delta 21 acmeB??2+U-&CAQh00bS3jOiPB8h8LRW(0r$ delta 21 bcmeB??2+U-&CAQh00g=Rex+^XY2X0>JD3IB diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc index c1db45b2ad27310c12fd70a8b22ce89a8614ed4d..bc8af1ab28afb0adedaef81baa40e67c22906085 100644 GIT binary patch delta 21 bcmaFJ@{on+G%qg~0}ymDGNy0j31tERJun2z delta 21 bcmaFJ@{on+G%qg~0}$vQ_?5PiCzJ^QMPddg diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc index f642205c8523f1e3b704d4ce767844a56ac474ec..8b2c5b975b1e2a9440c7d24e7e142ab1a06ba930 100644 GIT binary patch delta 537 zcmV+!0_OeOn*yGj0u0Ly4GI7N004*q0cWuc^9cbjk_tyZp;^-zG@)6b0kR>QA)r~( z88pChhy;ud*ccn12$=|=6sI1c9@7{why;uc**Zj_YSS7vp=zKJvO$_LplZ^yehPmW z0lJg^B6}I6e$*95p?;Zkm~o&XxDmM>kYSh+kz}BLvymfO3jv6e>@F(<))GFGA1~ws z024p61~9w_0h5!%H!lL7Zj<>pF9QG{Ewd{)1_lAalQKRo1KSrLlW0C(0{|Exv&lZn z9V|cq004jh*b^0q2-p`J*B2<%7bu8F*bEepPl->QPN+B295dAnH1Goe7%8*FT!9Gz zUXw;PfKuzZLli3V)0Va?SqN9WZTI$VyaxVJaWMfG6o*F zUO&_v!uCD!j>NvRb(m+@Mceb6`wl^F1g=`)Q}k!ywM2vP%JZN?mE3XAjvSgk-0`-${#YH825Rcbpv$mjyg7Y zG-pV0hI9bQGw9WdgTRzKE00NdADt~-B2{m)4;JV=ls8KkU{IM#>0sRL7jr!d_`@2T zP}qdVW)(KOJEgLMZnZQ1-vISjt0#_N*(0#I7X_0iHHK3dPGiyvlUA7p-DGqxL+sqX zRq)Y6-5Udm9Mt$lgyRvG6-;ir9Wl}t|eK1YS%WFwUOw+S6T3;W7ZDg&c zJ%>r54`L*zQ1NeH_`D9xHXf0+ s1!Bm2?XDSb^ay+j?bWzrhw*coJ*W8QC7UF)mfCPj*th58@%j_PKVwk7TL1t6 diff --git a/env/lib/python3.12/site-packages/django/urls/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/urls/__pycache__/utils.cpython-312.pyc index 061d392525a06308b38012e9d7315b72e2605bd5..2ebad9b8dccf4e60e31a632c221b7686124ad3c9 100644 GIT binary patch delta 21 bcmX>mbWDinG%qg~0}ymDGNy0jvEl>(I^6`F delta 21 bcmX>mbWDinG%qg~0}$vQ_?5Pi$BGjGLk|V{ diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc index 1b4ebc5527c1332c8e3a4b7674aa5d6a2ad66027..d4fcf6dd395293ee9e885c8d9c109ff3865f2207 100644 GIT binary patch delta 20 acmaFF_=u6`G%qg~0}ymDGNw=Dxds3@Km{fM delta 20 acmaFF_=u6`G%qg~0}$vQ_?0%1=NbS%76yU< diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc index a0816576f328e0dabd07321875eaca984541398c..9f7f1f59100caab040dbc3c2173fed4fbe03a1a6 100644 GIT binary patch delta 58 zcmX>nc3h0-G%qg~0}ymDGNy0jVdfB-1mrX@eBoi>61vW*a*uc211vG%qg~0}$vQ_?5PihnYiiCXmy>@P&tgOXxbM%0*6<%baQ-7&uuaCo6MQ Oa{y^DXY&${#Y_M-r4YUV diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/archive.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/archive.cpython-312.pyc index 782d466923e98cb0551cb85af0ecea47793dfb2f..328bb7ec601eeea813c06888feb2058c477234bd 100644 GIT binary patch delta 330 zcmX?+ur-0_G%qg~0}ymDGNy0jDP{9$&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7twuAS! zh~(sn5+=+HqEeerNLX=6hyrC_F#Kp>xS(dgv3!H#g2LrxOUpKvZAn+v7pPnjQ3pC#OlxwV Wt_nAUsO)z+Am@Up=H~snolF4j!D#;g delta 349 zcmdm*a3X={G%qg~0}!x0_?EVjrJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agBwIL>p&rnP28J(O3|xW}M7m`^Ffg(z&QQO>!Qao{ z$v=br3WvgXW}wh_koZRsvDuB&nP1cwtnC9AgQRQ+?+p>jPYmpwvXf^@m@otB%@-uB zxWq+(N?tJhXkfUcX1_skLE-YUrDYe@>^CbZr!z99P3}@r7TQpLMa}-QkbMXH4Kdlz z4APuhlXt01;k+!V`+4zK%M_4H22o48ok|lTYf*lfEpf3G|Yn#)|M8BGS`+C;Bc>xgw$t^pc>) W#5JqpoLaD25gU`Ut1SG{9yM#1GX%{$j-QA);r@Wp2$-LW{MG966>8iw|ID!8pu4W zw2+y2!^mZu6}>5o|7LE>KBJhJYq7~#F(7ovrtb0h1_msginfoO(2eV^5*s8iwQm`5 zjctnn1T|^SUCO_R>~f298FxPThX+>C&iw+7uc{Dxj9WTD(bu#eX_3Kp90Qb9e9czY zsF`52?zYW8sY7I^8>`#=Vx;p82){;OxSll5#$;PxB_^cv?+9?}{jXvYy6Xzyt2X~V z@xXz%bnr6z#2f0Wy89#ppWBxYH|*}*F~#mFj9niSMr3=iMh7K2xQPLWN4-38C^q?Q zBx`bZfHlCt=q$Es;BJyI!@NeySeQQ_S+J}B|QDj!CN zLbt}C1STR!WneM5CR@kSO!syEsgEbgC`YC0_0qa;t zzSFD-U&+DlVHHlTo^#YVuf%z4TtMOiG8bCbTI+|NmbvK66~UQ5Q5c#U60V5fof*Rj z?cT_|??(9BFiH&P|9eC~|*?asy(!cZePiQw|5)`$+Zf3s(O zcm0sWhiZIO;-ghQCK2{*BKPk9+Ls0G8sSsbokt*=INKhpIg+Y}D!RPBYiL&|6od6< zKyFLi49urL?JL4ESt5l|*%4mjB8vg3EwPO?k^46_z&QlPJ7-rgIDx)D{{+^sbfE3? zF|5iSLeUXM3#{HvJz#hQn=Rs{k>ByA9e`37$JuIIIM=7pY>n=c=q};p8tqfd=OVLj Z)(Hc#7s4F&jkcnlr{-G3JMZ1a{{<2GNNfNA delta 1040 zcmXw2U1(cX96x6_$&&2eG&j9TZkn5q_O3P?ZI`vn$L5k0+x26`l(Lp~Vc^QjmiQ;yP%Dv2A|_#(^h###^;d{TTcH@D3_!oUhcd{NqveV`0Hx48Rof1Lm4 z@BIG%bNxBQ&msLY!&m|NdMf`cl<9w4%ne}ROgl7#Si94>N09?MVpk0++uyvy{$X%V zLjWYOYXUA_N@Ito0X)W|=!x@YfM7EUS{xt0E{#0oe5(^H6UFrHag`fr0Gm-ncU-Sh z1ZB#dr}#AK`Rq^dOaj=~UdY_YtX*gTXo;e4+X9r1)wb^zKhlFF&~yO@U+S#$;o@YT zEx6a*H9mazQsu-JJ1U*UhZt!HJA?)>8J$@ZZfVULcAQ?lT5t9YZgsDwR#L@CsY7k; zSsvOY#d`^R3-hUU*?OJcWk{C%xA!S@&y#NZjG9)!a;xSQqJ_m6L{EL=6hZlnf89t- z6leY2-iDrtT|^#okb{Tcg0PG}={#jCr|SN}(p>)C5?s4hL%1_yQ2qT)nSJSPD_lY! zhGP-6Yp?+hFfqk0<}CR*4s;QwY%Di|1EIpwjiu6MH4xRfsKQ0}DB{?oNU;1U>}TBE z3xYLAPySM_KX>)>sN(2BZOI2zab`Z|(ou93Qieu~PTj}y> z&6B9|v+{4#uNdGa>c~t?;_-8J_f+Lz@#K2)R<;L&No7Yc?b2wULi_UXl@8waR{e=>I;jsRC4Zm!26n$ju0r-h2x>xD5yF}f zQG|#p#HwZwK6bh;Buef1$-?Z~Y*k3epIum@Z2BroVB`3M_-0%J$bT{azv;)hUlxB_ zB&HuOK89AbF_$@^a=P*sF*}55yG9ENE##-R=?A0yqE0hlvjJEz%0iak{FZyZ*R zB)9D;vK7R&*RmfDO)fcn`H|rOfXH=a*{6ERj3L{X8^j#1aoq~nT{^eT9oJW>PriTU aSK49Q*XS;F-&{6tu<{`Z$i?^nGW-WSE?p`B diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc index 2c66411ae6e38f354fd1ef9ce8c655f94a80d6b4..4d776416319ed8b0c53c65d65b19509099232a46 100644 GIT binary patch delta 396 zcmez0%=oIAk>@loFBbz4bTBfeZ{(5TV_ZF1lh2m9v5>gT?(~t3K}zK_D~lA{LrLWh&l}t#{q~*qm$_vwsF+;jHu=QLz$tV?QuzZb1FQJv z0xdx%#sV5v6#5|gw6~W;YnZ*JmKP@loFBbz4=pOi$wvk7Mk8$f{O+H(W%c7p27}z+~CTH@QGK1(vd`aw+ z`G8`qa+BHkttEi;2LT2lkp{0DvhwpIW=718`ozG_YBM>6UqkQ&+ci1=9i=lXS4eJf zy(({YY4SvV8D^mD<_-KQOv0ZSnE2RkNXhhYPEhLS{m2aDO;#7$$8uRA;!YP>M1bT6HU=q`Z>%g*Y!7%uZ*YtB+jrVu=9amjVseq& zvCYX^f=rC5lS_4sg>PUQw|S4w3>Jy$U@tu3;+>Itg-fNu`G%0pCkAF#^~vdm2FyTu k^DM(j+>A1lb!{6tE{iz={K`i{DR@g$71&Rv-CltGc)K|ZjR@F!mO$UlmEcLWXN^X%6>y&kJp64Ip#}T z*BD=r(!b7Quv2w%rtl%gipe@6mwACIJ~IPVeqmtJI_r*K-*}Q?S`aJ3@ofhlTG-wnSu1?B>pGNYRWJrpBR`7xo()6^>|GvoMXPkb&c@_ zDgEm_1|OM$;*+z54>6WZ))TqRd&A293rOe-1Ct)t gfZ_zfD<{9 diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/connection.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/connection.cpython-312.pyc index d0cb7b767d2945a62a4d22684b6c71db14d1918b..6e10740279ff5db2c2c305cf7d2ad2fe9139aa81 100644 GIT binary patch delta 99 zcmaE?`B;ulw8+$ zxTx=NK=q2c#|L%>Ucm{X-QJ&=CmRVp)l>y*x*;Ml-D9H1ij)Z+mqm;}F)(sUcDUT& V5$N~o^y>Bb$PDCfwiaH&2mnB~CpQ29 diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/crypto.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/crypto.cpython-312.pyc index 62f7dab75246ef3109f6654efe1faa84549908a3..d89abcdfe91ea056fc145307f81d2b3be62612ac 100644 GIT binary patch delta 64 zcmdldyk5|F2O<(rH7rNeX+!<89u=S>wmA*)~woc3E)$`}G@AK^Yd|m{?B9MKk zsi{V!NCFTq$Tk(7gj6gb6}cikpPJ7{w}uPD?_#2^zYxns*+?ERfN^9aO!upqe5}MB zD7FC@gD;gP^rNN&?kHU-qP4@u|f1xmGTr^Q!8+Knx8u3- zZLeVOe}WeS+DUVz^esxz#SoS-aAL+8ZF1SUA`ucB!#olC z_YX3$GEGgx8OFhkFzvj`TqHszF6=g-U=lv^X#MN4W3;NP`cs=D6Qv^zNP5$ORAA{g znMehh*srtMp~<#6o1I;s6Kjab;MN?w|ml_a51=pI?0-SLBUb)`GR{9N?V;qSG(p0p97)4l+Jg mN#3E`sNtg1U*fWTCsp7zT=jNUEkA|4_a2I@loFBbz4=pOi$wvlJKu%;o9)4*_pU%0=nvu;Dk_Na|fn`5raIjsy? z5x9YI0pkM0g@Fr9W>sF^{6KgIBV*>|nWE|(m!-5mF)(xTO+GAY%nYJ`ivH3uftutu zL1nt`MBNMgehb7;uw2vfJz%)Pa7D`c+?BaI953tHUDUR_v{_j^osrRda<_zx!epOM z42+!eoh}`Y9fdb|1p0kCeP#&GaJQMBIv+4`GdNmGKleojX^|iM)DH#E5h10q-5u7&eWW(J;C{gk}61{ z^<+H_ML{6_KuTf0&P<)zdLSE&Cr4{20!=oaT(5CZ5@de^!vih7YyA2Pj3+Qp2$`Wg zF>)f`rOmOLEBVAtAwgwodEM0gqN)1{mdmET*TwuMD_Dp#UfyhN0W>IQa;&wq-Qt+< z%uM=RH)R!P1TJ9gaO`*Qbno_@P}u4786^HdU1xdq!s^Af*Lh86mdq$zpxBYvpWd0? zojF6WGw1T=eb&~D5~8rMxWw;!QPE_9%!<+}JQw+WCyUsov0S$BxiY!V_Opfo*hzQz zg*T{d*WRdo-N@ylk;`Qxx9cMA3%wRNuMnLOJVSM2)aA|d?S3*bE}T5mQJ;Ns{U-)4 SPVvd798;Nr^kyTcg^U1en$~&% diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc index d2164b0864dc48f5449d815eaeeb780a152de5a2..33db180b39ab3e3836ec8663c26d4516d7c4003e 100644 GIT binary patch delta 45 zcmZpy|69j%nwOW00SG!68PhlNoMvO(F!=_X9P>2^_sRd*>R1>gJs3CFvol!$073{2 ATmS$7 delta 49 zcmexc*I3VUnwOW00SI&t{7T!%bDE8D%j6quavYZ>+&?jJa@tJ($yUb diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc index db44abc479f039126a98f2f3a6caaf802265ecdb..9e3cd3156c75756ac175b21856e08015dc106314 100644 GIT binary patch delta 169 zcmdmFyu+C1G%qg~0}ymDGNy0j31MgKo}9?;BXdQ=@rt0+MGeP=EDIPH7*0@}5{wh@&xWSnblm^1zjL&HY9G$MONps*_cO>mC=53sNhfh>av9%urR7j c_7R`Sx|{1dZ^+~~;)=`{ctbYxORQuB0DLeyf&c&j diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc index 77582a70293bfa2dfec9ec32ede1e5a6c604a9f6..31e5764dac0e16d22cf1377f3e9f7b6bb77c33fa 100644 GIT binary patch delta 21 bcmX>lbV`WlG%qg~0}ymDGNy0jvEu{)JB0+P delta 21 bcmX>lbV`WlG%qg~0}$vQ_?5Pi$Bq*KL$?M6 diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc index 92e19431e737c6469f098f0902bd8ca934db19cc..38aea2a59ad2895ca8dce1a873ba52d61a15201a 100644 GIT binary patch delta 21 bcmX>nd`_6>G%qg~0}ymDGNy0jIm8J7JyQiY delta 21 bcmX>nd`_6>G%qg~0}$vQ_?5Pi=MX0VMTG{F diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc index 13b47b61fb5ae7a1f52bbaf6a0fc0a5d8e4c7ac5..2ee621381848094b80e6709750ac664398da160c 100644 GIT binary patch delta 86 zcmZ4Ow$P2|G%qg~0}ymDGNy0j$!2Htom|1LBXV0`nyk*DC-zy4K|rd5`3{HNjEWV)S2=Wn3IwD!7jW#B0styg8E*gp delta 96 zcmZ4Jw%U#7G%qg~0}$vQ_?5PiC!3uyXmSO+j^qtt*-s3NoVp#(H>Krf)LfR<>Gb)) x3>28WgFTZme6kXUp7aMX1_3FcDptJ?<~tm6Gb&aHU**sRs$$jKoW`+R3IKy@9U}k$ diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc index e5a7882cbbe6b9eabc09d9875c2379966f28fcb1..b8418994b9d1347c091d05da87f4427e59ff5227 100644 GIT binary patch delta 70 zcmbPdGQouBG%qg~0}ymDGNy0jImXTOk74o^ZYA++BDx(eHzZ}}%g&VT@VcR-dR@u% aijwJMNuKQ-49aF7SQ$k1Hs9iL;ROKV=oMQ4 delta 84 zcmbPWGS7tPG%qg~0}$vQ_?5Pi=NLB=598!3+)B!qMRY$gh;w={cDUS-l$|d-Q?|qF khLY-aCDV&ark@x@c|8~>^YU!x0x>?Yf)s8(!{fpW04+@zqyPW_ diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc index c5a3bbf1477f357130426c7af776a5b7b71da92e..c3e8156efc47d2db0178b9c77ae6d0e8420507a2 100644 GIT binary patch delta 21 bcmbQpKarp3G%qg~0}ymDGNy0jX=MihGPeYF delta 21 bcmbQpKarp3G%qg~0}$vQ_?5Pirw!mY|K%8yHWkPcBtf-0~L@0d# delta 153 zcmccR{??u6G%qg~0}$vQ_?5Pi$3Tqn)MQ(+DE0{+pBUIVWhc)Rb7NxX-270inwznF za;(w>oeyjb5~|->S^1bgFaU`M9KtsQq(8BP_-qWEyf^seKXHOM91NU1li8Hz1et-n v8!VC^p!65!$yUlTJR72~vjlBmJfVJxC1`S@vLgEhmY@r)qL(LkDF*-mCnziQ diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/feedgenerator.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/feedgenerator.cpython-312.pyc index e357515d924b595197d5e783ae5c7f3cfe488952..88bda38239ee77ca22f98736c761679a1c589750 100644 GIT binary patch delta 458 zcmexAmGRwFMxN8Wyj%=G(80)SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(Hg%WWCe$rEJN zIT&QsJ}@(g%5UB;tHZ(T3D$4}qGhY=_VG}{a$skV8!*<=pJ1DmbwOBfY^nmU|s z@CaY$QNGBdyufP%(}u7e!5e(9@;CwA05s{EgB>H98`PY@ZrGgWw2g)F^JZE1bfEc? f+LL=cEVUSnMxN8Wyj%=G!1CZ*+D4viR)akK(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I5v7>p2ux0gY&2_@uh%`A!=Aj*so%A9v_T~l%1V7M@Bh2zr5OPjNWWw|sOz{);wF^Efd zaNiKo>)?DKA~D@-qSq$|R!)Nsmm4ywpBPwp4JI#>Rp$WGADDr{o3G01a0vN(mTg}YqHd$0_tNcY_txpV$oTeSlH+Y1v^C(~BQC{G+f%z(r z$p>bj@a894>o}QYnI=oRt8Ct3a)%M90ca~$4IjZ8)|pM_U_1^qTYYn;y)UCW)Bqa$JbGzdT~+Y}^-2-_1Hh(quK0}U1279*fcut>Obu};w>L(>*S(-1`Q z1ppKq@dE%AC9|sthXn!jlQRxw1J)KUlb{Y70{|BT@;Zd)G%qg~0}$vQ_?5Pi=LkFF>&X|{ofL0~sC{B!w1eY@u+%387EaO08yyP3w2g<`kRU!zaZIqF3@caa@+P|HQz=sW$l?p9C|I-ps{+OIS$`=$s!7 z3=0$&I4)LM!M=fUgW^V(RlFMtcL;7OxgccIz_6J`*@}hn(`0+~wOk)qnN@^z@e=my0vb1^9Vh=#-^6l7+VS(|bsACfBE~@b8W=tZFbD`uFzU!?aK9}e RHd)a_8mLKpv%QBBBLLc)GQj`< delta 189 zcmX>*iSgkiMxN8Wyj%=GpnKp~+D0C8CHtvB&aVcB?*gHWteR8Yzc7I44@FE25~`mV z1Xyi5xNnFmOpl)!e_2%R69Ye|ZHMa(d6oHfGwVJv@bTJCE>_az1=1gxfl?osff_ci zRZ?b^{KUX4%=bV<{0lRKp!5vmCG6J)G(Iu|#U{U0-^6lR+VRWg`5IC3k`_Sg8yG$a iFbD`uFzU!?aK9lS_KAU!Rc|t{hcq*g-mLAR#0UU%>^JiO diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc index 0539cb09f9e1b7bb3611a6db3208f1e277be0e2f..29f2f63266a99e5784aabdfd3f7021a0dec114d7 100644 GIT binary patch delta 70 zcmcb}ah-$bG%qg~0}ymDGNy0jv1MkQHQ9?b8=wM__-^i1}!KVb|ykPjzz;Hpxb*JUz1`biCotB$ta7^W7 zteLDQWGS;p?~0J;PQ8t68w58vPB6S8rm;fsvY7ToVeK7yo128ZnU&;$M*IMq@qvL! zmFuRJ#|D)i?-{%ocyw2=T;tK*sW= zI6-<&*@DE`mDlABF3KBh5ZO?6S>Eolpxp`94%UkTeh(d7FAKOGWZeN&IHPcW<;=9bn!3N#X_%b8&^_=gZ6i+xhl(PQ^Mc_=1H&aD*A0nNoM*7iD4fYL*>{2E zio%7qSA-2O3b}5c$uX6av3jz;kfro)z3W1r8`(ApZg8AnctuQOh2Ui|?Tf28gNO0qoaPS&V{^yv_45T*~IBn$=5ditIfnkZ{O3Mu)tL-loaqMvn%MA?*00000hyej-u?)8e0Th$O2sQ)T78{cS2~z{x93PWi2}T_N z9U$-&00|Y>2piD|8<M004jh^cVmV9-MouOw$oK zlYS8z0{{{^vz!s=3lAg!008I!_<#V=7gy0kR+Eq&76L<7lc*hI0Z)?*9xNTyLsrul zSBMPRCNk3xJfUouRkCG}1(0Er2%v1yvr!(b69F%i{xL5D+YJ(vH8Sx701gwgDKpXq D@PI$? delta 233 zcmaD;_`8tjG%qg~0}$vQ_?5PiXFCU@+~gx1W*j%fq(3o8v+7O$%Mr|RLq`4+1E-+& z)Enq!gco_K9pt^2w^ESBL78IZSkYfrngOJ4L z3eEyXRVARh7Ysid7%uRIT$Hky5V*r}zuQi?1Bu6T59VIB3GOKbicaR@j$yeXWpR0P z7I!hDx(Y&1IEtR@ZebVQ!Y7D>1%fWh zSWPJ0k+?r?XWALgOLl>i1TV-~UEKVJ&yP_-7O4IQ)MuR; delta 283 zcmbQM(yzjEnwOW00SI&t{7T!%W5TMX59Bm3+~HMSkaC$-iq(b^t)(B?#onZA}co_K9U^=*Y8(eM(ihp9@VO5;`fMW_XkltL* zS-_|y4^;eu;YS0*CBBdefjb=cyX|y4ka#@zVD4p`;GV*Zd?Ay0xMNr@OIcjmoWotr z$fJnR5I*@Gj~EkQ_+&O-e~5}m-V#O?Kd}8zc=)f#m~05SEMs*|AZSA2j>P?GJJZf^ zUa||EBzS4_cRoKxSt+2(A5h!<7NmBR_E&XQ%?P>5uXvHqZ*r;t&|ZDtE1QoBL@)vX DT2o|^ diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/ipv6.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/ipv6.cpython-312.pyc index 44078387d2eb6387ff4439c2e3c51b35c7bdd0a4..6c97fc5b93ac8798b282190f54f12019a971294c 100644 GIT binary patch delta 20 ZcmeAX=n>#K&CAQh00bS3jOhz`H~=jA1KI!p delta 20 acmeAX=n>#K&CAQh00g=Rex)ts;Q#RC diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/itercompat.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/itercompat.cpython-312.pyc index 246e23f2b364c839fc3024a9d267902fb36b6005..1e99d9c804902155cd55f8e6f554a920228937ac 100644 GIT binary patch delta 99 zcmZ3*c8HDVG%qg~0}ymDGNy0jdC2I|tRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJDHAUv0J=6B0RR91 diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/jslex.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/jslex.cpython-312.pyc index 53c4922d79b4829c1b026b6fcfeec79ac1a0b165..dbf25b3227e79cc2742a526e8ea7e19dac2dedba 100644 GIT binary patch delta 243 zcmaFr_RNjvG%qg~0}ymDGNy0jVPf*A(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tI|er0h1&;i(j5Tsc`xNs(z<>|{HoGG+!b<;mNX)&T&&9Z#wN delta 238 zcmaFn_SB8%G%qg~0}!x0_?EVjhl$A`O+U0awWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKjOiPbnljLcA1@ewG%#Ee_SsN4!EH{^{K%P+3kqk) zToln<;dWKT=%TRCI}x^yWo8 fm73m`kVU_COx}l)*i9wiCYVre4 R6AmE#kr^nwS%&L8D*%mG64n3! diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc index eed1f22b7fe8eb109c9127dd557d1d0143d12b64..e29357f3fc9f524aa96bbc19ef59edc743a01128 100644 GIT binary patch delta 43 ycmew*^;L@JG%qg~0}ymDGNy0j`Nzq)ZZkKR3KP?mxXETb{>%(wDw8{SJ^=s)tqb1( delta 48 zcmew=^-GH9G%qg~0}$vQ_?5Pi=N~8I=FQw(DopGX<32I4bBazjXz9^jMG%qg~0}ymDGNy0jagyK*1#(_6{AghKEW*GqIXO|nof$}PUM(?+k{K9wG1t+M@(YnH} zdRths!}$)s_zdP5Ay@g8Zi-8PU}X@I+FYY>l$B9nvXfda^K}u`$=lW9nXd^dPnJ_x zXJ!ymne3si&3s!zdUCb8o+g8&%m)qzDVYwh8{(239(Uvv7pSe!z9wfjk!u3Wgp@mK znk#g6a9vY#o_t4LUy4E9h4BM3gS<@&5JJ@fCD}t0uP7aYW0VVGsa%;8udvY_OmgxQL+OA=micQ`pv77P0^s8eCit{F7jG6aNRUC+fax{&F0gRmCOJdA4{MB delta 252 zcmdmEb;OG2G%qg~0}$vQ_?5PiX9p+ay~#&8t=K2?ePUo?)tSu5Wu*(GKX5Vd34LN< zV%6$kyur;gg`>;%29M}<9+`_gGIJspB+iV!%A@)3+snTwN2To`ELj|PT091BDi zlw6cBTTuoi8W=V=^6ci66az}W07+kxu$fV~B5{kws@yq(7bR>qhlxorGDc3$7kB2k zAt3shL4{R&@>cOf%nRJEOsj|PStA`;X6C;BgNxhA4HxqHU|8lb$eWP{Hg0p$fwE4Z%-m`q;CtINzFXuA0#uLTcd{bVjF7tvjo zmz7<2T5fP&khDU01?!5yMcz9tHz!Fg=j7!C+0($VM0i2S63NXHD)U)^dUj|kFioqU z{6I5|nL$E*vz3+|w}dEAA=o_^L<|;2Enu7yJVS7L*utpE{iX|<7e-y)Y;0D`tRM?_ z_5~q_jk+rWCs0pa6#gAVU3Nto6lQ@GBR(`y}Vi7dJ-FB+vHu2dg5Q1nYh>< zaPmFi6YS6E%;?U##36B8L}oIlld=MXsO)!cp!5e325!E7jZTejt;;MT-$g+}3_xPD okCPq?qt@hVH%Z}Z{DvLOH~0i6D0ZfG^L%7x5HQ-j#%(hX09KH6RsaA1 delta 386 zcmX@GjPd?5MxN8Wyj%=GpnKp~+D4v8PU-JJ&W{%iKN=Wrh)7KLpXk59<+6z8Ck8%F z>B-fccbI|n<|r-=W+^|QLZBjH$p)W00?G@VR&ZYyF!{v5!YVd-IkluWp*Mf(! zZjzLX$WF^^%B~xn7bL9^UctH|aFO>#W!KG-Qp-8{xk2_dFf0*X5VBaZfnhVR%6wMF zw#jQX6*wl>e`4U`^ktlUUNejZ#MrE%WydWp0@ML^;3W}*1&mXIX9!LYyC`BXxz2PU z^Ma@=o0ZIJndN2R-nb;>up)4R^>q7*_6rObBwiQRxG3bXdB0^SBlBk6E1SiwC$TY3 zn7qnSPw@*g6BpYD22NJ#2b_El_yqeiIy1VnE^$cQ5Rn0T3>X0K9hDV;^mlHcnhzoj z+9H{CPfm1`l(@`q_=$m$RkVZo2A|*r#m=;Do{!8x K{^nk{%{%}hD0<%j diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc index 6319ae942de3c50a413dec50c8de300aa684921f..466a0e46511788cfe1c0ec83ae066aa463a31a1c 100644 GIT binary patch delta 81 zcmcbodr6n)G%qg~0}ymDGNy0j;T2@`-7F>O#Ke4GP-b$9u&z3Tkn9IO22QR9$2%gj kGcvA;sCRO7Fm{;U;1-zR*ll%_NALqHgQ&*l{lfCh08!Ny{Qv*} delta 93 zcmcbldrz0=G%qg~0}$vQ_?5PihgXm>aL!oi2Ud{i=FP(L%mBC`8O#6x diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc index 3e015c500f8a38d8c48fab4607117d158487c07a..2cf3aab6b690d7aaf3ee0c8e733290936bc9bbb9 100644 GIT binary patch delta 21 bcmccbe&3zvG%qg~0}ymDGNy0jxvUHTNACsf delta 21 bcmccbe&3zvG%qg~0}$vQ_?5Pi=dv;YP$36M diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc index f5bb0b3dfd3d37cdbdf36aac865a04471255b266..83c18a08c202d27464cbc8af2c68aed0fb049edc 100644 GIT binary patch delta 59 zcmbQLH%*V{G%qg~0}ymDGNy0jF=dw!1#(_6{AggfU=n;V_5kCS;2nb7!w$wyj$m(L NJ`{U-^L=(RegN+P6LbIo delta 58 zcmbQHH&u`4G%qg~0}$vQ_?5Pi$CO=M1ju>8@S}m@l1cCZ#x21+1hGzp#@$=8@S}m@lCa5)!YR%(7^k~k6gHVWkFAJ# zf&Z1w!t4h)6)J#=8W=usF^Eex_}>vwxh|k}Q9x^j`DFp)PYmp=Mw8zOXfp%p%`$?l FOaQ3TA9Vl# diff --git a/env/lib/python3.12/site-packages/django/utils/__pycache__/xmlutils.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/__pycache__/xmlutils.cpython-312.pyc index 92fdccae4f60fec1f6a3ebe4c37feb006d8e6306..7ca94d75e30c30fcfac583b7eb7525fa1f546685 100644 GIT binary patch delta 99 zcmeC@U(U~SnwOW00SG!68PhlNNHKae>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9b^7%kZV=0hNR delta 75 zcmZ3^-_Or;nwOW00SH(gd`sKNBgJTtsUKRLT2!o`omiBZrnwOW00SG!68PhlNc!=?G0y#e#7%r-rUs1E1oGi9WS{x#Bhez=Suiymh W1#Bz$FYs7=WMx+2+H56$T>=2WsuY?4 delta 76 zcmeB8n3%wGnwOW00SI&t{7T!%;~~b+4dnc2V7RDeep$`3fnjo@*e+Q~h}az-#T&eW a6Ra1ot>C}FWATBNS%s^CVY8X|bqN4tZx;3d diff --git a/env/lib/python3.12/site-packages/django/utils/translation/__pycache__/reloader.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/translation/__pycache__/reloader.cpython-312.pyc index e4d15ab32e690edce8c3290cd43399c6246c87ac..fe0f4437d723dc9ac5d41a0a825d181982fbc73c 100644 GIT binary patch delta 130 zcmbO&I8%`4G%qg~0}ymDGNy0j*~-lIfq_Mu>!Fmv1h&a1ndO;pN*PRk%e+BK9H{06 z!;c1r3sO!ObsQHI&M{fQINuz|oV2wmrqxyU0kBV>W)RUX}s%s}DI|5#@;0RS}aEW7{! diff --git a/env/lib/python3.12/site-packages/django/utils/translation/__pycache__/template.cpython-312.pyc b/env/lib/python3.12/site-packages/django/utils/translation/__pycache__/template.cpython-312.pyc index 0d59d33141ed555aee3b2de36099e594fffc6f17..00f6caf0e92d5aba9f2ab5c9a6dbe391708b0d0f 100644 GIT binary patch delta 343 zcmbR3)#$}@nwOW00SG!68PhlNSTT9@>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9c1m>MJ*H%$I6 z9m{;3S7~yrj0^KM75B+2Wt1fuR6Q8Kura9Wtw_JF=WtQa;eg0xJvWf-OBrJpknCi6 z*^4%x`507nXSm#uk)Q85({oA2ijob%m(?t<%2<712Fg5E(ZVYE5h$rW*-S23{xc6= z12*rKQ(|PkqUbsKg}fs(gOb-~9fe*-=4(ohlMgD2vN9+;F+Q05Pa%G?rIIG|Z6z(B ps4(j%W(H;L$xTZ2OtU2?b11trGe{{<4pJ^>X5drad{)_y5dc*@bVdLG delta 312 zcmZqln(f7NnwOW00SH(gd`sKNW5r}psvlaMT2!o`omiBZr-#)mxE%UC-g7p2Go=%X)5L73_jqlRwEAGlOVN*^68s_!v}mKQS;$ zT2KBjE6xq1AE;=-_@b;InL#pUa>-mDc#su>gg5VyQ)1-2sOb5Lfm70taq?YxM`j>n zv!X&TBgbVWN1!R9W|KE6iZX-fQ;MA&HI8}(}G%qg~0}ymDGNw=Dx#7{TA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY zoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}yWoM@?HQ6dDY+)TF=!n>A2%mc$}LNL-E( z(&CSV>Y&A7Qd~^)Gp<5p!05n9?GM#$s(Pn6;ers^sKz``6kPm9x(z(Xf;7U*$C|4n)t<=b7Jj=<4 z<}w8sp5zU`VN-+39e)SM^I+HN-{7*Yv?t?Q32bn9(|8BH;P$ZBRC2pjN`w9iRoCkD z@-&`NXkMoI3Q~=@+pL`bKbl-l;(H41lxgP)N&=QkRrUv3#%~TTGxc=t(Ohoo{skL`@}I{vC07DNG#_*!f9a0&MbE!2?-INUfPgpt}wUPwZp z=QMSbb6rq)pUnG;O@1j-VmXEFl-bVQ?LF2nMN70LHMB64p7}((DimP5@migO%y%SA zwbhy+H$i^--&tV}zm5*0V#7sjx)wm7v6DpAURMUltozEir7L(T=0y998H_0F zBA($q>Uo`0QzPhD&!?HKLCq@)8CX2CxI8rc-%HqgcAnVCd(m*P*5Lt|7Y%i_n(0Hl_vRJ; tYS7jX$yU4v(Y0EDOgsx8Phi934t$0Sll`b@ynve%0|=Np$c@BX-5)Z{;{5;s delta 757 zcmZvaQAkr!7{|}q@y>ha-JH{@+uYS{p|`2gH0GFQ+Q6JEruC3PL4ry>CowZ+y~vdw z<~)J3hni$Gg$O%6^&o~l7)5Zq#a$*O)Pp@lZU{*a(b){2JTE`a$B#eX`E$N~hL1NO z|5mTp0eTu&{|qnl?>LizUZUVNTJ2mfdDXR66a{3POTxN9ex5F^m~D@@XF&mHmI6B( zq&KH4tcm7$WTtqBp+mA%^cz;1sl2xh_M+f}$(M9ZHz!>8{Ibc1U+Qn5Md2epZb;YH zQz`EpghI|G1!&&vXnYipsk~F>of$-@_*k*(KFoLS`;mAA-%@#p%sX;EaT`x)>{5Q? z?=~SZ@^E5qA~o`Cd~sZ{oy-C)*Mx7HJcyDknL41QBd>0nDzPXP9;|~n0sk#^AWGsa z^F#Z&eeIA$#8u%Dvzw|_WZpcg{a@n(N_M77=DQx{YIIjMY2aymMToI!dtDZ2^dkNx z)Mzw%Qc_*W!5M53?YbQUu+`@J6>+QBjVQ^a7=dlR{nuC=3!>_5k)17y#YZ!^BT_JJ z6;x}ZY;8K3J#5fwXv!TxR(x+v@F|u;y{uB+ zkOhcw<1ZmUq9m1P{fMQbV(k`h#FxVkCWGh&N5i)Zl(O30=e^6&+nV2Imj_MW7uQs8 zx9sg!JVDhHmOWv`)29}lpZ6!5Q;Zad1*d{{LkY9Y3kvz!mto)q{Pp4{yH%E}fY!Fs zUt^@qXo0bO%jwPa;>JJv1w=`7mtuub!1u2{V3q1qS)gOgxOLzRq9l_8ZOD-Oyit%C kNW!_nD8TOr*WnX9JJi7{`lDIEG9um>3Lr{SGrXq#2RSP6?f?J) diff --git a/env/lib/python3.12/site-packages/django/views/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/__pycache__/__init__.cpython-312.pyc index 2005e4810c528470516a41f943b95bed66f9999a..35eef497ed2cb46bb4444bceab205751dff1b921 100644 GIT binary patch delta 21 bcmdnSw2g`9G%qg~0}ymDGNy0j(P9JuHPr+~ delta 21 bcmdnSw2g`9G%qg~0}$vQ_?5PiM~e{vJ_iM% diff --git a/env/lib/python3.12/site-packages/django/views/__pycache__/csrf.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/__pycache__/csrf.cpython-312.pyc index 132a3e479d6ef6b4a79a47f0f2a328475e5dff86..c12f862140e583e67451afe6e5084fbbf3473443 100644 GIT binary patch delta 129 zcmcaB_g0SQG%qg~0}ymDGNy0j$z}4W)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agAd?0cW7yv#r#9xal;f6LK~-*N$^$W<*g*U1W@+?t)B$ zMj*^yiIYk#g7U7}>0&~JQc=)FzV7H*Bq8)cmy^J*k|xzv&&~gV-w&SWfAcGR`2}j; zk)#?FCkf%X1^#k|9h5{+L%J(z-zzmc2PPyzI@M z5=LdC2OB*ZPv+v9v17@L*>H~P6DRB16}7?QU*n*l20A85ZdBJ!AHBn(PjnLjYD^-j zTZAx%-srh<$;V4o{n*E&f?ls&@$su-1@mZ^J~iyp0jVmEeFJ~#z^b@yh$!K4)MNG% zA9WryZZ;4=-y){X2Nm!h`o{Gi_{>@bn71{`wr*_e7Ru7qGZh5_7;T#jm+Jpf0`_zY zsytJl4y`iwywf8)gV-4qLg}HI{(`DV#R-eI43>&ny8${RgCo_Ow>HRDKeqZ)A>r_C zev1ICvrq;scA0C%T&v9aFy~w6x=@9)odOnrp$63NlTFRo)GV9Yu&Hg`v>%;x8VOL} zAzpV*)ItI&194)VZa^mjlwvN5t_DH|z%~{%z}%ElrOr-~d74cIQ|?>gf)?l+#mxY( zf~V0`L`O(uCyIsj1gPvn7sA$(Vy=*#;!JoO!qNYX_mRE-jGYLhfKQN~j~OLx!+bo? zn(hzZ9iAPLSvO|gIkqJg{7HbiMl{KrcT-&8)k>&C&*KrrtQu7gx{N@_ZB>F^*avgk zzU8*8b^458P1ExoYjxhGHu2ctGYWo3Rp)=1rSizzOB)(m)>yE{l8!$felYxSB&TsD zVeyFi5Jc{=*QLA5N_j-w8LLvj1gcCF`;|wLE5Rs%nujQwa1|ZC=tRXE34-_y8(9LI delta 854 zcmb7=O-vI}6ou!t9cXI@T1uJe&$QHbfI?AC1)=JikgX8>DS1v`$Ad$GH=dJs{Wv=|KA2n!P>C zU$5#?SYqhzB}~?0W^0nzFjUSRfpi{IXvP41M>VJlhS!;&05A++T3k-CBQBMXEV$Fo z^cV}+pk%BSjI}9{Y8H(?LGKfJz4cxJerzkiV^VqIUofDfDliUX&X6Z(4xqcl0ATT) zk>cW6V|~u+m%ROgx1WvAhq9F(886KFyUqaxcmO}SMjAJ1CXWHrZVu#X>ZO_C!!qEuF6Zm;AD3a+5!>JVHVqN^*9;f4nI)7M5Ll`F97I?3S|9Dd2sDmYq2 z$1c=I>;rJH(XJ{O{$%6jNM*FBFUePdl9vG%qg~0}!x0_?EVjCyCu4Q$MsgwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~8#_NY0JPZ}TmS$7 diff --git a/env/lib/python3.12/site-packages/django/views/__pycache__/i18n.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/__pycache__/i18n.cpython-312.pyc index 9668f71a614526e50f745050bfb8b408f6fc4fcb..76a860547a2ebd56125f0e26139488eb00c6d2be 100644 GIT binary patch delta 452 zcmV;#0XzQbUF=;9%MA?*00000hyej-u?(#aC@la00Du7S1P>PmfKTxt05Ct(3qPrU zpmc~tlq#51(-I=l3?it1(X-tShzNh~0001h0OUG8*E&woI!@F&Q1b%<9tznyP^e0X zN{>&8PncTK3@6Y!Q1Al)2^;VL0v-zS2mmZJ^8*4G3fU_&pkc6a&^%7kH%`zD9++{{ z3?ZmE@B;t|6z~877Yg(S01OX^d(#UWoMWIUn{CnyE7>C}(-%vjIGACmanK1kO42V% zngO6Vljs*FCGiRXJxBr54@kL7uv3%*mj{stmkf~%m{XrvnOLBB)etbaOVP707)S&G zZ@PUP2oUOtCg93wr{WWg;1tlFWQ?zD; zTozKg$fI;=^FzK4j{2uyl~1hfu3PzCwDP-b74VIjNsjA=j#-CSzkjFyjHrt|>K{Nt z7dWIoFaYTf91J=pKt{5`pBR{UEhq1n(PswI zn?K1+Wn`?H+##pPeOXHT8!L+#-vbe`$=l@QnLaUZz9rYs%qTrMOUanyvYgc?1}jN`L_2x3=J1m}OzybJ)iIGzq=wUwP3(6*!c}=hLT3zI|I^ceR*XlB_ z&j+CC<`)8j?ug4yuDC9)eNkL{h0}WXmF}xOFN>RXczg$%XFhqlMjZ!`1}okyqj`Z9 E0M~$_CIA2c diff --git a/env/lib/python3.12/site-packages/django/views/__pycache__/static.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/__pycache__/static.cpython-312.pyc index 1e475d94e780b350309049af187a7a694866caa0..8e14188669fdce528e3b39b27a2f0bc44ca83517 100644 GIT binary patch delta 145 zcmX@EeMy_=G%qg~0}ymDGNy0jDP#7i*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t4`Aul(fW0`ANVdJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag6!Rq>MvcjH1*|wO^U8l>U}cq?d`rNc8APiH1_A{G bKQJ(J@=dM~)Z_)y-$9&@AY$`sL3I`Y+$$-f diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc index 36c9bdda7a5e65845de0656f0ca3acffc6805d40..e15f0e78002fec119729a3858af9479af485b33f 100644 GIT binary patch delta 20 acmaFM_?D69G%qg~0}ymDGNw=Dc?bYG?FB~w delta 20 acmaFM_?D69G%qg~0}$vQ_?0%1=OF+=O diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc index 6ade3aa0f529a89ff1022d7ec7f276617d37b62d..e5e877edafe9396f7ce3725e67edd855cd095e79 100644 GIT binary patch delta 21 bcmbO#J5`qFG%qg~0}ymDGNy0j>Er_dHF^Z4 delta 21 bcmbO#J5`qFG%qg~0}$vQ_?5Pir;`r=J*)-+ diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/clickjacking.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/clickjacking.cpython-312.pyc index 828816ff55f629e8091737e2cc4518693fecb89c..60df525dcc900da9fe3abdefd6211cdace97e68c 100644 GIT binary patch delta 99 zcmX>h`9PBAG%qg~0}ymDGNy0jnaAWYK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAdi|HLF081Pq A(f|Me delta 75 zcmaDLc|wxsG%qg~0}!x0_?EVjXC9M5g??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{p}C#H9t0MB9@)Bpeg diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc index 3cfd4b64bada593a0bc696194a7db8e87a24f9dc..9a2112034302099ec58dc85fbc193ace7c132248 100644 GIT binary patch delta 21 bcmeyw@ri@yG%qg~0}ymDGNy0jNn-&3K$Hat delta 21 bcmeyw@ri@yG%qg~0}$vQ_?5PiCyfOFNX7veqNmCG%qg~0}ymDGNy0jIm`_JJ{JW< delta 21 bcmX>veqNmCG%qg~0}$vQ_?5Pi=P)+_Mo9*s diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc index cab3fd1c9e36ee461ced390a200365459fd1aa4b..4209df30ae90052085fa4f946d0efca811b4dbfb 100644 GIT binary patch delta 21 bcmeCs>d@jj&CAQh00bS3jOiPB{)hkoHcSN` delta 21 bcmeCs>d@jj&CAQh00g=Rex+^X`6B`VK7Iyz diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/gzip.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/gzip.cpython-312.pyc index 8480756ab7d8fe91b9219a4843df0ed2bd70881d..34c290d7e938a80c2df72a8f043465c7d1871212 100644 GIT binary patch delta 98 zcmaFB{DYb2G%qg~0}ymDGNy0j(PZ@K&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>Kma!TDmysGs diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/http.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/http.cpython-312.pyc index d4210340380e901c8b909fb89c3c57cb71780c71..ad51778b67df1f6443efc7efa785510b874c0a6a 100644 GIT binary patch delta 99 zcmdmIcFm0EG%qg~0}ymDGNy0jX=3&0&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag8f$|n0MW`DUH||9 diff --git a/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/vary.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/decorators/__pycache__/vary.cpython-312.pyc index d166f5f703a570fefedcff4d7988b11426a5699e..7e423d7b8d636b4a8c0ec1b55b889f7b794f3cff 100644 GIT binary patch delta 99 zcmbQqw~>$MG%qg~0}ymDGNy0jVPW>@&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t<{9 delta 75 zcmdnUHJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKg83#h0Ejvo3jhEB diff --git a/env/lib/python3.12/site-packages/django/views/generic/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/generic/__pycache__/__init__.cpython-312.pyc index 6ed0337127d2f722e8616d58ef4f261b1d4acaae..fe936a303fee321925a0273f2b178b85509ac009 100644 GIT binary patch delta 21 bcmbQmIg69$G%qg~0}ymDGNy0j>0eBfh{R-CUhQ)ixDr&ovb1kpP@!V_F( zD9NW{2VxVYLN?mxVP~L|hd% z-B~mF8Rr$pIUq$qb2%8K<*rNVUy{=Q%*rCd^-xNG0^1D%u^F0|1eDjXZ(!aKc16SH z3o8S!$OPvZVpn+-Zb<2WU}fMGocx1Joq1=?<;_amVr)D&fX4l7VED|&AR;%}Q!tzv zNN-*&c#u=a5bXXN%IepZEiWlsUgr0^sBAeSaZmVxkQ0ViZG9&&PG_IUK9%!=vgO6i IUD6670OFZfM*si- delta 263 zcmZ1#zbc;RG%qg~0}$vQ_?5PiXA`@wCXmy>@PUs(T5-P4Or6f$yHL)n;AI{GRn&Uwf%U(@S}m@l9101#Vf*U3koj_Yp#g6 zDr|aD$Y=5+&MS5^L27_zb1+EDU6<0oD5d|6l|_W>fq>Wz0kIjHmjsm8uy0`A5Ozhw z<_jwWugC=F8Ddv?6h1Hm6?Je-{?4V&yrbsIW<_o>Ho?0erPmFDhGJr?XFFpUQb@bCg519rUcgj delta 21 bcmeCS?Y8AP&CAQh00g=Rex+^Xsh0x)K-dN| diff --git a/env/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc index 9079b60287a310caf468349ee0b0cb08014bfd0a..8e32221d8f0c9a473cb117de659a269dbe3b92c5 100644 GIT binary patch delta 21 bcmeB9=}zG}&CAQh00bS3jOiPB{u=@SKZ6Ch delta 21 bcmeB9=}zG}&CAQh00g=Rex+^X`ELjSN3{nO diff --git a/env/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc b/env/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc index a2d9043f0a67a9fe8d6c739be450cbb578fe6ddb..8a8d3dbfb2e98cdf21101831905f296e536aa112 100644 GIT binary patch delta 21 acmZqlZ1m(g&CAQh00bS3jOiPBN>u`Ld diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/INSTALLER similarity index 100% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER rename to env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/INSTALLER diff --git a/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/LICENSE.md b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/LICENSE.md new file mode 100644 index 00000000..3dea39c3 --- /dev/null +++ b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/LICENSE.md @@ -0,0 +1,29 @@ +# License + +Copyright © 2011-present, [Encode OSS Ltd](https://www.encode.io/). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/METADATA b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/METADATA new file mode 100644 index 00000000..05e2c21d --- /dev/null +++ b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/METADATA @@ -0,0 +1,257 @@ +Metadata-Version: 2.1 +Name: djangorestframework +Version: 3.15.2 +Summary: Web APIs for Django, made easy. +Home-page: https://www.django-rest-framework.org/ +Author: Tom Christie +Author-email: tom@tomchristie.com +License: BSD +Project-URL: Funding, https://fund.django-rest-framework.org/topics/funding/ +Project-URL: Source, https://github.com/encode/django-rest-framework +Project-URL: Changelog, https://www.django-rest-framework.org/community/release-notes/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Django +Classifier: Framework :: Django :: 4.2 +Classifier: Framework :: Django :: 5.0 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE.md +Requires-Dist: django (>=4.2) +Requires-Dist: backports.zoneinfo ; python_version < "3.9" + +# [Django REST framework][docs] + +[![build-status-image]][build-status] +[![coverage-status-image]][codecov] +[![pypi-version]][pypi] + +**Awesome web-browsable Web APIs.** + +Full documentation for the project is available at [https://www.django-rest-framework.org/][docs]. + +--- + +# Funding + +REST framework is a *collaboratively funded project*. If you use +REST framework commercially we strongly encourage you to invest in its +continued development by [signing up for a paid plan][funding]. + +The initial aim is to provide a single full-time position on REST framework. +*Every single sign-up makes a significant impact towards making that possible.* + +[![][sentry-img]][sentry-url] +[![][stream-img]][stream-url] +[![][spacinov-img]][spacinov-url] +[![][retool-img]][retool-url] +[![][bitio-img]][bitio-url] +[![][posthog-img]][posthog-url] +[![][cryptapi-img]][cryptapi-url] +[![][fezto-img]][fezto-url] +[![][svix-img]][svix-url] + +Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Spacinov][spacinov-url], [Retool][retool-url], [bit.io][bitio-url], [PostHog][posthog-url], [CryptAPI][cryptapi-url], [FEZTO][fezto-url], and [Svix][svix-url]. + +--- + +# Overview + +Django REST framework is a powerful and flexible toolkit for building Web APIs. + +Some reasons you might want to use REST framework: + +* The Web browsable API is a huge usability win for your developers. +* [Authentication policies][authentication] including optional packages for [OAuth1a][oauth1-section] and [OAuth2][oauth2-section]. +* [Serialization][serializers] that supports both [ORM][modelserializer-section] and [non-ORM][serializer-section] data sources. +* Customizable all the way down - just use [regular function-based views][functionview-section] if you don't need the [more][generic-views] [powerful][viewsets] [features][routers]. +* [Extensive documentation][docs], and [great community support][group]. + +**Below**: *Screenshot from the browsable API* + +![Screenshot][image] + +---- + +# Requirements + +* Python 3.8+ +* Django 5.0, 4.2 + +We **highly recommend** and only officially support the latest patch release of +each Python and Django series. + +# Installation + +Install using `pip`... + + pip install djangorestframework + +Add `'rest_framework'` to your `INSTALLED_APPS` setting. +```python +INSTALLED_APPS = [ + ... + 'rest_framework', +] +``` + +# Example + +Let's take a look at a quick example of using REST framework to build a simple model-backed API for accessing users and groups. + +Startup up a new project like so... + + pip install django + pip install djangorestframework + django-admin startproject example . + ./manage.py migrate + ./manage.py createsuperuser + + +Now edit the `example/urls.py` module in your project: + +```python +from django.contrib.auth.models import User +from django.urls import include, path +from rest_framework import routers, serializers, viewsets + + +# Serializers define the API representation. +class UserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = User + fields = ['url', 'username', 'email', 'is_staff'] + + +# ViewSets define the view behavior. +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer + + +# Routers provide a way of automatically determining the URL conf. +router = routers.DefaultRouter() +router.register(r'users', UserViewSet) + +# Wire up our API using automatic URL routing. +# Additionally, we include login URLs for the browsable API. +urlpatterns = [ + path('', include(router.urls)), + path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), +] +``` + +We'd also like to configure a couple of settings for our API. + +Add the following to your `settings.py` module: + +```python +INSTALLED_APPS = [ + ... # Make sure to include the default installed apps here. + 'rest_framework', +] + +REST_FRAMEWORK = { + # Use Django's standard `django.contrib.auth` permissions, + # or allow read-only access for unauthenticated users. + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', + ] +} +``` + +That's it, we're done! + + ./manage.py runserver + +You can now open the API in your browser at `http://127.0.0.1:8000/`, and view your new 'users' API. If you use the `Login` control in the top right corner you'll also be able to add, create and delete users from the system. + +You can also interact with the API using command line tools such as [`curl`](https://curl.haxx.se/). For example, to list the users endpoint: + + $ curl -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/ + [ + { + "url": "http://127.0.0.1:8000/users/1/", + "username": "admin", + "email": "admin@example.com", + "is_staff": true, + } + ] + +Or to create a new user: + + $ curl -X POST -d username=new -d email=new@example.com -d is_staff=false -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/ + { + "url": "http://127.0.0.1:8000/users/2/", + "username": "new", + "email": "new@example.com", + "is_staff": false, + } + +# Documentation & Support + +Full documentation for the project is available at [https://www.django-rest-framework.org/][docs]. + +For questions and support, use the [REST framework discussion group][group], or `#restframework` on libera.chat IRC. + +# Security + +Please see the [security policy][security-policy]. + +[build-status-image]: https://github.com/encode/django-rest-framework/actions/workflows/main.yml/badge.svg +[build-status]: https://github.com/encode/django-rest-framework/actions/workflows/main.yml +[coverage-status-image]: https://img.shields.io/codecov/c/github/encode/django-rest-framework/master.svg +[codecov]: https://codecov.io/github/encode/django-rest-framework?branch=master +[pypi-version]: https://img.shields.io/pypi/v/djangorestframework.svg +[pypi]: https://pypi.org/project/djangorestframework/ +[group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework + +[funding]: https://fund.django-rest-framework.org/topics/funding/ +[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors + +[sentry-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/sentry-readme.png +[stream-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/stream-readme.png +[spacinov-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/spacinov-readme.png +[retool-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/retool-readme.png +[bitio-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/bitio-readme.png +[posthog-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/posthog-readme.png +[cryptapi-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/cryptapi-readme.png +[fezto-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/fezto-readme.png +[svix-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/svix-premium.png + +[sentry-url]: https://getsentry.com/welcome/ +[stream-url]: https://getstream.io/?utm_source=DjangoRESTFramework&utm_medium=Webpage_Logo_Ad&utm_content=Developer&utm_campaign=DjangoRESTFramework_Jan2022_HomePage +[spacinov-url]: https://www.spacinov.com/ +[retool-url]: https://retool.com/?utm_source=djangorest&utm_medium=sponsorship +[bitio-url]: https://bit.io/jobs?utm_source=DRF&utm_medium=sponsor&utm_campaign=DRF_sponsorship +[posthog-url]: https://posthog.com?utm_source=drf&utm_medium=sponsorship&utm_campaign=open-source-sponsorship +[cryptapi-url]: https://cryptapi.io +[fezto-url]: https://www.fezto.xyz/?utm_source=DjangoRESTFramework +[svix-url]: https://www.svix.com/?utm_source=django-REST&utm_medium=sponsorship + +[oauth1-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth +[oauth2-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit +[serializer-section]: https://www.django-rest-framework.org/api-guide/serializers/#serializers +[modelserializer-section]: https://www.django-rest-framework.org/api-guide/serializers/#modelserializer +[functionview-section]: https://www.django-rest-framework.org/api-guide/views/#function-based-views +[generic-views]: https://www.django-rest-framework.org/api-guide/generic-views/ +[viewsets]: https://www.django-rest-framework.org/api-guide/viewsets/ +[routers]: https://www.django-rest-framework.org/api-guide/routers/ +[serializers]: https://www.django-rest-framework.org/api-guide/serializers/ +[authentication]: https://www.django-rest-framework.org/api-guide/authentication/ +[image]: https://www.django-rest-framework.org/img/quickstart.png + +[docs]: https://www.django-rest-framework.org/ +[security-policy]: https://github.com/encode/django-rest-framework/security/policy diff --git a/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/RECORD b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/RECORD new file mode 100644 index 00000000..ae753b79 --- /dev/null +++ b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/RECORD @@ -0,0 +1,344 @@ +djangorestframework-3.15.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +djangorestframework-3.15.2.dist-info/LICENSE.md,sha256=zBKwuFNolyF36_QiCJQZuf4-6lcp_ssREFxkD27qzNQ,1537 +djangorestframework-3.15.2.dist-info/METADATA,sha256=XKRECHdsCLNx2slXXhtrhLWwzYYvVomIx3vvu6bUZiw,10585 +djangorestframework-3.15.2.dist-info/RECORD,, +djangorestframework-3.15.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +djangorestframework-3.15.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +djangorestframework-3.15.2.dist-info/top_level.txt,sha256=Q4oMfHQmLp0SXK-4_xXo8rmYu94FZLDzpjpl-30rz9s,24 +rest_framework/__init__.py,sha256=r0mc9bqXfjdTaVxPw0MziVufrFbLoPsoKcesYc9alMo,916 +rest_framework/__pycache__/__init__.cpython-312.pyc,, +rest_framework/__pycache__/apps.cpython-312.pyc,, +rest_framework/__pycache__/authentication.cpython-312.pyc,, +rest_framework/__pycache__/checks.cpython-312.pyc,, +rest_framework/__pycache__/compat.cpython-312.pyc,, +rest_framework/__pycache__/decorators.cpython-312.pyc,, +rest_framework/__pycache__/documentation.cpython-312.pyc,, +rest_framework/__pycache__/exceptions.cpython-312.pyc,, +rest_framework/__pycache__/fields.cpython-312.pyc,, +rest_framework/__pycache__/filters.cpython-312.pyc,, +rest_framework/__pycache__/generics.cpython-312.pyc,, +rest_framework/__pycache__/metadata.cpython-312.pyc,, +rest_framework/__pycache__/mixins.cpython-312.pyc,, +rest_framework/__pycache__/negotiation.cpython-312.pyc,, +rest_framework/__pycache__/pagination.cpython-312.pyc,, +rest_framework/__pycache__/parsers.cpython-312.pyc,, +rest_framework/__pycache__/permissions.cpython-312.pyc,, +rest_framework/__pycache__/relations.cpython-312.pyc,, +rest_framework/__pycache__/renderers.cpython-312.pyc,, +rest_framework/__pycache__/request.cpython-312.pyc,, +rest_framework/__pycache__/response.cpython-312.pyc,, +rest_framework/__pycache__/reverse.cpython-312.pyc,, +rest_framework/__pycache__/routers.cpython-312.pyc,, +rest_framework/__pycache__/serializers.cpython-312.pyc,, +rest_framework/__pycache__/settings.cpython-312.pyc,, +rest_framework/__pycache__/status.cpython-312.pyc,, +rest_framework/__pycache__/test.cpython-312.pyc,, +rest_framework/__pycache__/throttling.cpython-312.pyc,, +rest_framework/__pycache__/urlpatterns.cpython-312.pyc,, +rest_framework/__pycache__/urls.cpython-312.pyc,, +rest_framework/__pycache__/validators.cpython-312.pyc,, +rest_framework/__pycache__/versioning.cpython-312.pyc,, +rest_framework/__pycache__/views.cpython-312.pyc,, +rest_framework/__pycache__/viewsets.cpython-312.pyc,, +rest_framework/apps.py,sha256=e-soDnr6WzO5YU4VKliGBgP_vneqoR85SiftQ7H7Ge4,255 +rest_framework/authentication.py,sha256=PXz8rBwYqWgwnZMflWO7jPBiUuGyvQ0fE3b89lb431M,7701 +rest_framework/authtoken/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/authtoken/__pycache__/__init__.cpython-312.pyc,, +rest_framework/authtoken/__pycache__/admin.cpython-312.pyc,, +rest_framework/authtoken/__pycache__/apps.cpython-312.pyc,, +rest_framework/authtoken/__pycache__/models.cpython-312.pyc,, +rest_framework/authtoken/__pycache__/serializers.cpython-312.pyc,, +rest_framework/authtoken/__pycache__/views.cpython-312.pyc,, +rest_framework/authtoken/admin.py,sha256=9gS4KYEb5j0Rq9HDWuisyopoUTqtpkqzfXIJMAKA5-I,1892 +rest_framework/authtoken/apps.py,sha256=O5R_48w8g0cThVJ0k2TH3x5t7D1KTdN3zsKwPXZDYSQ,198 +rest_framework/authtoken/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/authtoken/management/__pycache__/__init__.cpython-312.pyc,, +rest_framework/authtoken/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/authtoken/management/commands/__pycache__/__init__.cpython-312.pyc,, +rest_framework/authtoken/management/commands/__pycache__/drf_create_token.cpython-312.pyc,, +rest_framework/authtoken/management/commands/drf_create_token.py,sha256=CcGkuS62daT8YXIMt64mbc0Qu1zA5sInKSI0K1Vsx9U,1380 +rest_framework/authtoken/migrations/0001_initial.py,sha256=8hmactx2pKGeJV95raW4F7klyXNlcNQBvmahvnLj2xU,706 +rest_framework/authtoken/migrations/0002_auto_20160226_1747.py,sha256=f2C8kJ1D4A2uTte1H2UCc2-p_gxPWzT4_96oagJ56nk,994 +rest_framework/authtoken/migrations/0003_tokenproxy.py,sha256=bsFvzO_i8iMRaHvebIZU55HKNr08kg2D6LtduZQDXGw,552 +rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py,sha256=K2H4fArY_5XGFsoCfkBekbl4Q_w3XD2Ww2Zlb-AZfig,379 +rest_framework/authtoken/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/authtoken/migrations/__pycache__/0001_initial.cpython-312.pyc,, +rest_framework/authtoken/migrations/__pycache__/0002_auto_20160226_1747.cpython-312.pyc,, +rest_framework/authtoken/migrations/__pycache__/0003_tokenproxy.cpython-312.pyc,, +rest_framework/authtoken/migrations/__pycache__/0004_alter_tokenproxy_options.cpython-312.pyc,, +rest_framework/authtoken/migrations/__pycache__/__init__.cpython-312.pyc,, +rest_framework/authtoken/models.py,sha256=CJzKy2OLiqzYYqBK8iscBUUNRdnBlQAYRpCHfeQMKDA,1608 +rest_framework/authtoken/serializers.py,sha256=gZFJ3qhW17dOPigqY0_Qx9xVQeRD1V8fy1j07QXKmUc,1384 +rest_framework/authtoken/views.py,sha256=IXX6PNUwguRq7ZGebrG-vguAMFkSOmq4qPJI7CTcyAY,2216 +rest_framework/checks.py,sha256=WO57Y9Ks_MQKq0FsFVXoP7odQMQyVIr-LbPt6fcx2LU,970 +rest_framework/compat.py,sha256=fV42lrvKIQurSPjbRnSAxQIVnCdfjPkr92Tr7APiRrs,4888 +rest_framework/decorators.py,sha256=Wave2lj0AJzdng_IiQBzsaF3Gj7uHJXQHaFVyLksvPs,7784 +rest_framework/documentation.py,sha256=EKZGzMUzXq8H_bri0dRJ89npwT6JwKQOENNPHaYQ5-k,3054 +rest_framework/exceptions.py,sha256=k15a5yZPMk4IT2FbVmIFkeARH15nIENRTX2b5B3LoGI,8159 +rest_framework/fields.py,sha256=GuaxBzk1iTG48Kwj8BMp8x-G_1yHE6m8Bok2obWTnY4,68868 +rest_framework/filters.py,sha256=50TqkJ_6tfOUnEA8AU9TQ7cSd_dPg70PIGhot4wahlw,14802 +rest_framework/generics.py,sha256=po8I479IOJpGEpNyMF7pg9FISwiM-ZBwOG-piE6vraA,10164 +rest_framework/locale/ach/LC_MESSAGES/django.mo,sha256=3LyV_OzlARDfeuhvZp6OCdt6xH4esewLh5fU8a4eXxg,472 +rest_framework/locale/ar/LC_MESSAGES/django.mo,sha256=th7efxoto1P_iFZKFezHyVuQYOyspbvusm-fAnk5j84,12150 +rest_framework/locale/az/LC_MESSAGES/django.mo,sha256=B3IIoIYmYPkM9iOsm0I10Zb__w7rVVZ9HhWMhbvv5bA,10428 +rest_framework/locale/be/LC_MESSAGES/django.mo,sha256=TvqPpcP1PWvOx6RwBM1vO5fUaqXMRddmwRb05TuqTaQ,614 +rest_framework/locale/bg/LC_MESSAGES/django.mo,sha256=j8UXyFO7YdRsZ5OwtI15fUmrN6QnSJonpX_eIo74WCQ,13083 +rest_framework/locale/ca/LC_MESSAGES/django.mo,sha256=5h1KYV14JnFIX02ABU8WeFlqJGKCBKtgbRMcR2lzjpE,9300 +rest_framework/locale/ca_ES/LC_MESSAGES/django.mo,sha256=Toqlh8opAxtm46W5UGvLZW_nsXjkjUoAMQjc5dF-WiQ,487 +rest_framework/locale/cs/LC_MESSAGES/django.mo,sha256=KMLhUh-qAPlAvKWaGZYgFJKCMaLH0N5SdgOY2d0gSig,10519 +rest_framework/locale/da/LC_MESSAGES/django.mo,sha256=_RNWqDszm5SPR6m6LJSkpkLsOlxX6FCm7mV2Ln8JDZw,9955 +rest_framework/locale/de/LC_MESSAGES/django.mo,sha256=8v8nY8HmMIOteF2s24sTFK7lOKTShTxvMWhbm0qMm3A,10490 +rest_framework/locale/el/LC_MESSAGES/django.mo,sha256=RbxSQ08hrFB173iNcfVTvoAU5teTkl9SKsEFLuOK2BI,12933 +rest_framework/locale/el_GR/LC_MESSAGES/django.mo,sha256=_oUBBH7uSAlTcQ3Km2U2kwFRMnpG3Fz0X1CuAQbU_9I,486 +rest_framework/locale/en/LC_MESSAGES/django.mo,sha256=NTQOG7G0S5cILPfjiwr5jGLFS6-BLSkJWz-IZ34WnqU,12285 +rest_framework/locale/en_AU/LC_MESSAGES/django.mo,sha256=6yNdQp3uMV-f63P7xuvX6fzRyb-iG3upwHmz2cJHNlU,491 +rest_framework/locale/en_CA/LC_MESSAGES/django.mo,sha256=JT4wh-kQWfeO4T-be9lwbDaLz0QVu5P0SnK4BDJfOSQ,488 +rest_framework/locale/en_US/LC_MESSAGES/django.mo,sha256=UXCQbz2AxBvh-IQ7bGgjoBnijo8h9DfE9107A-2Mgkk,337 +rest_framework/locale/es/LC_MESSAGES/django.mo,sha256=2NqCq4Rk6k0sZUOk1OO55VWSOgHRnuUuvgcc3wB7MUY,10627 +rest_framework/locale/et/LC_MESSAGES/django.mo,sha256=-ZMrAfUiqMzPnxJD6qNCY3RqRl7m0jY8LjwFz68dxM4,10096 +rest_framework/locale/fa/LC_MESSAGES/django.mo,sha256=a1B7CgBlwt9D_cHqB6VJbj-PUiSvG1QNsij6cPVom_s,11976 +rest_framework/locale/fa_IR/LC_MESSAGES/django.mo,sha256=29zq4NzdtVBc0Q_LaoHROnNYXtwb4kSdrMMKs-yyCyE,11989 +rest_framework/locale/fi/LC_MESSAGES/django.mo,sha256=-TPYxiKlLMCOfjPRM9rvvO5KTuj5XnrJhABw9Db8dSs,10197 +rest_framework/locale/fr/LC_MESSAGES/django.mo,sha256=56a48bfyLGVnGrTiKqGNe6fb4fYDkoJSarLeP3dbmc0,10662 +rest_framework/locale/fr_CA/LC_MESSAGES/django.mo,sha256=AIkTPlyS_J4u1-DtjroxlYZ4_xK8s_dBR8ps593XVTE,486 +rest_framework/locale/gl/LC_MESSAGES/django.mo,sha256=-dhiLFcnF6nZSm2F1jLGOu9JYHAKz468w2hD48Hf7qU,474 +rest_framework/locale/gl_ES/LC_MESSAGES/django.mo,sha256=IQjsBgbgFHZ48iWHMeHzfbnlhReQNoeFq3pCYMSb8gA,628 +rest_framework/locale/he_IL/LC_MESSAGES/django.mo,sha256=JmkZjjtdpkm_51gHbWDa6LnAXK8dHBdxWvkZLVchTPU,487 +rest_framework/locale/hu/LC_MESSAGES/django.mo,sha256=DsEmG9PSPMP_thCE2j_Z4MUIxVb9JY0IPxwxSjit9DI,10844 +rest_framework/locale/hy/LC_MESSAGES/django.mo,sha256=r5Gjh2x7RTGjPt05NzsxzeS6nQxqNClR9J1UYpR1W30,12885 +rest_framework/locale/id/LC_MESSAGES/django.mo,sha256=X8mmBaEYQ0U1PBKpmVzEv07jqdrZAQmWaINMjnFEIGo,5188 +rest_framework/locale/it/LC_MESSAGES/django.mo,sha256=Seuvke2Kb3XZyBgsLndK4kc4ABOHFb1ok2SNWZLBk3o,10480 +rest_framework/locale/ja/LC_MESSAGES/django.mo,sha256=D19OXy2vt0t54yPYCbDe9BGwnrBemcH3zkwXD2YphcA,11759 +rest_framework/locale/ko_KR/LC_MESSAGES/django.mo,sha256=M09dPfSrFqcX8Te7xXGgnhgIk52LhxksiLrooZ3sFvE,11698 +rest_framework/locale/lt/LC_MESSAGES/django.mo,sha256=-6W2uJJ3gYEYkd1H1CF4MfRykn75_HJ2V4vgm0rlu48,5056 +rest_framework/locale/lv/LC_MESSAGES/django.mo,sha256=VcPsDP3hVZt8YMlq1RdgYm_WUIo5QWt4SBTe9KyIn_k,10423 +rest_framework/locale/mk/LC_MESSAGES/django.mo,sha256=HA51S3Es40nX29BcU4Qh1BNbLWLXjpa51p_7c_u-Drk,12121 +rest_framework/locale/nb/LC_MESSAGES/django.mo,sha256=U0jYbFS-Kxj08Thb7fF8oMrab5S2nu1lhlQhsUCpi-A,9928 +rest_framework/locale/ne_NP/LC_MESSAGES/django.mo,sha256=7ohVBTeeKYoPiTFwYA14fSxkqRgx7GBZAgyjDk15OTA,15636 +rest_framework/locale/nl/LC_MESSAGES/django.mo,sha256=ad5I7tegcNW8FOqn9E1O_cqrtHdvlkEoKvHEokjRqQo,10163 +rest_framework/locale/nn/LC_MESSAGES/django.mo,sha256=3oQQnH3UF9nHmTsj3pqv5R2iakv-wdjy0k_EQvbo4ds,483 +rest_framework/locale/no/LC_MESSAGES/django.mo,sha256=ZpgR0-XMg7oQXeS9Q6Pdhk1Y8G6hXnQVx1x3iv8yAA4,475 +rest_framework/locale/pl/LC_MESSAGES/django.mo,sha256=0mc9ltZnrL60-T2yOLavGH8DwRnEN9wu8a8_zB5RkgE,10673 +rest_framework/locale/pt/LC_MESSAGES/django.mo,sha256=j1Y5sfsqtQYVEKWxbrO6AJHw_hfh5adocwYdaVyG9CY,10382 +rest_framework/locale/pt_BR/LC_MESSAGES/django.mo,sha256=mn1IClfteWM9J3Y6uvy5arKR7AdzEwhvqtw1Xvdpuew,10397 +rest_framework/locale/pt_PT/LC_MESSAGES/django.mo,sha256=sCkzHosWkIhNbRljJWvK4x_UlbSK3SNickNyp17cOpM,493 +rest_framework/locale/ro/LC_MESSAGES/django.mo,sha256=CEab6ZJC7xeFrN2v6UKkDWNegXkbGpFBZSWeno0qN0w,10701 +rest_framework/locale/ru/LC_MESSAGES/django.mo,sha256=IxiOtRY_UAVUT6Is4Gh09pGj7kLyqBHaUJh7S3uiRcI,13160 +rest_framework/locale/ru_RU/LC_MESSAGES/django.mo,sha256=AmZPL7_x-1BT9COfEDAitvyhXvkWeYINhXj1htyhq0g,5208 +rest_framework/locale/sk/LC_MESSAGES/django.mo,sha256=hPXX50ijI61arUGVjMhEhz_S-zZqA1WmUNjTEJUgI8I,9164 +rest_framework/locale/sl/LC_MESSAGES/django.mo,sha256=_6IhTyJmeOb73eMhSmeVBVoKztxBQ1ldnwET_N-rT6g,9985 +rest_framework/locale/sv/LC_MESSAGES/django.mo,sha256=OV3cEUiafwnLwesNOlHr3h0fur29GJVMFHAUYUdIHBc,10204 +rest_framework/locale/th/LC_MESSAGES/django.mo,sha256=FHJKADSeYWVdvsQ285jz_865vzUelHIqkxSa4QSLlOw,8880 +rest_framework/locale/tr/LC_MESSAGES/django.mo,sha256=UJEBznyWnRnVKmRn56MwAGc7s0FAcToGXmd-O-k-58g,10073 +rest_framework/locale/tr_TR/LC_MESSAGES/django.mo,sha256=Nm3vmt38r3DxKdl2Astxny_E4IEkJlhDkzYpwiio7NQ,10292 +rest_framework/locale/uk/LC_MESSAGES/django.mo,sha256=fWmrOfNUsagv9jsIfQzP4QYQRKUugCaTBitRfvG-7gg,13245 +rest_framework/locale/vi/LC_MESSAGES/django.mo,sha256=_TekVPiXtQP0HsHrqt0S5fa669Auow5EaDsvoimUzPY,2179 +rest_framework/locale/zh_CN/LC_MESSAGES/django.mo,sha256=K9xrJnn5hyO5dM7sveYajph49Vveoo9kBLxrs9nyXfQ,9915 +rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=GVmnW3r-jCqyllmF87w5sxGPLA3p49BaS0n0ufRqsI8,9938 +rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=fZErAq1tsNswSyVXhMm96AUqQM3IwIZarbdLTWDhu64,4809 +rest_framework/locale/zh_TW/LC_MESSAGES/django.mo,sha256=x_Ba_GQLy-sIMYRRex0kGn9zZKzY5L8y69SSY2HasZU,481 +rest_framework/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/management/__pycache__/__init__.cpython-312.pyc,, +rest_framework/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/management/commands/__pycache__/__init__.cpython-312.pyc,, +rest_framework/management/commands/__pycache__/generateschema.cpython-312.pyc,, +rest_framework/management/commands/generateschema.py,sha256=egmCNu1eXyDxH-zDf466qjlckNVWrsc7mMMV1uZoK0w,2931 +rest_framework/metadata.py,sha256=k_pjpTOBATB3ssJyzUH8aGIdlFhyXRfIOVQVm-rWXbM,5862 +rest_framework/mixins.py,sha256=bqdlz6p0JlhRNIA3cxhjPkY24dPTWMcMsvWUfx-Mews,2937 +rest_framework/negotiation.py,sha256=-bEEaxcsoxyWRvDFdzyZ3jxraytSqjBVL84zPzO5USw,4044 +rest_framework/pagination.py,sha256=vUzEkP7U4o9LCwtIAhuv5AgL1gfPhOjbCuetwdmQNhU,36605 +rest_framework/parsers.py,sha256=8hdbNIAhhlLQ79J7yKdQFAlNR39imjZg-xP1G92R0-o,7717 +rest_framework/permissions.py,sha256=XQcS4PSVplTaaQ6WrulLFkB2xupfKTMUKynAp6T5j64,9596 +rest_framework/relations.py,sha256=e7PvSgUV4mQXKeO-SBN_e_8EeZwlkIG_scONHWBw7qk,21238 +rest_framework/renderers.py,sha256=UlOe6OD57XG41HKW78nePstvWpbrVXVZa8flrZkyBU8,40783 +rest_framework/request.py,sha256=lnoE2ziMfGIuCo1v4pGRKx2SLi6CryaKSrF3FR7zNJk,15431 +rest_framework/response.py,sha256=vvBY5ZtuIq22UbofEYdPN59ZAzeQXJ4DNGGOdAX3aL8,3553 +rest_framework/reverse.py,sha256=veLMPqo0v81NP0X7J_I6rCqtirJmCnJ4-Mm3-lOgBbY,2144 +rest_framework/routers.py,sha256=Pi5ptYXEoYdcAb5qKVu5BkZc5wqjTzSk7EmCDalF_ow,13923 +rest_framework/schemas/__init__.py,sha256=1CkgqzGW08pYGEPFqrUO4qjbUohDfcDf2boFe7-TVSw,1781 +rest_framework/schemas/__pycache__/__init__.cpython-312.pyc,, +rest_framework/schemas/__pycache__/coreapi.cpython-312.pyc,, +rest_framework/schemas/__pycache__/generators.cpython-312.pyc,, +rest_framework/schemas/__pycache__/inspectors.cpython-312.pyc,, +rest_framework/schemas/__pycache__/openapi.cpython-312.pyc,, +rest_framework/schemas/__pycache__/utils.cpython-312.pyc,, +rest_framework/schemas/__pycache__/views.cpython-312.pyc,, +rest_framework/schemas/coreapi.py,sha256=s3X-iML4NQQqWA08iguGug1gy1s8hVBvwGQNQUAmcfI,21411 +rest_framework/schemas/generators.py,sha256=GnVsXygC2Sl0b6x2z8_AZ5Y46mq-WCQWg4zESkAM0Mw,7995 +rest_framework/schemas/inspectors.py,sha256=v5FTcvRl6wWd7dMW4T_5ANS_yWKmlnEf5iN0aEYFPRQ,4177 +rest_framework/schemas/openapi.py,sha256=VUr1Ak-8D1Ynd6YHzsrFb-BlnpOw9XhB7O6By1Vo0qo,27234 +rest_framework/schemas/utils.py,sha256=iGGJfS7S-MwTvr2gPystxrEO3TaRb-x0fpyUjDWkkW8,1195 +rest_framework/schemas/views.py,sha256=epv16dSdBIUpmqOMKGvS61wtSCJhlzT1JZH84w4QNHw,1836 +rest_framework/serializers.py,sha256=-XCWkp42y7TugT84benxOTaHWBVj_6KsEEJxHBGYlqg,67224 +rest_framework/settings.py,sha256=8rW8H94l3m7c3cnVYI83v8jDNOCpa_fm8gsBZ3LbeG4,7950 +rest_framework/static/rest_framework/css/bootstrap-theme.min.css,sha256=8uHMIn1ru0GS5KO-zf7Zccf8Uw12IA5DrdEcmMuWLFM,23411 +rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map,sha256=Xrq8Sds3hoHPZBKqAL07ehEaCfKBUjH0tW4pb6xIYTA,75600 +rest_framework/static/rest_framework/css/bootstrap-tweaks.css,sha256=RjLCy2jm2n3gQbSdNFjWncQ4lVB9Qm2-5Bc-xw7O8us,3426 +rest_framework/static/rest_framework/css/bootstrap.min.css,sha256=bZLfwXAP04zRMK2BjiO8iu9pf4FbLqX6zitd-tIvLhE,121457 +rest_framework/static/rest_framework/css/bootstrap.min.css.map,sha256=eLWMnr_ULsLGG8T99Gpd-ZjmzZB8dzB2oKbo9Whrr8M,540434 +rest_framework/static/rest_framework/css/default.css,sha256=EWV35tstD5m0GezGG0U5Fa8O_4IGsL8_noeJdxnBs3s,1152 +rest_framework/static/rest_framework/css/font-awesome-4.0.3.css,sha256=MIPo07Id3D8ObWXsNYCqbt-q3KXZc32cqifmojPhzPM,21658 +rest_framework/static/rest_framework/css/prettify.css,sha256=-ZMq8eZ6blEFtxcVudM1hzv4gFwBwqlgPjHpbMSpWBk,817 +rest_framework/static/rest_framework/docs/css/base.css,sha256=fZ9Os4iAF3DBq3Aww8qbbRypx6fkGV_-PjxQ8YqssM4,6156 +rest_framework/static/rest_framework/docs/css/highlight.css,sha256=h-4d4bDFtOId4PkL4xBXl-XtRfav47B8cPUBoYWlc3M,1682 +rest_framework/static/rest_framework/docs/css/jquery.json-view.min.css,sha256=w4_hEoz19Kk_fC7uLct1FzPE3gEIvNulKydv75PFyew,1307 +rest_framework/static/rest_framework/docs/img/favicon.ico,sha256=Ww2bNjGXyE2y9FeO6sW7YksqF2CQ89pdTrksiFbP4n4,5430 +rest_framework/static/rest_framework/docs/img/grid.png,sha256=bipYUDSUpwgQWsZG069cCMjIkDJbt4GiV9EPkf-Wipw,1458 +rest_framework/static/rest_framework/docs/js/api.js,sha256=SZIptx1KE3KDkMbfZmc4OSg5JSNkTLsQalPdb-NwkUY,10391 +rest_framework/static/rest_framework/docs/js/highlight.pack.js,sha256=TpVs16YPyRxjTs122mIsboTVOpoTUb1AmzlBnOHjU4A,300764 +rest_framework/static/rest_framework/docs/js/jquery.json-view.min.js,sha256=xUY7pJMePDtQPh8KrWWP8GcwFpNVJn5AhLbXraVWvZY,2700 +rest_framework/static/rest_framework/fonts/fontawesome-webfont.eot,sha256=OeI3wHQD5i8AvW3fC1nTNJx704aSUKqtw4lBnbaqQO8,38205 +rest_framework/static/rest_framework/fonts/fontawesome-webfont.svg,sha256=m_HPYZuOy2MUAJCBqEjDemn70HtKKnzeM59jQrjrom4,202148 +rest_framework/static/rest_framework/fonts/fontawesome-webfont.ttf,sha256=a0k0itU4htCc5MMvoUbomcgg3j-FqN03BKBiTrO_f6E,80652 +rest_framework/static/rest_framework/fonts/fontawesome-webfont.woff,sha256=D9KP7Onr1ga4sHFGDr0_wu17x6Zu-RyINPEd-sq0qEk,44432 +rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.eot,sha256=E2NNqH2eI_jD7ZEIzhck0YOjmtBy5z4bPYy_ZG0tBAc,20127 +rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.svg,sha256=BogzMSnL5KzIuuo7NfgBUocHjzA1ufVnaDid2c-KDZE,108738 +rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.ttf,sha256=45UEQJN1fYKvyxOJV9BqHqk2G9zwtELQahioBRr1dFY,45404 +rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff,sha256=omOU9-3hAMoRjv8u2ghZYnWpg5uVnCJuFUOVV6WoB0I,23424 +rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff2,sha256=_hhdEaSWdokNR7t4MxKgzaWkTEA5IUCU55V7TAQO8Rw,18028 +rest_framework/static/rest_framework/img/glyphicons-halflings-white.png,sha256=8ODZWpyKvN-r9GNI4tQoWCm7BJH19q8OBa9Sv_tjJMQ,8777 +rest_framework/static/rest_framework/img/glyphicons-halflings.png,sha256=G9UbUyeER8HbM_AMR3PnEdsh5Vfs3SbZua6Wypk_BeI,12762 +rest_framework/static/rest_framework/img/grid.png,sha256=bipYUDSUpwgQWsZG069cCMjIkDJbt4GiV9EPkf-Wipw,1458 +rest_framework/static/rest_framework/js/ajax-form.js,sha256=IMzB6t8H1OghYxwefb2jbzA2M7n-9htuejv9huuX8eA,3796 +rest_framework/static/rest_framework/js/bootstrap.min.js,sha256=nuL8_2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL-1ev4,39680 +rest_framework/static/rest_framework/js/coreapi-0.1.1.js,sha256=_gzyPn-2cx0Wgfjvj_tlUhPf4laKnzYbgkcr_uNGW6E,157600 +rest_framework/static/rest_framework/js/csrf.js,sha256=MZTSvRZZ1JEfNzyjA5oi1hN4zQe7IvFMW6xjP6eHRU4,1793 +rest_framework/static/rest_framework/js/default.js,sha256=mJOP3JMDyQnRSX60X_T4WgtYzOBNDYpqc1ZhOUC85iM,1268 +rest_framework/static/rest_framework/js/jquery-3.7.1.min.js,sha256=_JqT3SQfawRcv_BIHPThkBvs0OEvtFFmqPF_lYI_Cxo,87533 +rest_framework/static/rest_framework/js/load-ajax-form.js,sha256=1FfQ5Vw7jJqE_4U93loswPA6vWtsyyf_Sjhvx38l-nc,59 +rest_framework/static/rest_framework/js/prettify-min.js,sha256=4uV247xgfNF5_1EZRwEPZF00QaNTE67A29BsRDf4O3c,13632 +rest_framework/status.py,sha256=gJjvtWPVEe2A4SWIQ9olI6_MThRJgSJ1KDSb_ItRiOw,2547 +rest_framework/templates/rest_framework/admin.html,sha256=7uJFyGvem690pUv01t2LRe1AJWkEH2y0vWQSlG4XLbE,10902 +rest_framework/templates/rest_framework/admin/detail.html,sha256=_ONyhbRK32d7IsUxmUVKQCWjxzZqwT-zK2u1CgB4lvk,306 +rest_framework/templates/rest_framework/admin/dict_value.html,sha256=KidLEu38kqvPGElnFDjiQMh72xsjT5Sq3L4gchrqMps,242 +rest_framework/templates/rest_framework/admin/list.html,sha256=sFoqx8GeL2gFZ0Yx35dq6DVXEgQIIAFYlA8h-65FEQM,819 +rest_framework/templates/rest_framework/admin/list_value.html,sha256=Z9VmS1f3mwk5LypgA8HAvogVPbDa09hABa389AYxQCo,241 +rest_framework/templates/rest_framework/admin/simple_list_value.html,sha256=d9cVgqyigNa0K0W7CYPNGcvRAqy5M-ZJAzkgA-Al70Q,121 +rest_framework/templates/rest_framework/api.html,sha256=6GkppzK1R50yjAVZJoqFnR_FdGlZBpfftD2m2WNPTVM,116 +rest_framework/templates/rest_framework/base.html,sha256=jtrF-PM4RlL8H2gbwHT3qAK0X6B8PKHGYLIq6E_sFCw,13928 +rest_framework/templates/rest_framework/docs/auth/basic.html,sha256=GsLRwieUOwxvQRSI4nRz2PYVq72e7NLEXiprmoTbzsI,1250 +rest_framework/templates/rest_framework/docs/auth/session.html,sha256=jhtMeLg6Lq5yPb2noOabUj61UAOQe--NQGEYYwWZY_E,1154 +rest_framework/templates/rest_framework/docs/auth/token.html,sha256=0KcVSQ8w2ZvOO8A2oNlTwqmYyJ2O-12eWZL-NCBm1Rc,1618 +rest_framework/templates/rest_framework/docs/document.html,sha256=r7bWwBnt2NGaP3XbABVg-yxCiRkQuB3_-nh1cK1Wr5M,906 +rest_framework/templates/rest_framework/docs/error.html,sha256=0e_MHIsjYRYUf41VshHcSkDBm-KHev2AjuoUvRb2IRM,1850 +rest_framework/templates/rest_framework/docs/index.html,sha256=K9bMTwOaWuFV5FtiC3ypuYkJH1guN9srNIgSJNhvQe8,2519 +rest_framework/templates/rest_framework/docs/interact.html,sha256=_8yaSo9DUW8eRVH-KEH5zJJ8MBIlI5QM_ajWPb4yrI8,1831 +rest_framework/templates/rest_framework/docs/langs/javascript-intro.html,sha256=TOLjcCnyA0MYI5w99Jtg2mN7w1wjXz0lfSM8b0wabZ4,330 +rest_framework/templates/rest_framework/docs/langs/javascript.html,sha256=vy1N2rMRSTKZjEo5mZ_rIp2g57TSa9PuuHXzeghpksk,714 +rest_framework/templates/rest_framework/docs/langs/python-intro.html,sha256=LBpDVN9qkOO5Itej4M6gl4WynB4Q2CpJ_ZEti1fAY8I,189 +rest_framework/templates/rest_framework/docs/langs/python.html,sha256=y24kdg1AdRDAWl2nu6UksrXMjbMTQcdTXuRpTOXSIJo,676 +rest_framework/templates/rest_framework/docs/langs/shell-intro.html,sha256=TQo-Y2ksj2T9kzsmENH7MEB1Mt940wW941AGGbIRjVE,189 +rest_framework/templates/rest_framework/docs/langs/shell.html,sha256=jcRLGn3Eu0Xc-lr7lGFUj-1z0e9wdMwfbFIi3Cs8mV4,441 +rest_framework/templates/rest_framework/docs/link.html,sha256=ITaS3W3sqL7gOHwVvtMi2fcuETv1eVhQedlkOsT7pTg,4624 +rest_framework/templates/rest_framework/docs/sidebar.html,sha256=S_D8Tbxo08fbmVT9FmEc8No1ESS1JMJID4q5SZRz5ZY,2581 +rest_framework/templates/rest_framework/filters/base.html,sha256=OjBIbd29onA2R-iUmkwrlXw0N5CJIsU1FOpsEJ-ZJRg,610 +rest_framework/templates/rest_framework/filters/ordering.html,sha256=wiAOyvmjypM4DJGMMWbdD4Il26Z8P7J_HcIurjv3xhA,556 +rest_framework/templates/rest_framework/filters/search.html,sha256=rO3_-Z2QVIom9WVErxMprYn-sJEe1inXHH4oAG-juWk,467 +rest_framework/templates/rest_framework/horizontal/checkbox.html,sha256=t8EJW3CIcuDb2NSa7VElCzj49b0S1RcZcS7mdkOEXMw,658 +rest_framework/templates/rest_framework/horizontal/checkbox_multiple.html,sha256=iUVqbdxQ37iejUtfT0x6UeF8RcA4t71B61dhiQsqFgk,1184 +rest_framework/templates/rest_framework/horizontal/dict_field.html,sha256=VgZ3iSqrPK02VU3gDoDuK0szJbu_PGex1HnYIpYx6ao,324 +rest_framework/templates/rest_framework/horizontal/fieldset.html,sha256=bXy7Q_zBGMpE8a7K-2SxJfVDMsHZ24xniLoCw8Xmzyg,480 +rest_framework/templates/rest_framework/horizontal/form.html,sha256=yo9PS2__lzBuYSue812MwGmi3HT6kIAzHvAQBaqJAGY,149 +rest_framework/templates/rest_framework/horizontal/input.html,sha256=pOLeWdni3DNqZCN1Dbvj5xA0D-jdM0QEok_1XpIHfBE,889 +rest_framework/templates/rest_framework/horizontal/list_field.html,sha256=_BlSeMbpE8vpnyqHp6jmou2f441hrtYBvbdBjYxJeew,317 +rest_framework/templates/rest_framework/horizontal/list_fieldset.html,sha256=5W-9tZ-GvTHR4JlHwVdDJo-1FlH6-cmUu33x2RKsnkM,384 +rest_framework/templates/rest_framework/horizontal/radio.html,sha256=xpgDdvdW3FojnB3x-OqWzIiSsdcw9sd1z-g8vYz7ofg,1796 +rest_framework/templates/rest_framework/horizontal/select.html,sha256=_Eow62zUMM9VWJ03P1HlfTNB4vyv9GfqB9WjYRhfTBY,1222 +rest_framework/templates/rest_framework/horizontal/select_multiple.html,sha256=wdiLntt2k0iMJ4LlmBCRucDDC0VzqI_5K-feK9ncwtE,1191 +rest_framework/templates/rest_framework/horizontal/textarea.html,sha256=8myshnZKHjohQtuVVPN2gmcYN0RTMNGkSh95CEIobx4,782 +rest_framework/templates/rest_framework/inline/checkbox.html,sha256=zpUnpKg-oMZ843vtmW7ec8lzxQttwGpFE7F2vmHxZFw,294 +rest_framework/templates/rest_framework/inline/checkbox_multiple.html,sha256=vGndr0cjo-Q-sj6rn0JdH9LTn2BO27xvcKBY7YBbJ3c,487 +rest_framework/templates/rest_framework/inline/dict_field.html,sha256=4EWRFxidLMSc_2kbaP3VcXSaQFVAjfmPi00gb3pHiKg,228 +rest_framework/templates/rest_framework/inline/fieldset.html,sha256=acBYZDeivx33bLNIYNKlXG_11YDBtIVUihbFeHGmy8M,171 +rest_framework/templates/rest_framework/inline/form.html,sha256=yo9PS2__lzBuYSue812MwGmi3HT6kIAzHvAQBaqJAGY,149 +rest_framework/templates/rest_framework/inline/input.html,sha256=mMWTdifDKSnma20ga7gYoHGuGbHAJuxinBQIrBqjs1A,530 +rest_framework/templates/rest_framework/inline/list_field.html,sha256=bafZBHQw3YqlJYGVaxFJgtj_pon9BiuEuCU7WU6a-LM,221 +rest_framework/templates/rest_framework/inline/list_fieldset.html,sha256=gPL69kBW9RBq_qIRvFrc26a0bvFqrCaWkOnarN5uJsw,62 +rest_framework/templates/rest_framework/inline/radio.html,sha256=nqjfBZcfpFjZ-ELyaLkio-wlw5fkPAG1OAlEbAsxk2Q,793 +rest_framework/templates/rest_framework/inline/select.html,sha256=rIDuGfGFZuc-5CUVMIRne4x0vBbAg-z_MWz139hVJvw,879 +rest_framework/templates/rest_framework/inline/select_multiple.html,sha256=3zoyMlBWFNDVT7yI-zgN3lMVPGmWOBRKB6-Qyzlu174,917 +rest_framework/templates/rest_framework/inline/textarea.html,sha256=0ZpewR8LDx9xLoMgs59r12AQsZVnbolNf4P7EsnIrEc,376 +rest_framework/templates/rest_framework/login.html,sha256=mZOh88AfLsiRWGPjJlvvOkvuvmMQwxTyjGZrzcXkxlQ,122 +rest_framework/templates/rest_framework/login_base.html,sha256=ZsWKtNWD0Em0cxHn-bjkeEFTecTOzsL4Qu_pgAO48L0,2857 +rest_framework/templates/rest_framework/pagination/numbers.html,sha256=vN1hd0tP3HU7yiKInSYkC1qTn6yu_bQ3On1cVPlcHwE,1154 +rest_framework/templates/rest_framework/pagination/previous_and_next.html,sha256=tvVdDzQeAX_mqre0ei8PO-bviFlTmEWVEGpfPQ9tmuc,456 +rest_framework/templates/rest_framework/raw_data_form.html,sha256=-96O3lHTPA0zP3zq19xofYvzT8oPbmghHY5DvP-laIM,335 +rest_framework/templates/rest_framework/schema.js,sha256=UFL1wg4ArGD2gAyDfqVNCTm1V9_5dxv7kYGyR5oBaGc,136 +rest_framework/templates/rest_framework/vertical/checkbox.html,sha256=5ZMJNFq6ERwAI06iGHL5m3XmMIgTmJG7vaw6WczjTfg,543 +rest_framework/templates/rest_framework/vertical/checkbox_multiple.html,sha256=MzJT5dw-vV2zNaJYgmL6W9lTlDx_CDGV-vA8AEEW6Fs,1157 +rest_framework/templates/rest_framework/vertical/dict_field.html,sha256=Pqk22yWIWaXUJYhqYCHmGwOCiKbhvUPjl-IWsC8uSbs,252 +rest_framework/templates/rest_framework/vertical/fieldset.html,sha256=TQsf1yWktrPAiPZCavwjyX3p5p9IjFk1bQOAXynS73E,346 +rest_framework/templates/rest_framework/vertical/form.html,sha256=yo9PS2__lzBuYSue812MwGmi3HT6kIAzHvAQBaqJAGY,149 +rest_framework/templates/rest_framework/vertical/input.html,sha256=lLcDs6xixer6eQZqjI5x-5pThUDNcil9lWNYTmNOIkk,801 +rest_framework/templates/rest_framework/vertical/list_field.html,sha256=JySAf36X8WXjDtNObb1kpYb6_lJXsLqB6Z99-c2_MnE,245 +rest_framework/templates/rest_framework/vertical/list_fieldset.html,sha256=TvSzps4U1WQTvbxWRrubRvjfiD8KdUym4wthTRxsumg,222 +rest_framework/templates/rest_framework/vertical/radio.html,sha256=xOYpOkf0SkCnNOwLSXZ9nJkjIc-KY3XnRU1_JJwcd8g,1809 +rest_framework/templates/rest_framework/vertical/select.html,sha256=qZcO0qN2XZIcGw1Rrsdkm8dfVqWw4nKMVaUettX-W3k,1162 +rest_framework/templates/rest_framework/vertical/select_multiple.html,sha256=97Rtt11FQHTX0yk-ksj3dchMXO7BBC2U4_6WZqqpegI,1184 +rest_framework/templates/rest_framework/vertical/textarea.html,sha256=xaGbiWJDGIWHgWLSCBpZXjf8FVDBo0LvCqHlSs-h5EY,694 +rest_framework/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/templatetags/__pycache__/__init__.cpython-312.pyc,, +rest_framework/templatetags/__pycache__/rest_framework.cpython-312.pyc,, +rest_framework/templatetags/rest_framework.py,sha256=CCT7_DRUgQRrYtCd8ZoDVNWDD7PKFDlURIw_aGHM2-U,10129 +rest_framework/test.py,sha256=6AH1mUIXq-84lotS4_SvZqRoFyM2ji6L4YP21qQUivM,14688 +rest_framework/throttling.py,sha256=WGKkN9i2u2O0EcSQMQKSpaufZOMZIjEsuaR4srg7cK0,8067 +rest_framework/urlpatterns.py,sha256=j2SytOi_09uhyvZsVQLhkvnlc8slxE2_4jWUxf0pRb8,4235 +rest_framework/urls.py,sha256=JiEpSQau4E-m8xjNj-4mdcP3oGdf5MnsvFdnTFk7y0Y,615 +rest_framework/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rest_framework/utils/__pycache__/__init__.cpython-312.pyc,, +rest_framework/utils/__pycache__/breadcrumbs.cpython-312.pyc,, +rest_framework/utils/__pycache__/encoders.cpython-312.pyc,, +rest_framework/utils/__pycache__/field_mapping.cpython-312.pyc,, +rest_framework/utils/__pycache__/formatting.cpython-312.pyc,, +rest_framework/utils/__pycache__/html.cpython-312.pyc,, +rest_framework/utils/__pycache__/humanize_datetime.cpython-312.pyc,, +rest_framework/utils/__pycache__/json.cpython-312.pyc,, +rest_framework/utils/__pycache__/mediatypes.cpython-312.pyc,, +rest_framework/utils/__pycache__/model_meta.cpython-312.pyc,, +rest_framework/utils/__pycache__/representation.cpython-312.pyc,, +rest_framework/utils/__pycache__/serializer_helpers.cpython-312.pyc,, +rest_framework/utils/__pycache__/timezone.cpython-312.pyc,, +rest_framework/utils/__pycache__/urls.cpython-312.pyc,, +rest_framework/utils/breadcrumbs.py,sha256=IwjiRRwqTjXkdFR4sIt76EV9ucvzQA-ORiF1yI1Tj2I,2039 +rest_framework/utils/encoders.py,sha256=8Pd-4Qo92fxQE1DYYuoDrcSwUzsJYlWWtR5KAZ1JH0w,2825 +rest_framework/utils/field_mapping.py,sha256=nz_8WRtz5Zu-IZeecIiglf4z2bfta7wZAN2Kh1TDXUI,12131 +rest_framework/utils/formatting.py,sha256=z292GYwr3WpcgRECnlouhQZgQk-m7LhsoQXRz1O0p-M,3015 +rest_framework/utils/html.py,sha256=2Bas2KS7dst6mdGUVSROPi9RUyD38Z1SPza_0WbV8Ts,2294 +rest_framework/utils/humanize_datetime.py,sha256=CeC4QWwfFKdn2RXHGYRaqVcOwp0J80J_AJsnx2ClVJ0,1281 +rest_framework/utils/json.py,sha256=1qVOOt_DuaQqO4ePub-jT29lZG-9sNmGLDEqW42BAZ0,1027 +rest_framework/utils/mediatypes.py,sha256=AYiGTnA9SReUZY18AxoQJNW0EyT06HFtlO9QI7-tIps,2490 +rest_framework/utils/model_meta.py,sha256=t8VF2kHoNUM8yDs_ts1lc7VYnB3tI9gw0CMO5YENqeM,5068 +rest_framework/utils/representation.py,sha256=93GsXt1zVMAO9mvfpafzstySmN9nbXimNCsaY1qw4M8,2970 +rest_framework/utils/serializer_helpers.py,sha256=5NccvsAlbpEOwGcn2Y6QW1BHQjpdrv5zf4D2EL8xpac,5867 +rest_framework/utils/timezone.py,sha256=TT_ORE5v84dJfCCnRubo6_Eeq8ZDGtj5OcgaFLhu310,1086 +rest_framework/utils/urls.py,sha256=5hagmITUV4AvYmhFRHccOvXx3Yn-OL6yEA1eYT4_bk8,1052 +rest_framework/validators.py,sha256=kZmjMpZJQO-HdXC3EKGPaFP60JgqYsvQ9jBAquJG0YI,12142 +rest_framework/versioning.py,sha256=ndWtifG_xnJS5Gx3q6Fc5oNpDLvG9-QU7XwxAw6gXUA,6801 +rest_framework/views.py,sha256=tZJiIEjWdc7AfS77pPp_pw1GU4g88-hLzlma6wooCOg,18799 +rest_framework/viewsets.py,sha256=a9QC4IHncv_qeARxRUlfS-utNwKUNdvUc-4DbFEwCkU,9002 +tutorial/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tutorial/__pycache__/__init__.cpython-312.pyc,, +tutorial/__pycache__/asgi.cpython-312.pyc,, +tutorial/__pycache__/settings.cpython-312.pyc,, +tutorial/__pycache__/urls.cpython-312.pyc,, +tutorial/__pycache__/wsgi.cpython-312.pyc,, +tutorial/asgi.py,sha256=wPe1pIushe19pfyEmos3q2MZI_qDIaJ2_go-2kn04Vs,393 +tutorial/quickstart/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tutorial/quickstart/__pycache__/__init__.cpython-312.pyc,, +tutorial/quickstart/__pycache__/admin.cpython-312.pyc,, +tutorial/quickstart/__pycache__/apps.cpython-312.pyc,, +tutorial/quickstart/__pycache__/models.cpython-312.pyc,, +tutorial/quickstart/__pycache__/serializers.cpython-312.pyc,, +tutorial/quickstart/__pycache__/tests.cpython-312.pyc,, +tutorial/quickstart/__pycache__/views.cpython-312.pyc,, +tutorial/quickstart/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63 +tutorial/quickstart/apps.py,sha256=b54WqlLADVqijHr8k6MJ-mAA0stUIsq7q470uVUc-qY,152 +tutorial/quickstart/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tutorial/quickstart/migrations/__pycache__/__init__.cpython-312.pyc,, +tutorial/quickstart/models.py,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57 +tutorial/quickstart/serializers.py,sha256=UrCRUpwyJDxqWxcMnEK9RVJtsIEfM-sIq6zt4SKJkfc,382 +tutorial/quickstart/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60 +tutorial/quickstart/views.py,sha256=DyUmtQhfnCtvrCoi8flATV44t8j3pvULcnP7WsDb-7w,1024 +tutorial/settings.py,sha256=oiPUmisOzUdhS3ums781tfxn7umGvyH-xdankcgxBIc,3249 +tutorial/urls.py,sha256=bXbAWRPdR-qDXnE4QNjTgdg06ca0cQptR4X_HyRu74w,486 +tutorial/wsgi.py,sha256=9OiZSXXml34hEdwsk_Vnd7qdjGXIua9DxiGTPauFXQ0,393 diff --git a/env/lib/python3.12/site-packages/Django-5.1.1.dist-info/REQUESTED b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/REQUESTED similarity index 100% rename from env/lib/python3.12/site-packages/Django-5.1.1.dist-info/REQUESTED rename to env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/REQUESTED diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/WHEEL similarity index 65% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL rename to env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/WHEEL index bab98d67..becc9a66 100644 --- a/env/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL +++ b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.43.0) +Generator: bdist_wheel (0.37.1) Root-Is-Purelib: true Tag: py3-none-any diff --git a/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/top_level.txt b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/top_level.txt new file mode 100644 index 00000000..5df77727 --- /dev/null +++ b/env/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/top_level.txt @@ -0,0 +1,2 @@ +rest_framework +tutorial diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt b/env/lib/python3.12/site-packages/pip-24.2.dist-info/AUTHORS.txt similarity index 95% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt rename to env/lib/python3.12/site-packages/pip-24.2.dist-info/AUTHORS.txt index 0e635489..dda2ac30 100644 --- a/env/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt +++ b/env/lib/python3.12/site-packages/pip-24.2.dist-info/AUTHORS.txt @@ -9,7 +9,9 @@ Adam Chainz Adam Tse Adam Wentz admin +Adolfo Ochagavía Adrien Morison +Agus ahayrapetyan Ahilya AinsworthK @@ -63,8 +65,11 @@ Anudit Nagar Anuj Godase AQNOUCH Mohammed AraHaan +arena +arenasys Arindam Choudhury Armin Ronacher +Arnon Yaari Artem Arun Babu Neelicattu Ashley Manton @@ -100,8 +105,10 @@ Bogdan Opanchuk BorisZZZ Brad Erickson Bradley Ayers +Branch Vincent Brandon L. Reiss Brandt Bucher +Brannon Dorsey Brett Randall Brett Rosen Brian Cristante @@ -125,11 +132,13 @@ Carol Willing Carter Thayer Cass Chandrasekhar Atina +Charlie Marsh Chih-Hsuan Yen Chris Brinker Chris Hunt Chris Jerdonek Chris Kuehl +Chris Markiewicz Chris McDonough Chris Pawley Chris Pryer @@ -140,6 +149,7 @@ Christian Oudard Christoph Reiter Christopher Hunt Christopher Snyder +chrysle cjc7373 Clark Boylan Claudio Jolowicz @@ -157,6 +167,7 @@ Craig Kerstiens Cristian Sorinel Cristina Cristina Muñoz +ctg123 Curtis Doty cytolentino Daan De Meyer @@ -194,6 +205,7 @@ David Evans David Hewitt David Linke David Poggi +David Poznik David Pursehouse David Runge David Tucker @@ -207,6 +219,7 @@ dependabot[bot] derwolfe Desetude Devesh Kumar Singh +devsagul Diego Caraballo Diego Ramirez DiegoCaraballo @@ -224,6 +237,7 @@ Dos Moonen Douglas Thor DrFeathers Dustin Ingram +Dustin Rodrigues Dwayne Bailey Ed Morley Edgar Ramírez @@ -265,6 +279,7 @@ Florian Briand Florian Rathgeber Francesco Francesco Montesano +Fredrik Orderud Frost Ming Gabriel Curio Gabriel de Perthuis @@ -315,6 +330,7 @@ Ian Stapleton Cordasco Ian Wienand Igor Kuzmitshov Igor Sobreira +Ikko Ashimine Ilan Schnell Illia Volochii Ilya Baryshev @@ -353,17 +369,20 @@ Jeff Dairiki Jeff Widman Jelmer Vernooij jenix21 +Jeremy Fleischman Jeremy Stanley Jeremy Zafran Jesse Rittner Jiashuo Li Jim Fisher Jim Garrison +Jinzhe Zeng Jiun Bae Jivan Amara Joe Bylund Joe Michelini John Paton +John Sirois John T. Wodder II John-Scott Atlakson johnthagen @@ -378,6 +397,7 @@ Jorge Niedbalski Joseph Bylund Joseph Long Josh Bronson +Josh Cannon Josh Hansen Josh Schneier Joshua @@ -408,9 +428,11 @@ Kexuan Sun Kit Randel Klaas van Schelven KOLANICH +konstin kpinc Krishna Oza Kumar McMillan +Kuntal Majumder Kurt McKee Kyle Persohn lakshmanaram @@ -428,6 +450,7 @@ lorddavidiii Loren Carvalho Lucas Cimon Ludovic Gasc +Luis Medel Lukas Geiger Lukas Juhrich Luke Macken @@ -441,11 +464,12 @@ Marc Tamlyn Marcus Smith Mariatta Mark Kohler +Mark McLoughlin Mark Williams Markus Hametner Martey Dodoo Martin Fischer -Martin Häcker +Martin Häcker Martin Pavlasek Masaki Masklinn @@ -457,10 +481,12 @@ Matt Bacchi Matt Good Matt Maker Matt Robenolt +Matt Wozniski matthew Matthew Einhorn Matthew Feickert Matthew Gilliard +Matthew Hughes Matthew Iversen Matthew Treinish Matthew Trumbell @@ -495,7 +521,9 @@ Miro Hrončok Monica Baluna montefra Monty Taylor -Muha Ajjan‮ +morotti +mrKazzila +Muha Ajjan Nadav Wexler Nahuel Ambrosini Nate Coraor @@ -559,7 +587,9 @@ Paweł Szramowski Pekka Klärck Peter Gessler Peter Lisák +Peter Shen Peter Waller +Petr Viktorin petr-tik Phaneendra Chiruvella Phil Elson @@ -592,6 +622,7 @@ Quentin Pradet R. David Murray Rafael Caricio Ralf Schmitt +Ran Benita Razzi Abuissa rdb Reece Dunham @@ -603,6 +634,7 @@ Richard Jones Richard Si Ricky Ng-Adam Rishi +rmorotti RobberPhex Robert Collins Robert McGibbon @@ -624,6 +656,7 @@ Russell Keith-Magee Ryan Shepherd Ryan Wooden ryneeverett +S. Guliaev Sachi King Salvatore Rinchiera sandeepkiran-js @@ -642,8 +675,10 @@ Seth Michael Larson Seth Woodworth Shahar Epstein Shantanu +shenxianpeng shireenrao Shivansh-007 +Shixian Sheng Shlomi Fish Shovan Maity Simeon Visser @@ -675,6 +710,7 @@ Stéphane Klein Sumana Harihareswara Surbhi Sharma Sviatoslav Sydorenko +Sviatoslav Sydorenko (Святослав Сидоренко) Swat009 Sylvain Takayuki SHIMIZUKAWA @@ -741,6 +777,7 @@ Wolfgang Maier Wu Zhenyu XAMES3 Xavier Fernandez +Xianpeng Shen xoviat xtreak YAMAMOTO Takashi @@ -757,4 +794,3 @@ Zvezdan Petkovic Łukasz Langa Роман Донченко Семён Марьясин -‮rekcäH nitraM‮ diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt b/env/lib/python3.12/site-packages/pip-24.2.dist-info/INSTALLER similarity index 100% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt rename to env/lib/python3.12/site-packages/pip-24.2.dist-info/INSTALLER diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt b/env/lib/python3.12/site-packages/pip-24.2.dist-info/LICENSE.txt similarity index 100% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt rename to env/lib/python3.12/site-packages/pip-24.2.dist-info/LICENSE.txt diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA b/env/lib/python3.12/site-packages/pip-24.2.dist-info/METADATA similarity index 91% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA rename to env/lib/python3.12/site-packages/pip-24.2.dist-info/METADATA index e5b45bdd..6141107f 100644 --- a/env/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA +++ b/env/lib/python3.12/site-packages/pip-24.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pip -Version: 24.0 +Version: 24.2 Summary: The PyPA recommended tool for installing Python packages. Author-email: The pip developers License: MIT @@ -15,7 +15,6 @@ Classifier: Topic :: Software Development :: Build Tools Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 @@ -23,7 +22,7 @@ Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=3.7 +Requires-Python: >=3.8 Description-Content-Type: text/x-rst License-File: LICENSE.txt License-File: AUTHORS.txt @@ -31,18 +30,20 @@ License-File: AUTHORS.txt pip - The Python Package Installer ================================== -.. image:: https://img.shields.io/pypi/v/pip.svg +.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg :target: https://pypi.org/project/pip/ :alt: PyPI -.. image:: https://img.shields.io/pypi/pyversions/pip +.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip :target: https://pypi.org/project/pip :alt: PyPI - Python Version -.. image:: https://readthedocs.org/projects/pip/badge/?version=latest +.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest :target: https://pip.pypa.io/en/latest :alt: Documentation +|pypi-version| |python-versions| |docs-badge| + pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. Please take a look at our documentation for how to install and use pip: diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD b/env/lib/python3.12/site-packages/pip-24.2.dist-info/RECORD similarity index 54% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD rename to env/lib/python3.12/site-packages/pip-24.2.dist-info/RECORD index c9efd257..228ac1a4 100644 --- a/env/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD +++ b/env/lib/python3.12/site-packages/pip-24.2.dist-info/RECORD @@ -1,1024 +1,853 @@ -../../../bin/pip,sha256=5xq53mrLbp210KJJWOcejQD7tcyjuMxopCFYEj_0ols,271 -../../../bin/pip3,sha256=5xq53mrLbp210KJJWOcejQD7tcyjuMxopCFYEj_0ols,271 -../../../bin/pip3.12,sha256=5xq53mrLbp210KJJWOcejQD7tcyjuMxopCFYEj_0ols,271 -pip-24.0.dist-info/AUTHORS.txt,sha256=SwXm4nkwRkmtnO1ZY-dLy7EPeoQNXMNLby5CN3GlNhY,10388 -pip-24.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-24.0.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 -pip-24.0.dist-info/METADATA,sha256=kNEfJ3_Vho2mee4lfJdlbd5RHIqsfQJSMUB-bOkIOeI,3581 -pip-24.0.dist-info/RECORD,, -pip-24.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-24.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 -pip-24.0.dist-info/entry_points.txt,sha256=Fa_c0b-xGFaYxagIruvpJD6qqXmNTA02vAVIkmMj-9o,125 -pip-24.0.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=oAk1nFpLmUVS5Ln7NxvNoGUn5Vkn6FGQjPaNDf8Q8pk,355 -pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854 -pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 -pip/__pycache__/__init__.cpython-312.pyc,, -pip/__pycache__/__main__.cpython-312.pyc,, -pip/__pycache__/__pip-runner__.cpython-312.pyc,, -pip/_internal/__init__.py,sha256=iqZ5-YQsQV08tkUc7L806Reop6tguLFWf70ySF6be0Y,515 -pip/_internal/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/__pycache__/build_env.cpython-312.pyc,, -pip/_internal/__pycache__/cache.cpython-312.pyc,, -pip/_internal/__pycache__/configuration.cpython-312.pyc,, -pip/_internal/__pycache__/exceptions.cpython-312.pyc,, -pip/_internal/__pycache__/main.cpython-312.pyc,, -pip/_internal/__pycache__/pyproject.cpython-312.pyc,, -pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,, -pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,, -pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243 -pip/_internal/cache.py,sha256=uiYD-9F0Bv1C8ZyWE85lpzDmQf7hcUkgL99GmI8I41Q,10370 -pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 -pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,, -pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,, -pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,, -pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,, -pip/_internal/cli/__pycache__/main.cpython-312.pyc,, -pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,, -pip/_internal/cli/__pycache__/parser.cpython-312.pyc,, -pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,, -pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,, -pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,, -pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,, -pip/_internal/cli/autocompletion.py,sha256=_br_5NgSxSuvPjMF0MLHzS5s6BpSkQAQHKrLK89VauM,6690 -pip/_internal/cli/base_command.py,sha256=iuVWGa2oTq7gBReo0er3Z0tXJ2oqBIC6QjDHcnDhKXY,8733 -pip/_internal/cli/cmdoptions.py,sha256=1EIm8yMixQMELO4QzogdIoWkvIlQqlAW0YnPeOmnvEA,30064 -pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 -pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816 -pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 -pip/_internal/cli/parser.py,sha256=KW6C3-7-4ErTNB0TfLTKwOdHcd-qefCeGnrOoE2r0RQ,10781 -pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 -pip/_internal/cli/req_command.py,sha256=c7_XHABnXmD3_qlK9-r37KqdKBAcgmVKvQ2WcTrNLfc,18369 -pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 -pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 -pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 -pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/commands/__pycache__/cache.cpython-312.pyc,, -pip/_internal/commands/__pycache__/check.cpython-312.pyc,, -pip/_internal/commands/__pycache__/completion.cpython-312.pyc,, -pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,, -pip/_internal/commands/__pycache__/debug.cpython-312.pyc,, -pip/_internal/commands/__pycache__/download.cpython-312.pyc,, -pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,, -pip/_internal/commands/__pycache__/hash.cpython-312.pyc,, -pip/_internal/commands/__pycache__/help.cpython-312.pyc,, -pip/_internal/commands/__pycache__/index.cpython-312.pyc,, -pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,, -pip/_internal/commands/__pycache__/install.cpython-312.pyc,, -pip/_internal/commands/__pycache__/list.cpython-312.pyc,, -pip/_internal/commands/__pycache__/search.cpython-312.pyc,, -pip/_internal/commands/__pycache__/show.cpython-312.pyc,, -pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,, -pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944 -pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782 -pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287 -pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766 -pip/_internal/commands/debug.py,sha256=63972uUCeMIGOdMMVeIUGrOjTOqTVWplFC82a-hcKyA,6777 -pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335 -pip/_internal/commands/freeze.py,sha256=2qjQrH9KWi5Roav0CuR7vc7hWm4uOi_0l6tp3ESKDHM,3172 -pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 -pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 -pip/_internal/commands/index.py,sha256=CNXQer_PeZKSJooURcCFCBEKGfwyNoUWYP_MWczAcOM,4775 -pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188 -pip/_internal/commands/install.py,sha256=VxDd-BD3a27ApeE2OK34rfBXS6Zo2wtemK9-HCwPqxM,28782 -pip/_internal/commands/list.py,sha256=7wRUUmdyyOknl-WZYbO_LtFQxHlWod3pjOY9yYH435o,12450 -pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 -pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419 -pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886 -pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476 -pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006 -pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 -pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/base.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,, -pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/distributions/base.py,sha256=oRSEvnv2ZjBnargamnv2fcJa1n6gUDKaW0g6CWSEpWs,1743 -pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842 -pip/_internal/distributions/sdist.py,sha256=4K3V0VNMllHbBzCJibjwd_tylUKpmIdu2AQyhplvCQo,6709 -pip/_internal/distributions/wheel.py,sha256=-ma3sOtUQj0AxXCEb6_Fhmjl3nh4k3A0HC2taAb2N-4,1277 -pip/_internal/exceptions.py,sha256=TmF1iNFEneSWaemwlg6a5bpPuq2cMHK7d1-SvjsQHb0,23634 -pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 -pip/_internal/index/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/index/__pycache__/collector.cpython-312.pyc,, -pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,, -pip/_internal/index/__pycache__/sources.cpython-312.pyc,, -pip/_internal/index/collector.py,sha256=sH0tL_cOoCk6pLLfCSGVjFM4rPEJtllF-VobvAvLSH4,16590 -pip/_internal/index/package_finder.py,sha256=S_nC8gzVIMY6ikWfKoSOzRtoesUqnfNhAPl_BwSOusA,37843 -pip/_internal/index/sources.py,sha256=dJegiR9f86kslaAHcv9-R5L_XBf5Rzm_FkyPteDuPxI,8688 -pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365 -pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,, -pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,, -pip/_internal/locations/__pycache__/base.cpython-312.pyc,, -pip/_internal/locations/_distutils.py,sha256=H9ZHK_35rdDV1Qsmi4QeaBULjFT4Mbu6QuoVGkJ6QHI,6009 -pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680 -pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556 -pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 -pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339 -pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,, -pip/_internal/metadata/__pycache__/base.cpython-312.pyc,, -pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,, -pip/_internal/metadata/_json.py,sha256=Rz5M5ciSNvITwaTQR6NfN8TgKgM5WfTws4D6CFknovE,2627 -pip/_internal/metadata/base.py,sha256=l3Wgku4xlgr8s4p6fS-3qQ4QKOpPbWLRwi5d9omEFG4,25907 -pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135 -pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,, -pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,, -pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,, -pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 -pip/_internal/metadata/importlib/_dists.py,sha256=UPl1wUujFqiwiltRJ1tMF42WRINO1sSpNNlYQ2mX0mk,8297 -pip/_internal/metadata/importlib/_envs.py,sha256=XTaFIYERP2JF0QUZuPx2ETiugXbPEcZ8q8ZKeht6Lpc,7456 -pip/_internal/metadata/pkg_resources.py,sha256=opjw4IBSqHvie6sXJ_cbT42meygoPEUfNURJuWZY7sk,10035 -pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 -pip/_internal/models/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/models/__pycache__/candidate.cpython-312.pyc,, -pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,, -pip/_internal/models/__pycache__/format_control.cpython-312.pyc,, -pip/_internal/models/__pycache__/index.cpython-312.pyc,, -pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,, -pip/_internal/models/__pycache__/link.cpython-312.pyc,, -pip/_internal/models/__pycache__/scheme.cpython-312.pyc,, -pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,, -pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,, -pip/_internal/models/__pycache__/target_python.cpython-312.pyc,, -pip/_internal/models/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/models/candidate.py,sha256=hEPu8VdGE5qVASv6vLz-R-Rgh5-7LMbai1jgthMCd8M,931 -pip/_internal/models/direct_url.py,sha256=FwouYBKcqckh7B-k2H3HVgRhhFTukFwqiS3kfvtFLSk,6889 -pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486 -pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 -pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818 -pip/_internal/models/link.py,sha256=XirOAGv1jgMu7vu87kuPbohGj7VHpwVrd2q3KUgVQNg,20777 -pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 -pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643 -pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 -pip/_internal/models/target_python.py,sha256=34EkorrMuRvRp-bjqHKJ-bOO71m9xdjN2b8WWFEC2HU,4272 -pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 -pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 -pip/_internal/network/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/network/__pycache__/auth.cpython-312.pyc,, -pip/_internal/network/__pycache__/cache.cpython-312.pyc,, -pip/_internal/network/__pycache__/download.cpython-312.pyc,, -pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,, -pip/_internal/network/__pycache__/session.cpython-312.pyc,, -pip/_internal/network/__pycache__/utils.cpython-312.pyc,, -pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,, -pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541 -pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935 -pip/_internal/network/download.py,sha256=i0Tn55CD5D7XYEFY3TxiYaCf0OaaTQ6SScNgCsSeV14,6086 -pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638 -pip/_internal/network/session.py,sha256=9tqEDD8JiVaFdplOEXJxNo9cjRfBZ6RIa0yQQ_qBNiM,18698 -pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 -pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838 -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/operations/__pycache__/check.cpython-312.pyc,, -pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,, -pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,, -pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,, -pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,, -pip/_internal/operations/build/build_tracker.py,sha256=z-H5DOknZdBa3dh2Vq6VBMY5qLYIKmlj2p6CGZK5Lc8,4832 -pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422 -pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474 -pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 -pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075 -pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417 -pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 -pip/_internal/operations/check.py,sha256=fsqA88iGaqftCr2tlP3sSU202CSkoODRtW0O-JU9M4Y,6806 -pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816 -pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 -pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,, -pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282 -pip/_internal/operations/install/wheel.py,sha256=9hGb1c4bRnPIb2FG7CtUSPfPxqprmHQBtwIAlWPNTtE,27311 -pip/_internal/operations/prepare.py,sha256=57Oq87HfunX3Rbqp47FdaJr9cHbAKUm_3gv7WhBAqbE,28128 -pip/_internal/pyproject.py,sha256=4Xszp11xgr126yzG6BbJA0oaQ9WXuhb0jyUb-y_6lPQ,7152 -pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738 -pip/_internal/req/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/req/__pycache__/constructors.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_file.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_install.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_set.cpython-312.pyc,, -pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,, -pip/_internal/req/constructors.py,sha256=8hlY56imEthLORRwmloyKz3YOyXymIaKsNB6P9ewvNI,19018 -pip/_internal/req/req_file.py,sha256=M8ttOZL-PwAj7scPElhW3ZD2hiD9mm_6FJAGIbwAzEI,17790 -pip/_internal/req/req_install.py,sha256=wtOPxkyRSM8comTks8oL1Gp2oyGqbH7JwIDRci2QiPk,35460 -pip/_internal/req/req_set.py,sha256=iMYDUToSgkxFyrP_OrTtPSgw4dwjRyGRDpGooTqeA4Y,4704 -pip/_internal/req/req_uninstall.py,sha256=nmvTQaRCC0iu-5Tw0djlXJhSj6WmqHRvT3qkkEdC35E,24551 -pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/resolution/__pycache__/base.cpython-312.pyc,, -pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 -pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,, -pip/_internal/resolution/legacy/resolver.py,sha256=Xk24jQ62GvLr4Mc7IjN_qiO88qp0BImzVmPIFz9QLOE,24025 -pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,, -pip/_internal/resolution/resolvelib/base.py,sha256=jg5COmHLhmBIKOR-4spdJD3jyULYa1BdsqiBu2YJnJ4,5173 -pip/_internal/resolution/resolvelib/candidates.py,sha256=19Ki91Po-MSxBknGIfOGkaWkFdOznN0W_nKv7jL28L0,21052 -pip/_internal/resolution/resolvelib/factory.py,sha256=vqqk-hjchdhShwWVdeW2_A-5ZblLhE_nC_v3Mhz4Svc,32292 -pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 -pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824 -pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100 -pip/_internal/resolution/resolvelib/requirements.py,sha256=-kJONP0WjDfdTvBAs2vUXPgAnOyNIBEAXY4b72ogtPE,5696 -pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592 -pip/_internal/self_outdated_check.py,sha256=saxQLB8UzIFtMScquytG10TOTsYVFJQ_mkW1NY-46wE,8378 -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,, -pip/_internal/utils/__pycache__/_log.cpython-312.pyc,, -pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,, -pip/_internal/utils/__pycache__/compat.cpython-312.pyc,, -pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,, -pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,, -pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,, -pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,, -pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,, -pip/_internal/utils/__pycache__/encoding.cpython-312.pyc,, -pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,, -pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,, -pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,, -pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,, -pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,, -pip/_internal/utils/__pycache__/logging.cpython-312.pyc,, -pip/_internal/utils/__pycache__/misc.cpython-312.pyc,, -pip/_internal/utils/__pycache__/models.cpython-312.pyc,, -pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,, -pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,, -pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,, -pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,, -pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,, -pip/_internal/utils/__pycache__/urls.cpython-312.pyc,, -pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,, -pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,, -pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351 -pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 -pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 -pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 -pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 -pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 -pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 -pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 -pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463 -pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 -pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 -pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 -pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 -pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113 -pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118 -pip/_internal/utils/logging.py,sha256=fdtuZJ-AKkqwDTANDvGcBEpssL8el7T1jnwk1CnZl3Y,11603 -pip/_internal/utils/misc.py,sha256=fNXwaeeikvnUt4CPMFIL4-IQbZDxxjj4jDpzCi4ZsOw,23623 -pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 -pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 -pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435 -pip/_internal/utils/subprocess.py,sha256=zzdimb75jVLE1GU4WlTZ055gczhD7n1y1xTcNc7vNZQ,9207 -pip/_internal/utils/temp_dir.py,sha256=DUAw22uFruQdK43i2L2K53C-CDjRCPeAsBKJpu-rHQ4,9312 -pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 -pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 -pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456 -pip/_internal/utils/wheel.py,sha256=i4BwUNHattzN0ixy3HBAF04tZPRh2CcxaT6t86viwkE,4499 -pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 -pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/git.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,, -pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,, -pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519 -pip/_internal/vcs/git.py,sha256=CeKBGJnl6uskvvjkAUXrJVxbHJrpS_B_pyfFdjL3CRc,18121 -pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249 -pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729 -pip/_internal/vcs/versioncontrol.py,sha256=3eIjtOMYvOY5qP6BMYIYDZ375CSuec6kSEB0bOo1cSs,22787 -pip/_internal/wheel_builder.py,sha256=qTTzQV8F6b1jNsFCda1TRQC8J7gK-m7iuRNgKo7Dj68,11801 -pip/_vendor/__init__.py,sha256=U51NPwXdA-wXOiANIQncYjcMp6txgeOL5nHxksJeyas,4993 -pip/_vendor/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/__pycache__/six.cpython-312.pyc,, -pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc,, -pip/_vendor/cachecontrol/__init__.py,sha256=ctHagMhQXuvQDdm4TirZrwDOT5H8oBNAJqzdKI6sovk,676 -pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,, -pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,, -pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737 -pip/_vendor/cachecontrol/adapter.py,sha256=_CcWvUP9048qAZjsNqViaHbdcLs9mmFNixVfpO7oebE,6392 -pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303 -pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=3z8AWKD-vfKeiJqIzLmJyIYtR2yd6Tsh3u1TyLRQoIQ,5352 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386 -pip/_vendor/cachecontrol/controller.py,sha256=keCFA3ZaNVaWTwHd6F1zqWhb4vyvNx_UvZuo5iIYMfo,18384 -pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292 -pip/_vendor/cachecontrol/heuristics.py,sha256=fdFbk9W8IeLrjteIz_fK4mj2HD_Y7COXF2Uc8TgjT1c,4828 -pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/cachecontrol/serialize.py,sha256=0dHeMaDwysVAAnGVlhMOP4tDliohgNK0Jxk_zsOiWxw,7173 -pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417 -pip/_vendor/certifi/__init__.py,sha256=L_j-d0kYuA_MzA2_2hraF1ovf6KT6DTquRdV3paQwOk,94 -pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 -pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=eU0Dn_3yd8BH4m8sfVj4Glhl2KDrcCSg-sEWT-pNJ88,281617 -pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279 -pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797 -pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc,, -pip/_vendor/chardet/__pycache__/version.cpython-312.pyc,, -pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 -pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763 -pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032 -pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915 -pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420 -pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc,, -pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242 -pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732 -pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542 -pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860 -pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683 -pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006 -pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176 -pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934 -pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 -pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753 -pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 -pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753 -pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 -pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759 -pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537 -pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 -pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 -pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752 -pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055 -pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 -pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 -pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 -pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 -pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 -pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 -pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 -pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380 -pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077 -pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715 -pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131 -pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391 -pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc,, -pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560 -pip/_vendor/chardet/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402 -pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400 -pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137 -pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007 -pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848 -pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505 -pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812 -pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244 -pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 -pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc,, -pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc,, -pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 -pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 -pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 -pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 -pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc,, -pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc,, -pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 -pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 -pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 -pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 -pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 -pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 -pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 -pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 -pip/_vendor/distlib/__init__.py,sha256=hJKF7FHoqbmGckncDuEINWo_OYkDNiHODtYXSMcvjcc,625 -pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/database.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/index.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/version.cpython-312.pyc,, -pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc,, -pip/_vendor/distlib/compat.py,sha256=Un-uIBvy02w-D267OG4VEhuddqWgKj9nNkxVltAb75w,41487 -pip/_vendor/distlib/database.py,sha256=0V9Qvs0Vrxa2F_-hLWitIyVyRifJ0pCxyOI-kEOBwsA,51965 -pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797 -pip/_vendor/distlib/locators.py,sha256=o1r_M86_bRLafSpetmyfX8KRtFu-_Q58abvQrnOSnbA,51767 -pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168 -pip/_vendor/distlib/markers.py,sha256=n3DfOh1yvZ_8EW7atMyoYeZFXjYla0Nz0itQlojCd0A,5268 -pip/_vendor/distlib/metadata.py,sha256=pB9WZ9mBfmQxc9OVIldLS5CjOoQRvKAvUwwQyKwKQtQ,39693 -pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 -pip/_vendor/distlib/scripts.py,sha256=nQFXN6G7nOWNDUyxirUep-3WOlJhB7McvCs9zOnkGTI,18315 -pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 -pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 -pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 -pip/_vendor/distlib/util.py,sha256=XSznxEi_i3T20UJuaVc0qXHz5ksGUCW1khYlBprN_QE,67530 -pip/_vendor/distlib/version.py,sha256=9pXkduchve_aN7JG6iL9VTYV_kqNSGoc2Dwl8JuySnQ,23747 -pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 -pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 -pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 -pip/_vendor/distlib/wheel.py,sha256=FVQCve8u-L0QYk5-YTZc7s4WmNQdvjRWTK08KXzZVX4,43958 -pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 -pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 -pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,, -pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330 -pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 -pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/core.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,, -pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,, -pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 -pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 -pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 -pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 -pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 -pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 -pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 -pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132 -pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,, -pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,, -pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 -pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079 -pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544 -pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 -pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 -pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,, -pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,, -pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 -pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 -pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 -pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 -pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 -pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 -pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 -pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 -pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 -pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364 -pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155 -pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476 -pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,, -pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,, -pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211 -pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132 -pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678 -pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809 -pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160 -pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573 -pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983 -pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353 -pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,, -pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,, -pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685 -pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697 -pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938 -pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386 -pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178 -pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424 -pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc,, -pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 -pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314 -pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094 -pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610 -pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938 -pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981 -pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351 -pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073 -pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212 -pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014 -pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335 -pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674 -pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753 -pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618 -pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130 -pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,, -pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,, -pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281 -pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424 -pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986 -pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591 -pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072 -pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092 -pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882 -pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257 -pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700 -pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184 -pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223 -pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230 -pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116 -pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc,, -pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc,, -pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567 -pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387 -pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445 -pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215 -pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523 -pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646 -pip/_vendor/pyparsing/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692 -pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488 -pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646 -pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670 -pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491 -pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 -pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920 -pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546 -pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,, -pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927 -pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169 -pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/api.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/help.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/models.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,, -pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,, -pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435 -pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 -pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697 -pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449 -pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 -pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 -pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 -pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 -pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 -pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 -pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 -pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288 -pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 -pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373 -pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 -pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 -pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460 -pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537 -pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc,, -pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,, -pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc,, -pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 -pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871 -pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601 -pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511 -pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963 -pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 -pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478 -pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/align.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/box.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/color.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/console.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/control.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/json.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/live.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/region.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/status.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/style.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/table.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/text.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,, -pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,, -pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 -pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 -pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 -pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100 -pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 -pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 -pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 -pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 -pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 -pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 -pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 -pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 -pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 -pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 -pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 -pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 -pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 -pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 -pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 -pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368 -pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 -pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 -pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842 -pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509 -pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224 -pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 -pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218 -pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 -pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 -pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 -pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082 -pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 -pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 -pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 -pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 -pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 -pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584 -pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032 -pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 -pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007 -pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273 -pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 -pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903 -pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 -pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 -pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 -pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 -pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 -pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574 -pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852 -pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706 -pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165 -pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 -pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 -pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 -pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431 -pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 -pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 -pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 -pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247 -pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 -pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 -pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 -pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 -pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173 -pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684 -pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 -pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525 -pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 -pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604 -pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 -pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 -pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493 -pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc,, -pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc,, -pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551 -pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179 -pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682 -pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562 -pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372 -pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 -pip/_vendor/tenacity/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746 -pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086 -pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142 -pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024 -pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 -pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,, -pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,, -pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,, -pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 -pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 -pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 -pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26 -pip/_vendor/truststore/__init__.py,sha256=qzTLSH8PvAkY1fr6QQ2vV-KwE_M83wdXugtpJaP_AbM,403 -pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,, -pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,, -pip/_vendor/truststore/_api.py,sha256=xjuEu_rlH4hcdJTROImEyOEqdw-F8t5vO2H2BToY0Ro,9893 -pip/_vendor/truststore/_macos.py,sha256=BjvAKoAjXhdIPuxpY124HJIFswDb0pq8DjynzJOVwqc,17694 -pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324 -pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130 -pip/_vendor/truststore/_windows.py,sha256=1x_EhROeJ9QK1sMAjfnZC7awYI8UnBJYL-TjACUYI4A,17468 -pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130 -pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 -pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,, -pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,, -pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 -pip/_vendor/urllib3/_version.py,sha256=azoM7M7BUADl2kBhMVR6PPf2GhBDI90me1fcnzTwdcw,64 -pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300 -pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990 -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 -pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 -pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 -pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036 -pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081 -pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 -pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 -pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 -pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 -pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 -pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,, -pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 -pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343 -pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 -pip/_vendor/urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752 -pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691 -pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641 -pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 -pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,, -pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,, -pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 -pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 -pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 -pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 -pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 -pip/_vendor/urllib3/util/retry.py,sha256=Z6WEf518eTOXP5jr5QSQ9gqJI0DVYt3Xs3EKnYaTmus,22013 -pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 -pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 -pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 -pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168 -pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296 -pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 -pip/_vendor/vendor.txt,sha256=4NKk7fQhVsZw0U-0zmm9Q2LgGyaPXacFbnJAaS0Q6EY,493 -pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 -pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc,, -pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc,, -pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 -pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 -pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 -pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 -pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 +../../../bin/pip,sha256=r0zPUAeVNQtEadYIYl0HS6uWInfKSq98vuWNpF5fic0,330 +../../../bin/pip3,sha256=r0zPUAeVNQtEadYIYl0HS6uWInfKSq98vuWNpF5fic0,330 +../../../bin/pip3.12,sha256=r0zPUAeVNQtEadYIYl0HS6uWInfKSq98vuWNpF5fic0,330 +pip-24.2.dist-info/AUTHORS.txt,sha256=KDa8Pd3GDeKSogF6yFW0l9A9eMneLDOFrcIDqkL8G8s,10868 +pip-24.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-24.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 +pip-24.2.dist-info/METADATA,sha256=PhzCxQxIhsnZ871cPUe3Hew9PhhpgflLbfqU3WizZqM,3624 +pip-24.2.dist-info/RECORD,, +pip-24.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-24.2.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91 +pip-24.2.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87 +pip-24.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=EQxEGXUQIu-9fNJxVEK74ufx_fTk_HpYV9lAbw-WWbs,355 +pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854 +pip/__pip-runner__.py,sha256=cPPWuJ6NK_k-GzfvlejLFgwzmYUROmpAR6QC3Q-vkXQ,1450 +pip/__pycache__/__init__.cpython-312.pyc,, +pip/__pycache__/__main__.cpython-312.pyc,, +pip/__pycache__/__pip-runner__.cpython-312.pyc,, +pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513 +pip/_internal/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/__pycache__/build_env.cpython-312.pyc,, +pip/_internal/__pycache__/cache.cpython-312.pyc,, +pip/_internal/__pycache__/configuration.cpython-312.pyc,, +pip/_internal/__pycache__/exceptions.cpython-312.pyc,, +pip/_internal/__pycache__/main.cpython-312.pyc,, +pip/_internal/__pycache__/pyproject.cpython-312.pyc,, +pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,, +pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,, +pip/_internal/build_env.py,sha256=QiusW8QEaj387y0hdRqVbuelHSHGYcT7WzVckbmMhR0,10420 +pip/_internal/cache.py,sha256=Jb698p5PNigRtpW5o26wQNkkUv4MnQ94mc471wL63A0,10369 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,, +pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,, +pip/_internal/cli/__pycache__/index_command.cpython-312.pyc,, +pip/_internal/cli/__pycache__/main.cpython-312.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-312.pyc,, +pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,, +pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,, +pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,, +pip/_internal/cli/autocompletion.py,sha256=Lli3Mr6aDNu7ZkJJFFvwD2-hFxNI6Avz8OwMyS5TVrs,6865 +pip/_internal/cli/base_command.py,sha256=F8nUcSM-Y-MQljJUe724-yxmc5viFXHyM_zH70NmIh4,8289 +pip/_internal/cli/cmdoptions.py,sha256=mDqBr0d0hoztbRJs-PWtcKpqNAc7khU6ZpoesZKocT8,30110 +pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 +pip/_internal/cli/index_command.py,sha256=YIJ84cfYcbDBACnB8eoDgqjYJU6GpiWP2Rh7Ij-Xyak,5633 +pip/_internal/cli/main.py,sha256=BDZef-bWe9g9Jpr4OVs4dDf-845HJsKw835T7AqEnAc,2817 +pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 +pip/_internal/cli/parser.py,sha256=QAkY6s8N-AD7w5D2PQm2Y8C2MIJSv7iuAeNjOMvDBUA,10811 +pip/_internal/cli/progress_bars.py,sha256=0FAf7eN67KnIv_gZQhTWSnKXXUzQko1ftGXEoLe5Yec,2713 +pip/_internal/cli/req_command.py,sha256=DqeFhmUMs6o6Ev8qawAcOoYNdAZsfyKS0MZI5jsJYwQ,12250 +pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 +pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 +pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 +pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/commands/__pycache__/cache.cpython-312.pyc,, +pip/_internal/commands/__pycache__/check.cpython-312.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-312.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,, +pip/_internal/commands/__pycache__/debug.cpython-312.pyc,, +pip/_internal/commands/__pycache__/download.cpython-312.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-312.pyc,, +pip/_internal/commands/__pycache__/help.cpython-312.pyc,, +pip/_internal/commands/__pycache__/index.cpython-312.pyc,, +pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,, +pip/_internal/commands/__pycache__/install.cpython-312.pyc,, +pip/_internal/commands/__pycache__/list.cpython-312.pyc,, +pip/_internal/commands/__pycache__/search.cpython-312.pyc,, +pip/_internal/commands/__pycache__/show.cpython-312.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944 +pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268 +pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287 +pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766 +pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797 +pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273 +pip/_internal/commands/freeze.py,sha256=2Vt72BYTSm9rzue6d8dNzt8idxWK4Db6Hd-anq7GQ80,3203 +pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 +pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 +pip/_internal/commands/index.py,sha256=RAXxmJwFhVb5S1BYzb5ifX3sn9Na8v2CCVYwSMP8pao,4731 +pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189 +pip/_internal/commands/install.py,sha256=iqesiLIZc6Op9uihMQFYRhAA2DQRZUxbM4z1BwXoFls,29428 +pip/_internal/commands/list.py,sha256=RgaIV4kN-eMSpgUAXc-6bjnURzl0v3cRE11xr54O9Cg,12771 +pip/_internal/commands/search.py,sha256=hSGtIHg26LRe468Ly7oZ6gfd9KbTxBRZAAtJc9Um6S4,5628 +pip/_internal/commands/show.py,sha256=IG9L5uo8w6UA4tI_IlmaxLCoNKPa5JNJCljj3NWs0OE,7507 +pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892 +pip/_internal/commands/wheel.py,sha256=eJRhr_qoNNxWAkkdJCNiQM7CXd4E1_YyQhsqJnBPGGg,6414 +pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006 +pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 +pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/base.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,, +pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783 +pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842 +pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751 +pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317 +pip/_internal/exceptions.py,sha256=6qcW3QgmFVlRxlZvDSLUhSzKJ7_Tedo-lyqWA6NfdAU,25371 +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/index/__pycache__/collector.cpython-312.pyc,, +pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,, +pip/_internal/index/__pycache__/sources.cpython-312.pyc,, +pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265 +pip/_internal/index/package_finder.py,sha256=yRC4xsyudwKnNoU6IXvNoyqYo5ScT7lB6Wa-z2eh7cs,37666 +pip/_internal/index/sources.py,sha256=dJegiR9f86kslaAHcv9-R5L_XBf5Rzm_FkyPteDuPxI,8688 +pip/_internal/locations/__init__.py,sha256=UaAxeZ_f93FyouuFf4p7SXYF-4WstXuEvd3LbmPCAno,14925 +pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,, +pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,, +pip/_internal/locations/__pycache__/base.cpython-312.pyc,, +pip/_internal/locations/_distutils.py,sha256=H9ZHK_35rdDV1Qsmi4QeaBULjFT4Mbu6QuoVGkJ6QHI,6009 +pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724 +pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556 +pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 +pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339 +pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,, +pip/_internal/metadata/__pycache__/base.cpython-312.pyc,, +pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,, +pip/_internal/metadata/_json.py,sha256=P0cAJrH_mtmMZvlZ16ZXm_-izA4lpr5wy08laICuiaA,2644 +pip/_internal/metadata/base.py,sha256=ft0K5XNgI4ETqZnRv2-CtvgYiMOMAeGMAzxT-f6VLJA,25298 +pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135 +pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,, +pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,, +pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,, +pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796 +pip/_internal/metadata/importlib/_dists.py,sha256=anh0mLI-FYRPUhAdipd0Va3YJJc6HelCKQ0bFhY10a0,8017 +pip/_internal/metadata/importlib/_envs.py,sha256=JHjNfnk9RsjrcQw8dLBqdfBglOKSepEe9aq03B4nRpU,7431 +pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-312.pyc,, +pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-312.pyc,, +pip/_internal/models/__pycache__/index.cpython-312.pyc,, +pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,, +pip/_internal/models/__pycache__/link.cpython-312.pyc,, +pip/_internal/models/__pycache__/scheme.cpython-312.pyc,, +pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,, +pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,, +pip/_internal/models/__pycache__/target_python.cpython-312.pyc,, +pip/_internal/models/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753 +pip/_internal/models/direct_url.py,sha256=uBtY2HHd3TO9cKQJWh0ThvE5FRr-MWRYChRU4IG9HZE,6578 +pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486 +pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 +pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818 +pip/_internal/models/link.py,sha256=jHax9O-9zlSzEwjBCDkx0OXjKXwBDwOuPwn-PsR8dCs,21034 +pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575 +pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531 +pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015 +pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271 +pip/_internal/models/wheel.py,sha256=Odc1NVWL5N-i6A3vFa50BfNvCRlGvGa4som60FQM198,3601 +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/network/__pycache__/auth.cpython-312.pyc,, +pip/_internal/network/__pycache__/cache.cpython-312.pyc,, +pip/_internal/network/__pycache__/download.cpython-312.pyc,, +pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,, +pip/_internal/network/__pycache__/session.cpython-312.pyc,, +pip/_internal/network/__pycache__/utils.cpython-312.pyc,, +pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,, +pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809 +pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935 +pip/_internal/network/download.py,sha256=FLOP29dPYECBiAi7eEjvAbNkyzaKNqbyjOT2m8HPW8U,6048 +pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638 +pip/_internal/network/session.py,sha256=XmanBKjVwPFmh1iJ58q6TDh9xabH37gREuQJ_feuZGA,18741 +pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088 +pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/operations/__pycache__/check.cpython-312.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,, +pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,, +pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774 +pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422 +pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474 +pip/_internal/operations/build/metadata_legacy.py,sha256=8i6i1QZX9m_lKPStEFsHKM0MT4a-CD408JOw99daLmo,2190 +pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075 +pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417 +pip/_internal/operations/build/wheel_legacy.py,sha256=K-6kNhmj-1xDF45ny1yheMerF0ui4EoQCLzEoHh6-tc,3045 +pip/_internal/operations/check.py,sha256=L24vRL8VWbyywdoeAhM89WCd8zLTnjIbULlKelUgIec,5912 +pip/_internal/operations/freeze.py,sha256=V59yEyCSz_YhZuhH09-6aV_zvYBMrS_IxFFNqn2QzlA,9864 +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,, +pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=PoEsNEPGbIZ2yQphPsmYTKLOCMs4gv5OcCdzW124NcA,1283 +pip/_internal/operations/install/wheel.py,sha256=X5Iz9yUg5LlK5VNQ9g2ikc6dcRu8EPi_SUi5iuEDRgo,27615 +pip/_internal/operations/prepare.py,sha256=joWJwPkuqGscQgVNImLK71e9hRapwKvRCM8HclysmvU,28118 +pip/_internal/pyproject.py,sha256=rw4fwlptDp1hZgYoplwbAGwWA32sWQkp7ysf8Ju6iXc,7287 +pip/_internal/req/__init__.py,sha256=HxBFtZy_BbCclLgr26waMtpzYdO5T3vxePvpGAXSt5s,2653 +pip/_internal/req/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-312.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,, +pip/_internal/req/constructors.py,sha256=qXNZtUqhsXpHxkRaIQhp20_Kz6I88MDKM8SQR9fckIc,18424 +pip/_internal/req/req_file.py,sha256=hnC9Oz-trqGQpuDnCVWqwpJkAvtbCsk7-5k0EWVQhlQ,17687 +pip/_internal/req/req_install.py,sha256=yhT98NGDoAEk03jznTJnYCznzhiMEEA2ocgsUG_dcNU,35788 +pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858 +pip/_internal/req/req_uninstall.py,sha256=qzDIxJo-OETWqGais7tSMCDcWbATYABT-Tid3ityF0s,23853 +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/resolution/__pycache__/base.cpython-312.pyc,, +pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,, +pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068 +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,, +pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023 +pip/_internal/resolution/resolvelib/candidates.py,sha256=07CBc85ya3J19XqdvUsLQwtVIxiTYq9km9hbTRh0jb0,19823 +pip/_internal/resolution/resolvelib/factory.py,sha256=mTTq_nG1F9Eq3VnlYPH6Ap-mydcS-mxC5y5L-CLLp80,32459 +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=9hrTyQqFvl9I7Tji79F1AxHv39Qh1rkJ_7deSHSMfQc,6383 +pip/_internal/resolution/resolvelib/provider.py,sha256=bcsFnYvlmtB80cwVdW1fIwgol8ZNr1f1VHyRTkz47SM,9935 +pip/_internal/resolution/resolvelib/reporter.py,sha256=00JtoXEkTlw0-rl_sl54d71avwOsJHt9GGHcrj5Sza0,3168 +pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065 +pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592 +pip/_internal/self_outdated_check.py,sha256=pkjQixuWyQ1vrVxZAaYD6SSHgXuFUnHZybXEWTkh0S0,8145 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,, +pip/_internal/utils/__pycache__/_log.cpython-312.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-312.pyc,, +pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,, +pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,, +pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,, +pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-312.pyc,, +pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,, +pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-312.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-312.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,, +pip/_internal/utils/__pycache__/retry.cpython-312.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,, +pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,, +pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,, +pip/_internal/utils/__pycache__/urls.cpython-312.pyc,, +pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,, +pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,, +pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350 +pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 +pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 +pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399 +pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 +pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 +pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707 +pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196 +pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463 +pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 +pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 +pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950 +pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 +pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734 +pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972 +pip/_internal/utils/logging.py,sha256=7BFKB1uFjdxD5crM-GtwA5T2qjbQ2LPD-gJDuJeDNTg,11606 +pip/_internal/utils/misc.py,sha256=HR_V97vNTHNzwq01JrnTZtsLLkWAOJ9_EeYfHJZSgDY,23745 +pip/_internal/utils/packaging.py,sha256=iI3LH43lVNR4hWBOqF6lFsZq4aycb2j0UcHlmDmcqUg,2109 +pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392 +pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435 +pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988 +pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310 +pip/_internal/utils/unpacking.py,sha256=eyDkSsk4nW8ZfiSjNzJduCznpHyaGHVv3ak_LMGsiEM,11951 +pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599 +pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456 +pip/_internal/utils/wheel.py,sha256=b442jkydFHjXzDy6cMR7MpzWBJ1Q82hR5F33cmcHV3g,4494 +pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 +pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,, +pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,, +pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528 +pip/_internal/vcs/git.py,sha256=3tpc9LQA_J4IVW5r5NvWaaSeDzcmJOrSFZN0J8vIKfU,18177 +pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249 +pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735 +pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440 +pip/_internal/wheel_builder.py,sha256=DL3A8LKeRj_ACp11WS5wSgASgPFqeyAeXJKdXfmaWXU,11799 +pip/_vendor/__init__.py,sha256=JYuAXvClhInxIrA2FTp5p-uuWVL7WV6-vEpTs46-Qh4,4873 +pip/_vendor/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=GiYoagwPEiJ_xR_lbwWGaoCiPtF_rz4isjfjdDAgHU4,676 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737 +pip/_vendor/cachecontrol/adapter.py,sha256=fByO_Pd_EOemjWbuocvBWdN85xT0q_TBm2lxS6vD4fk,6355 +pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=9AlmmTJc6cslb6k5z_6q0sGPHVrMj8zv-uWy-simmfE,5406 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386 +pip/_vendor/cachecontrol/controller.py,sha256=o-ejGJlBmpKK8QQLyTPJj0t7siU8XVHXuV8MCybCxQ8,18575 +pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292 +pip/_vendor/cachecontrol/heuristics.py,sha256=IYe4QmHERWsMvtxNrp920WeaIsaTTyqLB14DSheSbtY,4834 +pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163 +pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417 +pip/_vendor/certifi/__init__.py,sha256=LHXz7E80YJYBzCBv6ZyidQ5-ciYSkSebpY2E5OM0l7o,94 +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 +pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=SIupYGAr8HzGP073rsEIaS_sQYIPwzKKjj894DgUmu4,291528 +pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486 +pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/distlib/__init__.py,sha256=hJKF7FHoqbmGckncDuEINWo_OYkDNiHODtYXSMcvjcc,625 +pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-312.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc,, +pip/_vendor/distlib/compat.py,sha256=Un-uIBvy02w-D267OG4VEhuddqWgKj9nNkxVltAb75w,41487 +pip/_vendor/distlib/database.py,sha256=0V9Qvs0Vrxa2F_-hLWitIyVyRifJ0pCxyOI-kEOBwsA,51965 +pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797 +pip/_vendor/distlib/locators.py,sha256=o1r_M86_bRLafSpetmyfX8KRtFu-_Q58abvQrnOSnbA,51767 +pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168 +pip/_vendor/distlib/markers.py,sha256=n3DfOh1yvZ_8EW7atMyoYeZFXjYla0Nz0itQlojCd0A,5268 +pip/_vendor/distlib/metadata.py,sha256=pB9WZ9mBfmQxc9OVIldLS5CjOoQRvKAvUwwQyKwKQtQ,39693 +pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 +pip/_vendor/distlib/scripts.py,sha256=8_gP9J7_tlNRicnWmPX4ZiDlP5wTwJKDeeg-8_qXUZU,18780 +pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 +pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 +pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 +pip/_vendor/distlib/util.py,sha256=XSznxEi_i3T20UJuaVc0qXHz5ksGUCW1khYlBprN_QE,67530 +pip/_vendor/distlib/version.py,sha256=9pXkduchve_aN7JG6iL9VTYV_kqNSGoc2Dwl8JuySnQ,23747 +pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 +pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 +pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 +pip/_vendor/distlib/wheel.py,sha256=FVQCve8u-L0QYk5-YTZc7s4WmNQdvjRWTK08KXzZVX4,43958 +pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 +pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 +pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,, +pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430 +pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 +pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,, +pip/_vendor/idna/codec.py,sha256=PS6m-XmdST7Wj7J7ulRMakPDt5EBJyYrT3CPtjh-7t4,3426 +pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 +pip/_vendor/idna/core.py,sha256=lyhpoe2vulEaB_65xhXmoKgO-xUqFDvcwxu5hpNNO4E,12663 +pip/_vendor/idna/idnadata.py,sha256=dqRwytzkjIHMBa2R1lYvHDwACenZPt8eGVu1Y8UBE-E,78320 +pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 +pip/_vendor/idna/package_data.py,sha256=Tkt0KnIeyIlnHddOaz9WSkkislNgokJAuE-p5GorMqo,21 +pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/idna/uts46data.py,sha256=1KuksWqLuccPXm2uyRVkhfiFLNIhM_H2m4azCcnOqEU,206503 +pip/_vendor/msgpack/__init__.py,sha256=gsMP7JTECZNUSjvOyIbdhNOkpB9Z8BcGwabVGY2UcdQ,1077 +pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,, +pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,, +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/ext.py,sha256=fKp00BqDLjUtZnPd70Llr138zk8JsCuSpJkkZ5S4dt8,5629 +pip/_vendor/msgpack/fallback.py,sha256=wdUWJkWX2gzfRW9BBCTOuIE1Wvrf5PtBtR8ZtY7G_EE,33175 +pip/_vendor/packaging/__init__.py,sha256=dtw2bNmWCQ9WnMoK3bk_elL1svSlikXtLpZhCFIB9SE,496 +pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,, +pip/_vendor/packaging/_elffile.py,sha256=_LcJW4YNKywYsl4169B2ukKRqwxjxst_8H0FRVQKlz8,3282 +pip/_vendor/packaging/_manylinux.py,sha256=Xo4V0PZz8sbuVCbTni0t1CR0AHeir_7ib4lTmV8scD4,9586 +pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694 +pip/_vendor/packaging/_parser.py,sha256=s_TvTvDNK0NrM2QB3VKThdWFM4Nc0P6JnkObkl3MjpM,10236 +pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 +pip/_vendor/packaging/_tokenizer.py,sha256=J6v5H7Jzvb-g81xp_2QACKwO7LxHQA6ikryMU7zXwN8,5273 +pip/_vendor/packaging/markers.py,sha256=dWKSqn5Sp-jDmOG-W3GfLHKjwhf1IsznbT71VlBoB5M,10671 +pip/_vendor/packaging/metadata.py,sha256=KINuSkJ12u-SyoKNTy_pHNGAfMUtxNvZ53qA1zAKcKI,32349 +pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947 +pip/_vendor/packaging/specifiers.py,sha256=HfGgfNJRvrzC759gnnoojHyiWs_DYmcw5PEh5jHH-YE,39738 +pip/_vendor/packaging/tags.py,sha256=y8EbheOu9WS7s-MebaXMcHMF-jzsA_C1Lz5XRTiSy4w,18883 +pip/_vendor/packaging/utils.py,sha256=NAdYUwnlAOpkat_RthavX8a07YuVxgGL_vwrx73GSDM,5287 +pip/_vendor/packaging/version.py,sha256=wE4sSVlF-d1H6HFC1vszEe35CwTig_fh4HHIFg95hFE,16210 +pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/platformdirs/__init__.py,sha256=FTA6LGNm40GwNZt3gG3uLAacWvf2E_2HTmH0rAALGR8,22285 +pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505 +pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,, +pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,, +pip/_vendor/platformdirs/android.py,sha256=xZXY9Jd46WOsxT2U6-5HsNtDZ-IQqxcEUrBLl3hYk4o,9016 +pip/_vendor/platformdirs/api.py,sha256=QBYdUac2eC521ek_y53uD1Dcq-lJX8IgSRVd4InC6uc,8996 +pip/_vendor/platformdirs/macos.py,sha256=wftsbsvq6nZ0WORXSiCrZNkRHz_WKuktl0a6mC7MFkI,5580 +pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/platformdirs/unix.py,sha256=Cci9Wqt35dAMsg6HT9nRGHSBW5obb0pR3AE1JJnsCXg,10643 +pip/_vendor/platformdirs/version.py,sha256=r7F76tZRjgQKzrpx_I0_ZMQOMU-PS7eGnHD7zEK3KB0,411 +pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125 +pip/_vendor/pygments/__init__.py,sha256=7N1oiaWulw_nCsTY4EEixYLz15pWY5u4uPAFFi-ielU,2983 +pip/_vendor/pygments/__main__.py,sha256=isIhBxLg65nLlXukG4VkMuPfNdd7gFzTZ_R_z3Q8diY,353 +pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,, +pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,, +pip/_vendor/pygments/cmdline.py,sha256=LIVzmAunlk9sRJJp54O4KRy9GDIN4Wu13v9p9QzfGPM,23656 +pip/_vendor/pygments/console.py,sha256=yhP9UsLAVmWKVQf2446JJewkA7AiXeeTf4Ieg3Oi2fU,1718 +pip/_vendor/pygments/filter.py,sha256=_ADNPCskD8_GmodHi6_LoVgPU3Zh336aBCT5cOeTMs0,1910 +pip/_vendor/pygments/filters/__init__.py,sha256=RdedK2KWKXlKwR7cvkfr3NUj9YiZQgMgilRMFUg2jPA,40392 +pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/formatter.py,sha256=jDWBTndlBH2Z5IYZFVDnP0qn1CaTQjTWt7iAGtCnJEg,4390 +pip/_vendor/pygments/formatters/__init__.py,sha256=8No-NUs8rBTSSBJIv4hSEQt2M0cFB4hwAT0snVc2QGE,5385 +pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc,, +pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 +pip/_vendor/pygments/formatters/bbcode.py,sha256=3JQLI45tcrQ_kRUMjuab6C7Hb0XUsbVWqqbSn9cMjkI,3320 +pip/_vendor/pygments/formatters/groff.py,sha256=M39k0PaSSZRnxWjqBSVPkF0mu1-Vr7bm6RsFvs-CNN4,5106 +pip/_vendor/pygments/formatters/html.py,sha256=SE2jc3YCqbMS3rZW9EAmDlAUhdVxJ52gA4dileEvCGU,35669 +pip/_vendor/pygments/formatters/img.py,sha256=MwA4xWPLOwh6j7Yc6oHzjuqSPt0M1fh5r-5BTIIUfsU,23287 +pip/_vendor/pygments/formatters/irc.py,sha256=dp1Z0l_ObJ5NFh9MhqLGg5ptG5hgJqedT2Vkutt9v0M,4981 +pip/_vendor/pygments/formatters/latex.py,sha256=XMmhOCqUKDBQtG5mGJNAFYxApqaC5puo5cMmPfK3944,19306 +pip/_vendor/pygments/formatters/other.py,sha256=56PMJOliin-rAUdnRM0i1wsV1GdUPd_dvQq0_UPfF9c,5034 +pip/_vendor/pygments/formatters/pangomarkup.py,sha256=y16U00aVYYEFpeCfGXlYBSMacG425CbfoG8oKbKegIg,2218 +pip/_vendor/pygments/formatters/rtf.py,sha256=ZT90dmcKyJboIB0mArhL7IhE467GXRN0G7QAUgG03To,11957 +pip/_vendor/pygments/formatters/svg.py,sha256=KKsiophPupHuxm0So-MsbQEWOT54IAiSF7hZPmxtKXE,7174 +pip/_vendor/pygments/formatters/terminal.py,sha256=AojNG4MlKq2L6IsC_VnXHu4AbHCBn9Otog6u45XvxeI,4674 +pip/_vendor/pygments/formatters/terminal256.py,sha256=kGkNUVo3FpwjytIDS0if79EuUoroAprcWt3igrcIqT0,11753 +pip/_vendor/pygments/lexer.py,sha256=TYHDt___gNW4axTl2zvPZff-VQi8fPaIh5OKRcVSjUM,35349 +pip/_vendor/pygments/lexers/__init__.py,sha256=pIlxyQJuu_syh9lE080cq8ceVbEVcKp0osAFU5fawJU,12115 +pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,, +pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,, +pip/_vendor/pygments/lexers/_mapping.py,sha256=61-h3zr103m01OS5BUq_AfUiL9YI06Ves9ipQ7k4vr4,76097 +pip/_vendor/pygments/lexers/python.py,sha256=2J_YJrPTr_A6fJY_qKiKv0GpgPwHMrlMSeo59qN3fe4,53687 +pip/_vendor/pygments/modeline.py,sha256=gtRYZBS-CKOCDXHhGZqApboHBaZwGH8gznN3O6nuxj4,1005 +pip/_vendor/pygments/plugin.py,sha256=ioeJ3QeoJ-UQhZpY9JL7vbxsTVuwwM7BCu-Jb8nN0AU,1891 +pip/_vendor/pygments/regexopt.py,sha256=Hky4EB13rIXEHQUNkwmCrYqtIlnXDehNR3MztafZ43w,3072 +pip/_vendor/pygments/scanner.py,sha256=NDy3ofK_fHRFK4hIDvxpamG871aewqcsIb6sgTi7Fhk,3092 +pip/_vendor/pygments/sphinxext.py,sha256=iOptJBcqOGPwMEJ2p70PvwpZPIGdvdZ8dxvq6kzxDgA,7981 +pip/_vendor/pygments/style.py,sha256=rSCZWFpg1_DwFMXDU0nEVmAcBHpuQGf9RxvOPPQvKLQ,6420 +pip/_vendor/pygments/styles/__init__.py,sha256=qUk6_1z5KmT8EdJFZYgESmG6P_HJF_2vVrDD7HSCGYY,2042 +pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc,, +pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312 +pip/_vendor/pygments/token.py,sha256=qZwT7LSPy5YBY3JgDjut642CCy7JdQzAfmqD9NmT5j0,6226 +pip/_vendor/pygments/unistring.py,sha256=p5c1i-HhoIhWemy9CUsaN9o39oomYHNxXll0Xfw6tEA,63208 +pip/_vendor/pygments/util.py,sha256=2tj2nS1X9_OpcuSjf8dOET2bDVZhs8cEKd_uT6-Fgg8,10031 +pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491 +pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 +pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920 +pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546 +pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,, +pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927 +pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057 +pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,, +pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435 +pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 +pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607 +pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449 +pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186 +pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 +pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485 +pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590 +pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272 +pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813 +pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483 +pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057 +pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495 +pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322 +pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631 +pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537 +pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc,, +pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,, +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc,, +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 +pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871 +pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601 +pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511 +pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963 +pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 +pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477 +pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/align.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/box.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/color.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/console.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/control.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/json.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/live.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/region.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/status.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/style.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/table.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/text.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,, +pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,, +pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209 +pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 +pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 +pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128 +pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 +pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 +pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 +pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 +pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 +pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 +pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 +pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 +pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471 +pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 +pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 +pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 +pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 +pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925 +pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 +pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404 +pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 +pip/_vendor/rich/align.py,sha256=sCUkisXkQfoq-IQPyBELfJ8l7LihZJX3HbH8K7Cie-M,10368 +pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 +pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263 +pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831 +pip/_vendor/rich/cells.py,sha256=aMmGK4BjXhgE6_JF1ZEGmW3O7mKkE8g84vUnj4Et4To,4780 +pip/_vendor/rich/color.py,sha256=bCRATVdRe5IClJ6Hl62de2PKQ_U4i2MZ4ugjUEg7Tao,18223 +pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 +pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 +pip/_vendor/rich/console.py,sha256=deFZIubq2M9A2MCsKFAsFQlWDvcOMsGuUA07QkOaHIw,99173 +pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 +pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502 +pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 +pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082 +pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 +pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 +pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 +pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 +pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 +pip/_vendor/rich/highlighter.py,sha256=6ZAjUcNhBRajBCo9umFUclyi2xL0-55JL7S0vYGUJu4,9585 +pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031 +pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 +pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004 +pip/_vendor/rich/live.py,sha256=vUcnJV2LMSK3sQNaILbm0-_B8BpAeiHfcQMAMLfpRe0,14271 +pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666 +pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903 +pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451 +pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 +pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 +pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 +pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 +pip/_vendor/rich/panel.py,sha256=2Fd1V7e1kHxlPFIusoHY5T7-Cs0RpkrihgVG9ZVqJ4g,10705 +pip/_vendor/rich/pretty.py,sha256=5oIHP_CGWnHEnD0zMdW5qfGC5kHqIKn7zH_eC4crULE,35848 +pip/_vendor/rich/progress.py,sha256=P02xi7T2Ua3qq17o83bkshe4c0v_45cg8VyTj6US6Vg,59715 +pip/_vendor/rich/progress_bar.py,sha256=L4jw8E6Qb_x-jhOrLVhkuMaPmiAhFIl8jHQbWFrKuR8,8164 +pip/_vendor/rich/prompt.py,sha256=wdOn2X8XTJKnLnlw6PoMY7xG4iUPp3ezt4O5gqvpV-E,11304 +pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 +pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 +pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431 +pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 +pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 +pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 +pip/_vendor/rich/segment.py,sha256=hU1ueeXqI6YeFa08K9DAjlF2QLxcJY9pwZx7RsXavlk,24246 +pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 +pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424 +pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 +pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 +pip/_vendor/rich/syntax.py,sha256=TnZDuOD4DeHFbkaVEAji1gf8qgAlMU9Boe_GksMGCkk,35475 +pip/_vendor/rich/table.py,sha256=nGEvAZHF4dy1vT9h9Gj9O5qhSQO3ODAxJv0RY1vnIB8,39680 +pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 +pip/_vendor/rich/text.py,sha256=5rQ3zvNrg5UZKNLecbh7fiw9v3HeFulNVtRY_CBDjjE,47312 +pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 +pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 +pip/_vendor/rich/traceback.py,sha256=CUpxYLjQWIb6vQQ6O72X0hvDV6caryGqU6UweHgOyCY,29601 +pip/_vendor/rich/tree.py,sha256=meAOUU6sYnoBEOX2ILrPLY9k5bWrWNQKkaiEFvHinXM,9167 +pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 +pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,, +pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,, +pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,, +pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 +pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 +pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 +pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26 +pip/_vendor/truststore/__init__.py,sha256=M-PhuLMIF7gxKXk7tpo2MD7dk6nqG1ae8GXWdNXbMdQ,403 +pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,, +pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,, +pip/_vendor/truststore/_api.py,sha256=B9JIHipzBIS8pMP_J50-o1DHVZsvKZQUXTB0HQQ_UPg,10461 +pip/_vendor/truststore/_macos.py,sha256=VJ24avz5aEGYAs_kWvnGjMJtuIP4xJcYa459UQOQC3M,17608 +pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324 +pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130 +pip/_vendor/truststore/_windows.py,sha256=eldNViHNHeY5r3fiBoz_JFGD37atXB9S5yaRoPKEGAA,17891 +pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/typing_extensions.py,sha256=78hFl0HpDY-ylHUVCnWdU5nTHxUP2-S-3wEZk6CQmLk,134499 +pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 +pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372 +pip/_vendor/urllib3/_version.py,sha256=cuJvnSrWxXGYgQ3-ZRoPMw8-qaN5tpw71jnH1t16dLA,64 +pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300 +pip/_vendor/urllib3/connectionpool.py,sha256=Be6q65SR9laoikg-h_jmc_p8OWtEmwgq_Om_Xtig-2M,40285 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 +pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446 +pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 +pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 +pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 +pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 +pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 +pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343 +pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 +pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990 +pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691 +pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641 +pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 +pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 +pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 +pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 +pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 +pip/_vendor/urllib3/util/retry.py,sha256=Z6WEf518eTOXP5jr5QSQ9gqJI0DVYt3Xs3EKnYaTmus,22013 +pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 +pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 +pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 +pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168 +pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296 +pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 +pip/_vendor/vendor.txt,sha256=PxNaxxkkpBaw5zOTsDpHEY-zEaHjgkDgyrSxOuxg8nw,330 +pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED b/env/lib/python3.12/site-packages/pip-24.2.dist-info/REQUESTED similarity index 100% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED rename to env/lib/python3.12/site-packages/pip-24.2.dist-info/REQUESTED diff --git a/env/lib/python3.12/site-packages/pip-24.2.dist-info/WHEEL b/env/lib/python3.12/site-packages/pip-24.2.dist-info/WHEEL new file mode 100644 index 00000000..0fde4dd9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip-24.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (74.1.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt b/env/lib/python3.12/site-packages/pip-24.2.dist-info/entry_points.txt similarity index 69% rename from env/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt rename to env/lib/python3.12/site-packages/pip-24.2.dist-info/entry_points.txt index 26fa3616..25fcf7e2 100644 --- a/env/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt +++ b/env/lib/python3.12/site-packages/pip-24.2.dist-info/entry_points.txt @@ -1,4 +1,3 @@ [console_scripts] pip = pip._internal.cli.main:main pip3 = pip._internal.cli.main:main -pip3.12 = pip._internal.cli.main:main diff --git a/env/lib/python3.12/site-packages/pip-24.2.dist-info/top_level.txt b/env/lib/python3.12/site-packages/pip-24.2.dist-info/top_level.txt new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip-24.2.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/pip/__init__.py b/env/lib/python3.12/site-packages/pip/__init__.py index be0e3edb..640e922f 100644 --- a/env/lib/python3.12/site-packages/pip/__init__.py +++ b/env/lib/python3.12/site-packages/pip/__init__.py @@ -1,6 +1,6 @@ from typing import List, Optional -__version__ = "24.0" +__version__ = "24.2" def main(args: Optional[List[str]] = None) -> int: diff --git a/env/lib/python3.12/site-packages/pip/__pip-runner__.py b/env/lib/python3.12/site-packages/pip/__pip-runner__.py index 49a148a0..c633787f 100644 --- a/env/lib/python3.12/site-packages/pip/__pip-runner__.py +++ b/env/lib/python3.12/site-packages/pip/__pip-runner__.py @@ -8,8 +8,8 @@ import sys -# Copied from setup.py -PYTHON_REQUIRES = (3, 7) +# Copied from pyproject.toml +PYTHON_REQUIRES = (3, 8) def version_str(version): # type: ignore diff --git a/env/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc index 57249e11c0d5a3a440e934720115a0a80b84768e..9a94535c1bbdb4a0eaf6235185c16e7a6aa99785 100644 GIT binary patch delta 103 zcmdnTdX1ImG%qg~0}$9UGNw=DDPlC*Sg+6MQK27NoLW?@pOTbVo|=`Y?~&wG%qg~0}$9UGNy0jv10P5&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>KkLd{jsizwa diff --git a/env/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc index e71a14bfe357da34c470f1e3c02fa88fbd4ab743..3fc6c91d4e3155f5323bb0498e755207431b6f56 100644 GIT binary patch delta 143 zcmZ20cubJ@G%qg~0}$9UGN!NE$m_|($T2ybX^%&perR!OQL%nXQet^(R-(R3esXDU zYFC1pwPnFn|C6 delta 118 zcmX>mxK@z&G%qg~0}uq?|CY97Bd;eDBm3lVracB}`k}?CMaBBriA9NddPy0HC7Fr( zE~&-YCHV#V1wfhnyu=*+jMSW*{PO&woRrDY%<1AHK!aW|{AggfB&;)|aEkK`#_4Vs Ug>@$1V)kcV;C^MZ4$CYS08*qWh5!Hn diff --git a/env/lib/python3.12/site-packages/pip/_internal/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/__init__.py index 96c6b88c..1a5b7f87 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_internal/__init__.py @@ -7,7 +7,7 @@ _log.init_logging() -def main(args: (Optional[List[str]]) = None) -> int: +def main(args: Optional[List[str]] = None) -> int: """This is preserved for old console scripts that may still be referencing it. diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc index 5096f40146ac047b4de1d76c3e7b51f31b6bedd7..5d50ea6c576e24c53cc164b088693be63b0b44d5 100644 GIT binary patch delta 128 zcmZ3&wug=PG%qg~0}$9UGNv&w* delta 104 zcmdnPwuFuMG%qg~0}uq?|CYwQk@pItL6&}KacWVqes*F}VxC@7Mq){3qP|ONadt_5 zfqnr{CO diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc index 9428431e631baf518ba1340eeba600e53b43fc81..408cc604e681b5ae6fd490112904071c561f31dc 100644 GIT binary patch delta 3537 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 J)|QNy0055AH4*>- delta 132 zcmZ3I+?C9GnwOW00SJQce@koH$a{;~AYDJSIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC%wS)b)IJ7eKwWu9Px%jWLaggsVhPKaE(&io> iCLTtX$^8<#9G6wYKQV}N@=e|^(Zmd-H@iy4O8@{!XDwp@ diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc index 34706711924b531593592f2b473596f4e708b944..0875db44a2c8954c7fa05732c78dc29c8387b8fa 100644 GIT binary patch delta 461 zcmbQ-#n{=!$a9*Pmx}=iY#ABTH}Yh$dbI0@7N-^!>!&0omZxSV>bvA8m*%GCl@#l{ zrj#ZpmSpDV=?5n#=A;%WI3_2iq~=!Y`}nx%0~z@)S&4b+`2j`wS*gh-o0qZ9WVN^j zG`fM|iG}@ji-3z30T%+pu2_VBW@eIRyJ-==fu)D3pS_d4pQn>&LdYEZs~p-FEW$r9 zGq6f*F6CBaXWTM*x=@VOR}KaZGoT(1My{LcrZe0-+$RKedM~K^2o~yK>EVT`FhNtW zSylKPzw|<|8y;}*T<1`}$f10NL-m2I;&oZ$E3(Fug_X^fuZXIy5WFEGHQi^T&jP_I z{@CA)nw(LmAJB!NwTZDETlV&O~4vrGSD`O4la<+gT^Y{K%F1h7zCs)a7a!*XeYLr&15DcW5DDErlQQ( UB(x^)H8p2ukksD%-BgAj0EG&ZegFUf delta 487 zcmeC|Vw~K?$a9*Pmx}=ig71Gz+sKo}YLKrVTAW%`te>4&l$fWNl#y7HnW*oQTAW>y zU!Y$Al*!La%+b$C&B@6x&o9bJ*}RW+Cac*Epb-rWPb}=OTLfIR2)Ga!cG)8Q8#9wM z+YJMg9;SZwPWFDDPM!%NbL_8jXnz1nTwoF3+|RAZ&bVgsMxhv^FB}XSW7CPx*+AJ`>$0fo2L?t#l@)?FM5LzsO!QeGIK}@vGf?EmM?s*X?*c$3SjFZpa%!AiepmsSG~=4K$Zu diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc index 9fc67fbcc8b074bef210b32d5e8c153dfa69d3d0..684f50337a7c1df51d21b16ec7b6ac589ee11c10 100644 GIT binary patch delta 6634 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 delta 4656 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 diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc index c6f9a85013848de9e33b905342bb154011028424..abc0ce428a5587321ee4ac9398e840156559745f 100644 GIT binary patch delta 98 zcmZ3_dYqN#G%qg~0}$9UGNy0jna}7^ryp9JT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k=W-#~ delta 74 zcmX@kx}KHiG%qg~0}uq?|CY9qXFj7rnto_;YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{p|XT~c4sAC&* diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc index 6e4fd3d95853c1077525b6bb090cfecf29ac10e8..7b18920ce513dfc77f35113938625ef0fb1e9a59 100644 GIT binary patch delta 1144 zcmY*YO>7%Q6rR~1JL|P~Yddyq$7xO420H|s%0Zxr76qBms+A}LB($oqHr|QZWdAa| zPRJ?cPpZU)u!r^t^iWZHsMKpExQ1RDs;bf^6EooZbz=D43O=Hm01JiX{ z@AhtRO>Ffx+z%K#(j{d!f?$+PlZ2vTU zqjIxz`{;wlsm=C(z5u~bD^=X!X&z`KSf(FDylzrFF&| z3?>=85dN&ZdXm+Q2a3xJc9`UpEX@OxS;#j)pDu>5mv#U3+L4j4&TqT zZ!Yf?$1d9&_BXTF=DwY~diq}R#Y=DP@kp7z^-w*5%YUU&sdh=;d(U=_fkjTy^I)^#@qYx^ zk`x62DlR|iA NHxcgTJ`q@z{{facCH(*Z delta 972 zcmZ8fNoW*76s?->S$n2u%N`RZlQ_<3$RtG2gG3ZT^k6h1NFxp%tH!ibJ>9A9C^;$O zK@T3J4(8|r2A6~2)q{9)xws;9l!zjDl2ODB57r+qVne_B|NZx?{{L0W<=-X!aVnKS z^4q`qt={Utp!b}-FTIP1Ac7e(aC;3IA-RT_VylLVA*Qgf9Wf$y)QH+KBi80r7Pk{d zqHTwnW+#oLoib8wKf-i7ZKUmtk+HKzR&r4qAu*b(t0aC#HS#1uJEY%H-=z{w5}hGL zRgyf4Na_l{8G;fKGP;OPWm2!SNm?dk04%X2lX1h<5pc6 zahfKp&QZpk6AouY3@Qzhl}CEr5j2 z>K3CMUP7QcE^YFtG{qx*(|8h8Pzcum;s7y#AqkZM49d(Qxlstrd#IdtWEJm$aA3kyco8;#_uL zOlm*FUgB-`P=8OLTejp1N1v~mzB0KlNy?OaE^4{T`qS8R*zkOfAk_-^UKEAXyKXek)u s71X(c;%`uK6_uW%(g!rKiuQb0RUG<^B(!vl_u{2|3yB-~MHTk^0~q1<+5i9m diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc index eb45c65ef3d2014ae91e896dce19fcbed5ff4b88..4339466dc48c3a216f207ecf1811c5c19cb1285b 100644 GIT binary patch delta 1122 zcmZWoO>7%Q6rNfC#BuDk-FnwaY}fz)#)jZFZsUZcxP&$ZrA+~`LP4%)8e(?ruy$I0 z4&_iGqEa={P~b*5wNi={X)oaf2M$0F#A+%>l_P-!CyS}jIBEBWvuUSc5T0nR78Hg z%28I~5UX$u1#kofv8i^E@|?$A7+}f^W)xzv5(?vC6v0}@vnYyPD2DBG06XxWiqo|0 zgbrNPv#co2vPS=@xZm_&1_=nV>ItSBqpRGArRPPgH0K+2y3HYV#_%b8_FDdhCgbwx zeB~0ZRr2LVb&=qDtC>H67ORyO6X$2D6&WkRiE0I5@>c%z>2jWdM!8n0&o!o%Mh#b6 zYS?tf1aHum^-T7jF!9yP-EjP7>a*0XlXt^MmdhVbJu(3CINTH_cKd)$cx2u8)ZeWq z%&<$xTp#$h?1c@uZL?pWT$)@ie>}A^MW5TUg;^$lnEvAOo0;9T7gXngcMN9j(^PD9 zMexEt^>aal(5ikdUWL%1PWL;wgLW3bZ>}o1(!z>U6Z5JvST{kL{umflgTW!lrFzxx zLT+eGITQySiM&E@MrN!xnDz(uHb0`qXz=n+LaxjERxfoD#de~&#UJeo{*DlD3-OMS zZVTz##ZIQw&XhWt@pfkXt}wAJMmu7*EoQskXvdpvd$V0z=GIH=a}Nxh&-$>pM>N0t z{H_yN#Lb>i*TP@tm-yw@C$sC%Y?Rl>-skUGj_(?PC9EXaAySs7lnk@VGW{+39_*!W z#3Ccw==VJf^9#9GFXB3CC^==m`dW@ul-Cy*ls+vg{4d(VZ?@QdeIJWJJADvKLZ15K zK2?gJgh_2=Wmem?o=S{ue_BeUffi*vrrc((_M0@{rgst<@rfNUz5~+w6aN_u?|{+{ nI7V&BU!j-&k<7>3@M*YuY8PmBqyNjm7lA$e&AEpGVQN>23#Epu1cYcZ)<&1VIxfn%&YlYzs4OGc6a_ z#5HE4OLh~M920yn27Pf8)`)3L&=)tW4;Wu)K)WF&YvSsQJ~X;<%_c@q2b$HBnfbr} z`@jD`|G8vV#=m`$`Oavh02!0_{+#`iU1P3YHbEc&K_k{nX5Oq|t!R;~yj8)~qD^Yx z8x*V)?UI9cC|EBxN=>=`I8D)Cx#@B=O9o41m-T_5$NoHg5at-p}dy= z4|Hl19x;5EU`E}71$EC>3DzrBe2-vLeEb=0nIc>R;le5~3XkFJg4=l5whDWLb@U+bE6#44&BV|rb! z)svOV2E1x%gj8ysy&W>U&w`JS*|Djf~%maP3gSyI;Y60!oHMACK)9TpD z*n3?YE!*1LRaz$Bav~NFNl|%zAuUsQ&D#hK_!F-O(m3yJgGT(w+oWa6S&jG~uT>M8iDppF(mDd+ zI=pA`BRy2ED> diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc index 8a56f15a5ed86e9c23cada161f9af92a5019fef9..4695f2db608f29671ae10181a411ef413712fb31 100644 GIT binary patch delta 416 zcmaEqbtjAWG%qg~0}$9UGNy}f?HGI|DR& zI>Y4uT;h`j*=Gpw)G%c6fvkgq%?H_e85yG|pXZ2RzQCckS(lSrkn!wfODPqZZrMAc zS~qz3CrHhRUE#OG<1;gp7*_|^cV-5lS#?qotU$U$cJn={HS7YP85tNF7{2fUg=V;4 z1t7a!o>o6B?p85yTe zKB23rurTMcpz&o6<1ehttZZMn7`Q}wWo~HctVo(6*TH{VSbnm!-a!Kf5rywStHnNA zF>r|A;o$4%?&Q9~qYQLtzelIXO8v{CRx9-v7*9x^o-sLNh5p6K9Qq1|EA=jmTCUWC r3+r7JwYjM`9kMs<`3*1^4ShT(eG6K!+kl7re&&37+Y+i&3 delta 400 zcmcbU^(c$?G%qg~0}uq?|CT1Xk(Zy%AYVVUIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC$FIfZQn|2-xY8WOj;1-$uL5^ed4R$t0#<{{;kU!%Gc%JIR|nU3 zW}wXEHmL{>ApHTPZ1ZEOHSD6l7#SEE7{2f^aEZ@wzrv~Vfx(tlWb=Hb2aFs*287qD za)Vu51n8X?3_lteE(sdXD4w7^U1O@oMM2}ur89l?Q1+u01Bdt>4!(Zw zPVO5#%0RdGdvtoN(7z^XwZM2n^7M?!8J8wA>MIzm(7PsT2^SKzyv$<-w2G7K0~Z62 b^bEfX+*%h{w7v&20?qsYvUYQjJ{KDRvpa!q diff --git a/env/lib/python3.12/site-packages/pip/_internal/build_env.py b/env/lib/python3.12/site-packages/pip/_internal/build_env.py index 4f704a35..be1e0ca8 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/build_env.py +++ b/env/lib/python3.12/site-packages/pip/_internal/build_env.py @@ -12,13 +12,14 @@ from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union from pip._vendor.certifi import where -from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.version import Version from pip import __file__ as pip_location from pip._internal.cli.spinners import open_spinner from pip._internal.locations import get_platlib, get_purelib, get_scheme from pip._internal.metadata import get_default_environment, get_environment +from pip._internal.utils.logging import VERBOSE +from pip._internal.utils.packaging import get_requirement from pip._internal.utils.subprocess import call_subprocess from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds @@ -183,7 +184,7 @@ def check_requirements( else get_default_environment() ) for req_str in reqs: - req = Requirement(req_str) + req = get_requirement(req_str) # We're explicitly evaluating with an empty extra value, since build # environments are not provided any mechanism to select specific extras. if req.marker is not None and not req.marker.evaluate({"extra": ""}): @@ -240,8 +241,11 @@ def _install_requirements( "--prefix", prefix.path, "--no-warn-script-location", + "--disable-pip-version-check", ] if logger.getEffectiveLevel() <= logging.DEBUG: + args.append("-vv") + elif logger.getEffectiveLevel() <= VERBOSE: args.append("-v") for format_control in ("no_binary", "only_binary"): formats = getattr(finder.format_control, format_control) diff --git a/env/lib/python3.12/site-packages/pip/_internal/cache.py b/env/lib/python3.12/site-packages/pip/_internal/cache.py index f45ac23e..6b451267 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cache.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cache.py @@ -44,7 +44,7 @@ def _get_cache_path_parts(self, link: Link) -> List[str]: """Get parts of part that must be os.path.joined with cache_dir""" # We want to generate an url to use as our cache key, we don't want to - # just re-use the URL because it might have other items in the fragment + # just reuse the URL because it might have other items in the fragment # and we don't care about those. key_parts = {"url": link.url_without_fragment} if link.hash_name is not None and link.hash is not None: diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc index adba5941f74f78a176b9b0e229654f01ebfdbf1e..c35ae5bbf3f447f05764b5690383b71dc090012a 100644 GIT binary patch delta 96 zcmZ3^w4aIRG%qg~0}$9UGNw=DY4vE+4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOC}yn0|2RfAp`&b delta 72 zcmdnbw490OG%qg~0}uq?|CTn9r_~@&KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQQvU8US^|8lM0F diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc index 3a99add1a6330de1108ed7d205fa9356e71ee57b..82b46a2a54b3b4dfc072b519cf3daa7f863a425b 100644 GIT binary patch delta 2141 zcmah}TWpg@7M}TUw&VEj*m2@3PU0jEF(jmrOxYYi<%Q}qY#)qziig8+((m@|@?oBjTlp8aN@@o=BpVB8< zH`t0Kw^gJ>J52K~nCDF#G3|iA^M1SyKH~j6Pj3tKf(y>}3^tODzGW+)m zsQFHBdZAtA(mcGtm@zQ`hg80A&*(2I?+^P{iP0Ixi{vUOsg?}Is)6C5ks||R!=s_k z>C1xUs<3HOkx5ELMSSYigqWNvvg2`izC#_uxNZJ&bq(HoA#gy7i&7wVG;%tghy+5( z=*h|Wlq>}vi=B){|7I(zhlZ<`6oMN&-^WzqaZ1)~l^~McW;v_6q@3YcKXZ-*d6|`QB_>LG61(eDmz} zvu{pcpI$g#2<(F)?Red)-ZI18QR_0nCAIU8bJNW5O0}V+Kn5!;YZID+eds>V+qC!W zLzxil)pdIB*oR6y(pXA}&}&+xx2@V6Goia?Tejh)eI*t-n&4I4qlOP_cVxJ``kGAa zB{gAfJ7G=dVGE{hP^WJ=x72;`KFipRE8PdLjb+BN(N`v}Oe~q3bKM8mD8GgngYlAr zL^5}kv?$Ou7hb4&$MBXd-#)Nx4iUU&$b>JCT^h?i0f%Qja3t40Fr&(uLo3aJf^qkC z#g${(XJ$QfTNehGIv>mQXP$ZCk!y+>Mc%mkUeji0!MNw@_?1{TGHaMK+_K-aFN}Y% zb@#g2>^S80UAC3Y9m|%^>j!4{XSr)mbv4=Jx;lf=j;O zvTjG-7o7EE@MR5Xa=sv(HgvJ8)<*b;VKa+ro8VJJyX|Ul*}C^?FdLck+-keows87` zjy-?Ev%x&H7!UvMU9&Q*L;u>mE9~Lk!!_Y1<$J#Ru%BC0Rfo3-ixz=mgDw1su-GdQ ze7{E>-ogEsHH~5}XR?e6)wx!VU|y#VJK4Mg6BHjM4IIr;?z9Maem{#LT&&XUj)1R|#DVVq9dqy5eq{YzhwR+s56q|@B(l1kN zrw|}eWF=V?-BeOc#^uPVh*)GJQ)gQE?+cg6 zNDNXKnrCZw@fwi|AH04eH z2a=L#|IpcsZz+1QcnCgn)cDsJr4tePsiF{xM&puH~=Lhc#NNWYVYnr9=%dRGM`8phQQv=*~K_~qn#NSe&-`x5Umwo<*E{{^6alTgW dm`uh_9*_5m&%%rDE+K)jzH|uw=N{&$(Kqe$`LX~2 delta 2080 zcma)7Yiv|S6rQ<{y?49a*WFjQ-S+PG!S>xkDX#(rT3d)>w-kfC0xP?fUD__(dj&CD zY4lG?)GR$gw*IjY5>3zq(kK{=f%rpE6Sl3=b%U{gOz@9cDj{Huai*{>5-?73zd7eS zXJ*bh^SIx%o!Mag&S=a-r1kuAuebDq@iG>YB0{H72!h2j{Eo{Z!3bbuY|=UEMp}pq zF@YNm&RiD!r z`nV<92z&KT*r;>BVx0{R>fAg>cMsmvxuKh}!)09`c8ui7&?(p}nsY}b@d{F28MnZY=%`wen{lDfrA!L3CdWqC!dIdX)5B2n zKawpf;z(-GPPnY<-E;1GOtxwrK5u>9_ z8PY@;$eXnOMlVGsudQoyU{Bk&t}X4*ZRj@nGE7X(2;qUl5hXS-{+S_!am{$4(SaMa zhL_Z^qBa}|D#3yJSM~?BNU)(jtRB!}2OAC&OKc$6*RVg_*B3hyQ~E-1#I&_|D_O)$ zKDCWQXb5F>NGv*A`cd`i>ItD1^3AWxX^V3fvAi_Qr48mp%cP+sT~a#S^;5nzD-asq zHAf9op3V1o-ffz(7XW8z@@HA13~$OJ(%ms3i#zS9m_^v?O|;*#yOZT7pU<*HgB_NY z&Z&ac#ANg&xLX!SB6QL~Ohyl!wfMvd+tOLY=_R;kDL*!`;^liRr-m4BVU_oEkw+2eNYm6h{7q3+o1!}qLdHI3Gy6Y|-#R_*|x$b(aj^MW~hQJ!` zd(PI)a5wDEZXy3h4M#9#F$82bRe}jB^ad#_DRhsI+BDXL}2Alwnm(QRqF$ z2>oF#csQtJ*xJ_-{@{4J+Z5D~VAEbhE zamrdwYww4Z1?#w}Re`%OSm1IKA}bIVvK9H3Kgdv|tfKJ3_@@P}d=(9~idA+}iYA^B zdn0|}fna}FrB~YP9a832-vy468rK-1R2s$xMAbqOMOjWYT|}j;XZVOpxGMdlNa5F# zn&oq4(eI1(AKXKIlrR~f>Iu*i(YEekp!C&NC?u%E-_R)^uus`)?$YRnHj&G1a?K(= zUk_L1H(A=D diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc index 7324b283f5dab8bc9d895c06e30a06c7525f8842..afb86e498fbbe1daccf46bcbb4ad7fb6bd667fe3 100644 GIT binary patch delta 4946 zcmb6d3v3+4b@ulDxA*bgIp@Fc{5xObFPMDXB(@Vfd}I=+lR%cw=5o7s?%2I^XV$6Ri zijnTUH}AcfH*a?4y*Ky8z5m(g`_SukBieQ_%uq7=tgj?5G6+3~M8qSJ5iK&qGX}OS zW0q%)zLmEc*v8uoZ0GG1vofnVcn1Sxt+G>b@h-*9yA==bF?cqaQ@p&_pzV~l^FD)i z$bKcj2PmCqM5kP&1o@yLaLFMh%!id?zS!uyR4iBig!DrJ0`!S~4JN(En` zRPvQd6;g!6z6*{TKc6 zMr9MoMsvuSl!y6RyEzZZ&*v`vPoID?H?JI zr39mUu$0PW2h&3%nEac0jj@x{mSNJyUS_V4fVG7wCSBG_W&?T1+MW+cUXhdBqEF%^ zYbiA>IwkL*Q!IMI%KO)F1Cra+8MJ`rpj8Y~t)ewrUdjzoZtxr2Fy)4(&=|vq2T&q{ zqjU=W>_4r87N(XQbTowOf#DG)HHFiLPdHAVam3nyj~f7Z0Mr5~1He(BI|M<@r368@ z4=1rIVO&K%bF?!q5_I0}DGZI1jI-m8r&|wD6}447k{p#X$=2RnYDAH;n%deYj--;X zk*x!%q%7fRPbw)&%JJ6z{@zwf`?9=oXbcljr`Hs8)>8F#{OefwxC+> zLXR;MwgFU&G$S&Bb{)b!lXeZxgwZm7lQM9n0Y%${U9^jAnmOYzuNi|hjxgnwT~4}0 zmuZA@gXRP&%OM)uD+JxQo*2Jcv1M3aJVK&+g z4ON&@t!jmen$#fst<8T+KWj`=)X)yo&j4)Xs;x3M@Ed;Jd;{xNP5c1eo4DB*-CCnb zXEu^^Wg)+(U~7WWn#l8I6>X2uZNqh1`-bHsfQ_ zFX|JyRYMFv+t+`;^%HGgHBr=@C@*@~ov*E?8hrKvG>XR9Luiyq`1WG(KV^ym!!-)g z-_B6G8-23+E$mNyA>k|}rucW8~;4Ykar;ayamu;6}* z@Et(2Mz}FT6*fX17(8*}gc0;~H;su|2@7~6JDzVegCBH-QJfqemT=2)moOQvTf7vty?mGvSXTEuRI#^MU5`f##W^xxnVHer#RUyKY3e z$BP=!uR`0{{g4aQqq$Lm8u3yq_IPGA>KfN?xYDzOH(&=R@E@}fdIk- zE&@;t0FDSQp+L6{V=&69$5q{~Y9h^8xDKxW%FFkd9G$go8vk@300Eqvt0F}waFFxq_~um;>$ zkkeKAFE{drp4oTv!Ar)Xr+ZJ;Uf>!Emh$VC7QccVbb34T24{mEZ{GU5&fj#- zaeFTM%U>9Maq{`ekNiywfztUv?fF3Mnb5DxUMZUkbWp#Z?qBdnS6iB`*mi;IEEp=- z0o95th;_xNG!ITp_rKaPweJGA_482lBQCn=pt9@gApLM}mi0u?xrpmdFMBS!c~=Gd z)&_>sZ&h#r8#{M5vTxS_=k3M_z^=~TF7};mzPBwhXAX)jWSC};vw}F%hKUADh^1_%Y_P-$#1y`^HcI?jut6r zuW=g~TBZ1WW%pnRYPwTBI--fW(JWSIcTI_7Rg&rKIA@+#==}_IASNsw(&~#v#q&iq z=Zk9Qit5Otz6Li6*3TBzU8g_ty6-;Q-)PD59NFhDA)EZ~5l5idcV<<<(?aA6{}v_; zX{FR+)&P^N7NHi5Hetz>kU+R>LxH8OWavxniaOEYPmu;P|NQqIK8846frMQf(E z&^IZq-lS+5v>e4(Fzh6444SZzd&|Ok+%4KxC$c5+YIuxUvykT1vL#wvsYYl%YBl8< zC}Gz%4ZgC`mKQ`W2km68C|ny79XDTw=p;LX<+di#m8m7?>>;u{SWF%cxbmygxjA_O zi|*~TLw9{89~NY|cLHTP3w@JPw`w~~+AJg0)!$;x7A$)tu1@|p--DfGHdtKSZJH=x zd{EnM_UMwk;WU&@ScIs_)cQ=y6gQ~x|8qz0b=NToAIYg{?Kp-~nfxRCI9+5Uq$LfHfCMs$F%>Q)uSKKPP>bu4p8orK4h;x>dwX{E_w@>U z`g-;s_-@|-et;}S+lt_N;v^_qrLnYzy`(+1DGwDMt_BbQkt>x<9hC$zjd3|J;l|+% z1qoXrjw~fPNOyW9DUT+PtAdnG9+4$c7?fzb!;)&emS~ON$8OvOg`e?UHb4_d{!W_e z)%X@$Y$mjbD0=mnfquXL{n~Sf403kh;8l<;Vurj}zx}Q~jBV$1-L(3AVi5s7!(KD+ zlFOSh)X_`f*|%Jcv@HFJfT1qNPXd51OpB9^4b^0zAyj3Yl=~@9FB(n{Lj_0A8vQ4t zB_*e^i{u;PjGMgNP-QpX?Hu{Ap)TNsDU1pU${QRY|81zULY+h^;-#c39%CXT8IO6O zR>JU@qOabbc-W()>E8knhH*JL6R%+^$e-fHcH<~lk?rwP?pPXYBlP8-J%+1^zp*6$ zBT#+-KokI6Tf1*ojA4gVJC4Cw~dn~p)Fljnl$BOloTi(@R)dY{azA>_v~=r zOOu9V?nEWpN!!w0p_Yw}BA6(mY@jlYKbt5kUjk_@ZPoIK1k*ZgnkEtGI=Z4sJLe`& z(!h$QUCHO(d(OG%oOkZI_nhm0Z~Ne|EgR~C&<}R&DUm>l~BT__RO9 zs%H37twyhvYV|s)PLD}3Jub!ddZ}J-kQ($xsgd!xwS?XzHL|5^e#=M z@9`0OnSYUY&}W1ZzZKk(%jOIdsb)5xqdxH>f0kYnQ*}YbuG*9m_&HRE;#6D%&i&i~ zuaxfdN=_w2H`&&#^Qj)ywgU7kPPI%eEzSl6#0}UK|2~`KSC(>l0UMw%*(w6%Kr7$R zjq_4)JD02=^~e8i8y5Hkz1PtcY=-rgTTzV+$&R35BuS?o@pi0cs}v=-qTqNy&0Hmo;U1&GBBBiw}Gghz9Oa zjPw8`-Sj)9RsL;=wFB78U2u9xFWp!APC2rYn~@>_h`|CXyKmy}rcb$Jd@p^?-I4AC zLXx+F{dw~?eMD1rHD{{I7DDnQDUt;NDvfIZXzQ=Y=^9OnA{m;30Pcm?$sGUR>}Xy;=#DACHDB z`2rJavpjk_o0BtnuzTFJ>@rR*hn624%;p9yr!h2YD*3S-xeH`2_yG;EA?Jjrs0C-c zkY^CUUT#*fx#}(iD$WP$PY3GH1R6i(cyG&vaP-i`!HFY{XTtQks;Cc8vxvXSAbqdu zUeD{W3y+l?;wHIap7Q=6-L&FO+7U_d<@DvU;0nHYlD=PJR)8kfCWYZj`h!T+y?`;R z=$$3i^bZklK%5jw%Eb6%ZMcq}@CEIHA`ZtccDk8LgP8m&`5it6>T=N zX%5G6!x-Yr+HU?DU8_)6*j|*!b7pIC!Eg$-^X)WHQ^9wD>|j|?DOoBV*SZ|tumH4o zA%}gn;smSPsw?;|_PtANL2lkf%c`UHKJeXo`c!pA-8YKbUYH*kOFc1XUFmhK>t@z% zWY&G##JFV*?AZwVBaul#t}7zV&BYNTPu0}8mpk3fD8H?V7Zz429uotRHN|V-TExMrdLrU$nX>2VmlNigrtIb& zMfTx-^lZU@EU@S&5NV$jCixfU;{&AN@mSU-g~b)yxdx2rui+Zw#>M-&F+N$|pA;?E zZk6oH8(9-FgENR5-vD?NfNu23)Kuf>}}=gM$S~CvaBwd5RG<#ZU5(3T*xCPMgzP z{zi`UOf9it*oFR& z^OJ%Cc4YZuw&D!{r)j~`VK;K!WLLyvCBJ*fQV zyccR#fWMdcahacYEdS{1`#H8m!vo;Lg&S9Kn2kl+a1-9|Ugx6L10ww-T1!7EbGVn? zn(k$*TAfQa=o(wLb7p%{1AN~NxPh?CHDTA170bSE&2_&HBw~HR8c2*4CEifFEcP&4 zvxb4Nom)8D?*0iOVOTbj%?#Z`r^>%qh+3stgB5tWjB1J5oJlZ>tP;$^DzWTPB;}z~ z)Lo;41f!PV3A3C~cbVBtTC+sMB%}-pm;njK7AZ%7@kTJ92}YS^A0Z$e*!LJ#iD4=r znCw7@S@ymyy*q9pF8X3{O~DVCq@5jbWJ{Z)h9#=w8Ox)oyH!ojjq1B#=}ur{MH3V? zd-u+jH9=sL=c@;KjHE}PNSoMNED~6Ck?Pj+V6?F@1-7UpqmGz{JenJVVog&OSsgEA z7FoVR+{>u;QMk*lK$&4{4J1FPNgOc`%hNZ{L=#5_j%Ch9J5Gf)BAxJoZ%l#@G4~aofdcA@=yzFJ{84aa9-6 zw;kN}?B=85Gq;`%wSEPE=ebbl7Z*c`nNaggsCFi_a@J+9D*udg1>*nka23(7TR*3+ zVZq1(=sVJPwBc+h^%dIYxZ6JC93Z}gtB9P6bf4^eYr}~R=R*A#!VS-kJva6A)cfJC znX35ts#T|}R=pDZP2}asxvK7q(b$i-&V*YQG=ZX1jXh^Wz1Qd|%(;Q_Hh#v5f#kds zj%JYVIq5>4lNB9Xyy6=U#Ju6{DKtX=X6FWgZ?z==zFmowq|I_+ zvNQ8}&9LkkTn53sMTP)CxxEv|;|Rt8uyT86Y(6fl{!6T7CfdFfoQ3N~XXckEd>w#) z?d4zteBmF-2js)|o$)r!3Mp^$Sm!JU-7B4!vAZO4zGjA>-N|#I=2M;~R@dJHuLid< zlplk`g6fh<%ZqOZ0%^XT)#4-uDhL)zte&?VbLD_)*&iOwswTM~DNzIxeIOR&OX*~+ zhR@QU#M%QIqVoVOn>wB~iI095TeYzXv2g?eB)Kx_%#bQ8SwdYW`~c`SCNA>ko<_S4IvE9UPh#XZ*G2{Y|I+O)qtw^RNFP zSUEj*#C9f__}Jq=?@6BaB#$8Km_pc$#1f6Wzc0r61%oC&=frtQIM=;kg|IRrJ z-+OF($-Ov2FIiq$&S+`F$iS;smXkc$1X%WDo%dxuO9AzO#k^>oq^U-OzTMcpZL?tS zJluHLcp^E=;rOWdIqO-(C2u61z)toc*a5)u&EL~0c>N7z2gzEb>_>p11G%6-QMZ=h zRuZ(+@{eRkQu1y!r{qZr(-)aWbbz7R`GUuIDx+mdDgAk(nRnAS6SXCnUWk|eEz#&_ zcC$2v8HNOCZBs4nX{z$De8$q2RZI6ag=oIX&99)3G{xPRw^*24RY>vcS@^pF3ndn` zRyAY)sL2(_I>suyN7YCAvgB@cFbg?x&)oTmA!$xg;cBm0_9*uj^%ivzDzNa15p>ea6B2AP=w+Q#J9jT1%<=xU)qy^GK=|RcviDO>UZn;aFPueb_s6ahyoD)~O z!?skBWX0xQ?OZ3VaoVZ^u8y^mKd9KM-5oAx&>QgE94@C%lFgMar(0UvWwYC>Y|IE$ zt#SH2fyHuQjpPcdWhuGBj9Dypx8{aHlbRFi40jw|c4*T@Q+c;Nl9C=u{3IoBhZxbN z4(f6SbUBB_!@5g4>vgThWKo|@^%~Nx+NcolN40^LmZ(;Cu9I6?wDoq3&z%`R$;=!$ zH}`31!w+(I!edyU_d57cYf+eIon<)5&&2XlLL0W{|DM)HrjO7>SVr*U)(JUcH<{gd zWWun>MSeU`us?~LTvYvLfV~sT*c4M3M z2iT@I73V@em&G=V0dB(w&AQvT~oRIZvkolpU*@MLAgT-O77;?fD)8L zcy-b~_VC7%)|}@^z5VV-SXu!2v651-J9R%sOR7gytH>_74?mx}8TxR=v|@M- zw@>>}e2oNsxV)@_1v^kSJN``)QqOjKLzu-edo2(`PR5tgz5BLJb?~62J#H{qX2_B_KtYq;Yas1WYGWdt>)Km&4sL4{pCl?dK}@@ zmzMXJ;eEV3uU*?;eo_dbK!Z^ZNe6?~eoL9fA zya}W4^lGdS>QDD?(!$61*aO8dp!Ph_2yjXLr8WV^{a5!4QoKRTSlG!XVPBI)J+aUR zdFPn7#wyBm^T=liJg-i&cybZc+N1IdL)69$u~oYG<65{Y$9l4Au7 zW2TVSgcP)DeZmORxI|8G5zwim?RrBNCN7k?k{P9Q_{OXI#4+G4{`AwD*bJIGf?4M-z zdi()dT4^qFOD)b0UvRdW{8rW^{CGYCKDDQ5t{|SI%znf#SFSfvt)gP9Q)!hH*+Tv^ z=v!52RS-;gXXQVPHa=_9<2aqQ};T@0GP0M^&+8m`3rBu z*{)rNsGi>!N|5D-XI%~~bl3c?A!1qKCU>LJ;FCN~S67Kkl7k9fcAtlD)L!W%KqtCA z?OWDTZUI6&p@Z-^VI!fNu!FFZA*xrrYukNNbBFAcpCs>Y!X5&@^Fn0tYl&YrVOky` zyh7kZPU9%^dEyheg-_8ma&{5;D4ZvYra&$ylo199mk7LZBV>I__>Ay5;S0hQ!qU`EXs&*^a=yK~ zs=21RvVQ53YKJ_IBw2*WD=FUN9nib~1?wwiRNnm$I7#u}YI?|BR5^s%$=ch5Wbf6u+| z-gEAkSK;(kFuZFp=s5PP{^Dn6V6Pz&`c7mm14x$xutcSGtaPk$sT?ci*VW_NbQjcb zQE@_~pz8vMkv;M3F*ycY9Ba+&neI~IMg5|AQ@&&uFmFm197%XdOS5oX{Z=8)ktyh$ zszmlC6tn)B3z@}Q3sxBBEw}cm>bD6-Ay0_CMUy(INfXM23SqfW>C&(fr0w{Z)<)Vk zRd$9vWLT(~6DX*a1W_tzv5R(J{sT?+pxa)sSddzR{y;&1_4s{uPeGI5@%T6UMUO*X zWlU9N+{I#S=dSBHlci@4ArI?*sibCpcXvQB?cR>IjPCJU-=`mPpb28rn+jz8>O(511nz1MSS93F& zErbTb8iE%OXIS_SGCT17jB#EOdGTCkZ?s}6QZG8Qeg`iK*+KpZ(stq(+3jX!0ws*1 zs-d2p=*vlmJ%~9!K&SjjZYpFevT!FUstH+y48qDRYe%=4e`$*G=_ZB?E0*4B=@ZrGN zFee2L$Zd0G0QBSD!W=jxzfzb9>ESJ+L4WV#AidHzhSZYSC=Osm(KZ;sM~iad2p%gM z;*XGE0CyCZv0&$l?*JKpE52q4yQ$AiI7&E9I7T>u`rET3PBHTQZ_hItVCSiaummw!oOd`9VP)4|o@HT#Y_nj~#$KP`k!iTM-lJb4c za`NJ>YIq;_FU^IE^7*Cp0GDKIc_iHSUkCmP#rp*BuGqvYS<@`PRbZg)pe0lXrIEx#r65$-SSItecFnRdnW6F=$ z?QVN|+pcXR)3S!AWerA-Oq(+tQ;r{03GA>-s_%oVxUafYeO7x3->a^L@6lGXgGD}6 za~X{)G4@yVN8|qK*9LargQxgR(w;YJF$d zmw^sp!#5Ct-)-12nUL~>8_NKi<&*X}03*Kjz)JWQO^s!fhlBNvd+>T=wLYW^img&m z3i?F>mpYc*k_Ad-wcvA(dW;Z;;A{Cq;SGRR+~*2(cxW{~f}ap1Y$j|WD0kUoWIfIh z(n)S_z$0vE6+PlE^6nu#O;B#0ZnBgML%9YH(CZ<>VS-YgR9d1^D@rwWDD_!H&W8v} z#t)H2$u5=8k=ms>ch(T!>1$D)$P^ybm%_)&e#6>a>O)^sgG zZQ!qIxyYFlQ5wU{2_2_f20tYla#h=>btUxJdN%ds4aa3(=M12ln8_8EDuJetMP=R+ rD3MKN;3s%4dNurHjxJ=gPB->w`{Vna{Yk?Kv#)c}Y;-1;Z+iAm+yY(M diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc index 7b229c0d989e28460fa50d5d537494c297111493..0c0490690fc085b7fe4e0ab7bc4786be1a5d24d6 100644 GIT binary patch delta 140 zcmZqUo6g5`nwOW00SIgv8PhlNh%$Nf>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9ZunYJ-922AE) p(UQF^sC-*M^gAJAU-+SKw9*G1Al%pIs!LM>(R2 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 H@ZtghB3?BK delta 132 zcmcbtwo8rYG%qg~0}uq?|CY9qCxO+VP(QRdwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=f3u_?b*~x5db)1)#%)hfTOR+tiJb_J~=`-`@Eo?s+ i8S^Kv1VDoTrf>Q%E4(WQlbG@vY-8FY+ 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 amB61q2aspOeRbCDH-+tNs&Cwi2l_9v`k^-f diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc index 06343e509ca6f856bfd4f70f8df7d7659a45eaee..a40cf81a1bf23b74d9230789e5e4a5285f09ce8c 100644 GIT binary patch delta 1875 zcmahJ{cBrQ^xpTKk0xuAwn@6QnQPIgOWf*=&aER`$|iPWu8d(|bXnd@O?*kpeJ|9O zl$0@{-GpU4-8vXD&>tL|FcD<`!w}jTX?&faupj)vAEFgM_KTkT^3jQ+7w$Rdp09iE z`M6(tKN@u1@9MH6SO+kkzHYzb^1bT92wg)mlCg@CO^lNm&Wy_B*(96il3boo@_8XC z_6pr3-B#y|E4_xetodD9}O&gAjIyzvF45$H-urqv~_Rv z28~rA=tO;kzp=>PbJ@4-GyW8YD`}{mwI~)~?}WYiD}dJ#rd7o{(9I6m z+!WI#LZA?YW`oeIrdv^4E@-G8*qciLuA!~0BR1wN`9@b(2l5rW8afX?%K+4-G z!vE*!KeB)!_%L&Pz6UyDnkbqU8j(ZA3_yFBGg)m;GX+hTizVIUX9+Z{$!FA(_Esg# zkQX2z>!BKrJ`^Im0GTdJZEB|FZ$3OlQnQ`o)VUOi>{pA>oZ49A@2YVy*P;Lx(L>2` z*}iOFmwaoIZ`B{U`}DoNtGnZC{&-C~M1_@(^lK@w2{wq(Af_pW(CWc3Z?aja1I;#p z8Y7b@N=lxiNK^E%*c>ctre2~toyV9?0^>KOHpi1Z4?>M5Fw|VlM|M~K@hY+(l<3wj z0{8*_zK9xjh9CHtZ6H8*4qNDMVw0X45^`@_JW_XVyZBl)zBvBSGq|FEqJxdM}1Lg1#p^ZfL826;vU|=RY6PbceP)H%AM$&3FqRnIr z1^7LQ$9T@R1AC2Qw(w!{GPUW1MCjGGkmb;-_+x2*z9^SeWsDpH5&fJr6F`H-7;m6$ z8^~^aX7h8S-=dgt-*)=!QS8Cqx~s2RS}rzNpc?{mc&ekzyBZ=rNl0)nm8$YeVin%P m@7T0aZUpVx{WI$X%WiMO!rO;$PF_D|(ckgGUwDvNQT+vBf1&;W delta 631 zcmYLE&1(}u6rb78d~RE_NfR}tNQx{breY7NpADRy>Ac6>H$dy@PxTmZJp=Y}`MpU61EmmOqCZ_tI z%2yla@(}sJ9S%p?4_%b;cHL2t=7NOsL|ci+NJ z?h9z>yd#$I`{xbit%7HSu3xJaK#h&zfOrv&RYvWkxIbsH(^MbR*;yCCnVAnr&fvBhPxra73GL_J%<7scu987neiV-juT zsA4mF=cN4by7K>KM~l<`uzw>80v5*Rz~gW&qeCGCX}H9FgwfZ;#sbiISk~8 zRQHQ_xjF0eMB#4s8*t?8;q#)AUllL%Ra_9C^3Ks%?e?Q&9hYP4h%Z3mb%39#W4(Y3 z89l*|1I6&d#{gR@#&{D=iVIc+w*<4U95{}IN|maMoGJ*ZYTuiS zol5QM^qb$jdGqGYn>TOnXM%pFuf1Je9VhVJPw9M+C*))7Y=0GZ$ktCOA>SY-(TGXS zkWDoTtzw59MN=rs!gkoH&?+Raup>@Xi#nBBr4!R)PF#yidBm=A5?Vs?s9o(OwIp4` z$(44ElhRUhAO^fvtCc)%*E#iCz0;sI$bOZ*%W2daB~RE*PFhP#UTrr!En17@NxRi) z)7m7jvD=*vtwZvZ-RY>BDtWEl!#$!R&sci98Zpf)IZqdny0wY)Q|4Lc*+2qhuH=%TqDzPl~k_c}xnKW#r7SzIi0 zz_lF)Vtc2vLqO{8bau$RqK%qOENZ4%bS`W*zZBN)3z1o3w!B2lR+f5QDXVH@tD$V$ z^QFn6>l>Eqsr~{}PqJs0EzTU~`jbV~aSYc~&lw(53%22TL-F|O1!mAid2I0A7w-7`)^Ow0RzS^-xyTtj=(3Wmv?)%>wzQ+Xi8sYSz`FFwYLi>%;_ z=PM^^i+EUV5&P7=_uUKDy*7Y#@?mZ7g+td94V#J1jYQ`qdg;LXiR?{<)b(w_I0?cY zv*&_naS7M*#COzpmCN+FSnle~C1E^U!E?~?0fa$>EP@K);RRAvb$y-pi8s4)bX@$s z>qXijtljO?5!6Bj9t8*#%k{I0oW}Q}6s>r8kWZ--ybo0pE0({Y7i?y@%S-$Ki1v!N zcb}&HSJcb}TC)!X(t#lK^a}41Kkxo_0d6$OMuG}&d5Q6$Qr9il@^w9^EI6hPJMx0K zVM+#j<5&s!2u=x?_awK2p$cL;EDZUf>s}c8xGCur9}_>?qlO+O;+;LCk$yBVAmTlL zOkg-XOnMde{z=dA&}kwL^s2O9oax;i3!+{*H?F+cn+eg0E8olJDLo=K`g@zF(Z~!y zkXYiyc@B#DIfL_AQJZU6JB$Ny+jxFeUs+(x=0{ObW3zdqu&RS{(SDZkY*i3mGW-QT ziKD4GW)2HPSxuY3^9)EDPmihNJ^D*D0ggt+FgzEWbuo8 zPtv@o8tn%k?irowgcpf;OHF@yz3qMpYc$+nu_iHkjUl6a2zO{ClWOoHs z1t<(YhZ5_1yahc;BP;*}5n~BYhNB(nY7m`gzTx{kh%wXhF&{nNh^h%V)$P*k$$Anf zpc^QLyDIaLpGUR$oaLIjZMjc-{6Mu_W3I>@!w-V`KaO0Ag<(GH;!f8pz)L7ZTUgotx?0wRG;n;Xic@Ur(j4w{~7{ zY6mg=ZdXM*lj7H7!`0B16w*Af)j=B4qGEg|32mv7G_-EkcVDaT7Eg{(c9DiXAZk`O z(*xJi1KS2KHNMgGR_|>k1g72@S5K58q^)POb@1KRK{T1!O!sf3`!~}=8|k5|`H5@k zLm#zw-Kvdu)Lo2&x!U&4RAwWUxpegXRQ_f=SixC?x4KE9W&@AvJu!apbtpG~J@~KO z8H`fca_5RrVr3vMq9kS)%P)v03oR5is8ux&jL~j!6tMrwS04C1r4NbY6Ax2eyf)FR zzXH>;QC@?yBLxm+h4EVG@K;fyEOEwP!)^)y^zJ?kGVnONd@sL=>{|d{6aW^+4;EJs zO+gB>Lv!HxJBM=O@m<|(;ky7q^_>Tyz@QxI zS<3GRsVw*t<%eM(sv;aGSAO!)3v~K4t!VowS$A>Y%T}oZJ8bZVib)zL zb#0|8NfRWVyqZ)uVqII+QeX>jYN1^|GiW+H9z=EBEEeENi(*NKQZAI~aWOgFIE9-E zYL~2~At;-0POf1O6>LksazW?+$cNxovFG$c`R@y_LiZEm&FPK^-Z7pOA5Uj!jfl?l z(UcgT>8G{g3E*|&rI`$^hvHc;{xMS}emm1Z8^i}QJ#?1{&332oW|uF&tO?EHo>>+C zhde%;p{?RPV4L{e>~2+_R|o2L0t7L*_s8TD#V?`ojF>$UqU8h(Fg3a z%7akImu>a{{}puc>GggIP*NzRH$xRPyp<%h<_2lML0Uf~gYS{SPe}g_(szU0e}kM6 z9~>T3Z->G(bdvy-AoQ&lnl@uC8?lyGN8gKeuSZIiV(v($x0GzA^%uPof#y|j3!7V` Q=M@^i+T8z7faVB2R-YA?!2B^-h>s1z0UVdDo6WNCNm_XO@w^p6is)j8 z#=><1^d&)@d@Ne0#wAT@XnIK7a{}#2lhdS)7UXLEBGu%?J&n`TWcd)jk zQFcaLeiwT&$wiT3e=)<&a!JJPcQf1~mqyC`Wem5<nW8L9GDG2AX! zM{4{v40p)2kve}J!<}+{MDPm?cgYQrMt>v2i{z$cq}kuhUW(j@%J#iOkNXt%>Nj}%jMokpTCdc9(iqKoqt{A zasT6y_5Ss&u0q}r+34TM5y?W0Vv-Xpz{>>cWiNqZ{nV0=aDQ&&VW#9bU#45=y zR#(F75HHr8(fgm^$!;Rno*`nLRCZODqub7E>!DVV+|u@|`ds}EY5lP?Sv(7cYys6@ zSY2JHolBS~^-_3?;hGANy9fiU7jPu^MAZ#P)k3|!~ za8wZzBa+Y`i$sD^Q8*e@Bq1aR6-B~^U_ub3xC9NcsPIfUen?W3a4hPxS`R}fMpp)e z;V96C6(JH6M`cL}Qc11hTg#)dgf%KjVmLZ1h_SJ#91DsyQw2Y0K#;WyWra5uQm5G2M-)R(0^cG;PAdff&P7a z2L=y&b+i)+kV@kuMYkRhK@dKAq32lzPFc_KAPq)+M?oRN!JeIxay$`>_r#$k77fZh zBa$q~#$r?!)gK%ClXZa*1))lTl{E)ox`9ykFw;I@-V1-q7Xh3m3nuHl$&)g9rrU0t z8Wx;Yv(=xz<9u$`{9Hz_H3=8lY+*vsc_Ldqu0xaS)-q#8Edv2C2y zZ~SoCP3)fggg2BfB+brq&a=*0&r@^er{8wDGX|*r?XsN_aKH$MsNH$wNgrgG!R@h)+N7jnLNrgIg;6pi6n74v?3l=y!8kR+{Jj?{Pdwr}wZH8HdaxMU8 zPIS0_W=i7GsWTwFs(|cFg2(xSjKO|%SAE_h9*&1`6P=v(9g6Y2k;)Nn{=W+ z?}AS0CUvxUl2`9J%aXdh4Fxl}njVfwfnGnUNBUz0%ZvQ8&!m2(|0I8sQ+SZ59`@Wg zvHl>l??O zVPydN3~EK-hiEX{f;9^4lWAB=1QQ7`KEXJ;NzDjEP*0L)ggpJ;mICO$|s2uzd!fYT&nB;^%T)&*Dj`LP-6m4P`|??OrC zblc44Yx+AS>!$kOc9o=ys^*ItQbi3jO>;%93$CL;J1g{F+j+;eaZ3NT&6Ni8Vy{iv zYp2CId(&N4b$1_&MFD{>JG^l1FYHm*2d6393+F z@Cp3*r^rj7M2{K^ww;@(+btzv&qZk{I4UQ)A*cxsOG#14sgDmV{U#Vgb4Ugr6M)BvE=T&l|?NJ-GnlPCg{dwT23;;My?%G`Eww~QOYZKBn z!hDS{RpYyonD2Qq)$`=d^>=!nzEiVrYUiu_!QhuxT-#VzL*4_m$?Q)+xb@tS( zxrS|tW`a0|h9yNaCBhLYHk#1fLqSSxm_Fw?QEYvcnH*6jE zC~=-LOd4oIB5wfH_iWzsNke|C6t)o}2YtF;AYs zN;z3Lc9X_$>#pYHa>@j(Dpan<-Byg)3Vj}%GzA<5oI6&7v=OAO$=9xwKx@yx0YzON zUnvzHtYF!s4wj)~%XkD0a49ScxCl66bsb_WeDWA;hu|@(|2hx-3L=Dh^iU5yb~0%? z#_aTi4S~}9JM`Lc5`$=!!VQ>cwpEc7Iz#NK84xPoa?O%t z-2-BnYJ5!5^zmR~L^EK(s%S;IP*({^QH*az7Kv$=fs-ML8Gnk)*Yw9?;V7E`Jq+*k zDOQP!q!}R)4G)cLwvZeK1H!b6K7;KB@FOS3HB%BxRL86riGx1sgQGA93p7Mv6bMX< zj!WYdkU-A&P_KE#+++tvp7c`)eh0y`ID{!@MHEzD<~Z`cgYJi#iAFR-N$}dM!yMm( zhHVH4l>zXy;4hq{tY*HnB~{uoWqI3O^E&^A>9Xk!$7RQr@SLz=*1TcXwc)PKGrfMk zx-SL4w!RE+a5OE{ZMjpo?Sd_1C)M>+PrqAI^Y(@vUv9kEcA@QJ*M(%)^!OF;T*=y- ziFAGIY<=&A-8W1>aDCsEu4Pc1gq&?O1p3an~^UCf!p0(+Ure&MaZJjb@N{HQk zZp$lM(zVU6J%8!>sok#*f={!%=WTVjZFTAD#`$Vrs@ezj`&j+CCti8t(s0_lX4bpq z((ui;ANAbonM&?{^+2|D>nmIDR@A@dxa3Gz3a`~(s=a5>)jOg00hoDf_k7E`RLi>A zhILb>bM~|LIdfgQy=T6Cd#ZhVzNY1_t9;7&;qrctl-AxSI!Dvno{n^BWxB3WwPj53 z{*i);_5o{1jJY<5WpA>&M}ML zA`;xLM2c3B;Opi(e~ z+MbOB*8xfq?8F8YqtXx0kb8RGV1D1s8~VVt7>hH!&CobAlp#=DtGLm8L;1cp_1Mn) z_`ame6J)B)hT1ESX9yJ6jxAx4sUnT7>4uhcv-h5@&)~UR?8z9Q1lgBVO*dVr&6x1b zoPV<<@zqM|8Z$@^TVO5yzyTQZVr-rvm|@{TiQuy&0C?yw!Ap9$ZtLM@05=A|VO;Mu zYQ=joV%tq)qw(DFpZKa3m1M_J5N0rxNUq9ltd8>)VJw^&VM&l|oHmR+3eljIF*%Ic zji9W=gb>^%B_$qrt1jA;42=E2S1r}xDZqG__Ojp&Nq?A;IxfFynO`vab%p&<|@3ViPKDE zDEpmR0X-mxB+5Yu4+)SR5=53skVHr*Aw51!)G-hng{T~5D&>PY;ixncJQ0SR1O)S} zH`r;&K>!8I0A+=XJm_{<^&rbuyodfB@Av3X&{QY0cGYXrOd~;s1@D!)X#_B{lutD< zmW)wW-*gdh3d}5{rv`?F0FjPBg@W-E4vn`ktzra{X|nWjh7%phj~!IsClSAnd?x{% zCd*Dz|*nl`)fyO{AkH1krfBmMLk(_2&TWjf5DG>GFtTue!_4wg8apn* zBG9g~)C*W*NJv96ZAcD>FrdmChEXac3&tGsh6yPm#Ni$UH$WkK5u`q0FH1~P39UBV z)ZyX}!h{t)dIMkrz$Pee5?F+}siz0_!WSQp2YumKPfk=y4>3N^QoUfh zZJ?N7Rfo*=op{6X8dh1;KZFYU3WCoAU}+MttEW%XUiF%}llw1q0aELN>bKMmpwpwM z(An524j33_>_*QaKrYNMe^$r_MVcMY2PDpfc!ob6c+$TctHv{}7k`^KknreN|mU=xen%%O-FfNYVXS%V_OAm*kvZ2uC{>a&Ys>rkR`F7OBuS=!j1?|f8V-iW1JE}ngM0Mas2}Pn zT6Fq6f|WB}j<4TB@TUmgIE3&Df;Rzp9dsAs-#~y%rG@FS39$*#%hFa#*d&ut+0*q${Vfuf8 zFDL@xkdeM{mmpZmEJPAGeJrk z{1;q>6k3gQsYLL%2zDZ~twq7PZ6db*ywl=hKKUMcP zRKXfY8a8b^jca@kjvr`oDd}B1WlvYs&sTJ&Dmw2Ihh@#wo`t$K>7t5sb$!}X3vKWV z*W!BTePVa4QUA4JO$n449gt?~AR~C6SS($tyK$Er%1k*at)6!`r`*l=i5cpL8~Zz< zg!)QhzM?Bt(e=O}Gv(JjH`|tVe4hPJ8ifOQJq`07?`@Aaqa!Un^UaT^njfEU-jr(I zG`o4GO;@?C z>aUvquM>@frpGULV4Inc-oYA+91FqMG}zFU&{-{N*~HDMPXpX~{R=HW=D4q^2il(I zzN>z%tu62_irqwuu(vV$g^iZL3;hqQ(Z#7m(J4{9k^^1A;V|<@v3FK+e~s9G0#ML@ z~!_l`Q$J_Hm0=l0Iz!%?mg`)vfE*}+mI!lBid_ZT)Zix@?$9zhubOewJ` z(H9UiBZwnlrt&+8SrJ$e)FSu?1SYZtU=5;+2!4scjo`l#Py`Bq)i?h0Sc!me*B8B$ z+`vK3P;=K=a=!0uIAg#Uyq#BMObj)X;<}85p;l5-ld&-r?&Z!|r;xHVEIC-ki2BXW zk#^>y82>P^_wHpOzh=Tut`LB&L_2Cz*Jhqt)Zgu@9KvO3#TYMvZG~hzd@1!o-i&!l zt?py>KK$PUNXWB)M4%X3YYiVK%C+Yc_tc@@=&Cb1fttG1g{~&9=#RSFxnkAZ-NBWp zhXHr1r@EWCQZT{2T$wu8-O81#zwK@=LW__!7|e)NsXab{t5%=!HE}fn%hbCb3!4+$ zm51lT{s95vXOWrt>}9b|o%S_;hHbro%o_kaywFhy;}zdZzzi`XP28>ky2pny)+gGNLabxPXA|%OqlKoABQCk$Fq@pE0&k8`vKBCHQTOz-L~L zyT= zHeE4at4XzQTOxojH$Tg9p4qDIWrE0ZoENxt)27)5xCR22*~6*VdYZbHoYkB$v!#-A cpI0&jifLsDi{%aDI?g&<+3`L>gsuAj0hz3nLI3~& diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc index 8988c26725231e5508819fe84191ad2fab161f09..f929d85de1831415987dad5873152fa1ed093936 100644 GIT binary patch delta 146 zcmdmJd&rjOG%qg~0}$9UGNy0jiD&X?(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~Gn1q^ aDbUZ?$v2_wDu>*6VUQ3=#byVoCKdow(JHqv a04S56mzblUk(!f}U!Gr-lQLO~u?+x=j2a98 diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py b/env/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py index e5950b90..f3f70ac8 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py @@ -17,6 +17,10 @@ def autocomplete() -> None: # Don't complete if user hasn't sourced bash_completion file. if "PIP_AUTO_COMPLETE" not in os.environ: return + # Don't complete if autocompletion environment variables + # are not present + if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"): + return cwords = os.environ["COMP_WORDS"].split()[1:] cword = int(os.environ["COMP_CWORD"]) try: diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py b/env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py index db9d5cc6..bc1ab659 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py @@ -1,6 +1,5 @@ """Base Command class, and related routines""" -import functools import logging import logging.config import optparse @@ -8,8 +7,9 @@ import sys import traceback from optparse import Values -from typing import Any, Callable, List, Optional, Tuple +from typing import List, Optional, Tuple +from pip._vendor.rich import reconfigure from pip._vendor.rich import traceback as rich_traceback from pip._internal.cli import cmdoptions @@ -28,7 +28,6 @@ InstallationError, NetworkConnectionError, PreviousBuildDirError, - UninstallationError, ) from pip._internal.utils.filesystem import check_path_owner from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging @@ -91,6 +90,63 @@ def handle_pip_version_check(self, options: Values) -> None: def run(self, options: Values, args: List[str]) -> int: raise NotImplementedError + def _run_wrapper(self, level_number: int, options: Values, args: List[str]) -> int: + def _inner_run() -> int: + try: + return self.run(options, args) + finally: + self.handle_pip_version_check(options) + + if options.debug_mode: + rich_traceback.install(show_locals=True) + return _inner_run() + + try: + status = _inner_run() + assert isinstance(status, int) + return status + except DiagnosticPipError as exc: + logger.error("%s", exc, extra={"rich": True}) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except ( + InstallationError, + BadCommand, + NetworkConnectionError, + ) as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical("%s", exc) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to + # stderr because stdout no longer works. + print("ERROR: Pipe to stdout was broken", file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical("Operation cancelled by user") + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BaseException: + logger.critical("Exception:", exc_info=True) + + return UNKNOWN_ERROR + def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]: # factored out for testability return self.parser.parse_args(args) @@ -116,6 +172,7 @@ def _main(self, args: List[str]) -> int: # Set verbosity so that it can be used elsewhere. self.verbosity = options.verbose - options.quiet + reconfigure(no_color=options.no_color) level_number = setup_logging( verbosity=self.verbosity, no_color=options.no_color, @@ -171,66 +228,4 @@ def _main(self, args: List[str]) -> int: ) options.cache_dir = None - def intercepts_unhandled_exc( - run_func: Callable[..., int] - ) -> Callable[..., int]: - @functools.wraps(run_func) - def exc_logging_wrapper(*args: Any) -> int: - try: - status = run_func(*args) - assert isinstance(status, int) - return status - except DiagnosticPipError as exc: - logger.error("%s", exc, extra={"rich": True}) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except ( - InstallationError, - UninstallationError, - BadCommand, - NetworkConnectionError, - ) as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical("%s", exc) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to - # stderr because stdout no longer works. - print("ERROR: Pipe to stdout was broken", file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical("Operation cancelled by user") - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BaseException: - logger.critical("Exception:", exc_info=True) - - return UNKNOWN_ERROR - - return exc_logging_wrapper - - try: - if not options.debug_mode: - run = intercepts_unhandled_exc(self.run) - else: - run = self.run - rich_traceback.install(show_locals=True) - return run(options, args) - finally: - self.handle_pip_version_check(options) + return self._run_wrapper(level_number, options, args) diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py b/env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py index d05e502f..0b7cff77 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py @@ -226,9 +226,9 @@ class PipOption(Option): "--progress-bar", dest="progress_bar", type="choice", - choices=["on", "off"], + choices=["on", "off", "raw"], default="on", - help="Specify whether the progress bar should be used [on, off] (default: on)", + help="Specify whether the progress bar should be used [on, off, raw] (default: on)", ) log: Callable[..., Option] = partial( @@ -903,7 +903,7 @@ def _handle_config_settings( dest="root_user_action", default="warn", choices=["warn", "ignore"], - help="Action if pip is run as a root user. By default, a warning message is shown.", + help="Action if pip is run as a root user [warn, ignore] (default: warn)", ) @@ -996,6 +996,7 @@ def check_list_path_option(options: Values) -> None: # Features that are now always on. A warning is printed if they are used. ALWAYS_ENABLED_FEATURES = [ + "truststore", # always on since 24.2 "no-binary-enable-wheel-cache", # always on since 23.1 ] @@ -1008,7 +1009,6 @@ def check_list_path_option(options: Values) -> None: default=[], choices=[ "fast-deps", - "truststore", ] + ALWAYS_ENABLED_FEATURES, help="Enable new functionality, that may be backward incompatible.", @@ -1023,6 +1023,7 @@ def check_list_path_option(options: Values) -> None: default=[], choices=[ "legacy-resolver", + "legacy-certs", ], help=("Enable deprecated functionality, that will be removed in the future."), ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py b/env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py new file mode 100644 index 00000000..226f8da1 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py @@ -0,0 +1,170 @@ +""" +Contains command classes which may interact with an index / the network. + +Unlike its sister module, req_command, this module still uses lazy imports +so commands which don't always hit the network (e.g. list w/o --outdated or +--uptodate) don't need waste time importing PipSession and friends. +""" + +import logging +import os +import sys +from optparse import Values +from typing import TYPE_CHECKING, List, Optional + +from pip._vendor import certifi + +from pip._internal.cli.base_command import Command +from pip._internal.cli.command_context import CommandContextMixIn + +if TYPE_CHECKING: + from ssl import SSLContext + + from pip._internal.network.session import PipSession + +logger = logging.getLogger(__name__) + + +def _create_truststore_ssl_context() -> Optional["SSLContext"]: + if sys.version_info < (3, 10): + logger.debug("Disabling truststore because Python version isn't 3.10+") + return None + + try: + import ssl + except ImportError: + logger.warning("Disabling truststore since ssl support is missing") + return None + + try: + from pip._vendor import truststore + except ImportError: + logger.warning("Disabling truststore because platform isn't supported") + return None + + ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + ctx.load_verify_locations(certifi.where()) + return ctx + + +class SessionCommandMixin(CommandContextMixIn): + """ + A class mixin for command classes needing _build_session(). + """ + + def __init__(self) -> None: + super().__init__() + self._session: Optional["PipSession"] = None + + @classmethod + def _get_index_urls(cls, options: Values) -> Optional[List[str]]: + """Return a list of index urls from user-provided options.""" + index_urls = [] + if not getattr(options, "no_index", False): + url = getattr(options, "index_url", None) + if url: + index_urls.append(url) + urls = getattr(options, "extra_index_urls", None) + if urls: + index_urls.extend(urls) + # Return None rather than an empty list + return index_urls or None + + def get_default_session(self, options: Values) -> "PipSession": + """Get a default-managed session.""" + if self._session is None: + self._session = self.enter_context(self._build_session(options)) + # there's no type annotation on requests.Session, so it's + # automatically ContextManager[Any] and self._session becomes Any, + # then https://github.com/python/mypy/issues/7696 kicks in + assert self._session is not None + return self._session + + def _build_session( + self, + options: Values, + retries: Optional[int] = None, + timeout: Optional[int] = None, + ) -> "PipSession": + from pip._internal.network.session import PipSession + + cache_dir = options.cache_dir + assert not cache_dir or os.path.isabs(cache_dir) + + if "legacy-certs" not in options.deprecated_features_enabled: + ssl_context = _create_truststore_ssl_context() + else: + ssl_context = None + + session = PipSession( + cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, + retries=retries if retries is not None else options.retries, + trusted_hosts=options.trusted_hosts, + index_urls=self._get_index_urls(options), + ssl_context=ssl_context, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = timeout if timeout is not None else options.timeout + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + session.trust_env = False + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + session.auth.keyring_provider = options.keyring_provider + + return session + + +def _pip_self_version_check(session: "PipSession", options: Values) -> None: + from pip._internal.self_outdated_check import pip_self_version_check as check + + check(session, options) + + +class IndexGroupCommand(Command, SessionCommandMixin): + """ + Abstract base class for commands with the index_group options. + + This also corresponds to the commands that permit the pip version check. + """ + + def handle_pip_version_check(self, options: Values) -> None: + """ + Do the pip version check if not disabled. + + This overrides the default behavior of not doing the check. + """ + # Make sure the index_group options are present. + assert hasattr(options, "no_index") + + if options.disable_pip_version_check or options.no_index: + return + + try: + # Otherwise, check if we're using the latest version of pip available. + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout), + ) + with session: + _pip_self_version_check(session, options) + except Exception: + logger.warning("There was an error checking the latest version of pip.") + logger.debug("See below for error", exc_info=True) diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/main.py b/env/lib/python3.12/site-packages/pip/_internal/cli/main.py index 7e061f5b..563ac79c 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cli/main.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/main.py @@ -1,5 +1,6 @@ """Primary application entrypoint. """ + import locale import logging import os diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/parser.py b/env/lib/python3.12/site-packages/pip/_internal/cli/parser.py index ae554b24..b7d7c1f6 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cli/parser.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/parser.py @@ -6,7 +6,7 @@ import sys import textwrap from contextlib import suppress -from typing import Any, Dict, Generator, List, Tuple +from typing import Any, Dict, Generator, List, Optional, Tuple from pip._internal.cli.status_codes import UNKNOWN_ERROR from pip._internal.configuration import Configuration, ConfigurationError @@ -67,7 +67,7 @@ def format_usage(self, usage: str) -> str: msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " ")) return msg - def format_description(self, description: str) -> str: + def format_description(self, description: Optional[str]) -> str: # leave full control over description to us if description: if hasattr(self.parser, "main"): @@ -85,7 +85,7 @@ def format_description(self, description: str) -> str: else: return "" - def format_epilog(self, epilog: str) -> str: + def format_epilog(self, epilog: Optional[str]) -> str: # leave full control over epilog to us if epilog: return epilog diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py b/env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py index 0ad14031..883359c9 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py @@ -1,4 +1,5 @@ import functools +import sys from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple from pip._vendor.rich.progress import ( @@ -14,6 +15,7 @@ TransferSpeedColumn, ) +from pip._internal.cli.spinners import RateLimiter from pip._internal.utils.logging import get_indentation DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]] @@ -47,7 +49,7 @@ def _rich_progress_bar( TimeRemainingColumn(), ) - progress = Progress(*columns, refresh_per_second=30) + progress = Progress(*columns, refresh_per_second=5) task_id = progress.add_task(" " * (get_indentation() + 2), total=total) with progress: for chunk in iterable: @@ -55,6 +57,28 @@ def _rich_progress_bar( progress.update(task_id, advance=len(chunk)) +def _raw_progress_bar( + iterable: Iterable[bytes], + *, + size: Optional[int], +) -> Generator[bytes, None, None]: + def write_progress(current: int, total: int) -> None: + sys.stdout.write("Progress %d of %d\n" % (current, total)) + sys.stdout.flush() + + current = 0 + total = size or 0 + rate_limiter = RateLimiter(0.25) + + write_progress(current, total) + for chunk in iterable: + current += len(chunk) + if rate_limiter.ready() or current == total: + write_progress(current, total) + rate_limiter.reset() + yield chunk + + def get_download_progress_renderer( *, bar_type: str, size: Optional[int] = None ) -> DownloadProgressRenderer: @@ -64,5 +88,7 @@ def get_download_progress_renderer( """ if bar_type == "on": return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size) + elif bar_type == "raw": + return functools.partial(_raw_progress_bar, size=size) else: return iter # no-op, when passed an iterator diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py b/env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py index 6f2f79c6..92900f94 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py @@ -1,21 +1,19 @@ -"""Contains the Command base classes that depend on PipSession. +"""Contains the RequirementCommand base class. -The classes in this module are in a separate module so the commands not -needing download / PackageFinder capability don't unnecessarily import the +This class is in a separate module so the commands that do not always +need PackageFinder capability don't unnecessarily import the PackageFinder machinery and all its vendored dependencies, etc. """ import logging -import os -import sys from functools import partial from optparse import Values -from typing import TYPE_CHECKING, Any, List, Optional, Tuple +from typing import Any, List, Optional, Tuple from pip._internal.cache import WheelCache from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.cli.index_command import IndexGroupCommand +from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin from pip._internal.exceptions import CommandError, PreviousBuildDirError from pip._internal.index.collector import LinkCollector from pip._internal.index.package_finder import PackageFinder @@ -33,161 +31,15 @@ from pip._internal.req.req_file import parse_requirements from pip._internal.req.req_install import InstallRequirement from pip._internal.resolution.base import BaseResolver -from pip._internal.self_outdated_check import pip_self_version_check from pip._internal.utils.temp_dir import ( TempDirectory, TempDirectoryTypeRegistry, tempdir_kinds, ) -from pip._internal.utils.virtualenv import running_under_virtualenv - -if TYPE_CHECKING: - from ssl import SSLContext logger = logging.getLogger(__name__) -def _create_truststore_ssl_context() -> Optional["SSLContext"]: - if sys.version_info < (3, 10): - raise CommandError("The truststore feature is only available for Python 3.10+") - - try: - import ssl - except ImportError: - logger.warning("Disabling truststore since ssl support is missing") - return None - - try: - from pip._vendor import truststore - except ImportError as e: - raise CommandError(f"The truststore feature is unavailable: {e}") - - return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - - -class SessionCommandMixin(CommandContextMixIn): - - """ - A class mixin for command classes needing _build_session(). - """ - - def __init__(self) -> None: - super().__init__() - self._session: Optional[PipSession] = None - - @classmethod - def _get_index_urls(cls, options: Values) -> Optional[List[str]]: - """Return a list of index urls from user-provided options.""" - index_urls = [] - if not getattr(options, "no_index", False): - url = getattr(options, "index_url", None) - if url: - index_urls.append(url) - urls = getattr(options, "extra_index_urls", None) - if urls: - index_urls.extend(urls) - # Return None rather than an empty list - return index_urls or None - - def get_default_session(self, options: Values) -> PipSession: - """Get a default-managed session.""" - if self._session is None: - self._session = self.enter_context(self._build_session(options)) - # there's no type annotation on requests.Session, so it's - # automatically ContextManager[Any] and self._session becomes Any, - # then https://github.com/python/mypy/issues/7696 kicks in - assert self._session is not None - return self._session - - def _build_session( - self, - options: Values, - retries: Optional[int] = None, - timeout: Optional[int] = None, - fallback_to_certifi: bool = False, - ) -> PipSession: - cache_dir = options.cache_dir - assert not cache_dir or os.path.isabs(cache_dir) - - if "truststore" in options.features_enabled: - try: - ssl_context = _create_truststore_ssl_context() - except Exception: - if not fallback_to_certifi: - raise - ssl_context = None - else: - ssl_context = None - - session = PipSession( - cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, - retries=retries if retries is not None else options.retries, - trusted_hosts=options.trusted_hosts, - index_urls=self._get_index_urls(options), - ssl_context=ssl_context, - ) - - # Handle custom ca-bundles from the user - if options.cert: - session.verify = options.cert - - # Handle SSL client certificate - if options.client_cert: - session.cert = options.client_cert - - # Handle timeouts - if options.timeout or timeout: - session.timeout = timeout if timeout is not None else options.timeout - - # Handle configured proxies - if options.proxy: - session.proxies = { - "http": options.proxy, - "https": options.proxy, - } - - # Determine if we can prompt the user for authentication or not - session.auth.prompting = not options.no_input - session.auth.keyring_provider = options.keyring_provider - - return session - - -class IndexGroupCommand(Command, SessionCommandMixin): - - """ - Abstract base class for commands with the index_group options. - - This also corresponds to the commands that permit the pip version check. - """ - - def handle_pip_version_check(self, options: Values) -> None: - """ - Do the pip version check if not disabled. - - This overrides the default behavior of not doing the check. - """ - # Make sure the index_group options are present. - assert hasattr(options, "no_index") - - if options.disable_pip_version_check or options.no_index: - return - - # Otherwise, check if we're using the latest version of pip available. - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout), - # This is set to ensure the function does not fail when truststore is - # specified in use-feature but cannot be loaded. This usually raises a - # CommandError and shows a nice user-facing error, but this function is not - # called in that try-except block. - fallback_to_certifi=True, - ) - with session: - pip_self_version_check(session, options) - - KEEPABLE_TEMPDIR_TYPES = [ tempdir_kinds.BUILD_ENV, tempdir_kinds.EPHEM_WHEEL_CACHE, @@ -195,36 +47,6 @@ def handle_pip_version_check(self, options: Values) -> None: ] -def warn_if_run_as_root() -> None: - """Output a warning for sudo users on Unix. - - In a virtual environment, sudo pip still writes to virtualenv. - On Windows, users may run pip as Administrator without issues. - This warning only applies to Unix root users outside of virtualenv. - """ - if running_under_virtualenv(): - return - if not hasattr(os, "getuid"): - return - # On Windows, there are no "system managed" Python packages. Installing as - # Administrator via pip is the correct way of updating system environments. - # - # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform - # checks: https://mypy.readthedocs.io/en/stable/common_issues.html - if sys.platform == "win32" or sys.platform == "cygwin": - return - - if os.getuid() != 0: - return - - logger.warning( - "Running pip as the 'root' user can result in broken permissions and " - "conflicting behaviour with the system package manager. " - "It is recommended to use a virtual environment instead: " - "https://pip.pypa.io/warnings/venv" - ) - - def with_cleanup(func: Any) -> Any: """Decorator for common logic related to managing temporary directories. @@ -438,9 +260,11 @@ def get_requirements( isolated=options.isolated_mode, use_pep517=options.use_pep517, user_supplied=True, - config_settings=parsed_req.options.get("config_settings") - if parsed_req.options - else None, + config_settings=( + parsed_req.options.get("config_settings") + if parsed_req.options + else None + ), ) requirements.append(req_to_add) diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc index 35c176e0144fd9b1d0da9eef2b6ecd2fabe4f9c1..08e4d0320073132d40328fe28d3ef95780967125 100644 GIT binary patch delta 99 zcmdlie_EdBG%qg~0}$9UGNy0j3E=YR)(tzgeE=G%qg~0}uq?|CY9qCxFYKSUJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~370x60LFY8r~m)} diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc index 96df6170dde48ceac6fe9e284e7d90523d60620c..418bd0c9605b46641d394ee6ff7025b019e184b4 100644 GIT binary patch delta 145 zcmZqh>GR<^&CAQh00g#-jOiPB4A?w6^h1kNi;DGAk`l{Pvl8`P@{>z*Q}arS^<7g+ zlM_oa^YiqBlM{1NixeD_6H`)iEA@SRT=apAe3z`my!8BlqWrAX(&&<`z6Eh^T}PAp2y(@V-oEXhpNcS$YIF3B&@ zF96Eq=OyOoXQbxjS`e(z523lf%Bc&u*l2t5!I z>0rMhA^VAenbUakRS9QiAiY^yQjmr5d zrw$#Q_~&E!Lp zT^b<$3jjQVm}s1Zw2Z}Ryp_=ei`PU;z>+0m8E2<}$C7YvMY7}vf|hS(Yq_Yn!2BM3 z^v1=HFtJx!%FrEU@IisHYTU(&>AOvX+RF}BEZoGNg+0^8LH&b`YF>%ge3SSMgmA=)K`3E+ESo% z9`uQU)RqFFEd-giOe8v<$}gcq7Q{4`9HQWNvX)Ryy1DV@e4xOO;5(sBFoVx1_f~Cl zRj~ub^XWlR)(K0@#@R$*)fft~UX10IL#nj=Fe%!Yt-f(8VIL?P_Lt&&3S9+i(=q6Z zPuz{!o4&G4{B`W5&M>`!vf_uHRj(BZDaW6-DMpqX`xUEAOd zYX(weEb?7U0ze5XwdALMn{H3MVQY9xJ7$0Sdf^4xP3f zM6zoK42=q=@2xntNn_;j)F}ez8a8QSh=o1M58JmDWdV+_q5^{k{zW`wB9hbo9|5VP z!-xBC9reQiK1Q{cjeB^_P_OuA7>7!|YK11u3ExwfOvAxMxojF1c3bM=;uRGD|H_)- zHT?Gzzf>5ds$(y!%@$qty|?P;FQ@@T@@#5cZQ4y0!V1Cl3`d12#71`vs_L`q#hvQK&h_rx z{1fNt+*@1uUgcPK{2$$Mr8_>;9iMxA=ixv1bK>ZcmpnTD=RFam`{QW#^ea@0-LIm_*E`pH#mR2vQnxbktfK5x z6aXHLJRI4Vg;IHs2acCTR2+M_{;%6#t@p+zJB$A{KW*;I14`Ct7 z>Tw0=dX(37*SA6k16Yh{+XCD7$ z55e*I_~+&qQ!)5u@H3+%%9x(oWF$L&qrs{^3y%%!j>L^fqOB&76L;pIhU&u_s+*2o zUp4})4~mJf_ak}*6THhb41mqT!9kNo)jz6pF*PiM8p#;=A2ogxleim#dR(#b>`0~t z8zs>jf7Auj!U4{~Q)@dmZRyl#4Ccq=tC(R1n8`rN!Jmgk2nQzQ6w@uS*Z>lTTm{NO z8h*?EEy?uX$vbetp55REYCVKn-1JUv`tjSlxs&&$pQUr$%+|$y1V?P?cQp*V$p8QV delta 1096 zcmah|OKV$46h0%}r*tLNmMhDaV%bSmSB;Tk2mF9G5R%k^7%$?c4`Cy2e8LFp#KfjEv58`45|Rouh@lSR*!tu%!~XYrkx^Z4eQ zbC_RR9)9Hi)#vj7uCbl{seNh9A0|Jobzk~AtEIK9FYO~>fFYayY#<#V-~tMBolg3{ z7j4=ghn{q^3x>f^R=`lHwBbJT2A4>}v-YB&r^v_rTXHyt~FMarz% ze9p?~IU{2g=;Z9wEV}p&@+nF32c$JhMMIzxmD`Ze5UDaH8PbZ7R+r?2!v7${{FLhg zxy%<`r)LNh#fCiF-4HhJ0w{?k$rjJUL=Wy|+ilnB=A=gUKenXU;$alCgP5%r)kf4H zwrnf5%5`_w_5Wj$-m`=N#<3kGPsv--K43!?$fnsI+q-e3guul{AB3y?oe&$4nIoP#^-Mw7mX8|FypGGcmB|PR z-?m^;bBg&LPk`SL`vY2m<>%;RF_Y7?lr{6Jc=DX(!+7V1>!6UjV&TM6^E%UW$*VJZ zaaK>Ar`CKiUq}@&lF#X8YKEF-{#u@y2G2_0ebb6G)=PwCsK&qAj9;uM$IIT;iK=pP z{nBG)uo^pcKe8G7vZ6%G@@ix^dSVY0wYfa973#X(QwgP>ga#_1f%5QHNBp)~={UUy zlCPQf%F$l5H4$@bEpY6!J@EWzRdVR(o=S2UNwKOZ$9vG$M9h5^1}(TYe`lf^43|fK z)54G11|Mrf)nI#h^e@y4qX`fHQ%>?eCGvd-p6>#Sp<%}yaJo~6Cfrz`Bdowv;cQJH zzP9BHH7O=WZuQpy&3eoF^2v0)#gnAbq=Pd%5+A+FnuHZw+p$pDatSr9hlSRtMeyn))4o0~hl6TmS$7 diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc index 2469248385223109ec3c562da73313d08ca4935d..a33a88e6d9559ea4ea4c998295364dc9f515a9c6 100644 GIT binary patch delta 128 zcmcbq@kxW{G%qg~0}$9UGNy0jS@G_ui|~cAIYsHZTDI>WD4< delta 122 zcmeyQaZ`imG%qg~0}uq?|CY9qXDyFGseWj2YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{nzBkyq*%|k#V8W^4kDqk1WxG1P`Sx~Ek?T)eK4zvZff{$W*6gTWV|_9Slm|g zBRh*c-xpR639gSUK-NUA3Ct5hKXNe$h<@T_;1&451Qh(h%D^c)xky}v<&uW)=gqUk z7c(-tPPUWOle#8l)9KaWJVEphkHie|1 zoqiqe6GB0%L>I7M;nBD)DK~-jj;Q?9n8|#KM&b-&N)uv$`lRGPvNFi~GJa(aUxrFE}MJ6)7^I$(ZT+WWe6;6>@cYtq4;-W@IzRPP8%PnEeN zATuLkLCK2HD+0#fnHhxSCddE{mI-0JFDN@fW^)9tUs1iu3jpkVkskm6 delta 454 zcmbP|zBZlbG%qg~0}uq?|CY9qCyLvkLO--PwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~9k&OUrW(+Q7Ysid7(OvDi}F1XQTf8mASgVYeIomG zzKMJn}FPnFXFJ@%)nj9yoCx2PW<`V-Wr(UO5hw}u{J3JCI#1|+p zD80&~`;i$aJUL%Rdh!&C^U3zVw*@{A1bhN~8xShaybx%adLIeGaX}Y!WC+^QiZsM+Q4{$pX%eiW;WA}S zM$AVt+@?qKaNT8iO+`~opXM`bv>MZ|`8ke^fEEN_*{C%`T8LwABWy;rI<9++db2^B zYT$;~Xf&I&Cax<+v)Q7xaNTD_&6pPBdW{h`TeViM`;COzrnPZBU?k0ymg0KQXg52w z4zAZ4on~4~BS91}8XIO=|Nq0?rx8seWh#VKJ&YASqN7o_UU$%?t}_kF1-oRo0n1bI@%2AYQ5#ZH}E%HdK7jt@J0;Qp7nYh z%hxwr0qE5exD~EfM_qaw*tdwnJ%XM*DCjBNbXrA$_8duawGG z=7B=qz$7_P$m`hLml+<;W0Q@NYF)b|A_RY&DUB_I!P!7ja2sHl>IMv2O7nY-AmQORVIMCpCr zSWgdFY546)5YxgHB{sYDo~ebbwK_>6f~ z5|rRo0npz)f^XfgA;BLy&%(V>+jpU+Z^6~~=g&3&?k*_(*KAhQnYw`3%B> z;^SHo?2lK#7OmCzN8Pcl?vU2xxq+WQ~?pM0#0_tj;X(n`=^NsJgx82jm_C zh-{?m0`~@)i{m!S`UEg#8$B9mfr6e2bfWv|7lCOMuWk?4i(U6KufTYo*f@9njTfl#umIlIm+`@_>MB?XEf_r=v=$#?O!HY^>RcMGwZ>L>;kdh zm%OQxCq-OYpCk`5AiSw;jsurR44kawi#FhC>Tf6|mjiJ;kmX1j28;)@6;7!N$vQ3r5jmk4by*KC*_+H>+qZz1*x$ z@eqQAd~RgI(hbbpO`ZVP85YMYAf|_bLc{_{Y+x|?(>0-mukY_)F!@fA6#&?eHTjsbKBgPVyR>4xm^pZH-DMld_{=2IeRq^CM|^gPRsvQZ}< zCRp1Ysbp2iOQ4++2v3j|pB&(Vs-4+12f6(+fa)6ZJS>jKC>M(?b(RrH(6>A9MFaG= z&O!7r?N5IS6+>P1-U25g3DdvQDHNfJuEZ3plA}Q4!*Bs6gmrUi)>t@8mE@Jo&HKr{`e$9Kw(y-r2-h~YWzwHBgRYC||76SC6u3OML`cv0}i=Fug DMnD$s delta 2191 zcmYjRYit}>6`s5E*qz;-wRgRK?EB%hn+ep;qjl;&aI$ujR*n(_jS3?mtUY6AjUYiE(GEGPp>kQW!%oDAI8h_&Xolv*j2P#M-C=Zst!&4ggpuH! zVs|-7qZ{NI!3^3xPOs6+6(PINNf{|Ft9IJS7#S{y?W~hCa$Jtsd8c3$xE!^MPRS^7 zS+mPdztPX-m|bxOi~%A91WRO5Qd;V;bhFcnm~oTLDrVwE$=GX_%q|!|XU46lrCa)J zAO)3~4VXz_KW}z}N8E~8DrY6L2iS*qS^ZPC7uX@Q@3SlLJtQ*)nqk-@4dcGY&5RZN zRFMT@znQZNu)IDinR%EW2nfdnv+$x|7Om8qA|8<-7zY=LUS|Iwzhb`(ymq7uD4GQD z0szJ0{pRo~&!XP&e2vx`L(^w!t$J;E!t&-@ZgaQ^8n;oihtF8H?Vfk3ZL(GI1WC95 zCC12pTucwrUR<*ez!$wm&yUrerfoS^qXlcZ4a&ESqfMF($t99vQ*tg`1R@W=ca)u% zA1eJgdq*JhzT2V1m65f~(5=w$JrU;jkmMTnw){}2$Q!LCu*q~ba8_ndsCoHO;ezl2 zn^L-2EEi%aB}Y`Y-IHb{nPisoFwq!OZYX8kzryB%xc{Z#Q%e~j{we%tS-9CT^15_I zx*C2tyzRu2&Vt;6r!Dw$6NBPj**SX$eJ|r$=%2UEnn@vSAq?%byX$tZS}~Q^7{dRcl!e{ ze|Jm5FqrQMoQ#ZyBzsDQH}vat1PNLvj;7F#c|DZ zwne9KB3g|FEQHtcWc0)j5`RIfkmuMnZJA`+_#7H*%^LNr(+kjb*f_g=rOWgb z=;=ZBwazg(zgIg;{oerMOYnQ&2Ur%MGJBue)T`@ybwi)HE5zjEg!!HG3JNsCI;0dc zcC3#jYL2t{rW^mIwrfp9FjQJivFt#XYSWowHhx7wK1!h>yEY6Yj~hZ53O! zIS=>>yOFFHcLVi

*RBE-4T8BzWm6t+D63%{0CrzRKf7XX?TnfA1sqe)lVb7@Q*K zwz_)n3Pdem9KRh+T%No%`Kq`w{z~ZmXlYvnn*F4wtby4*wB-)%U-uj(q{9B&TOIf+ zEVt9n3bh<}!SbcEZoL85zKNTQ^VT9AVKaR?8D%f^=}SDM*i7y8^tpy?gUlCWnxDhL?l8sn-O*_1NbX`0A zK_tG_k^ft{x+WDq%#@(*3(8iaclFfT(6cuOp8b&wyYrS6dKww{Ir znyi`W!|R?|h~ssqH2`0N`g=1XBWki;$!c;QEA0o**Jz{On4@VlOd#YCrr62S%-JG} zm<0VE0%lGp0sJ7ecb&QoUxYKID)Qq96R1=tp01ucF>(Cq3EnmQbZ87Tx=4S3Ru~Vx z2(a@e;LT`f%cCTO(Y_I&-R$fAQ~U5;p!jIeAObdkFV-6^`g4%p5GYR#%TAX#u)p+A zjB%3BuL7w*;&<&nVne%c7~P8wR{;E=?as|%{+Jfcv7?n|$T+)PsS<)64u67A>HHPVNtq*4!m12vYq-BQQ{YjKMr`gDc-Wr)PYx%2lxwA>?UzP^yJR_ f@dbJv6!_eDVL)hALjEkInK$?-dvoxHgdYC~GqNip diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc index 5376970b08ccd4562bdf8b1286dff930760b9856..4313c59659531308069f1124dae75e08bd6a43c9 100644 GIT binary patch delta 277 zcmdmH{lkj)G%qg~0}$9UGN#Ym$orqyqgy|;IJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`=Y{U12iP2=U zqTnZHVV)xC5_^z6AdteD!jw66+XQHs6+LV`RQ2 zY%w`g%7K|d#B%Z)Df!9QrRo?{CWlGeYPc}6iqA0nzyP9Gh^$CnDG6b3DE9(`h-rLf05OWp Gfzkldcu^bx delta 320 zcmexiwauFMG%qg~0}uq?|CV-rBkzA+gJS*A;?$yI{p`e|#5}#EjKq@6M17ak;_Q&FduE7&$HrTYO?*;nbOIF6F=sqN}9jd2VosU+1vC$YFhj z!*=pasXE5g$r94G8m^42;xo)XFo5V4A}f+tND8p09rpYt8jJcCBWb=RK^Q?@jo6mDbv#>=1l@+g@Y{1vb`kkLclxy;SJ{d_M z{Y8X9K)i#mNC+se$yCG*r2I5_Cx7A76A{i#&&w}LjW0?qEX@ScWvO{(lNI>`MD2l! zS{Obuv9NM{;9-!KzrZ5?foXFczbGSP(Bvrs>Wndy_Xv0hhA=XUPjLUr0HVR>0|0FU BR}TOH delta 268 zcmX@5G*yZBG%qg~0}uq?|CW}rk++}Gpin=wIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC%w`3YkdBcs)1e`YCFt`xQwmMFFq_Eh#1j#Q3RPD!BA zDJ-d6X>2K+KpE~zR!#27lbAa<%dnhhWmMVxhBKOlEdr>hc++HGzE=A${2ZcOpBOkf zwK`nB2r=*q^m}!BUFVUx$Rjf&WP!`f=&L-MAB2I@Uql!L#5?$kgn)WAnToi9l%FQg zWFCIK$^QKQyyifD3&Tey7FLcAJexQ3i!w3>PChB1&KN!UqkxBCFe9V*1oy8DAR250 E0Af%|$^ZZW diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc index 9bb294c260c3f6bdd561f75bcde1e9849c450006..327d7f01a3300544067f7fe435f39e14d4c743f1 100644 GIT binary patch delta 235 zcmdlXeo&m}G%qg~0}$9UGNy0jac1#o*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tD->-v?#}QOV6_?0rlj2|$N5Fg)Sp z?MRv6a)ncJM))0mvHt4L>KT@o`Bghu?uaTZ5Wgm>+2MMFN1)%k(|ZQ%RUWyI%nV{$ h-&q;Bq&{#k0LAS(?JjdmUtp2`&IuITti&~q5daIIO{)L^ delta 203 zcmX>ozC)bnG%qg~0}uq?|CY9q$CJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~I!huGW8~zYYkS@(e(z528LU@%i_@% delta 75 zcmdnQJByd+G%qg~0}uq?|CY9qXA`qQzJ6$NYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{nz8_OCd0KZ%shX4Qo diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc index 4e28174a6095b907be7eee3acc8fc2d0bf8a7f68..7edcd3f0878a852c413d910b7c9a2a3fb56e2d48 100644 GIT binary patch delta 1319 zcmY*ZO>7%Q6yC9&wHF0q zyAh2lR0JF%acLPOBu+Vi)T-r_OS$%h)QhdOO1pqKAS5^us6-J5U}gd+ox?ZZ``)~n zH}B1EYy8f*a!*m(B{p6JVExK^u>cPEcuiy&0 z`V7vSd10ui4;RdW;2o%lPnaiw6p)~_F~`$>dcc8O;7Bo_4M_7+E%BjLOG4#V@L%=h zHqcW)bK_MV`0{HO+Jdeg@`E#tZ9j6(gTz`x(5G*Jj(`sKJ^*(^AWG-ty9+zUvI~i8 z)Yhzb;D%+)I`$TZ4bL@RscqSoS9co5McYD<6lQFz2JyDBxHxMt;>>PXjdf>Ci1R`j;P!Es=rjvOFZh%3dAW|Ub>66q#UoTVs+qO6Ls9f0%-+BIEdTD=p z>67`JQ*<@GnljiLJ?RG#Y!H=k5~a;_Nj}SIp8l22UE<~NgD&()2Nx%gOplOG&g3^8 zf-R3saG%0Jj~y$TXbdl!-}d$vB-@1FpT*Q0HAu(^C7B7C*NlwOFEbNhhW?N_6TGkJ zw5$#5W%Xg@)IsG!t8(FMc)wD89Aw4WSvZVHnVwIlKc4JGPLWQ_zjKNKb3~?^*l;tc-16{XcLgcnS zNWbbDr@wU-auH_w$<6xa$SOMrl7@vwY*c3r7|r&Bc3RC2$l{5|nUFc%)$v-0ZsFk8$33`uhm!!XBOCUwFxgn6IXLBWxp(xi6G7%Q6yEW_yiIxLL-~uUBfVhNt(+Z_?`1X6>y!YnKd$Tv| zJ9Xt-MF~iJ&Hwb*>Zg~LGzwiVRJTl@?n6>bYPpEt4Cnz<)@5P4NzhbuMQ{%ZnPELF zxR*rCs2(*{T@|*E#LT!J7u-)0W>Qa@ny#5CJtedNNt*-ufZ#G2G>7yd!GmPj%;;Mg zVJPG=GplC>50RXCOg|=gnB>h7eFRAk2}`fN0Odcr@aPTnK+y{hX+~;A-jP~S9KPXv zs1`R-N&OX!7fZf64T*7}`Z*C4jL+2y3< zu$4L7HdZzlF}1j`jnOR^l3CGnYhtb1w76QmXi%ejeEEXW?-T zjXs@%y)cK8e57GwD9|w5{rWnln-rSBWB4(c(g`q}tQ((@#Z_wDeyegtt$5m;Su@Oz zpZ4u4r2{GLudw07SOq#%JF!Z3nAxo|hvyl#D*|7hh}@pi6xJDB0PpD0{MJBjk8>A!1``uoJJkAEMYlPsb^Hl18} zrNXPA@bsw%V3C9E>~#C|B$yfi44x)o!?oP&5%FZGXs8Qz;6|TGbPTw-;sCG#_Gj`7 zS%_elO6+s3?w~&Qqn7vh!6U#9HI4rmS}Ko%tdSb=h=(3xm-0g8#J>`Si3 z*xghS#o1x1j1sJzE}|rxPv?=wHqx0BVpje(?$7nwZQlA<;gq^41^@&6U**5PlV-2A bPVg!E2Kz3Z_Dr0dSo4J9*Fu1o1$l+sxda#hM`N9o1QxtwoU#N`Sy3-sbM^GZ^S@)C3O Xl5;Zkk`jwkC+G8hXEd6e&Tj|+eRDk* delta 143 zcmdlgKSQ4PG%qg~0}uq?|CUy=kynk?ph!QoIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC%wxtet`Gh@eOdCmZ_8}=^OBwaU@%uu;5rE^hAXGO?W tDWgl9J2~I5h{+aY7U;!i=9Q!t0S(Yg&dJm(N-dn+!}p!haB>U3Apk)iG-&_; diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc index 502ec73febf685d4a18bbecb7a6638f2f1b41b5e..2bc6dbd2632c444ba0da05b1b9460e6bb1a389af 100644 GIT binary patch delta 5415 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 diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc index 65dabf623f6b9d18daaf1c3c6796750af5369d3f..6788fbe030811a53b8ba9ba87b6c9765f4c1fe83 100644 GIT binary patch delta 3450 zcmb7GdrVu`89&Fq_hP_LY~UK>2XD;7CXkYZ^fg|2G;LX6X@}Y|&-X$ge)Sp}Lc<_c zrjkFpraRigrnU*|BVFUdNJPpGJ^Kge zSh%RWh!UAs3V~$|6^Bc@OVnvos5D>}Fw9>>`r+IFT%}{Z%b$B&54s&XmjTNL6Tv zOb0qt_H7`0U!`k|?kZJB4(PDT)>}HNC7aZiE9J>rDPPW#GvHT)D)GNT_iAv|D@fvT zuDe#UOB?bvz$*Zr?+Eoe*lYBVF5`f##QUQW=F;55#^C>srrdFkrVJf{;GsaD+} zoxwmzRyp&pV7wu4@19EVX{g&G+=7GiWT!8P8Weu09PwR=@ zv!HXca=x7Z0{Bm{2YGRNGD+rjEoR_ZfM@&?F9&$0FYzQRFwL7x*&^B2gPjXAIh!+JoFL@^ z&#ESB-2~MPanm4G$_`St2{KH(b32LGF|fUWG4mj|A$LM^lss)9))G&hf}*L6xE#llRSICFU_gVo|JqYa2>P#v=LbNXA`+D}Arhve zTIf(JX+xT@c9f&!sCFQeJ(g=_*Dai#dv!g)qx@j@x+)^^M=A4E*mBMbx26RRIm!*_ z*s;7^lW;y`gAZxbvHNrGcPOX_+QqQ1KXRxg8VW&uM-@c`F8fhVC(U4g+To!cjBl!J zM$=P5P>~_@iVX+am?C>KHe;+j09*w>6RMv|CsJJi@eBZuhgDfy+n>fU&Ww{!jU@A4 zx}As7H=j^o$_FWUkRe?DCi+0yyvG;8CRP`#ab!1JL(pkh@Ix#vs zZT+{FS9XIQ_LKZQML$EWXyIQmIdl2D5{>OMmdm1dx+p2uz<^oA&OBugNGN*|EC>w< zMs{2*60w(4I(ax48j|FAN*Ib^i78h0Ymw!fVbUx7m!sXdP-1=dM&TtO;}5eJ?IYZL zWBURtDrl};B|@HYh0mqymh2zPnj4ez$e zJ&W$jq`NNRu1mV_o_F630k9V@dbfckxh1Ti^ttx0qb@A}lr|iQZFI|KAk>yQg+e0; z_z_s|mTy8;#^`M^r)l)&MhNFXdjSpHa9Zog%Jii0)@q=bVqoR|uzD)QQd7%UknX1}Q} z7ObfC4Hoo1q`fM7*qh!KEo7KwRaFVEfRu7}wy7$Q(ihlQtGjX^#jWUY96w4M71_gn zRo&dxfNHQs*V?YmJ8c1wcS*U_(_w6dij(#Bu7$0e*}*DK_w3ras$!+ zh=OixwD8)_?7^B^I>kn7{6ZzF?`J=+dC+;OZK0}pp}6_7zU4!!Yog_Sy*O#TqIWK9 ziOtPQYWI%ed7-Fj6_6^$J+%FiK_!mE2m&Ta2_x_bhY>I+$`nA#uznH+hYMG?wzq8?^GKaST7UI*8VHivtT%TH^l!9L!$A{?N6Q#z*6@QpJ85NES?3gW=3V6J*r|aC*G<%`$2}=LMy!DUsiUG`I)Af(4-xlyEg!Z3D z+i%ZgNkf&h9YejD$^0$nTF*Q-Nl#}zpLMR4^*5A5Eu3s{(mm{_4R-OzsOd$3R5n)N z`suEevSfqT`4aLoA=QHcIJgwAPPvHU?FeU?b88uWg|%!gGMzyN!VcW~ZWiCVO?$3& zfnC_T&wkZxo8X|6%(iDnPmE4VNtZ9-^356jtl$ooM=ZJNa-uh%%$v9qg1#0iW%kWG zeo4phgQW~3ynygJ0$QZ}4#A1wLU;?nYfzm~Yh`VX>e!~ZdM@3*MtKugHv*)1X($|v zL-pQjJLMHTlGIN|itCT`MwPd)^9o-^EfS1Bj`=JRY|CO zS&0NfzF?@|hnMf+p5WRoN-?qLca(b2&Xjn&ES$1(4DZ`<#ln0|g+dMp!BN}MR7Gv< zbd!hXve%njW^7-zag_r|+1ZU9R`%T{bGCYwDn#BOGw&=H&LH_RyK|@Wz7K!|-%0#! zfV7rUdX;2fCB`M&LH>0b8dot^&yl;Ve{ delta 3191 zcmai0YfK#16~41GJM1p|WS4!xE)T;l%VWXV2FKt!!Ou|FaSV1P`f%3F01NwKW{DpK zfvmKpQKi_qKm4d2o2HhX*r`xaE4xao_K)SLRRac>)i~HxYNAAHt2IV;-AYZ*8H{b5 zN}bhybMJS~J@=e*?>%>Z^}TC{%zrSM3(VuAVV}{I}vPe5Ft-2xXhw; zLOLo$y;$MFR!Bocrngezl56`SQX~;R&=W~VBeh#Zxi6he)uup_OhjU}Jz^}DJeZVX0-fMm-7fH2 z&IkBDxu@au#;lQes;6~TG+!HF?+`*?)VhaV0uK@J0z@w8M4iBidWcF7oI&LbVyAK3Qcgh544maT&H|kEInD~4?I|bb3AWb9sm%kC{i#UMf>}Fo4p^<+ zWfxR8@|Sx8r)oJtEB~-Ib`n##nDp6@DP4syXNpFLhZ!FT_6+)ovX4Em~I4 zz@LSt{3?B|;0QO>ux*CkDQGFVPk5*KfmRtburZv+l+zcjHyv?}F3r z)(2Y73KKY})$h_Qu(aAg?ni4<5<$YDxIK#Dk%CC|(0}=TH;lI|w7Y(R zXiP=NxQyL3WnY!?`f2MuEiex^fzCrzyoWH+AFS6{a9Kl)gkix;roRa7%D2H;myN)T zkdy7RzPc%2-3X!f%A;1SEs9Qx9NeFX#6?KKh04I1C*CU@?Cglb_lOZel+*}h9!7xY z@GSWrh5nIJx+z@B8*!Q&G*I zw0rUPQkX+B7M^93`_SY@Fj+}2)Y#jq(X0cwrE^=^GTwh_&A9D@#;MAdN9w*kYOygP zt-{8{gu+J?aA%|?HyY-8lhK5PK`x)kB@d`ET*I8E8^X1G30hCkWcZcRt6OI(Tc%4} zW{jKX?fwPA=>4OcKQX#b+HV2rUElWIs4XPuCXtY+6Ic<;$}8uBcbv^LpofE%dVi`bF)W zYf)>~`j-r$4TVefb<0wm&eg3l>!9ABAOa(3x-~-@I=0qH%T|9G{09_xevt1~zgJ+) zGf&#I+!^HQScQX5*6V0{eUa%IzSl~}itO}1&YX$U^?Mm6OS5ZU*DE=2d8-$D-`ek} z#RayX2-c(v04vv*ezvx zq?5)`xDDYv{bF4?bB*$>Z>I8*sfEcaEoTJT?oNH-m`X+wZ_)BK^5L)j?z~H27 z2_|_Dk1F03|xoC2+8D{Mz&8Mk%c>BQ3*GU;`<68mc;)3oymAS0xM;vN1MtR3%%In=d7Sl_d1Fh8-3kTu?oKq z6z9s}aWNgif+X2NC^_ioO_fYOJ}glU8xNplrcFBQ>7wl2|o%I_y1CeN99hn zSg2(}DOjnqJZ1Pm1geS`=Pg8tqdk4MnBJM}?iT6UW)H9KoOkGl&AwfDzd`bd{3n1c z%P`Dsl6#w&=Saa_vS*g;nId~WB`Ob7U=$cS+M< dSnC|OiI#1wv+Up)|76~(MS_j&KH9ml?Y|AxH@yG= diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc index 521be8c76e5808ccdfa320a9df047e166fd27779..fdbced5364e97785da02fce16e722c04fa997378 100644 GIT binary patch delta 1454 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 UH8^;&cP81sgb39Pc$E0yAAF&8X8-^I diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc index 7ac30678381cc0260e646abc7130333a74c5a20a..69f8b7ee24558a5ccc997133abe16e5712c22eba 100644 GIT binary patch delta 3823 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 delta 3146 zcmaJ@YfKy26~5PFd)O1sfU-EP_{aezRlY_n<;scQSf2~oA#_D9bh2Ppfa zBl+_=-}&a=JLjHzX5KkE*>3us(Wpakbv*o6kIgk{a$>`z|I}DN-^F7jAVD3r^jo{E z{kATf>}$gI{_L)7j1)*jeP3a>uD`^b8#u#sITdIx60{eQpc9QZxEHKTX7#`tM9nJe z7L1}=%yofCFo_LH(Jf#B_i&8pQ3~dZ$}W${h*rv4P&r3LMLZnTel)5g?!>~Lr z%#p#!h`HljbZB?9zdsleDuF1W2h>M3g%A%Yh>c!XAFeL|hp^lbwR~GFP9!cAiIYlj z-$#Ur;Jnhh*$2|Q& z#&W}V>i8Zks4f~t)d^(_n!u-jfY7K$i(cmw8n%a{ia1+|dQ9{v|OE2g>^qR%y z^Q=VH{(q#tp~!fnTH0$Y+VKB1IxQQ~M^i?dS+i1-qxyutuK+k7XGkdMc%dgUYD^f% zIYB>ais;uClrXN|VuE2x)|Rnijhf?u6PsT7Dl~j)Nqn%Pp)Ww%nji{$xMya zi?MCykd5FhR-t4w{n+j`9{@9^1b_oNPV(up{X}yY<6Z&y{BP*j5I zI{8ShJ8Eo{I`}Qu1MEi_T|o(SnukM#6PWJg>`j^6UA8LGFp@KY4+b#V407l+$KVed zl6XO0&WjF3P5?XNr)EdqrmekVM0|CCH1`4*vjfN(x$oYW5`F0KjY+!Q;b1Hl>IsR2>}IsOV-UI^873{@jcE5p z`^AcZV6RB_FkgR|MEk_E@rq+d+sR8zpS5!^elAMLUKTcFoC>i&7z&epEUs=3ofRX{ z;#^w`#zGx^yOw7+>AoozsesOpYA+VkfrcuF5LnQPcIlIO>nT9ngWXN=`R()EPGVyv4zdnPCH^5i^|Q)-qgC-u=Rm; zTQWXpE1vG0x0T(qZX4eZuw=3?`3k2uCd+4in-(;OCIb`2Q{2s>4^Q6TeDDqXEd8ge zxiih9oWf;z%jz!a(h5$Sy=e1Hb){^jms*}_klhXCmy9n|?MYSbnXTG8=ic}Gvv)(E zgyw7~E@_q=o|L!#XPvX&&9}LawYRi$j!^>zr#V z-Q@YIvI^EnuX+l{{{75~_=2YhYx5R!y>GUsIk5f{8-g6Z=52H1X?ts_^5<%>er0W~ zP~I{+z`RvtXsy-Vs#Y?r-)REsBTm)YsQ5^;(*n+IcTt;0aeG_K7H~dk)V8TqcQ6O` z9VKSAO13rnww!?Kj!kwPxGhI@Cx_XRaec9~*B0^5JohG5xSf8l=qF>)GBS0RDN=Sc zu~P7iA6kL}I6Z4CUq&UWhM6rJ%y=x7R|)Ah z)=cP@c+b@F>8^Rc8nSMzd1P=-`Q{9PMVEKMRhDv?Ii1IcF$bG~2#4^7;t;=pp3*Hh@_>(iQL>$$@q4k3j{A%0nBPf% z?Kfr_*uxv?UB4$wZZ~H7#GfbckfeqF&>roD_L%vkliQR0{l{93+>_)3D=E)Jqv1>% z*MH1?q1oCW6$Zm%Ghw-9-)*sJ0C+Zx|Ab7RqTGk5eF3#UMoo`V?L*WA?x(1RPL@{q scVVoXR!(n0{{R3 diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc index 2e5cce487c6df2fadbe87ace1c0e29f42605c2a6..cfa9346b60406972d30790dbb68fdd815be58623 100644 GIT binary patch delta 487 zcmZoy?NjAF&CAQh00g#-jOiv5d2{U<8B!QhIC6M%`J(v1Y|b41T!AP7Fqf5(V>la>R1QqbBa0B*u74I5@SqI5R)bIX^cyF)zh8vm!HZav5VO zBlF}pj4qQC8AUf6Fa@%D^yr5crxq3Krz9nor)DMUyW}UA=BDPA6zjXDlqM&Z0FBTO zPEO28EmCkyPE1M7t##5Wxo`_$TM^ny?9gn4FWB@%FJf0-42aldbrqnQx0oOpfLAlV=c> z{2;?1sc>CF=Zb_*hsPZ`gBt=83)DB5e`jWr=bLi)SWEJpTK-gSa)(G zzYQ~kh~DG_{F4}^CI<_gQj#yoEYOS3%qvMP%1g}AOU}vE%gjqjt%y&C1WOUeWG6ut zM$XCUf^w1|XWkM-)lrmMSj0Vfo}daF56Hc|lTQfBv4DIr`Kh2gWB6oUAt~9r4EA>! gjP5d+-DNQN&cw{f^qqr+k?A7?kodqeIbKKu0B~T3JOBUy delta 569 zcmeBEZCB+z&CAQh00hDJzoqF-`R!=ltB<#Jm*W%!4&l$fWNl#y7H znW*oQTAW>yU!Y$Al*!La%+b$C&B@6x&o9bJnS7GHfKg+!6~}KDM&8M0ye3jSK+hEM zfe3C8p#&oML4?5M7G4uJP7sr8@;=@^O$Q*ecpf7ILj%JNA+hU1S{H@1R+wKFGVWl1 zAR~8yL-K}*#3u$`PNB&Ke16(M`hyIEq{4Lxor@AWpBOkeJsCSZ?#LP35Rh1)zQOzp zGm|{uCkA$2PsYi2`7F6Wj1SBpRg>lT6F4pl>waQjW% z?BQF2sM0`_ig+f^7F1E@1(^d17<3a#OEPnc^>Q1E4$iqXi+g7uUItC#I$7KJ#*qRGh$wiVaD1Jd$^(zC20agb9rCfc) delta 610 zcmX@*+Uv%9nwOW00SJQce@pY($m=CwP@o@LoLW?@pPg8gn5UPNkyw(MsPB?moL!P% zpkDx#$TJYT?{nQ_79_rjITEH&I&=93-Sqy!ilN-ROj1YDTSGG9=LlJjLFib9m8z$GpSP}vg4Q5bg zDDi;tR2YhEY6VKXVEioK$rD+HSvi3=`E8bvoXp6my?Kq41*7UMnTAaZw}Ve9IW2FlMl+rF&0l&P_T9PXJi$hVfKLmM6VE8k-Sn8!roB)2`u)RnSo8{ zBNIrv$PVbcA`u{=seFq)CqF$sGcUbJ2_%@jd5OXlM$HlsI}N6)s2aoqYq9~desS33 f=BJeAq}mmAO-@t_7m8`jr910ILH43;~d2 diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/check.py b/env/lib/python3.12/site-packages/pip/_internal/commands/check.py index 5efd0a34..f54a16dc 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/check.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/check.py @@ -4,11 +4,13 @@ from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.metadata import get_default_environment from pip._internal.operations.check import ( check_package_set, + check_unsupported, create_package_set_from_installed, - warn_legacy_versions_and_specifiers, ) +from pip._internal.utils.compatibility_tags import get_supported from pip._internal.utils.misc import write_output logger = logging.getLogger(__name__) @@ -17,13 +19,19 @@ class CheckCommand(Command): """Verify installed packages have compatible dependencies.""" + ignore_require_venv = True usage = """ %prog [options]""" def run(self, options: Values, args: List[str]) -> int: package_set, parsing_probs = create_package_set_from_installed() - warn_legacy_versions_and_specifiers(package_set) missing, conflicting = check_package_set(package_set) + unsupported = list( + check_unsupported( + get_default_environment().iter_installed_distributions(), + get_supported(), + ) + ) for project_name in missing: version = package_set[project_name].version @@ -46,8 +54,13 @@ def run(self, options: Values, args: List[str]) -> int: dep_name, dep_version, ) - - if missing or conflicting or parsing_probs: + for package in unsupported: + write_output( + "%s %s is not supported on this platform", + package.raw_name, + package.version, + ) + if missing or conflicting or parsing_probs or unsupported: return ERROR else: write_output("No broken requirements found.") diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/debug.py b/env/lib/python3.12/site-packages/pip/_internal/commands/debug.py index 7e5271c9..567ca967 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/debug.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/debug.py @@ -1,4 +1,3 @@ -import importlib.resources import locale import logging import os @@ -17,6 +16,7 @@ from pip._internal.cli.status_codes import SUCCESS from pip._internal.configuration import Configuration from pip._internal.metadata import get_environment +from pip._internal.utils.compat import open_text_resource from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import get_pip_version @@ -35,7 +35,7 @@ def show_sys_implementation() -> None: def create_vendor_txt_map() -> Dict[str, str]: - with importlib.resources.open_text("pip._vendor", "vendor.txt") as f: + with open_text_resource("pip._vendor", "vendor.txt") as f: # Purge non version specifying lines. # Also, remove any space prefix or suffixes (including comments). lines = [ diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/download.py b/env/lib/python3.12/site-packages/pip/_internal/commands/download.py index 54247a78..917bbb91 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/download.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/download.py @@ -139,7 +139,6 @@ def run(self, options: Values, args: List[str]) -> int: downloaded.append(req.name) preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) - requirement_set.warn_legacy_versions_and_specifiers() if downloaded: write_output("Successfully downloaded %s", " ".join(downloaded)) diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py b/env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py index fd9d88a8..885fdfeb 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py @@ -29,6 +29,7 @@ class FreezeCommand(Command): packages are listed in a case-insensitive sorted order. """ + ignore_require_venv = True usage = """ %prog [options]""" log_streams = ("ext://sys.stderr", "ext://sys.stderr") diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/index.py b/env/lib/python3.12/site-packages/pip/_internal/commands/index.py index f55e9e49..2e2661bb 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/index.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/index.py @@ -1,8 +1,8 @@ import logging from optparse import Values -from typing import Any, Iterable, List, Optional, Union +from typing import Any, Iterable, List, Optional -from pip._vendor.packaging.version import LegacyVersion, Version +from pip._vendor.packaging.version import Version from pip._internal.cli import cmdoptions from pip._internal.cli.req_command import IndexGroupCommand @@ -115,7 +115,7 @@ def get_available_package_versions(self, options: Values, args: List[Any]) -> No ignore_requires_python=options.ignore_requires_python, ) - versions: Iterable[Union[LegacyVersion, Version]] = ( + versions: Iterable[Version] = ( candidate.version for candidate in finder.find_all_candidates(query) ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py b/env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py index 27c8fa3d..e810c131 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py @@ -7,7 +7,7 @@ from pip import __version__ from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import Command +from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import SUCCESS from pip._internal.metadata import BaseDistribution, get_environment from pip._internal.utils.compat import stdlib_pkgs diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/install.py b/env/lib/python3.12/site-packages/pip/_internal/commands/install.py index e944bb95..ad45a2f2 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/install.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/install.py @@ -7,6 +7,7 @@ from optparse import SUPPRESS_HELP, Values from typing import List, Optional +from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.rich import print_json from pip._internal.cache import WheelCache @@ -14,7 +15,6 @@ from pip._internal.cli.cmdoptions import make_target_python from pip._internal.cli.req_command import ( RequirementCommand, - warn_if_run_as_root, with_cleanup, ) from pip._internal.cli.status_codes import ERROR, SUCCESS @@ -37,6 +37,7 @@ ensure_dir, get_pip_version, protect_pip_from_modification_on_windows, + warn_if_run_as_root, write_output, ) from pip._internal.utils.temp_dir import TempDirectory @@ -370,6 +371,7 @@ def run(self, options: Values, args: List[str]) -> int: force_reinstall=options.force_reinstall, upgrade_strategy=upgrade_strategy, use_pep517=options.use_pep517, + py_version_info=options.python_version, ) self.trace_basic_info(finder) @@ -387,9 +389,6 @@ def run(self, options: Values, args: List[str]) -> int: json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) if options.dry_run: - # In non dry-run mode, the legacy versions and specifiers check - # will be done as part of conflict detection. - requirement_set.warn_legacy_versions_and_specifiers() would_install_items = sorted( (r.metadata["name"], r.metadata["version"]) for r in requirement_set.requirements_to_install @@ -409,6 +408,12 @@ def run(self, options: Values, args: List[str]) -> int: # If we're not replacing an already installed pip, # we're not modifying it. modifying_pip = pip_req.satisfied_by is None + if modifying_pip: + # Eagerly import this module to avoid crashes. Otherwise, this + # module would be imported *after* pip was replaced, resulting in + # crashes if the new self_outdated_check module was incompatible + # with the rest of pip that's already imported. + import pip._internal.self_outdated_check # noqa: F401 protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) reqs_to_build = [ @@ -427,8 +432,8 @@ def run(self, options: Values, args: List[str]) -> int: if build_failures: raise InstallationError( - "Could not build wheels for {}, which is required to " - "install pyproject.toml-based projects".format( + "ERROR: Failed to build installable wheels for some " + "pyproject.toml based projects ({})".format( ", ".join(r.name for r in build_failures) # type: ignore ) ) @@ -469,17 +474,21 @@ def run(self, options: Values, args: List[str]) -> int: ) env = get_environment(lib_locations) + # Display a summary of installed packages, with extra care to + # display a package name as it was requested by the user. installed.sort(key=operator.attrgetter("name")) - items = [] - for result in installed: - item = result.name - try: - installed_dist = env.get_distribution(item) - if installed_dist is not None: - item = f"{item}-{installed_dist.version}" - except Exception: - pass - items.append(item) + summary = [] + installed_versions = {} + for distribution in env.iter_all_distributions(): + installed_versions[distribution.canonical_name] = distribution.version + for package in installed: + display_name = package.name + version = installed_versions.get(canonicalize_name(display_name), None) + if version: + text = f"{display_name}-{version}" + else: + text = display_name + summary.append(text) if conflicts is not None: self._warn_about_conflicts( @@ -487,7 +496,7 @@ def run(self, options: Values, args: List[str]) -> int: resolver_variant=self.determine_resolver_variant(options), ) - installed_desc = " ".join(items) + installed_desc = " ".join(summary) if installed_desc: write_output( "Successfully installed %s", diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/list.py b/env/lib/python3.12/site-packages/pip/_internal/commands/list.py index e551dda9..82fc46a1 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/list.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/list.py @@ -4,21 +4,20 @@ from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.cli.index_command import IndexGroupCommand from pip._internal.cli.status_codes import SUCCESS from pip._internal.exceptions import CommandError -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution, get_environment from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.network.session import PipSession from pip._internal.utils.compat import stdlib_pkgs from pip._internal.utils.misc import tabulate, write_output if TYPE_CHECKING: - from pip._internal.metadata.base import DistributionVersion + from pip._internal.index.package_finder import PackageFinder + from pip._internal.network.session import PipSession class _DistWithLatestInfo(BaseDistribution): """Give the distribution object a couple of extra fields. @@ -27,7 +26,7 @@ class _DistWithLatestInfo(BaseDistribution): makes the rest of the code much cleaner. """ - latest_version: DistributionVersion + latest_version: Version latest_filetype: str _ProcessedDists = Sequence[_DistWithLatestInfo] @@ -135,12 +134,20 @@ def add_options(self) -> None: self.parser.insert_option_group(0, index_opts) self.parser.insert_option_group(0, self.cmd_opts) + def handle_pip_version_check(self, options: Values) -> None: + if options.outdated or options.uptodate: + super().handle_pip_version_check(options) + def _build_package_finder( - self, options: Values, session: PipSession - ) -> PackageFinder: + self, options: Values, session: "PipSession" + ) -> "PackageFinder": """ Create a package finder appropriate to this list command. """ + # Lazy import the heavy index modules as most list invocations won't need 'em. + from pip._internal.index.collector import LinkCollector + from pip._internal.index.package_finder import PackageFinder + link_collector = LinkCollector.create(session, options=options) # Pass allow_yanked=False to ignore yanked versions. @@ -329,7 +336,7 @@ def format_for_columns( for proj in pkgs: # if we're working on the 'outdated' list, separate out the # latest_version and type - row = [proj.raw_name, str(proj.version)] + row = [proj.raw_name, proj.raw_version] if running_outdated: row.append(str(proj.latest_version)) diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/search.py b/env/lib/python3.12/site-packages/pip/_internal/commands/search.py index 03ed925b..e0d329d5 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/search.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/search.py @@ -5,7 +5,7 @@ import xmlrpc.client from collections import OrderedDict from optparse import Values -from typing import TYPE_CHECKING, Dict, List, Optional +from typing import TYPE_CHECKING, Dict, List, Optional, TypedDict from pip._vendor.packaging.version import parse as parse_version @@ -20,7 +20,6 @@ from pip._internal.utils.misc import write_output if TYPE_CHECKING: - from typing import TypedDict class TransformedHit(TypedDict): name: str @@ -76,9 +75,8 @@ def search(self, query: List[str], options: Values) -> List[Dict[str, str]]: try: hits = pypi.search({"name": query, "summary": query}, "or") except xmlrpc.client.Fault as fault: - message = "XMLRPC request failed [code: {code}]\n{string}".format( - code=fault.faultCode, - string=fault.faultString, + message = ( + f"XMLRPC request failed [code: {fault.faultCode}]\n{fault.faultString}" ) raise CommandError(message) assert isinstance(hits, list) diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/show.py b/env/lib/python3.12/site-packages/pip/_internal/commands/show.py index 3f10701f..c54d548f 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/show.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/show.py @@ -2,6 +2,7 @@ from optparse import Values from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional +from pip._vendor.packaging.requirements import InvalidRequirement from pip._vendor.packaging.utils import canonicalize_name from pip._internal.cli.base_command import Command @@ -100,8 +101,19 @@ def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: except KeyError: continue - requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower) - required_by = sorted(_get_requiring_packages(dist), key=str.lower) + try: + requires = sorted( + # Avoid duplicates in requirements (e.g. due to environment markers). + {req.name for req in dist.iter_dependencies()}, + key=str.lower, + ) + except InvalidRequirement: + requires = sorted(dist.iter_raw_dependencies(), key=str.lower) + + try: + required_by = sorted(_get_requiring_packages(dist), key=str.lower) + except InvalidRequirement: + required_by = ["#N/A"] try: entry_points_text = dist.read_text("entry_points.txt") @@ -117,9 +129,25 @@ def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: metadata = dist.metadata + project_urls = metadata.get_all("Project-URL", []) + homepage = metadata.get("Home-page", "") + if not homepage: + # It's common that there is a "homepage" Project-URL, but Home-page + # remains unset (especially as PEP 621 doesn't surface the field). + # + # This logic was taken from PyPI's codebase. + for url in project_urls: + url_label, url = url.split(",", maxsplit=1) + normalized_label = ( + url_label.casefold().replace("-", "").replace("_", "").strip() + ) + if normalized_label == "homepage": + homepage = url.strip() + break + yield _PackageInfo( name=dist.raw_name, - version=str(dist.version), + version=dist.raw_version, location=dist.location or "", editable_project_location=dist.editable_project_location, requires=requires, @@ -128,8 +156,8 @@ def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: metadata_version=dist.metadata_version or "", classifiers=metadata.get_all("Classifier", []), summary=metadata.get("Summary", ""), - homepage=metadata.get("Home-page", ""), - project_urls=metadata.get_all("Project-URL", []), + homepage=homepage, + project_urls=project_urls, author=metadata.get("Author", ""), author_email=metadata.get("Author-email", ""), license=metadata.get("License", ""), diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py b/env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py index f198fc31..bc0edeac 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py @@ -6,7 +6,7 @@ from pip._internal.cli import cmdoptions from pip._internal.cli.base_command import Command -from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root +from pip._internal.cli.index_command import SessionCommandMixin from pip._internal.cli.status_codes import SUCCESS from pip._internal.exceptions import InstallationError from pip._internal.req import parse_requirements @@ -17,6 +17,7 @@ from pip._internal.utils.misc import ( check_externally_managed, protect_pip_from_modification_on_windows, + warn_if_run_as_root, ) logger = logging.getLogger(__name__) diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py index ed578aa2..278719f4 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py @@ -154,7 +154,6 @@ def run(self, options: Values, args: List[str]) -> int: reqs_to_build.append(req) preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) - requirement_set.warn_legacy_versions_and_specifiers() # build wheels build_successes, build_failures = build( diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc index c0cd252128b50ab80abac4de90ae9c6fd110c0ad..df3239fd22b86fc8bda81eedad7fbd864da556f0 100644 GIT binary patch delta 99 zcmdnTevO^yG%qg~0}$9UGNy0jImhTRK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY#k7SH04I|n AYybcN delta 75 zcmcb{zK@;fG%qg~0}uq?|CY9q=NzL!g??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ64Mq&0NBVI2LJ#7 diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc index 9ef8144099d7422dd637232e635876897325b3a9..f4ab462899db7efe37eda9a57015c45a4d983ecf 100644 GIT binary patch delta 872 zcmY*XO-~a+7@p~Vx80WVC4!X-jb9tWCg!%VD$K8EWfpx0x+!O$@|v z@Zg2)L2u~6puvL)2ao;$51M#eLkx)?ym=sKI61R|(Mk5%=Y8IJKjxiz*S+7ZzE{;a zpz8vJm7nYC@s$QOo&W?8bb!JBF$cOaBj$1j2bs+|yek+&#Cb<_B}0M$$B0OMf+M?% zp+FD=vjB-}07)3sI$44L*K2u;`=c0%7SxpQ%qVKHut#0ES(-K{FHcWiy;7VFD7nUO9ab~akH9@>w9Nxe z4LgI3)Vciu_Hrxi$Ql>&K6aJ}GeX5QZO8I`)AU(mx!mf(WBrDYiLaxwbr;txeaf?! zU0iSa`ZQX$E!LJkZ(9x~xe41s*lp=^b5lAc-c-%1SG*GOYS?b-xPC`>s%5>=YTokd zBSXVMNf;H=w9Nf1?Wrr+5M+3A`=u}glWkP>A?tv&2M6L<&j1rt3ael*3DN_fQiC7m zLDCTvrO|GtlP(6w*tVm%r&95Bfe8r;tKe(u)KL_*LvbmZ9g(OJNb-XIH;cv-R-g1S zIKd!G!RIOD=pyZugxO$2%m$nCXm*G>4_iz9(;AhvOz=w{f$89^(r2>xkn@{_^e~pP z%9LAn)5UZihzL|9z0AXxJ+kSXY-qj&lmRrrBR~a DU**jU delta 719 zcmX|8O=uHA7@f)fZ?fAoXliXEttprdr3vUkFlhauUbG5Tk?kRFGn*!6HXCMFw1q+s zJ$Mas@Tw;fFG^1y#G?m63m$}(;zbXF2M;BPC%;*!1N-)U@0<6&o!L?GUD5hrStf$D z@@>@qG_)qKb)a~H2qKswSG+S62N^em1(&E4$gZ4nnJR(mswr2f7U-^yQ3hQ_MBPC| z^U?jnaI;h~H?U*;6eE@$oai?OaX0LH6u5QMYxTT!f2rFiJ{!KR4*$HW_%<>8F=E0a z5xK3C?2i0WxM8{Z$LJAu$5)V(+ug%;$u>ZBq(qK<+GYl~m5F*>yB+x~s`WhP^%vGU zUflI+SNy0KhlAPxI%0aQ<5LhUnP?l61ayCnRQ9H^%DmtFt{h}=4+!&}42AE;v z+|e4xW`tk?Y@>r58aw&fF7N4OR^VIOnPLufc0@o?Y&-P5*Oq51LdXJaqwn_Yp$qCn zZKsFl=k#0E{{fE7#AtS0z?6V#fJg?IfdwD)M!$pSdEO|h1rVJApEpipo8L30hy+3+ zMKNO&g4y00aIX~ye%uKOQ$S>s0z_OQuZ1CHCj_;c%@*~ds0CNkY&w|bK~0ab$i{_1 zKLmp(#uhH|yXL|vF+c6V4>e$hmu5IwR)$8R#v6lff1OGEms#Pj%?qw}@zUk%ur2kx zKrHo(_`iB12+0HLpJ#O_#q~vV0KX-S@mFN-qp2ULv5(H~qxykb#dA+rp07Sz9U-7; F%0IkysmuTX diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc index 13bf39b351247bd4b7a5c807a1a0953fe060b3b0..1858bc82b6cc8ff4c24ff9ac74034eb0d073f77b 100644 GIT binary patch delta 99 zcmdnWdzP2yG%qg~0}$9UGNy0j`OoMvQ9raewWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAN%~Zt#05vNi Ak^lez delta 75 zcmX@hyOo#cG%qg~0}uq?|CY9q=Rc!CrG98}YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{oeFjEx^0OCL!EdT%j diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc index 6d766c8e44f52ea7f26a33a4ec5da8755d709c1f..4031bc61b001ef303819a6a7fe8425594fa09017 100644 GIT binary patch delta 1764 zcmZ`(Z)_Ar6rb7K+q=E(Zg01Dz3Uy zy$gbxl30y|7;VOgUraRd8wnriC%=#wKT3=h5k1maVodM@rUViViNtwZMSCiAsRa8yKinjfo<(~P)2NjT|e;h=)l;Xp@BWm?Hk!US10@h+-2Ihu8-ymNAr_( zuvjLP@fqBVFY=G^jv1nm01c6#7!pw@f+RF6=QI)_n)o*miRx5o5z!|k(jY9xV-{Ul z8pT>e{KKS?DkMxzYEgwM6B2mA@Zu`O6leAllQ2h4sCIO|C|$xs?`IFX zl(|_loAI2&EqrcUJoz|5J?|PUn zlnctNgf0F~a4Fm@RF(p01xWLn+JQUxr)sAX6NY+<|E;F@4Rtfl@MP!?ZkZ2j>wFu4 zm~{XI0Xku6q*!*VdB+)J^jNLPsCPDI^CLzQujg+XT^k>gd9GP-?GoVn1!Ul3K+4t% zIBD}+W`zG?MDboOH{O)t6!X`te$1aSI}~pNoqWO^PD9kX!fNF*W%aS=B~9SimWZ)nVav5@u!N6j99Ut zr{^zNXK{3ePWZD1fL#E+{BUHQv0I3bkj+J2iWkB3wt)YV;pkHy*{*1N{1Gz!0oh$P z$j?Muq>nJ~@+Y~`)FiPUZiZw0W;B93Jn5d+G~eAE!FV;_7h4nT7Cd%{S=^27Ik-%_0V{&=nzPi%ll9i>zBR^myKjNtOT>IX+kHHdO!SP3>AFU!TVTa$ zD0$J@%0z{g@>S+t@^-O+^#H)@^zWX*jlIZ^C7;l|3V}nNZ1Z+@KBe$)6Dod}UrO$f zf3W**b8S_d*NCi(hqV^|{HmKr_Cqj<1Vfc%hi2dFy%9o9t^38gL1_0c>3qtNat)$aSETn@e0096mvB1s_0s!So`!s?C0Hp3E0ki0qB>RKQ4M;JT z`PJ4Zahm(nZNA$hqMOp|q}vf*P7i2a2ynDx{Gu?k0AEU{aFE|ix3{XoUXM=~r#Frj z%T>zCd1oViy+FMzy8LKnh!17f&cJEws(6xyE0dFyu_Hof+W@?6J-*eu!JVZFsX6pn zHZ7LG)8+OHSoUFzuOZ_X)O!W>{)W02QQsokx`?(cqQUFF@S@ziq$b{rT~!kcYT}b^ Um({hWlsn3Zg!%f_n)g)v0|&*EQ2+n{ delta 1806 zcmZ`(U2IfE6rQ=ed-vYm-tON0=`P*wk1hRK(QXR`C6MA`3qDjtg#=c}y6nAem)`wh z?pA&h12KI;1EfrhF_8olV=%<<&=>U0$eUs$H9^-jsEG+aV77u*`s6uNDiGr&^UXPD z&N*}DoHKKA`)Av=uQbg=V7z+kuknqu+8X-tY;V^|N(^E+EV=B?xdrXCl(L#r1?{pt zWpBr- z>;S0_GZ#Ki)85}uXII)eyJ%?I?m}^@Fk$W}RSc8AOot*x++7{Y1LE#C{8PH+r0Fqa z(`&e4N`^A7zyZ!&i{Sz}@=n78yk zxyIJTP!I+x05qeQIRI1qZf@S5I zd1Si8%(7Xj+pG__!jFpb^=iI2X%?qgnqO=k=zkc3aM+IyGXS;=AcccrD69+MM4Ert z9^wICn2z#3-yJ93Ywk{9gz|%WuPnmqb`b9#uVSXmi8Hcrr%(B2G6_l1xQ>f2f3%p0eD+hr`)`BpM zu#MM3-N7u7Hn#I>+>H+YL#Tsa3k@bFaPI=Zf8ubfS<1EWM)g4;z>S7`o}*fpVh~v> zV#(4a4Kxb8eHrPmw=}qqFsA z{(F1mz@h`l`?eFd-U_wRw4>pDq_x;fAa8gL(=M`7tzN2D(k^KFDk~T2Oq6UhD6p*v zD!}Sh(2VWo`PfsU>7g%YV|{dne;(W7oKI)(@%ynZ89R+-<~loMns^0`CAMFPkan}z zkX|{1XXC+)@b6qn6?QW_fN&5%ME|g@p9GP}PCK7eTj;y|N_>wvEZxRqiDysZT^kN~ z@+^WLya@Q%8UEl6=b>uVVgtzI`(Rl2mC}hKV(J;bBZf_}QbatE?LiP%5^t*&Sp=N+ zZGaiFC^=n9lV4A)r}6X2F1@*nMqRC!4mJraSL=5P?@4z1n<3rhx%70Cz;bm2gfAvX zy}~iNf;(JDcE=i#TB+8bFIDO$gCDMcrEAQ}8_dmrN%l~MtEmK4`QcO_?@jG|U4?&c ztU57aGKO!LJ%b=(d_3-DWox-=Ok3tKtAYythc-UIrh`)YBWb-w2ItA(uViR}WEaS$ T1+sO4Y*-*W_;RXKd>#J)@CKEk diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc index b42f2502a71aaf734a0e8f117a1285a63173513f..a3c191fa5e65ac5787fefa335cff7764ecb6b5cb 100644 GIT binary patch delta 634 zcmY*W&ubGw7@e7&o!w1#V-rg)iP8wIux({MR%peNgj8Bewf5j%WRsc1q&r!eO(+4u zAN1-W&cT!afFAt^JPKaC8W1n`ARers2%el-@!$vZ=6&D1dGpQ8hvKtR;hpE@fQk(W zyG!PzF#oWlvgd#T3S+=w2ssK7)H#X`jzgSrBQ`k+Nyc$(aXYlR6FNK><{)5D5T!Tc zJa@UM%#R&EFQ33STTg?7l!-K;t>}pLqoAI&N1P3YY0#jfb~NlI zgJ8cM#Y|K;+Yx1a9PI4W14WX0KN@tCJ(2WTdng5Z0OwwRLrqjMv$jN0O;hve9%FHe z6t7lAN!~QKVOhQ~4~w&UnRI#s%7oCbC}&A+`HUiBMuCqr15we1^BOKFNU?&d3T5?} z?4MiIHA}%GaOwib6WY~x173{288evSUv$)Pr&9cgdzG4G`Ij4KjP~@NEv$X=U0CMHD|5<0rQ%Q AeEOi z<`!aBV!Y9y3qnzAg9i2&umP^=?MamudCZk>KZ^4rPp9wZWgpK>cQ4B`_)a%*n3=eW z;4;GKkTQEqZy1hzh2NiB3-6VQD8q3q;{5FDD6Y~tTu#byRZPN(ssKD3C7c)Qh2TuS zCQtC8w{zMG>FF>75i{zjjrCEI@RBG$7>KsqG;ZRK{Ai3@2cc{Z)0`zj-Y~C+zDkG# zN&>xkE4q;AfgDp(0(PL5Xe(3q{h3^0W diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/base.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/base.py index 6fb0d7b7..6e4d0c91 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/distributions/base.py +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/base.py @@ -1,10 +1,12 @@ import abc -from typing import Optional +from typing import TYPE_CHECKING, Optional -from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata.base import BaseDistribution from pip._internal.req import InstallRequirement +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + class AbstractDistribution(metaclass=abc.ABCMeta): """A base class for handling installable artifacts. @@ -44,7 +46,7 @@ def get_metadata_distribution(self) -> BaseDistribution: @abc.abstractmethod def prepare_distribution_metadata( self, - finder: PackageFinder, + finder: "PackageFinder", build_isolation: bool, check_build_deps: bool, ) -> None: diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py index 15ff42b7..28ea5cea 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py @@ -1,13 +1,15 @@ import logging -from typing import Iterable, Optional, Set, Tuple +from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple from pip._internal.build_env import BuildEnvironment from pip._internal.distributions.base import AbstractDistribution from pip._internal.exceptions import InstallationError -from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution from pip._internal.utils.subprocess import runner_with_spinner_message +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + logger = logging.getLogger(__name__) @@ -29,7 +31,7 @@ def get_metadata_distribution(self) -> BaseDistribution: def prepare_distribution_metadata( self, - finder: PackageFinder, + finder: "PackageFinder", build_isolation: bool, check_build_deps: bool, ) -> None: @@ -66,7 +68,7 @@ def prepare_distribution_metadata( self._raise_missing_reqs(missing) self.req.prepare_metadata() - def _prepare_build_backend(self, finder: PackageFinder) -> None: + def _prepare_build_backend(self, finder: "PackageFinder") -> None: # Isolate in a BuildEnvironment and install the build-time # requirements. pyproject_requires = self.req.pyproject_requires @@ -110,14 +112,14 @@ def _get_build_requires_editable(self) -> Iterable[str]: with backend.subprocess_runner(runner): return backend.get_requires_for_build_editable() - def _install_build_reqs(self, finder: PackageFinder) -> None: + def _install_build_reqs(self, finder: "PackageFinder") -> None: # Install any extra build dependencies that the backend requests. # This must be done in a second pass, as the pyproject.toml # dependencies must be installed before we can call the backend. if ( self.req.editable and self.req.permit_editable_wheels - and self.req.supports_pyproject_editable() + and self.req.supports_pyproject_editable ): build_reqs = self._get_build_requires_editable() else: diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py index eb16e25c..bfadd39d 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py @@ -1,15 +1,17 @@ -from typing import Optional +from typing import TYPE_CHECKING, Optional from pip._vendor.packaging.utils import canonicalize_name from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import ( BaseDistribution, FilesystemWheel, get_wheel_distribution, ) +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + class WheelDistribution(AbstractDistribution): """Represents a wheel distribution. @@ -33,7 +35,7 @@ def get_metadata_distribution(self) -> BaseDistribution: def prepare_distribution_metadata( self, - finder: PackageFinder, + finder: "PackageFinder", build_isolation: bool, check_build_deps: bool, ) -> None: diff --git a/env/lib/python3.12/site-packages/pip/_internal/exceptions.py b/env/lib/python3.12/site-packages/pip/_internal/exceptions.py index 5007a622..2587740f 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/exceptions.py +++ b/env/lib/python3.12/site-packages/pip/_internal/exceptions.py @@ -13,16 +13,16 @@ import re import sys from itertools import chain, groupby, repeat -from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union +from typing import TYPE_CHECKING, Dict, Iterator, List, Literal, Optional, Union -from pip._vendor.requests.models import Request, Response from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult from pip._vendor.rich.markup import escape from pip._vendor.rich.text import Text if TYPE_CHECKING: from hashlib import _Hash - from typing import Literal + + from pip._vendor.requests.models import Request, Response from pip._internal.metadata import BaseDistribution from pip._internal.req.req_install import InstallRequirement @@ -184,10 +184,6 @@ class InstallationError(PipError): """General exception during installation""" -class UninstallationError(PipError): - """General exception during uninstallation""" - - class MissingPyProjectBuildRequires(DiagnosticPipError): """Raised when pyproject.toml has `build-system`, but no `build-system.requires`.""" @@ -294,8 +290,8 @@ class NetworkConnectionError(PipError): def __init__( self, error_msg: str, - response: Optional[Response] = None, - request: Optional[Request] = None, + response: Optional["Response"] = None, + request: Optional["Request"] = None, ) -> None: """ Initialize NetworkConnectionError with `request` and `response` @@ -358,6 +354,17 @@ def __str__(self) -> str: ) +class MetadataInvalid(InstallationError): + """Metadata is invalid.""" + + def __init__(self, ireq: "InstallRequirement", error: str) -> None: + self.ireq = ireq + self.error = error + + def __str__(self) -> str: + return f"Requested {self.ireq} has invalid metadata: {self.error}" + + class InstallationSubprocessError(DiagnosticPipError, InstallationError): """A subprocess call failed.""" @@ -726,3 +733,45 @@ def from_config( exc_info = logger.isEnabledFor(VERBOSE) logger.warning("Failed to read %s", config, exc_info=exc_info) return cls(None) + + +class UninstallMissingRecord(DiagnosticPipError): + reference = "uninstall-no-record-file" + + def __init__(self, *, distribution: "BaseDistribution") -> None: + installer = distribution.installer + if not installer or installer == "pip": + dep = f"{distribution.raw_name}=={distribution.version}" + hint = Text.assemble( + "You might be able to recover from this via: ", + (f"pip install --force-reinstall --no-deps {dep}", "green"), + ) + else: + hint = Text( + f"The package was installed by {installer}. " + "You should check if it can uninstall the package." + ) + + super().__init__( + message=Text(f"Cannot uninstall {distribution}"), + context=( + "The package's contents are unknown: " + f"no RECORD file was found for {distribution.raw_name}." + ), + hint_stmt=hint, + ) + + +class LegacyDistutilsInstall(DiagnosticPipError): + reference = "uninstall-distutils-installed-package" + + def __init__(self, *, distribution: "BaseDistribution") -> None: + super().__init__( + message=Text(f"Cannot uninstall {distribution}"), + context=( + "It is a distutils installed project and thus we cannot accurately " + "determine which files belong to it which would lead to only a partial " + "uninstall." + ), + hint_stmt=None, + ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc index 518ab312cd6a35fb0b5eec39263514cf9214ca39..9ef3951cd7a7a3001f581728c706ba600ce83856 100644 GIT binary patch delta 96 zcmey#IFX6xG%qg~0}$9UGNw=D3H9jE4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD0at005}LAj<#% delta 72 zcmbQp^plb2G%qg~0}uq?|CTn9C)A)oKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQMB-1^{&t8fE|h diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc index badf12d65a62b5d323fa9711c63bf6d4fe2c5533..963ddea323c78ac379d4d880e33cbf8c904a2a4e 100644 GIT binary patch delta 2236 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 D2;HDO diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc index 8a8f56ddeeb7e388c495868ad209c822d37685d2..1e4b5c0e7b13c5b1a3bcef596f99d7dfc98894b1 100644 GIT binary patch delta 7934 zcmZ`;3v`pmmHtOBOR{9kShgjDEy*vC-v*2WHrNJZFgD^1=7&@f(r+Ws!=eNxx zM92Pg=g!QXJ9qBfxifm-yWG=n@@xg3F#uns7W+M z&7wJ)EG9=Sq9tk-t~RL8JH3ZjK#A+NJWilVc{*_=*^%!ztMFQ-!@#nBS6gwwW2 zX|zl%<8)eoq&!+7R`9}%NM*E2tm1TfWNvhxIFHlz$oy!vSk38-$bx8%Si|Ye$Su)@ z;zCYmMHWSC#ad1~B6ZQl;$luaBTJ(7Vm+s`BMs3;v5^Rpi5kE-Gb2l*{maBb3L%t#KnN8`WY-|`RHyfAp&fig zAFnHfx}s+_le{&d*^)&ni?`NMiAHW zx-zIMpQ;nrb6&+pU{+2uH*jVZ@a9hQHiqWGfb;pFD>@9JY8YOP9_)@vv4mW)Jk%Ww zBtT-thF~BfQFmi75R#%j6>V)z6+pzBb_HUc@wGI*OA01fwpr5Gf!z5+2h3+Q&SD@Z z;9sD%2ur3Q$QE078CrR9=sD|pVkkqpd`O@AqV5(S(B33PCrgnIiUqm`VJ*Tsg!Ks6 zLrwy4s~=j+zDSR$LQ95r*mY*ZFIc<6D6e zix9RTco1-8Mb{Nb?4-F!8au)fDHe!I)Q;6F5mI;?&fJ9MR> z*gn_hcC?F<+STK~LtP_(IMxxTo3TL^!YYJngc^h<0I!8^MVhbIBA^t5s=H#8Iy+SX z67#yt2xVK`MWl9Uzk5*IUypqn5E`*hlHVVS2mO9ULnS3C7>{V58jA=~_?Hg@9MB3^G;FZokh&JDSy`cj_=cJb zAJ8Y?jjaO!dmZeBVh5WjzOSGcie8PX3Qp9kQ8eY1eEu?SSGOCM_KA{u7i#mF@b!Q& zoYit++Y6>s+T$&!eJ6aQj*<)8zLD8qOK#1awx6Pf#Zq*Uu$-VJELK|Ko(tU-ODNna z$q9cj-W^ML&Gar{QmП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 delta 7742 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 a*ssI+j*!@d;>nub{vcU@#?7_j7bF2~@l7TG delta 231 zcmcbbbT*0SG%qg~0}uq?|CY9q=NYp>zJ6$NYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ70Xc$#+#FPMK~{uYJXx7;B;l2EY6$80%B}#;GNB3 zV*@n*1;dX9h8x1-*M(It3aefhHoYip`iX&&)3(F;hPd=~al?z^hFerN6mQnNEN*k1 z$L1oB%|~XS^yDD1{}!fL46wQ=Y_-GWy0z~`AQJWinI+TVd`C!ZLh)qHZhw$wna!=@ G7bF2pX;2mb diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/collector.py b/env/lib/python3.12/site-packages/pip/_internal/index/collector.py index 08c8bddc..5f8fdee3 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/index/collector.py +++ b/env/lib/python3.12/site-packages/pip/_internal/index/collector.py @@ -11,10 +11,10 @@ import os import urllib.parse import urllib.request +from dataclasses import dataclass from html.parser import HTMLParser from optparse import Values from typing import ( - TYPE_CHECKING, Callable, Dict, Iterable, @@ -22,6 +22,7 @@ MutableMapping, NamedTuple, Optional, + Protocol, Sequence, Tuple, Union, @@ -42,11 +43,6 @@ from .sources import CandidatesFromPage, LinkSource, build_source -if TYPE_CHECKING: - from typing import Protocol -else: - Protocol = object - logger = logging.getLogger(__name__) ResponseHeaders = MutableMapping[str, str] @@ -201,8 +197,7 @@ def __hash__(self) -> int: class ParseLinks(Protocol): - def __call__(self, page: "IndexContent") -> Iterable[Link]: - ... + def __call__(self, page: "IndexContent") -> Iterable[Link]: ... def with_cached_index_content(fn: ParseLinks) -> ParseLinks: @@ -254,29 +249,22 @@ def parse_links(page: "IndexContent") -> Iterable[Link]: yield link +@dataclass(frozen=True) class IndexContent: - """Represents one response (or page), along with its URL""" + """Represents one response (or page), along with its URL. - def __init__( - self, - content: bytes, - content_type: str, - encoding: Optional[str], - url: str, - cache_link_parsing: bool = True, - ) -> None: - """ - :param encoding: the encoding to decode the given content. - :param url: the URL from which the HTML was downloaded. - :param cache_link_parsing: whether links parsed from this page's url - should be cached. PyPI index urls should - have this set to False, for example. - """ - self.content = content - self.content_type = content_type - self.encoding = encoding - self.url = url - self.cache_link_parsing = cache_link_parsing + :param encoding: the encoding to decode the given content. + :param url: the URL from which the HTML was downloaded. + :param cache_link_parsing: whether links parsed from this page's url + should be cached. PyPI index urls should + have this set to False, for example. + """ + + content: bytes + content_type: str + encoding: Optional[str] + url: str + cache_link_parsing: bool = True def __str__(self) -> str: return redact_auth_from_url(self.url) @@ -400,7 +388,6 @@ class CollectedSources(NamedTuple): class LinkCollector: - """ Responsible for collecting Link objects from all configured locations, making network requests as needed. diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py b/env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py index ec9ebc36..0d65ce35 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py +++ b/env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py @@ -5,12 +5,13 @@ import itertools import logging import re +from dataclasses import dataclass from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union from pip._vendor.packaging import specifiers from pip._vendor.packaging.tags import Tag from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import _BaseVersion +from pip._vendor.packaging.version import InvalidVersion, _BaseVersion from pip._vendor.packaging.version import parse as parse_version from pip._internal.exceptions import ( @@ -106,7 +107,6 @@ class LinkType(enum.Enum): class LinkEvaluator: - """ Responsible for evaluating links for a particular project. """ @@ -323,23 +323,15 @@ def filter_unallowed_hashes( return filtered +@dataclass class CandidatePreferences: - """ Encapsulates some of the preferences for filtering and sorting InstallationCandidate objects. """ - def __init__( - self, - prefer_binary: bool = False, - allow_all_prereleases: bool = False, - ) -> None: - """ - :param allow_all_prereleases: Whether to allow all pre-releases. - """ - self.allow_all_prereleases = allow_all_prereleases - self.prefer_binary = prefer_binary + prefer_binary: bool = False + allow_all_prereleases: bool = False class BestCandidateResult: @@ -383,7 +375,6 @@ def iter_applicable(self) -> Iterable[InstallationCandidate]: class CandidateEvaluator: - """ Responsible for filtering and sorting candidates for installation based on what tags are valid. @@ -461,24 +452,23 @@ def get_applicable_candidates( # Using None infers from the specifier instead. allow_prereleases = self._allow_all_prereleases or None specifier = self._specifier - versions = { - str(v) - for v in specifier.filter( - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - (str(c.version) for c in candidates), + + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + candidates_and_versions = [(c, str(c.version)) for c in candidates] + versions = set( + specifier.filter( + (v for _, v in candidates_and_versions), prereleases=allow_prereleases, ) - } - - # Again, converting version to str to deal with debundling. - applicable_candidates = [c for c in candidates if str(c.version) in versions] + ) + applicable_candidates = [c for c, v in candidates_and_versions if v in versions] filtered_applicable_candidates = filter_unallowed_hashes( candidates=applicable_candidates, hashes=self._hashes, @@ -761,11 +751,14 @@ def get_install_candidate( self._log_skipped_link(link, result, detail) return None - return InstallationCandidate( - name=link_evaluator.project_name, - link=link, - version=detail, - ) + try: + return InstallationCandidate( + name=link_evaluator.project_name, + link=link, + version=detail, + ) + except InvalidVersion: + return None def evaluate_links( self, link_evaluator: LinkEvaluator, links: Iterable[Link] diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py index d54bc63e..32382be7 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py @@ -336,17 +336,6 @@ def get_scheme( if skip_linux_system_special_case: continue - # On Python 3.7 and earlier, sysconfig does not include sys.abiflags in - # the "pythonX.Y" part of the path, but distutils does. - skip_sysconfig_abiflag_bug = ( - sys.version_info < (3, 8) - and not WINDOWS - and k in ("headers", "platlib", "purelib") - and tuple(_fix_abiflags(old_v.parts)) == new_v.parts - ) - if skip_sysconfig_abiflag_bug: - continue - # MSYS2 MINGW's sysconfig patch does not include the "site-packages" # part of the path. This is incorrect and will be fixed in MSYS. skip_msys2_mingw_bug = ( diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc index 05205c604ecf1a549f6d6ba079113810180b56eb..6e88f802e110b09845bc69fe7684b82207d27919 100644 GIT binary patch delta 1067 zcmZ8fOKcNY6n$^To^d9zC*xmY(m-qqiIdna`2hJiRvPnZ6%f>lP)j2)9w&+eaj*wU z#kfsWiP$6{i>vZWkOFKf*_9dw5E2`N#HLg#Zi)np3er^&jxu#D=7VZg5&at=9wkIr?%v5o9X9*5B{+&)KsgBz5NTloj^|n zU#_8N-jv>Snf|^}rSNFo6syMH1z$l4)ZE2b2CjCew!k343SZPV(P~tZwd*vx2Mj_} zrYSSztaVW7u)<6GE{k~>C0I#Eu1=00rK!Pr=ytfUS&2A4*T6{q2lcHhMT9b|BvC0> z#;7zk6O`IZwa8YOY%|e(wh|uJZyXR#qJ$s|#jdk58|f(Ztwp&^=0u~cn?={CAv%Ls zDp*}%=B5V8Y@AA&14v>^jz}jg+t=5LeAbj%70;R^Z>gL#CCx*WXogb__HTV9RkVmm zL|JQwE{!KcW!8@d%?N#|s)@1$moQ4bB?nncHfF2V95Yr8lKTFyW0{g^S(~lSXx^Ra zwC#0jV-uSt+z#qVQdq-qxlb3WD&Ue(nZ(ZYf7W%p$;@iM@$1T^1a}xmv0Vjd0Fzwxs=im>o z1K+#QQ;#1j4L!e72Sp0=&v;{=Cgde&$ZHA7GpO8@ZcVxJY%$f9(z0U8A>NcPFVYI6 Yx19vd!b)2RxB-K0f{R(U1S>HHNiCEzXr=Y`f^NB0 z$dXYECN)R18o;2&Y)N?-xtnP4!T7M4m>_kVPJQvumOi%I6l_=pz>H;vL*G;;OSut{R0%A3IWoFIni|*z zAjzV?eHB{4ux|q}%SlsJuP6dW*%))k>~IblA`}2`LB0(Fp+fex#PLBOvLWLn;SD%# zmQ$fcW}O-?XymChHJ3pTYVG!C<>#{pBxw>&h5VLq z0xi{*D?+B_V$@Vu-DjQz$zrj%5dJ2r#!kwmhqI^_H6e@0&VxlNOlRSK0`W1-Jyrlw zm7r!hKM?Sd?T@iev|d@^z)Nu11M^*ra9WO2mJ}DJLRR#suJWDdWH)pq1VUiBBuno* z5Fe)>H}3`m764wwZc?4pB+WvPTtT)anwLutE9R^UAe{X#hax4?BC~AEDxU7?D!brf z_$h4h(n21M*c^>`Ka9(NUXK*>1c9x={W4Fs}iO6U? zkhqi>ij9XyM*_jY(Qq_45*VBqK}XzP!!@#a0z<-z!GZeRE~-a?rrZPSO$c6irhm+U)53kuT(Vd z0LXZAY-x%~O{9l5*^&&m#N259iS^`ZoJhUC7Rb$${WlPJo4^8rMKs@34>Raa(;oax zT5G;W!LN|NwS`&3>2>M7)~m4du#T8d7ZZ7vz-r%es2dY0tLBj(>ah@h*OQX*-gy7>TGN+qo-Fa0(va(bcqy`ww`Jw{V0v(t3&z{fg S3Q`Z0+Fe6|hLG*l*?$2-c~_|b diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc index bd20a54a6c6f676be59f6bc018db3e106bfbd1f2..2309978abc1b472c725028b3042f471b29c2da4d 100644 GIT binary patch delta 172 zcmca<`qq@^G%qg~0}$9UGNy0jvE=mV(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t0 W%pf4Wxr3L7k$Ge3<;~OioOl3DBRH%8 delta 152 zcmaEBdefBWG%qg~0}uq?|CY9q$CA^aOh2?ZwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>Km$ODm9%#Y~h93PFzyBbE9MT}Q+EieR1vQ3O!!8Q51#M#grlF}V~_l4y;obM>95%W6DWy57c15|9 zKg(WM_hw`iy1_5>ff>Yjz{U506~y?!#=tGuuivRZL-`_?+y{2=$sgr}4Zt#74E(|$ lxWP;w243NQ|4#oI&KG$UKJbFY_!!uDKJ$Z_F_TT?H2|D;t?&Q< delta 578 zcmZp*zhlRHnwOW00SJQce@kQ7$ZNoEP^KSRoLW?@pPg8gn5UPNkyw(MsPB?moL!P% zpkDx#$T+{!+SlTl@}g5V~mdc6__kZB;`!Vs&2ra>MRU3Ji!dfOpHKW%U+Je(iBRJ z0UE`nps+byK@W z&Xh>ey`yGuO~i14;Do>#EEB^oh!}QoUKBCB!O4GtQ~HjE(KQj{1%^O5wuzA!M2si@ zkvJQ0M_BF?0~4o4hw~i~`2{RX(pRKyNWQFQby>u^!}Si2@C3IR&I?4Z@~D4c1*-bM z#=s-g;QRBFDG59+Yd@`xpA-@)aP>J-7G7m$jBN26g)ZES^5}jG>~;+ zGM`KtW7OnU83nF5ApZ&w7sYH|FJsRr0P;W)NO=)RWl`MZf3mWSd6Q-2u4j2MG78<` z7y7^qVm#pD`@jlf0G+@s*stHIKSTKq-!@w)t@89V^ a!}%hQ!UtZk7#{;0&u4xxGiq|IyaoVC@S5ZR diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc index 7778a11049dcecbf1ca3d3bee9abeb8b8d875de9..8f6ab494a616eff6057f1460c6b0cc75daf64fdc 100644 GIT binary patch delta 99 zcmca6`%aeUG%qg~0}$9UGNy0j`N8DTp&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ5Az~!0Q-a+sQ>@~ diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py b/env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py index 97aef1f1..ca860ea5 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py +++ b/env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py @@ -192,9 +192,10 @@ def get_scheme( data=paths["data"], ) if root is not None: + converted_keys = {} for key in SCHEME_KEYS: - value = change_root(root, getattr(scheme, key)) - setattr(scheme, key, value) + converted_keys[key] = change_root(root, getattr(scheme, key)) + scheme = Scheme(**converted_keys) return scheme diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc index 97f55d9cb89353ec45ab486ef201332144b6a57a..d73ae2bbe5a6daf9d53940eddb032762586c1925 100644 GIT binary patch delta 169 zcmeCyo2$ojnwOW00SIgv8PhlN$gz8L>xUMn78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9Dc*z+87fhIRF ze34<`61mPPbCFYKPQ;R`tDHu6_=Tr<&Pke|H8bmirrSk1_sb$4m-#)vGc&S!F@9tK Rk=HqmE^r!c=I8js2LKniI4=MI delta 112 zcmbQM*R98MnwOW00SJQce@olQBgbw~tRGsOT2!o`omiBZrfyvE^ H9Dn!#NTwvP diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc index 318c9463cdaa7c24b68dedd55f60acaf0b6bfce4..0a713e1938ef827b984db59062db0213e7c0f48b 100644 GIT binary patch delta 666 zcmXv~O-~a+7~bjZ_G?{AAktPVA7ZF&8n#+vG-zd|l^9B+0Yc=`EW1O~y6u+PEu@Kw z7h?#C33ZG@)IdCGJQ4l@S3Q7$(Y@%wlcyRzanYG3zR5iAGw;{T`+V$q5tKeilAoh? z9f0C=QwjszjE-EXh;t&~ik!~B0dpsG0ZFppDS6mBg|AwX4T;})v~vL##~cD+G7C<{l_cvjD@fz>+|X| zDywqF)an&fwJkZT*EQ9qjq;SH8VL6*nyRBpL(b(gG9_lFtX7NW9c-47W|KUe1byTc z90#qPAFv5Rb~k;XZ8ra(J>beG$$)Um_1;CE2#X-J^H*2}V34eOhCnab_S^uE$uCbB zejZGbF7H*yox4Qx-uZ_jW-?*OAWp#vOlGH*j54hhZr#r2GE=yZMLk7i7gWP=ASI4q z)r=BzHZIk$$O=SOP*WR*sp>Hw9$@o^S;CExRX1$Rq;Z4_r6mX6M-2xoIl>Z&`yyw0 z+XE_Av0$5pvSn6rnnq&uSZ+WxUle`|MaffNG;)|o|Awwa$Ja!9Yq1&F0!N)^_Y&zA zOxB+Y9S=H)l6yU*FqHj;>|*Bg*&4z~;op#LLOG?3bR?EAAC* zRcsA%;q!lnxIp)_)H>V@Yy=KMv4f5{x#^FK!|vUl;8@C?k9Cq|e?H0f#1|Pbq1w8% kKl+Zt{Vc%NIQCwvn0nnnX*@<+{$5@_;$+e#UglZJKk7xkLI3~& delta 549 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 delta 8112 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 P`1|b+N*=Yd`_2CWD9YBL diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc index 1ea68c5172d7344ef6fb4d66c21556834e572583..a73c2f1b7fc42a1babc84f162b03e755cff39a56 100644 GIT binary patch delta 3384 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 NJ{10(z(cKy{{z-VP+9;0 delta 3118 zcmZWr3v83u6~6b6?by!4IJWb!6FYVi5+@HqGz-#Pc(bI(2ZUVnD<-7jU|%F5Cc`0bc~)Z0)#o}Ewkj+eidxcep(lB(FiAE1p3rDEc>{8k1-cJJ1Celt#AIl=E$x%q0nbhux}JT0<`36&_xYm% zzsD=d`=XJ4Pd{iPVSmumCk2C%LlG7f`4-g<>YDntYMnr9_#Mq#w0`Q9^lD0t{F-(< zZJN^QHdETlKd=89ZR2C(F#76`CB^6_hdB=sikyLkhHxjQ8S{t zm|Q3E=_HMqF6l)rXmv{#T2Y^3kpUJNQl^->q}7O7DcUS48@w8%^aAkMD~Q=Cx@D=l zAy67pl*Uvg=$57Eaul5jSYrxnR#*$LIVo(e!sY>MN@4S1-wGfw6D-#($90?}mUoMpG|?g`g~7`Hc!XN+l2I~O#>S#lxcT*mpVM{1Qb z=cD{W?y)r*7t)|JmbE~jd8~$^{D7@h3$5aZzhhf$z%VB%YsP6PKrveZs6;<#Nj<$a z!AK9B(n$Ci|6O6cDhI3*TIN60g&9h&)(jk^AAKdX(w;qC!9aK)3-jAW8|ZQFvR|b` zeAd27a~fwD=6Q~(TwG})yDgf$B%}?DMHn06A356T8D3rdjs~|Bh`$uCrr+n~&hy40 zAW|b8<8#ge`X>L>St_vI{Fdt_x|?q=si8mM!zEW>#`@Bo^vcv|X$#F-24meSB|tEJ zuk1Pcqp6(bE`c85O%+=;KS9@D<}X*+?Q#3FizH3gL62=4-7wZXTULFc^IYfou0b`+7pF&WIz{GDD{!nU5LUci+Kz6SUn;Gu0N6lWrxa42EqIh})FYSL}}Iz2@x`HD?N4wFl1hbU_V zTeqOpER?*zSL#v%b_)rirk1S(t&ERDak5VSpP z@dJB%+|oX}an@p+u~ft?6%*#m)=BG(yCvpsiCb2K#$bAF@Yvvt!4)&O&aR9bDyOxT z-0bpca9XItOP)=w^XMGwA18L2 z(mtAp4w4-tnRZq3s<;Yv|5@vk75)_1)YK=80XexhUHvR_Fd$0ep#8rN?EmS1k1kvQ z!{oN1aK=y`Gn7vZspE#4w@a^8Ua6d^UmvSqKW$h)tzECI#7$Whn7b?4a%fmNLIr|y zr8!V~1|X5q6ZFe+NQ(AFMCL|1AE6In8$v%q5yDY`gcc%(M?QL(=?I+XxYdY6e65JP$Qf~P)?i*B`9ygzKbvkkVp?nvh3d@CDNZy3hWB%a4T2_ z!jF}u;K^q<__Dgf)r?0ENG?%>s&Nvx}bUy z`gIS|h$b7Y>-f!jf4fRuHKBjIVbTB>ue$0+{>`dbTgL;G7c!~ZdA4stJ{LkqaB)+$ zm!6f;xtC5vA1bYqdxq)l88=#ZwBcX$7d+ZnN$>L48wY7Ow>DJ^eH=`KEUxec~i>)D)5UfC%b-w1Xd0E8G;qz76Lx=OoO0Q(0eE;JFL`F z47-Z6S(K^}@UKAfxhh5p;S>J)>R-}H9#~`3_>dgnudKOBU*qFzO}WxQkJOJhiJW|* z@i|~d9$pJu2?lnJ2?;a5y4GRF*FX8htGfO0R~3Wce^}cbHp@9vge2naGrF`kd7GX_!B9+Lt5s^mOJFxy9#rMc;`vmJZXQdN~gkO0 str: value = value.split() result[key] = value - payload = msg.get_payload() + payload = cast(str, msg.get_payload()) if payload: result["description"] = payload diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/base.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/base.py index 92491244..9eabcdb2 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/metadata/base.py +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/base.py @@ -8,7 +8,6 @@ import zipfile from typing import ( IO, - TYPE_CHECKING, Any, Collection, Container, @@ -18,6 +17,7 @@ List, NamedTuple, Optional, + Protocol, Tuple, Union, ) @@ -25,7 +25,7 @@ from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import LegacyVersion, Version +from pip._vendor.packaging.version import Version from pip._internal.exceptions import NoneMetadataError from pip._internal.locations import site_packages, user_site @@ -41,13 +41,6 @@ from ._json import msg_to_json -if TYPE_CHECKING: - from typing import Protocol -else: - Protocol = object - -DistributionVersion = Union[LegacyVersion, Version] - InfoPath = Union[str, pathlib.PurePath] logger = logging.getLogger(__name__) @@ -145,10 +138,10 @@ def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution": raise NotImplementedError() def __repr__(self) -> str: - return f"{self.raw_name} {self.version} ({self.location})" + return f"{self.raw_name} {self.raw_version} ({self.location})" def __str__(self) -> str: - return f"{self.raw_name} {self.version}" + return f"{self.raw_name} {self.raw_version}" @property def location(self) -> Optional[str]: @@ -279,7 +272,11 @@ def canonical_name(self) -> NormalizedName: raise NotImplementedError() @property - def version(self) -> DistributionVersion: + def version(self) -> Version: + raise NotImplementedError() + + @property + def raw_version(self) -> str: raise NotImplementedError() @property @@ -385,15 +382,7 @@ def iter_entry_points(self) -> Iterable[BaseEntryPoint]: def _metadata_impl(self) -> email.message.Message: raise NotImplementedError() - @functools.lru_cache(maxsize=1) - def _metadata_cached(self) -> email.message.Message: - # When we drop python 3.7 support, move this to the metadata property and use - # functools.cached_property instead of lru_cache. - metadata = self._metadata_impl() - self._add_egg_info_requires(metadata) - return metadata - - @property + @functools.cached_property def metadata(self) -> email.message.Message: """Metadata of distribution parsed from e.g. METADATA or PKG-INFO. @@ -402,7 +391,9 @@ def metadata(self) -> email.message.Message: :raises NoneMetadataError: If the metadata file is available, but does not contain valid metadata. """ - return self._metadata_cached() + metadata = self._metadata_impl() + self._add_egg_info_requires(metadata) + return metadata @property def metadata_dict(self) -> Dict[str, Any]: @@ -454,24 +445,19 @@ def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requiremen """ raise NotImplementedError() - def iter_provided_extras(self) -> Iterable[str]: + def iter_raw_dependencies(self) -> Iterable[str]: + """Raw Requires-Dist metadata.""" + return self.metadata.get_all("Requires-Dist", []) + + def iter_provided_extras(self) -> Iterable[NormalizedName]: """Extras provided by this distribution. For modern .dist-info distributions, this is the collection of "Provides-Extra:" entries in distribution metadata. - The return value of this function is not particularly useful other than - display purposes due to backward compatibility issues and the extra - names being poorly normalized prior to PEP 685. If you want to perform - logic operations on extras, use :func:`is_extra_provided` instead. - """ - raise NotImplementedError() - - def is_extra_provided(self, extra: str) -> bool: - """Check whether an extra is provided by this distribution. - - This is needed mostly for compatibility issues with pkg_resources not - following the extra normalization rules defined in PEP 685. + The return value of this function is expected to be normalised names, + per PEP 685, with the returned value being handled appropriately by + `iter_dependencies`. """ raise NotImplementedError() diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc index 0645523d81f07a360111f32bc0107a1f9dce3df6..37e59cb2b9ebcebf3e9044e91365de0d941e53d1 100644 GIT binary patch delta 96 zcmey))X&UwnwOW00SIgv8Pg~7?Dm+dA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv a04S56mzblUk(!f}U!Gr-lQNl~u>k<2`5IUN diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc index 26c9d0e1f18ba8e682e80124f5eb68d516bdd2d2..79511101d300208539b20ae98d4cfcc122f851fd 100644 GIT binary patch delta 2427 zcmb7GO>7fa5Z`Dx)W~Ilkli~f>*r>FF{*Z)~5;yLG>s6gkhP}jLcnOWVaHyEKO4EAD^wqmXQU66d1+)qOBGZl zXXqoRRGU{)hB?Nn#Aklbt{iOv z=$nML!lXm)8IeXnT6{988#I|LM#d%ioMK3_WJvL*GH4pEVG=dJbiE_Cfi=Y_-ehPL z*XU0Dj_{gc?u5ra@ZX-|{w5@3{^B_@yazpq6`9nGGb%(2U!lmSDAg$42WQS*%&$EA z_I88f8A2{Gk3zlmP=D3iPos!aK^(dt#q(aUw>)`?0%$QjF6qj7$(V~b6e1cAqrh8D z##kD{O+Sd3mv-X13k7}@!ys#^WYY5Hsg_r$u}DQc971t`VY(RFi_6`YBaRK$Vt&D& z4A}>$vxrPXw;%IQN#G!Cci#8F*X}+Hiv8w4zV1e#0%niUad8Wj*BJwIVviDYtGOOrVvdoviUaf>0F>FXtK^bhmmwsytHjP@oL?9+x8ng! zEOTXd*;8^;uEdo*X?BVMf4A-50sctg7lzEqo?Fe!%6vx!j?3UI6Lel=W8Px%v|@;o zh{YgEIa&MwSPo-pv)~16&de0BLd1##7Pp;&0+W+PA&xc&Gr6?3O%4`)ab(9y*_$vbUo5vi}bIZTOT-98#q>vjDB=>X<~VBgAcBB z-{pHYdV0UUbmP*uZ`XSc)x4d{+;VDV^bdb%BhtRwzH+=85FdhN*IgbUBcB$p7FYXM z->-*z*LrK=fn^SqE7Qxxs<-2zKWZ0A3ZiKa2(5{q;BGIcw@k2|ERZsxegpW{7$xFx zaEdY9j@IxvD=3d9!)%I|iLpcE5-~6f_Hc~!pb>U-CHQsw&gGnZOkV!c7+1WFEJZdx zPp2VW%K;IkC-OYv=u-+lhX|;mjdFV7Vi$7 z$^HevUZdmN94@raDn=5oklgttv57&)!RQQHzY78qA7J*p`Qt!6+aq z;(l0MYpaI`tKPv!{;>I%f3R}j-@Q6r_xDw~K08gZsMVTL^BOg>nVGm#FSG}6=}{1t z$5_lmVKv@>-G^dMD5k@HoYj@jLQT zetfmvJ1PE4Kwm|HL~g_cX>C98g_gVReM{BkLRL9JPlE}TtNsm$O&1~L9@BA;@jYNh ze`iJ?GiSCu9&%#kz!n43R%;6xSYFs-T8Q~;VCX`W?A;I|>q2);=w26MH6ga?0^LKm zu>8i#+gFdT4zIm_<6zZ4RC5nMbHmBzp#bS$i>>z^sr4OM?;ET2jcqcZx|7?&$qwYd DWj8A7 delta 1202 zcmZ`&PiPcZ7=LePc6N4VcXo|`vPrC&Y$|nwWVKYhNW>bkMMhR}p-N-~0Z5@B7U+ zzmDG;UVN0#TLjL@XaCLCGKBntO7EoK39lc5aGNl~s84DX?v$Sjw3-&^H9bhz(t%Mk zC`pl{glX3Z(|Kl9>*m(X#F_@H!P9+fmSs4d-$E99t@`);w!YXGn8|gX9Rht;XW46d zEyt`Ry&usNK9QY=JR9%Q$&Pe)ut)eD~RT9fDIJlXWB(>%H$!*;a|9;{xS z-reAR9W9e2h=hBdv_C<1(LEt!~n`g z1hWTe^}9Z0Bo6ZdP5(=&tu~CWcI7dH#+zqC`EAhldB9tevm-);LTm+Jubn!cDQ!b) zU)umn8R5e$&|{>579;GGEgs+mek zU}fO~R7^35atQ&O#+iDZg^hYWHrpZuuH=G9@;}FjF9;bSVh4)vCwEaraMU;EK__vb z8dE0h2RF@^G&ccif4-lr!So~;%4)^h-X$ul9$7;>Bp7cKiL@t2rg~C`tfrJ@4^LmA z68?$q=}?KJCuj9tXq1;YTXH(^cic<$JXdLlo`j{j{ENEl3}#@sdESuf59hi%TPQCk z8)XOsG6k-YzemuBtkFMFHOVfYbTbJ3L!%uBj?JhdyKkdTOv4q%4As%Q3?NCU+ zd2TY`(qo?V#IQPF9A&X}#`7=o?&c(G=RyN9g0LL{n|7azPx$C_y)_R6A-m}FDX|Z{ zNOsf&*w84Yf03bQWX}__M~!WoDraf&=j?iEVy!f>UfRD_+P^`-^xNS#cqQ-rA0|}v AqyPW_ diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc index 87b9522963d0348d87124eec9088dc94ab83cfe7..253718bd0f48d2936a0be914691f68a3c2492ce1 100644 GIT binary patch delta 4093 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 delta 5038 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 diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py index 593bff23..ec1e815c 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py @@ -1,5 +1,8 @@ import importlib.metadata -from typing import Any, Optional, Protocol, cast +import os +from typing import Any, Optional, Protocol, Tuple, cast + +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name class BadMetadata(ValueError): @@ -43,13 +46,40 @@ def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]: return getattr(d, "_path", None) -def get_dist_name(dist: importlib.metadata.Distribution) -> str: - """Get the distribution's project name. +def parse_name_and_version_from_info_directory( + dist: importlib.metadata.Distribution, +) -> Tuple[Optional[str], Optional[str]]: + """Get a name and version from the metadata directory name. + + This is much faster than reading distribution metadata. + """ + info_location = get_info_location(dist) + if info_location is None: + return None, None + + stem, suffix = os.path.splitext(info_location.name) + if suffix == ".dist-info": + name, sep, version = stem.partition("-") + if sep: + return name, version + + if suffix == ".egg-info": + name = stem.split("-", 1)[0] + return name, None + + return None, None + + +def get_dist_canonical_name(dist: importlib.metadata.Distribution) -> NormalizedName: + """Get the distribution's normalized name. The ``name`` attribute is only available in Python 3.10 or later. We are targeting exactly that, but Mypy does not know this. """ + if name := parse_name_and_version_from_info_directory(dist)[0]: + return canonicalize_name(name) + name = cast(Any, dist).name if not isinstance(name, str): raise BadMetadata(dist, reason="invalid metadata entry 'name'") - return name + return canonicalize_name(name) diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py index 26370fac..36cd3262 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py @@ -1,6 +1,5 @@ import email.message import importlib.metadata -import os import pathlib import zipfile from typing import ( @@ -16,21 +15,26 @@ from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import Version from pip._vendor.packaging.version import parse as parse_version from pip._internal.exceptions import InvalidWheel, UnsupportedWheel from pip._internal.metadata.base import ( BaseDistribution, BaseEntryPoint, - DistributionVersion, InfoPath, Wheel, ) from pip._internal.utils.misc import normalize_path +from pip._internal.utils.packaging import get_requirement from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file -from ._compat import BasePath, get_dist_name +from ._compat import ( + BasePath, + get_dist_canonical_name, + parse_name_and_version_from_info_directory, +) class WheelDistribution(importlib.metadata.Distribution): @@ -133,8 +137,6 @@ def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: dist = WheelDistribution.from_zipfile(zf, name, wheel.location) except zipfile.BadZipFile as e: raise InvalidWheel(wheel.location, name) from e - except UnsupportedWheel as e: - raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location)) @property @@ -155,27 +157,20 @@ def installed_location(self) -> Optional[str]: return None return normalize_path(str(self._installed_location)) - def _get_dist_name_from_location(self) -> Optional[str]: - """Try to get the name from the metadata directory name. - - This is much faster than reading metadata. - """ - if self._info_location is None: - return None - stem, suffix = os.path.splitext(self._info_location.name) - if suffix not in (".dist-info", ".egg-info"): - return None - return stem.split("-", 1)[0] - @property def canonical_name(self) -> NormalizedName: - name = self._get_dist_name_from_location() or get_dist_name(self._dist) - return canonicalize_name(name) + return get_dist_canonical_name(self._dist) @property - def version(self) -> DistributionVersion: + def version(self) -> Version: + if version := parse_name_and_version_from_info_directory(self._dist)[1]: + return parse_version(version) return parse_version(self._dist.version) + @property + def raw_version(self) -> str: + return self._dist.version + def is_file(self, path: InfoPath) -> bool: return self._dist.read_text(str(path)) is not None @@ -206,19 +201,18 @@ def _metadata_impl(self) -> email.message.Message: # until upstream can improve the protocol. (python/cpython#94952) return cast(email.message.Message, self._dist.metadata) - def iter_provided_extras(self) -> Iterable[str]: - return self.metadata.get_all("Provides-Extra", []) - - def is_extra_provided(self, extra: str) -> bool: - return any( - canonicalize_name(provided_extra) == canonicalize_name(extra) - for provided_extra in self.metadata.get_all("Provides-Extra", []) - ) + def iter_provided_extras(self) -> Iterable[NormalizedName]: + return [ + canonicalize_name(extra) + for extra in self.metadata.get_all("Provides-Extra", []) + ] def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras] for req_string in self.metadata.get_all("Requires-Dist", []): - req = Requirement(req_string) + # strip() because email.message.Message.get_all() may return a leading \n + # in case a long header was wrapped. + req = get_requirement(req_string.strip()) if not req.marker: yield req elif not extras and req.marker.evaluate({"extra": ""}): diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py index 048dc55d..70cb7a60 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py @@ -15,7 +15,7 @@ from pip._internal.utils.deprecation import deprecated from pip._internal.utils.filetypes import WHEEL_EXTENSION -from ._compat import BadMetadata, BasePath, get_dist_name, get_info_location +from ._compat import BadMetadata, BasePath, get_dist_canonical_name, get_info_location from ._dists import Distribution logger = logging.getLogger(__name__) @@ -61,14 +61,13 @@ def _find_impl(self, location: str) -> Iterator[FoundResult]: for dist in importlib.metadata.distributions(path=[location]): info_location = get_info_location(dist) try: - raw_name = get_dist_name(dist) + name = get_dist_canonical_name(dist) except BadMetadata as e: logger.warning("Skipping %s due to %s", info_location, e.reason) continue - normalized_name = canonicalize_name(raw_name) - if normalized_name in self._found_names: + if name in self._found_names: continue - self._found_names.add(normalized_name) + self._found_names.add(name) yield dist, info_location def find(self, location: str) -> Iterator[BaseDistribution]: @@ -150,7 +149,7 @@ def find_eggs(self, location: str) -> Iterator[BaseDistribution]: def _emit_egg_deprecation(location: Optional[str]) -> None: deprecated( reason=f"Loading egg at {location} is deprecated.", - replacement="to use pip for package installation.", + replacement="to use pip for package installation", gone_in="24.3", issue=12330, ) @@ -181,9 +180,10 @@ def _iter_distributions(self) -> Iterator[BaseDistribution]: yield from finder.find_linked(location) def get_distribution(self, name: str) -> Optional[BaseDistribution]: + canonical_name = canonicalize_name(name) matches = ( distribution for distribution in self.iter_all_distributions() - if distribution.canonical_name == canonicalize_name(name) + if distribution.canonical_name == canonical_name ) return next(matches, None) diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py index bb11e5bd..4ea84f93 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py @@ -3,11 +3,20 @@ import logging import os import zipfile -from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional +from typing import ( + Collection, + Iterable, + Iterator, + List, + Mapping, + NamedTuple, + Optional, +) from pip._vendor import pkg_resources from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import Version from pip._vendor.packaging.version import parse as parse_version from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel @@ -19,7 +28,6 @@ BaseDistribution, BaseEntryPoint, BaseEnvironment, - DistributionVersion, InfoPath, Wheel, ) @@ -75,6 +83,18 @@ def run_script(self, script_name: str, namespace: str) -> None: class Distribution(BaseDistribution): def __init__(self, dist: pkg_resources.Distribution) -> None: self._dist = dist + # This is populated lazily, to avoid loading metadata for all possible + # distributions eagerly. + self.__extra_mapping: Optional[Mapping[NormalizedName, str]] = None + + @property + def _extra_mapping(self) -> Mapping[NormalizedName, str]: + if self.__extra_mapping is None: + self.__extra_mapping = { + canonicalize_name(extra): extra for extra in self._dist.extras + } + + return self.__extra_mapping @classmethod def from_directory(cls, directory: str) -> BaseDistribution: @@ -168,9 +188,13 @@ def canonical_name(self) -> NormalizedName: return canonicalize_name(self._dist.project_name) @property - def version(self) -> DistributionVersion: + def version(self) -> Version: return parse_version(self._dist.version) + @property + def raw_version(self) -> str: + return self._dist.version + def is_file(self, path: InfoPath) -> bool: return self._dist.has_metadata(str(path)) @@ -215,16 +239,15 @@ def _metadata_impl(self) -> email.message.Message: return feed_parser.close() def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: - if extras: # pkg_resources raises on invalid extras, so we sanitize. - extras = frozenset(pkg_resources.safe_extra(e) for e in extras) - extras = extras.intersection(self._dist.extras) + if extras: + relevant_extras = set(self._extra_mapping) & set( + map(canonicalize_name, extras) + ) + extras = [self._extra_mapping[extra] for extra in relevant_extras] return self._dist.requires(extras) - def iter_provided_extras(self) -> Iterable[str]: - return self._dist.extras - - def is_extra_provided(self, extra: str) -> bool: - return pkg_resources.safe_extra(extra) in self._dist.extras + def iter_provided_extras(self) -> Iterable[NormalizedName]: + return self._extra_mapping.keys() class Environment(BaseEnvironment): diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc index 4141437ccdea96e0e32c7d45d993ac9de7090ddb..8a50905f976ddb6bc82a1b6b5fef8e9f98a35efa 100644 GIT binary patch delta 96 zcmbQuw3&(LG%qg~0}$9UGNw=DDf8&m4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD1m01OS}ZAk+W= delta 72 zcmdnYG@FU%G%qg~0}uq?|CTn9r_7*GKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQQvCCID=G8gBpq diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc index b2a25ca4059f1f9bb32f8322df3f89c502894550..97c2396244292aa2d3a299433482b40a9089bf58 100644 GIT binary patch literal 1645 zcmb7EO=ufO6rR~Xt)wU}iQ>iqhfQc{wm-YX@zDuw<5JwZrm>wuL}5GL8L6wRc9q#x zii8e^q?ex3lMSH|dP;B(?x{Jtrxto~h)d1VK!3=gHyITQKK0FNn7FhD7hFp-}9gr#zm6=MxhN?`b8qHO8s^3;Bd8#qBD$zXPLOW*`k`r@56cgVkF?e{H1k?l9 zS!a5YH93n|5Jv_vnqdscBffFg9h#gqsv$SLk-x16a-syJ!IIp~LBxsTLzuh>4)G&` zm4GE0XK{-M3$6mYA>{zb@b&KjTSGDM0o8@{5OpCFUA&QL@PAuN@vsq4R~i=cfBY|Z z<-e`l$W#^%1!c;K7OvEp8z)7_iC9eHm^)5VN(=5}`7o74iI`tK^m8Nal)mefr+`{ql}(jY=jSzW3;*C$GM_qhB5sgW(Ul z)fY8(vpEwOY4D{ju?%1hbx~bN57Au-S^?FwX&hDFg+T$$Xp?1X(8ynCOQMXOvT+c! zaV{&9(NPQ%8~fPg;$<;0PeT;G8N3WU$w7@peLIu?mYP(35^SS$z*f=jvGFzYbMwyR z_UWn3>91$Ln%T6rl&$4&uYGfE>)r2eY>!>p*01n!FgA-K_hOKsfeMZT#cBBhA90); zE#hYy@PURdi1Xl#AI1?t8Lmyn9ESu!2rURB4N@*rz(qFs3Be|SJwWMIX*4`9q=Jbr zngjMJ`bD|)>vONH&iz~{-J07im7gf(-NMmZ@AMQ|wbz$=2$uU7(q)sT%cHn2guMb* z7xDV>Kaf}lw}^8W%zRQjcotd2MQM{s=tB#}BcLI-2F>XOH7hH`z;iLW{FtzwNUeum zYYn>AO5d0?JaG>{Bbdlz8r;4-j|VdaxWF6XZ{5-0FSr; literal 1922 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 delta 4261 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 JN4TD_0sy*>IXnOW diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc index a638afad6c34dd921b9725522427634bead1cb65..d226dc3993abc83bf78fc6461e3187af36e95ff3 100644 GIT binary patch delta 99 zcmZ3_dz_c&G%qg~0}$9UGNy0j;bit`(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKmN|D^#uu=wGl2`?%SXeFq}| DHLx`i delta 124 zcmeAZ`Y6bAnwOW00SJQce@olQbC}VfMnAMTwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YqoQa=R+Zkv?1H%JxsXNkY4{RK++k{=T3H!#(B*AyX a#9{)=bpg$b0-7sSt_tXX+8oBdgAo8~Y%4|p diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc index 6b52a28422d874e204b3afee2485ef3a7bf5af3f..271f6976bc9fe78aaa675b9e2ebb9f03fd3e473a 100644 GIT binary patch delta 6893 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 DU0HPX delta 6316 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 B@l^l- diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc index 6e3c49d4fa8f63b6f626cbfd072a389308309f20..dc0ef32143c20cb73cd20446cfa440e93cce3935 100644 GIT binary patch delta 608 zcmZ9Jzl#$=6vyA2{gF+U&E0YSxWXccAdAI<_33#MJrBYmoY$;H7--HHn#o?wic2~w6e<*M7YYCy(ERN_|E6M`+bkc%((i&8GZG<8mPK~*x4Zf zzqDDFwSf6O1@C}C2n-qNVN61T&;e$QF*FEp!pu+B1kdsW_JG+Zz$z0pQPd6eY^xiylm8d-{`Aib*O6%;11oS6d~myY*;cORgz1byv5_Q>m{`t}iq4oTjqnf}&GrI~J_p+v7Lomh$>F)9XrR q1|k;3Li0}@@bb_4?PIsFfw*t3e8Y=>iHr3aD482TwhC>_q5l9!^o&3N delta 739 zcmZ`$PiqrV5TCdEcC$(Ir+*?%p{NHzf|A85p2SN9Q8WaK9`+K_yq6|)yBpqaERlue zkV6l8kQ{RF$>LY=8~6nzAc}s0Z6gXjIg?~P>A?Kv_nUe1W_I6u>oi^al*?rRZSU)^ z)^`oy2Z_Y^lFV)(nScNX4nVL|<}eK&gV07G^bgoY=4gFhHr|CF+1YrP-KsSg=>=w& zVs;P71SB{NZ_@;Gbjck9Y1ofsa2WbsyNeayYq)k>x~_lh zD_7Xkdu6+weY@Ka+rD?Va%aaL-`8)~rdGY)@j79>{<^T&Y|A5ANfH}4F1U#>gm@K7 z*G~AG?B~s^{|Lp>34fcO;ZYd(v}XgAM|K9PfI;O5(h1Pp1U ucb7}+!I3X|u6(FUSfED>wh>~TF?OyQj9;umVV4b8ew!O?>jDtw-G2b?4wHBQ diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc index 93c1a3f4ebe0431836d90eeb673dc2457974dc7c..3f43b49fd141ad97d89bde3046068835e1217a7f 100644 GIT binary patch delta 1418 zcmYjRO-vkB9Di?Sc6RoQ{e)dqwzFx&bPll9VoYi4N`P7uinX)}S&i$k@39@6oxwLl zkY1K(y%>!pkN9yiX*^KzU_wmv;Gv#0UQlW!Ly0C{^aj$z(u=+~KyePg_xpdp_y4~) z+uCQE_G2Ou1?)QuVPho?z#m*V_(J<+=lcb%(SiU06t+^$bT!?~R5K6=0K=*71MkBX z=a%7~RBdNIVWfN!InW5;d4QtV0g5dPdp^tifz^&VsK@`}(x?vo2r@jQZW*r21Zl)v zxOXXbnNfL?IM=XEdtt};BJ=$SU{Hk!RD~-5!K&B*NVo~B5)NUxli68$@eE%NWhsyq zW(fr>g2V$W3gYNAd|Znn8OxIbQm#wY7>Zz-$@@7bC3Xa<8lQ{lae5bCi?y)=B*`JQ z^0M%*kV`PGC;h1F8N_pEP46mE=&n?RVOj{i_ll}AQ~%8WQeQ-F9+U_?D z=D}7GX!@#B*vJ)WRX*DZ+K=4NfK>jyxqF4ur^!!}OVQQ7p}U1)`jy;Y1fA#Lb`GSn z>v?TGUs`YPx*wKO(JdfFqC0?YwdGbe!zaX|4%vW6gdb7xh29gsI72L#k5g5NMtfrC zT9bSac?N%i2lHUHYwULA>%lw4r@lP-Yw?-em0ee2wzt~z@F9%q$-UOeOvO58Hm5CI zV;O@AJksAk#-zsYO4q=z1j>rkT?;sf$|7UVvli}7Azu|Lp50U->X`8OlApY?^guv(m@u;buc`%s3t<{0aFAwoz~gbdm4~U*!8f&6q1P zP}OF1D z3%{pwH^vqsYf|U>A(PrNZ;w)#8KkqB?n^;3o=4A<$JpYBEvL~i?FQ*!5~*-ioDIt| zCwiw1!d?vTw;y}-r@$`Z4fSPjZkmTlbTdO>7%g5Pom}y|!b=c5sp^u0u(!4U!!wKk6Tjl(wM~4WNLiOoiEa*N&UD*Sy^* zN);&qX1Ilx{&wo}ABoO+AfxRPjgq>?Ex!Q}3cqxvNfNXsJ@jZ`6+)k|F zHYz0rG>$BF8Clwz(9xylu@U->feEVOvx}9szD+|NuyYB7%g9D0Y@w21;gVQGmT(o9 zBwMybTd~zX@UWzZl5A_1Vxg)A>7=zzm{RC}d^PY5EgMovw;)_qu=HiA6t=>)3b>P? zDp?WGM&>mmO8bQi;Rr+~QAWDfKM~#+QelvdSfG2pNqldv?oShy9+xv%q37h6|Lae` zkdKbc7GC#k;uU60Vm9+r)23fH3ny%E#&=tV7FgV-=@h1I$8qOe;#l;sGPRFA)%zOA z657n5oN-I*-AHA&ksKPPpDD*h#MQA|;)R`ti^Jo=M5Z(nT zkUZO|65gXX+f9N19?O%3Lxw;Iv~s!Lto!Bih18^NlFIaC#ckR7J?$8~!5$26ji7x) z7o|(Fjs7P%>&;%2K8TVWeYY#M?x`bUmKfk^V4^W51VVl!5NCq+AWST|zr;mY6*Gp#pTj$MX;JOSwk zE!oFR8cWi0>OL7@P-)t}<5oz9IqYX7&DB+xG|Z$QNax*pllR3?$S|1bN8tfnpf|#X z!kdz&cl9*g4G$@2!0P=&ha-7)WpNvIM~k!+IV&>$dE|_Evv`Nf(LtPB&qZIuN`d8y zK|k&mpJU>q3gvfZUEe0G_km_NExwwDNZ5@)WW^o>$zwCmW|yE-AIDzBbM*JvD^KM> z2h9{cpYU!N60ezGASb}cgS5x`Ht%vPKBlx-xM%5&cy@4g@rPLPy13GH#rr;f;C8Hd zODo<7#;;tBJtNWG_>s4QaK$k_uVMSsu0>cO(hY*Q3S=2=NrJ3xYpDD1(rNlt_t+s#9=w<8y^>rxy(xpdsi2-dj#P#;luU1i zn4}}UYbVU46y5DUILgzo3`P&>1s14|TdUQZHIf2EMwu!CE8x_p@-36V7tI}n6#7#lGp@2gY;A*3&Guh{@HQdiOv#ssKW~D; qhfjW>9c#GOtYg1G-T(vp9=$O-n(U+JlKYc?DIUh7cpGuXZ~Y6rHc{RH diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc index f3bef76f131d5a22d85ca381f7a40e5b7615ab8a..7f1c4e4c6433b2a5811de94af25f4e4d91a527ac 100644 GIT binary patch delta 126 zcmX@Z_k@r4G%qg~0}$9UGN#|($orMWV}gEYacWVqeo9hed1_XozDs^`X>Mv>NwL0b zN@;RpNoIbYesFSPPHK^YV{&3jYHp>zkB^H!kdg0_m6(^FA5fH^m6}{K*@(4>QEKv1 Z)(wmtlf&3v@Nwxf+J0gH5=BBl3juXzD763p delta 102 zcmaFDcZQGmG%qg~0}uq?|CUy~k@qW$L4|&3acWVqes*F}VxC@7Mq){3qP|ONadt_5 zfqnr{CO&w zqn%073ur^JB#?N)@S}m@0|S#f-%T~g87WhkC%8=Kyr||l`4iU}gAkA^4J1_(TsIA^ z7g{YaUctJf^rC%0M{!5$1j7lT6Fjf*$ZeFG{GPj+(PeTmk3P#KHOJ4Bm+=I!05yEx r{ENqii7{fcIsb7+#=^<}1#UAkZN4qo$jG11$f)v(0Ynxl0qp?**GE?B delta 218 zcmZotf33!QnwOW00SJQce@ol2k#`BZL79GNacWVqes*F}VxC@7Mq){3qP|ONadt_5 zfqnr{CO&w(c}iG1&vHA7HM{J_8@%ym=8 zYC-Uh_R&HXE?- Lk&$C^tC#`+9CU`n delta 387 zcmZ3fyHuC=G%qg~0}uq?|CT1Ok@p^(L7skSacWVqes*F}VxC@7Mq){3qP|ONadt_5 zfqnr{COw$GxHNE=d(^`L3o~CJ?t0MJ*>wawSXXfE0)Wi3Wxz{Gve76)NlXR_a~ZJcY}eS;Gz_ zs{kZ^K=h0I&PF&2}p4R!v`s5PWd~+ z;+MsJmt<~WS)6}m^EAG9%v!-9HA-*;KQS-~bKOwY*pYl7{*qlthyM)ct2_!HnSr8{ r*9sLdI!%@nmSSG%_hqxSuq7j7_~cTNlZ-r@?L|Eq8QCUxiYWj9+S7pd diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/candidate.py b/env/lib/python3.12/site-packages/pip/_internal/models/candidate.py index 9184a902..f27f2831 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/candidate.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/candidate.py @@ -1,30 +1,25 @@ +from dataclasses import dataclass + +from pip._vendor.packaging.version import Version from pip._vendor.packaging.version import parse as parse_version from pip._internal.models.link import Link -from pip._internal.utils.models import KeyBasedCompareMixin -class InstallationCandidate(KeyBasedCompareMixin): +@dataclass(frozen=True) +class InstallationCandidate: """Represents a potential "candidate" for installation.""" __slots__ = ["name", "version", "link"] + name: str + version: Version + link: Link + def __init__(self, name: str, version: str, link: Link) -> None: - self.name = name - self.version = parse_version(version) - self.link = link - - super().__init__( - key=(self.name, self.version, self.link), - defining_class=InstallationCandidate, - ) - - def __repr__(self) -> str: - return "".format( - self.name, - self.version, - self.link, - ) + object.__setattr__(self, "name", name) + object.__setattr__(self, "version", parse_version(version)) + object.__setattr__(self, "link", link) def __str__(self) -> str: return f"{self.name!r} candidate (version {self.version} at {self.link})" diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py b/env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py index 0af884bd..fc5ec8d4 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py @@ -1,8 +1,10 @@ """ PEP 610 """ + import json import re import urllib.parse -from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union +from dataclasses import dataclass +from typing import Any, ClassVar, Dict, Iterable, Optional, Type, TypeVar, Union __all__ = [ "DirectUrl", @@ -64,18 +66,13 @@ def _filter_none(**kwargs: Any) -> Dict[str, Any]: return {k: v for k, v in kwargs.items() if v is not None} +@dataclass class VcsInfo: - name = "vcs_info" + name: ClassVar = "vcs_info" - def __init__( - self, - vcs: str, - commit_id: str, - requested_revision: Optional[str] = None, - ) -> None: - self.vcs = vcs - self.requested_revision = requested_revision - self.commit_id = commit_id + vcs: str + commit_id: str + requested_revision: Optional[str] = None @classmethod def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]: @@ -139,14 +136,11 @@ def _to_dict(self) -> Dict[str, Any]: return _filter_none(hash=self.hash, hashes=self.hashes) +@dataclass class DirInfo: - name = "dir_info" + name: ClassVar = "dir_info" - def __init__( - self, - editable: bool = False, - ) -> None: - self.editable = editable + editable: bool = False @classmethod def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]: @@ -161,16 +155,11 @@ def _to_dict(self) -> Dict[str, Any]: InfoType = Union[ArchiveInfo, DirInfo, VcsInfo] +@dataclass class DirectUrl: - def __init__( - self, - url: str, - info: InfoType, - subdirectory: Optional[str] = None, - ) -> None: - self.url = url - self.info = info - self.subdirectory = subdirectory + url: str + info: InfoType + subdirectory: Optional[str] = None def _remove_auth_from_netloc(self, netloc: str) -> str: if "@" not in netloc: diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/link.py b/env/lib/python3.12/site-packages/pip/_internal/models/link.py index 73041b86..2f41f2f6 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/link.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/link.py @@ -27,7 +27,6 @@ split_auth_from_netloc, splitext, ) -from pip._internal.utils.models import KeyBasedCompareMixin from pip._internal.utils.urls import path_to_url, url_to_path if TYPE_CHECKING: @@ -179,7 +178,8 @@ def _ensure_quoted_url(url: str) -> str: return urllib.parse.urlunparse(result._replace(path=path)) -class Link(KeyBasedCompareMixin): +@functools.total_ordering +class Link: """Represents a parsed link from a Package Index's simple URL""" __slots__ = [ @@ -254,8 +254,6 @@ def __init__( self.yanked_reason = yanked_reason self.metadata_file_data = metadata_file_data - super().__init__(key=url, defining_class=Link) - self.cache_link_parsing = cache_link_parsing self.egg_fragment = self._egg_fragment() @@ -375,6 +373,19 @@ def __str__(self) -> str: def __repr__(self) -> str: return f"" + def __hash__(self) -> int: + return hash(self.url) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Link): + return NotImplemented + return self.url == other.url + + def __lt__(self, other: Any) -> bool: + if not isinstance(other, Link): + return NotImplemented + return self.url < other.url + @property def url(self) -> str: return self._url diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/scheme.py b/env/lib/python3.12/site-packages/pip/_internal/models/scheme.py index f51190ac..06a9a550 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/scheme.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/scheme.py @@ -5,10 +5,12 @@ https://docs.python.org/3/install/index.html#alternate-installation. """ +from dataclasses import dataclass SCHEME_KEYS = ["platlib", "purelib", "headers", "scripts", "data"] +@dataclass(frozen=True) class Scheme: """A Scheme holds paths which are used as the base directories for artifacts associated with a Python package. @@ -16,16 +18,8 @@ class Scheme: __slots__ = SCHEME_KEYS - def __init__( - self, - platlib: str, - purelib: str, - headers: str, - scripts: str, - data: str, - ) -> None: - self.platlib = platlib - self.purelib = purelib - self.headers = headers - self.scripts = scripts - self.data = data + platlib: str + purelib: str + headers: str + scripts: str + data: str diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py b/env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py index fe61e811..ee7bc862 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py @@ -3,6 +3,7 @@ import os import posixpath import urllib.parse +from dataclasses import dataclass from typing import List from pip._vendor.packaging.utils import canonicalize_name @@ -14,14 +15,18 @@ logger = logging.getLogger(__name__) +@dataclass(frozen=True) class SearchScope: - """ Encapsulates the locations that pip is configured to search. """ __slots__ = ["find_links", "index_urls", "no_index"] + find_links: List[str] + index_urls: List[str] + no_index: bool + @classmethod def create( cls, @@ -64,16 +69,6 @@ def create( no_index=no_index, ) - def __init__( - self, - find_links: List[str], - index_urls: List[str], - no_index: bool, - ) -> None: - self.find_links = find_links - self.index_urls = index_urls - self.no_index = no_index - def get_formatted_locations(self) -> str: lines = [] redacted_index_urls = [] diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py b/env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py index 977bc4ca..e9b50aa5 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py @@ -3,6 +3,8 @@ from pip._internal.models.format_control import FormatControl +# TODO: This needs Python 3.10's improved slots support for dataclasses +# to be converted into a dataclass. class SelectionPreferences: """ Encapsulates the candidate selection preferences for downloading diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/target_python.py b/env/lib/python3.12/site-packages/pip/_internal/models/target_python.py index 67ea5da7..88925a9f 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/target_python.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/target_python.py @@ -8,7 +8,6 @@ class TargetPython: - """ Encapsulates the properties of a Python interpreter one is targeting for a package install, download, etc. diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/models/wheel.py index a5dc12bd..36d4d2e7 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/models/wheel.py +++ b/env/lib/python3.12/site-packages/pip/_internal/models/wheel.py @@ -1,6 +1,7 @@ """Represents a wheel file and provides access to the various parts of the name that have meaning. """ + import re from typing import Dict, Iterable, List diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc index 5779d29e047e002d10c8c780550bd84ddce424f2..3d314422bd9d34a06f9e5a14ae1da4ffac08a3cc 100644 GIT binary patch delta 96 zcmeBYTF%6CnwOW00SIgv8Pg~7WO{VzhZd(673-%YC6=dVCF;B6Czs}?=9LudyQY*T xCzfR9=jjJ0C+4IUDL5u4rljUp>ihV(=mQz~E?J3r>G=Ug`B|ySB@>rs0RWIVAfx~Q delta 72 zcmZ3^)X&6onwOW00SJQce@mOllW9<-A6lGRRIHz!Sd^Hjmz0rMl9{OQl3JWyl3$=- Z0F=qkOU%*FNX^N~FV8Q^Ntw7e3jkw28b1I4 diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc index 714df755f32e44dd27f5f6e696d7bc6decba8efd..6c173c67909fb5a5e71ff227d3b19207088f49ff 100644 GIT binary patch delta 1672 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 c$#$Z0jxUMn78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9bUn67X!Hcx&a z;^KIfSM83V=!Dz_Ay)*oRwUjKmzZ8Qv21e1cVw=)x zFChNT%)qC9omcH5uiEAdyzdx!5`pe)V7SAp0yJ;(d44IoD}ov;9B&8+PG_IUK7(Zn zFHnb&<`*^wUXclo)7>Vz&2YKGqxhW{Xv_s(weM^|$qRxSzrM3W1U4H9OlOJ+0~>mS zU-&w|@-X&RoRHGv4|dEGu+?zU8Q~N2uJEXWr9c+2Ld^a3 xoLB7v?`C7+HH?h$ApgsP{4Xp%gL8q&Wnm4Vr#Ur0G5`sn-+ar$I`UKjDpylNjAm^c;g2#QX~T@Z3vQ0oH& zBd@~b1-$a|-K$Ret%&+e(P{GZj!fO~AlR*KY2sK>uj0Z0g)~#R(6p*W2ia@M}SPD8)Hrt&;*>+}UJu{VCO?|)w zNsQp}!Kl$DzDRh`q%l62=#z<;2LU0F>4TD}(a3{@2MOW9|38IRImvwUpYQzhpYwm` zpa0&DZ+FN)$Z|k}v4xQF+4FLioIc;Xdxl6VQQcZdmlavq9xbd#l!&msT2zlIF=6|( zxSmiF!uD%Py+i2`c0fz%X(cV}pqA0IN>=YwI`y2A6I@8k>jkBt7nP!3Qc6T}NYpv8 z4Nn4NX5l4}c3mV3Q>CKHG^mEDk1opsb;PAcPP>%lf{oII8l&B?>ZLtm)u+Z`wO36D zwi~>YFn>(#fO+Zx=TXzZRTm?KY4;J2n%M?qpPHp<6~l&U5Xes89(PE)B{g?iQu7xb z4-U0La0TFsi`+{785t&IF5|dBh7;guVhZJZXZuG?%FKRstbUA6)cXgG#*|K5mf62c zoodvrrqSvjZqzl(%G(=tmFg$@hlU3G!7v6V>aB5OA2TLs!{YayqwYL}%<#jmIg?!uGVNr5O$8 z=bOA6f-#_26d}lGyaVY7nqGjapJ67ffKcQ=dY`Z4z_eqvHlyu2qczny*3yi+%2oqk zg2()m@AQ41>b&A#ej}5AL;fXGI3xcm=ilA`lU(63|LxEKdI@b5xCO&V)qse@(l~RDQ%g9q_}h_k*Gk~nI)wEARrh~Hz`fZ< zzCDugh>df6yDP!Z&9@+Dcr*GIoN{4{!E!R)U(7IyJKF0`&gJlw!`n{BOW zu|4P~BZL7U*Jsg2#qEGqXK=FG6w|~J%%!CHP%Psf1}BR*W4mC>Ph%57@nsP|Px5av zTlrYLH?hc>PFN6v@ekq^GR?n^=RIrCxiEJ#{-&dAH`o_q41=;45qto)k5SOF1tr|e z-|EQKFwG@xY}bU*Y>CTf3c9y)R&jr7JpoZu70+pKF@NXH)WOPCxoh^&e71DXeIuH`9<5xCR%X{;i&k$trOxs{ zPAOdBw^B_Hyf4XJd^EjpAcULjKo~{9cE{WZZGa0B6N%#uvXO^yir-8>x1h)fUz>UT z5jmeK97N9-5MBaU(i53c-jyw+-$(N>0>-!9TC+82vfA88)^xP$$d4g35KwNW0#ri_ z;v7dph$Cb|h1ev5s5uR-RR}sl3&8*|F;lqK#UXwO)`s(>v(Q$wTJ2+WyASY(boVvs zj!)|78_qBygVTN3>hoFcr(?-$gdSiouZ2|iiOMz`W}AHrUQ zb^M*;W`3<$AzpsBSR_84E|rO&KUpe~0ROO*^ET>@qZGQ=$BV%l_N6w ze|GnLn{`8-(&$!p2K=zqncX3H{p}=#+;$M+y5o^Z$GjAtm!k8M|7U5%WogB4(kgzo Je9MJm{0pKOvlajV delta 2168 zcmZuyYitx%6rS1lYqq=FZM)mQnqPqsXznLM<{{?Z7DcBmTl*jPMO(V?@ZHz zkeY~zn2q!qMo z(#EwOB?8(tN;PL&!8!`-tWpE(+GWnA)B)GN;vq;{2d7+049K-goWvA#8zceX>VfO9 z3EKpv;gp~xF4~rZTF1F0aH$n8$37BAYiw3zVAsgl(8ySRV0h2Sj{N9$dFT_{1#wdp z_8NGr%stw<#~{?`JX)ZIVs2u(V5)`AL1G*=OXbcoXiCL`);Ucytu$Ann!@he4?2^u zwT>Nf%!`4=YmRTll$okTBM1*-IO#s&GHfT@qk`GUK6Q<^J^hX#WNnsbqCoTJu`;n7 zhI*W2!xWuat|BqD(j@hmm&&@qor1k7y z&+R}D8uF~r1iSA|J2wI`%rd?vv3qgAcS00<*d>4aPNXfnVbZLFZUUM1AtCCNJ8-}v z10Urv#UUPplnYzk->KIUs2-!czcQ=Oc;0!+AKCoy?nt6P6gpavTk8tD~Cjukt#d1;rtzR(&CM zvzE~33)^rXHq%(vRyouKS0e=-yyJ0}(m zGFImxlAkusavm*K3Nr@#4E$sJ!&@Pecf&J&?l6sBYuE>|&1`q1t$Kws?4aP+VXsG; z#FyB|k%X%ojZ=$1M9$b6he5s&rs$Z;2wnioLkVQO2ra&bovdld{lL)qJQAn)42hW%Kp zdf=CDU|Z^TcT0HS0Ky>zKLS>lz6fwZpgalKY;^nq9A{tEja0HT&gx>XK9<@o&+S9Y z7Z45rJj^XJc*^luf5Dub9$bD$gy!;jwWyl;{M%@fN5FF}r=}K<8uajDZ``mgOdvmr zpdesLC;`X@DhWJ>#9;)UO3WhF5P0+ID0Lwe5lRSU03!eZrC<5@)8f}(9Vg2s0rv8o)^>(r0#8}6ba0?_>%6*tvN;X3!!nw0UOVP}=XzS%@>-pKM z(REOXa1JUV<=B^rb~|qTGcoLeHQ&fKB)9LN7#VgiH4z>w5H{*#Rid-VJuK85E)m{h z-zOD6SKu<+$@)_9&=yp$MR*3GmyuMTjk?);sg?o`Kr2>O%Q+|rG$~By9GRaaWt=HS zrRnQetM!sXG$W@L6*5opAFdVuUjr;9^|P6D1KW~zxiITil9kf6UV|70jw}h3js748 zg+qXb*c<880w2_TWLM)BFFf>}r6WfOr94q<(6SBzCq3_E%QKf+;o|VGMnGa6|*uPnVhVW%zRBmeeyXKRb~cJjm_UwUNZ472fOD1uV8;vXH;*@ yJFzG+PcJDWu_QB5-zBv;yClCr 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 THPkVwd_KaK)Uc diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc index d64abdbfd1daadedc7eb88453a79d70ada6a3dbe..76faa3223bdea71ccd0f87de930ad840b0ada6f5 100644 GIT binary patch delta 530 zcmXv}&ubGw7@f)f%(k0Y18IYbYZ0Ufjt2!bDik+RX=p2@2#c_6cV?4~$xfKrC^>nl zD0&Ke>7Sq%Ddf-a((@wf#rsM@swcm#I56+MdEfW(z4^Lyx@3R0Z41G9fN}41X161Z zD5A#n_&|(>#3F21l#_!GFJAfHbdFJ@&|BEWhj$88@(1LeaUV-CAt?B&J>YY+%_r%qfK%U37o|xh1-m4X4YG7Z)bV4L9J|3 z2%>Oo^}s>J zx&hi;6O5~>WCB0}o2tif4nbvL>h*eOGTK)HR5VE-Df*AbNtGqhwosEwmQjg}ERsAL zi#(T4B;>rlWsa;6#aHI9O_S1KURyEU2oM2nv#}1whsEUoe7K~sB@n8Vg%a!^30D!_ zz))4a=3EO;N%vy=Ct2~r7lV@<BOLv9+Or33t9a}w(D2!<@&w5Lhsa{-2NZ!Wrt?~ diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc index 06acda5c3b33c608304c351e5dd624b98de9cfa7..5bb363e9e7fdb109f9ac4d422fbfd082f7f944dc 100644 GIT binary patch delta 99 zcmbOxzD}IyG%qg~0}$9UGNy0jxyS6$p&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ5lam_0L Optional[AuthInfo]: - ... + def get_auth_info( + self, url: str, username: Optional[str] + ) -> Optional[AuthInfo]: ... @abstractmethod - def save_auth_info(self, url: str, username: str, password: str) -> None: - ... + def save_auth_info(self, url: str, username: str, password: str) -> None: ... class KeyRingNullProvider(KeyRingBaseProvider): @@ -151,7 +152,7 @@ def _set_password(self, service_name: str, username: str, password: str) -> None env["PYTHONIOENCODING"] = "utf-8" subprocess.run( [self.keyring, "set", service_name, username], - input=f"{password}{os.linesep}".encode("utf-8"), + input=f"{password}{os.linesep}".encode(), env=env, check=True, ) @@ -270,6 +271,10 @@ def _get_keyring_auth( try: return self.keyring_provider.get_auth_info(url, username) except Exception as exc: + # Log the full exception (with stacktrace) at debug, so it'll only + # show up when running in verbose mode. + logger.debug("Keyring is skipped due to an exception", exc_info=True) + # Always log a shortened version of the exception. logger.warning( "Keyring is skipped due to an exception: %s", str(exc), diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/download.py b/env/lib/python3.12/site-packages/pip/_internal/network/download.py index d1d43541..5c3bce3d 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/network/download.py +++ b/env/lib/python3.12/site-packages/pip/_internal/network/download.py @@ -1,12 +1,13 @@ """Download files with progress indicators. """ + import email.message import logging import mimetypes import os from typing import Iterable, Optional, Tuple -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.models import Response from pip._internal.cli.progress_bars import get_download_progress_renderer from pip._internal.exceptions import NetworkConnectionError @@ -55,12 +56,12 @@ def _prepare_download( show_progress = False elif not total_length: show_progress = True - elif total_length > (40 * 1000): + elif total_length > (512 * 1024): show_progress = True else: show_progress = False - chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) + chunks = response_chunks(resp) if not show_progress: return chunks diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/session.py b/env/lib/python3.12/site-packages/pip/_internal/network/session.py index f17efc52..1765b4f6 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/network/session.py +++ b/env/lib/python3.12/site-packages/pip/_internal/network/session.py @@ -3,6 +3,7 @@ """ import email.utils +import functools import io import ipaddress import json @@ -106,6 +107,7 @@ def looks_like_ci() -> bool: return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) +@functools.lru_cache(maxsize=1) def user_agent() -> str: """ Return a string representing the user agent. @@ -230,7 +232,7 @@ def send( # to return a better error message: resp.status_code = 404 resp.reason = type(exc).__name__ - resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode("utf8")) + resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode()) else: modified = email.utils.formatdate(stats.st_mtime, usegmt=True) content_type = mimetypes.guess_type(pathname)[0] or "text/plain" diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/utils.py b/env/lib/python3.12/site-packages/pip/_internal/network/utils.py index 134848ae..bba4c265 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/network/utils.py +++ b/env/lib/python3.12/site-packages/pip/_internal/network/utils.py @@ -1,6 +1,6 @@ from typing import Dict, Generator -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.models import Response from pip._internal.exceptions import NetworkConnectionError @@ -25,6 +25,8 @@ # possible to make this work. HEADERS: Dict[str, str] = {"Accept-Encoding": "identity"} +DOWNLOAD_CHUNK_SIZE = 256 * 1024 + def raise_for_status(resp: Response) -> None: http_error_msg = "" @@ -55,7 +57,7 @@ def raise_for_status(resp: Response) -> None: def response_chunks( - response: Response, chunk_size: int = CONTENT_CHUNK_SIZE + response: Response, chunk_size: int = DOWNLOAD_CHUNK_SIZE ) -> Generator[bytes, None, None]: """Given a requests Response, provide the data chunks.""" try: diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc index 07809d909abf4cb12de10fd4bac379dacef52fa2..4695862432eb6184bef8ffc7230596ee30217647 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}$9UGNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J006WUAj1Fv delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0*78eRYZ diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc index ce5049728b3984628342c23527f688f176f23d52..634dba417c8734ecec42f868d089d362aa398fc3 100644 GIT binary patch delta 3241 zcmZuzZEPIH8J^kQ`~Lp4@58xE?8bMA?Tdp$90*^*Nl0u$Xu?O9!fA6mw(qigd!1bq zLLJ#uX_X>=KnFE}(vr5S+A6JtM1RmfDCHLtQsq+uaaT!6L6zEnMy3Lx{^&b(5^knO0+~MS50UbnYgVGNd#sWI!R8NgSkPSK8)Cd5}fNy4~>&lWkn;`iyjS+q*ixzB~#8N62W`WelV; z8S6?FHRi}WI`XWb#?MLexDTnD)C4K3NfISKvU3iTt_PnO#*EFn)zmqce21DQVKUU! zR%Ru&55`ZZ{Uk)TWY9b~XMjz29fD+wDyTwd2QWnzoOj(e1z$2oVkG0l?^bhQzf;Zk zG)_pj+XukD`;1U7u%fWzQEYq7g;t9a(=21#eN>?)p`4>cU8s?=-}XMJXqs|TBepbE zuUWS505zT`&0_@EgQQ8QVj0x-9ZV2OCl@SskCRzF#3ow4SP<{j)AX<{VDSL0+0d}ad35725Tc~wfT#?votcPtCGUo&9Ms?pTW*phjw-gDhMU+gqG#7=mI{kuW46F&17>_yM8_)&D4{mHXe zLa`alzVvMMK5%8?{n)kOG~4Pe<8gM>TZ->=V4{xB3h;@GsDarfZ#mU19)vE#biAE) zTO#|LcRQBY3#laAobliI0j zOR1ew=17&#{RrqEzg$LdOSY60P$l4gwgW+A^yC|?fN0UVr_mpQvYa?AOZ*L8@!OF)T8Qgmi&Pt0?V2(R6fnym*CO$1-bOQE@(b7x5eoj1rPUAm_r*T<4V!NJrX#f5h$~RFC zQeI1T>_A;3M-1zLvCveV+P8g_C~)xPIg9dpvwgD;a6}RR!3!{dH5VFPROa-n1Yep5ngW;l8+K`%ljkqE%;M;U3R#c_T@RU(5c5 z=0-Bm2F!2{KJ$k_{>gK3-HXEM^Y}(6buB&oVW_m4$-bF;EqCdOtC`XBONVciD>tH< z3z1hMH=>DG554j1PoKM9*wHTRcq@Cgu=jdls$H16^4Roo-bl3TwV#4J`-Wpk3%J3|6}rU|9)!UD8BH(efu`M z-b)97e{ZvE-!_l$y{#S)-Zr9-WA}aFN7L+sSYhin&UTQKbK5x?;bb3>vZq%*(Rk^e z39ja)`E^+3+Q)n3Rc`(+kY)6_AH|Z)wR~vZjZy{neEjh^^lMQROsz=C&J%EgeG>o6 z(lPLdn{lGL4YBx~P82SBg7X}<>{zcdtIF&wJVF3lhq&=!Am6w)`UE#{@*8fP1p-mI zQ6|5VAG_LLS&>qo_79#9W>*7!E4h(&U}QCzyp`B=aj~5kxt`c_EwP6kOAarg0 zyU?szhM}3Aymnh>S}>NndBhwACC5#eS9De1Dn`PCJ94JP2(n+L%r( zMO7??as;q*|KB)v5`KcvekSDxbNpA6?Sp!ofg>Q4ZsMy{ILWd3-2BpR&K}@|W3q#_ zPW^P!#<`^}+`zHaDY&n^dv!xy(8#^?N1)?KYQ76}O~e>~CSWWgKbnRfKIT+wwG*wI*`3Hg!@;+>6O0WcDS@A yf^;jHzj*AGhu2)duep&svJxp=N?x*7BHP=pk#!GO7umsqhy0(r!g#>h>3;$9Ap@iU delta 3700 zcmb^!TWnlMb!P9~_sd@I%jRVCvFqRQLVOVidLk{&EB!S&fQ1n zUf0;ztf_+3j|c?@wM7uAA5;XTMG*zb;>&!2gbKS&z~(AZEl?5sZS7LEk&rlZch_;C zAAB&Yd(NCQXU?3NIgiPBfdN(b@hKBlIRxP#P&% zv8XtW0Sl@nFQkRMm=^Qav^8%_+w%6bJ?}_6^3Jpqb6HV!<=ttw*|(~myf^JN`!>~= z_ow~&a!b0!WZ2c#d>|b#`wq1&A4~_$zEch5!|AZucd3zlG#xejZnZrhOUKNe*%z+1Y@f=(mFdj%;zV!J7n8*GV)#80FtOFI|pCQhK-4Qj7R zMS&K~(H>LQO7?Q9A=BI7_3YyH!MtA5*O2H3s+;sTr~$=q(&a>*F=bI&u88TR6DcvJ zm2@isVkZK5WEzu(1Xm1``loD4+ZAhipAsZi5^Hb=rbHzK^Y`!KaxH%1Ab!&%n-Yfc zK_$}Un5+1EnfI8`|;m`WncUyzZ?h3K*1%vE>E5-t5gr*t~1N6#cm?=H;$ywk4Y$ zV}Eva@8Z~jV|V{0?K67jWm?FnrXOZrt$UaTE~8|$rdMi)HK&ujW(XS5DZd5kJ)VSZ9~V2w&Ur5OHiUDUMqm{98sBi^8chUu`GF_$ z_*q~-!N(tiw6lUf4IpdchWn0qXw%oSa(W{WT$$KRJhq-VT1_0iojA6I;?}d6xxGn8 zwJo)U{LW+Su=fW7$G5$MZG5ygf;?^4CMxc(ir7Uv-w*gwxGN58BrWw#IOk_zhbqLH z23L-x6|g1aKhmdjJGh;nub^9FYtG7{@fBoxbrREqT!Ba*Wxw(t^m40{RyqNQ?qgs0 zJ3^Dt)wtvE%{@i;K+lMV|F3%H0#QE z&4xlD1q9QDDrg&XYtcvYj`%SSv4WlK? zEMN3L8m#v;qzFOhabz~daRn_2v%V(%0FR+&(rMOV4PTWS=D0!5TzZ#1&LshCab34H ztaAUiRaZ}o=;~V{T0lw9v-h#I*dxuznj}kwVqp*}OF@yTA~mvsRG7Aau(`fxu8R`(zH2Z z*r$sHlF1bwasVEWkHNP+0$>7Rc$h7ri;zo~vA*LdOIUAQJ3>tdcmuzQF}fP&XZD^j zkEs~}7Q>Z;I>t{dODJ4M8B&U2NgXgmo;~Zyr0&}Hog>qvK)zn0Cl;UhA98MLL@j1z zRXdT|nfEiWS>w_6cb<!a6ValDxPvipSR0Vyb? zkX?{=a=UaNrxwZo?b6DPTl=!5w4{R`1?#E80WSfRyF2BN2eYa`*HB*PD zM2oYKGBO1@PYiz}kz^D|jyV-1=q>S)Re;7*Gg`3vlBb(LMi+c)Y%HErxup2TwxKQLa|T{N zb=Mz&%UNstP3NyW?*u0Q=%2jX65H$;cq?@S-xykdWVHIoXeD_PRyYN}jZ@F8^{u^9 z6L7n!x?^PZ+$z{$Ig8Kp1>0Zb3wB5w@x7l#JgtFGtgy%@U9cxJ+l|)!@_=E_WRzky zlQHaSae5j8$*}1QCBRhR2gDDp{u1P=j`9~3<$qYHlZ`|ZHlDH!iH%0XtvjBgasNg} zhslNasH#z38O^7F(aE{&gQx@h*q@@^*v~$X#&HV^wRhuIcDTJ~G{7f!m2#yN#H3Cr zyeU(rmQ?fA3hz_X7Yrv9z;j?Vp)|@@NOBNjbL}%_{?MbN9Pol`7Seh-GYf}#_q?vx zOBFA<_Z=hoqB5tF6ZAD8d5mk{0SE_-@h29H#cdnH{*Tc3IvTH{@sH8)Jv0L3J#_eE z^xQp89s|xj^u(q!#%5zrxhuVgS34@fv8wNB_KVom>HS#RXzi#89PdAL>np3;Dp@cgG2y?b!r QR=S1&t&M%kk-4FN16kRR6951J diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc index d83eacdc90692e2f0e9ead84abfd0658f14d4f6e..16cba15eea4e66e24a9329a0457ae35f425a2a69 100644 GIT binary patch delta 625 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 R&kc<8#3;>V+GP)_`Y&^9&*K09 delta 4978 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 U-ts%e_8S5~?zgc<(Sg(c2jcU!!vFvP diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc index 581cd2d96f9a5dba412109ca75c277df4918690a..860a0e960138b5a7c423b16b47c1f85280813f5f 100644 GIT binary patch delta 96 zcmcb^_=S<@G%qg~0}$9UGNw=DG4hzKA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_4*-K^8g>8x diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc index 3b6cda13e342008deccdb4df9f9ada55b3215e69..77b99bdc2f9689195d40d325bdce449ca3cca82c 100644 GIT binary patch delta 1918 zcmZ`(YfMx}6rS08_i^FgeY3E@K7a*Wd@Lxas3=fSQqk6`ZKby6vUglrmR&Nt1Ziog z2}#w|P&-YF(JKDwkMg57BrQqPChOm(3AXsirN%a~P5eZ5SuMJgfMz?`-|c#HQK&Tya#?q)Bmh!V6!)hb>#q6}EUX7F|sE@pRx!#&fngIPkeF|A)6B}p~bm5GlGk#sH_>()l%YL1)7_Q%x}q2Z3W zs*$0wSZ{Avj0>5rq?%4-UZt5NiRaj$m@W?T2<-fyeTdjyvCedH2XmS0{HSvEvRyK- zTe2z37F64GGqUkoWaEv7P8k^Yec4Y3(pb#(wVt^~;)=^q(LX-9JWV+;~X*K&Rp|7SmE zcWn`2Q3^4q^zy1jB{Z|?mfL@N&jSJ3!w(cx6kd=*4`jYsP(qI$6YPxiR}J{4vB%H? z-pm{(c~o5#wlu~*D_X{(xetrmv84eRnf)wZ3Bk=Y${}jf#Vko3rJ&400mES$U>B4K z?qqpo4Q^rgmC3*pd%778VY&s(p}W9(%3gT-f+ig^r=y%Xd`0Xd zS8rq-CoSCeg>@cjrU~?==;Tc*9- zr7mWMNm>^vQ8o6^Q@^$qNb@Ki$Pwz}GJT;a)`rab)|XUbW65R^_=SYbpN!6y}2j{p;=pQD$UoFW)?456APh> zt`3jzwXGwB@*Z1vw;jtQPVOnB!HsqO(!B+Gy@^vo$z>Jkny*>Zl$l^1KV!)M_H+Gqin+`eqRXroBy>S$pO8)P||oM@?FC>4cBdL zg~zDOwfKi|rSV|j0@o1Cc%TF@_LCXoT6y?pOR1HWWtGe!~;p$@RJw=Hoy*L7fZ-8rkcC zFqYV8pnAd>q!OQzy~Y47BxrOu0l!9WFky|MSqR*?@cAGf*|rU3w2>6qPE*_%hEw)3 mhh+g{yo6j!$Zq_k+bDDgwO&W9f1+)-(Z=6dMeu|OA^!(2oVT9< delta 2063 zcmZ`)T})I*6uz^2@9tf=cVT~Ee_;P$S-V@x@*`0BQBhPP);59-g(_Xx3oKlAx3f#c zh{d)%NYloj@d0D2KD22X9<(8;HhpL{=}Y^fT@85A*tDrhlRm84Na9oH+y#F~I@$T| znRC85GiTBvC~#^+=e}{FS3pdZiL$adZtOLxGA9>| z7xosavQ9RQn|sZO(J+!`Gyoo6ZjyB#Ap<#A0QE`Te8YSDjcGbI6)fP}~;k;&5S8^ByO@G5+ZxAVB zH;xQS1Chb8?!!qbs3U!-)S>N?(h3U-h1(yGCE}FG?uo_67CuIsHAp1aweMCR3-3=! zI29g?;7Gh`U?h@`MZ)b;YAl^dhLhBih)3k`h$PF2LkTQL$q*aQ_tIqxXixEo+-C#& zb6XxU9Ool?F5sr$tkJ+#E%Rbl$5hlT`WtTg8#4aaDaBAlc5<~^_#WW`{CefW9j;!3 z%1HtLiq1^kV+(2J!(M@k3Y(0iN3a(}otzjRmaxJ_rGbfI>?5D@WynJ=@wU7$wFhZW zeNArgem-OHWEnl@BrE*xx{OE%$l$!#xMX&G^2Umm$}1wZs+1Lh4psZp=SmVYJSg{2 zf4F818o)b8VTSIh9XG0ag7dP-w=kH$73nHLV4J72C$7nilyMC4MP|T-`_7yk`Kiqw=@|`_xJAsib&xYlNA_)ctV&JJ~QG* zGF`BYOr)x)8Zi7((6TkHR(|9FL;K z())v}xlG3lqoW(rnfaw4M}RO{wXxd1Lfs5&8_AAQC&KpESW0ut0%SZ zFo#e%lNJbX_K=4<3u!V3i{Mn&wX}synmd7Ep3=aPrmbs?Q5zJkUN?oNm{B_sie1EG zsdKxI9QDRh-iVB)Nc6CGK#IkOy#o_5Io;$va+JuHdZ&o@QYQ+VNJ?>q1)icCO5pKG znk-m0yw(gx?huZpC2XfMUU#?p+yTA`rkzA@t)mItY<22-s3P?z>9hKFWlTPrk7C8e zeM=>-3yo(R&uu!%)2tOMvU!ZHVX?U7W^v2at{;28@A+vmQ~cKPU3bl{x#5gCa6<^J zh`@vC6){Uo?C(&%D}S%wub;jD5|UtG3QNfZtW$$ zEyP@Nb8Q>+*UI%EhYW2E+H3WQ;&ofewr1`1W^OyHAJmc>n|0xXB0bs)>7wW+;xc__ z)FZ-h6zjuZ&7WNO5c2cn`MKDOQshDL4%E0%Y15!qb$$^ziTuAO$V3e8o_hjKI~lV( zdZ$3Yo5C^XuDx`w`@(^<2Nqq`H(k{kS8c{#_lQPbHrsK0`$@}^Pf>+_)`K0c72>ntl)N;3oyR2H zAB(A7??jaE25z9rOK5nqGx_lEkUGmtgzG>=iN^t;89TXHjyt=dw zu$g>ST3v<>pmZc-$*TTXoMt)wo2VL3L?t;@rQUrW`K`1Z<&!6+Wzzz14Z~7;kNR@w zVpA((1pKREc|i&Ts9~skdU>Bu`4+msge+~wNyZwaAg#1OemtRGsOT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>~K1(L!uF0OP@;(nZg+4NHvIaAL;b0Kby`UR(SunVR z?FO&NbzZfLylM-|F7xVrWMJV8X8gd!%p1&jLtgE=y!%CY_Y*vq)f=m)Uzo8Ph4FaiKs{5}5w diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc index edee8561ef2818336de613f13e0eb5bdfbe77314..8f481a30bb39dd8177d3ae3121175a338271d374 100644 GIT binary patch delta 176 zcmeC?@8Rb;&CAQh00g#-jOiPBrn7j=(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tA81R-c)fgt$7`KCm(HiC*VbyU44ypzJEI-sCx~5*!SC`rr8(xP&L~ XW3}P~axU=d{Q?VgNN(n5t6>BHVN5pq delta 171 zcmeC-@8;(@&CAQh00hDJzol*Dna*O+q90nET2!o`omiBZrwdCmu%LLV8pS%VoTce2W8U*^^O$iTuG z%=m$cnKzj6hP>K!d9RD|UMFlW%STM)`OXTG`_2zme}dIY9IO%$gpv^h1kNi;DGA zk`l{Pvl8`P@{>z*Q}arS^<7g+lM_oa^YiqBlM{1NixeD_6H`)iEA@SRT=apAe3z`m zy!8BlqWrAX7p}9l)0*~ut1y&O_7MAraPAr?FSWTH3g(pwokgW%q ztI1g;38adoK!h}ikO2|0AVLvH++s;AN-r)_1u;Re-p7ACPEZ_#(!@%H8hM=yQX^<_3r84G#VmlPF& r+<%KDDL+34Y}-nP&p-hNu#0|i*yQG?l;)(`6b?R%UI^>e?bEpo}KR}+ZIMY)M3lW#C<88qpK z7N-^!>t`nxCFbcRWh9nlChEJS7H5~_7w8uNW%Bb9bM!M(b8_;_^NVs)CVR1@7)S!m z5(VPob|BHf@I*##zSm5z1(la&46h0JPAJ?ExIJoP)B*0RraqGdF9`Tfe#oND%VT|= z$LS)E(*euNJie1fSxwjkSk|*R32gRfHD&e^0h(0A0U}sH1Sg1K0}-GQC<0li$yp=? zVoQSv84w{0BIH1X5|FsXl30{pT%wL_7_BS^B&GPMnesdUChNLMPO&%VoA!+&jDMslHoH@ilGSPm|q+=x%nxjIjMF< N)|0)t=dxG<1p#UdeN6xW diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc index 9bd7f1edb5fcdfa6e2048e18c08cb86c524cdb88..de80b026dab117572e8ba8a7d92f7e12187e0276 100644 GIT binary patch delta 176 zcmZ3=yN#FUG%qg~0}$9UGNy0j;b-xfpdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kO6uGY5WS&n`hk@}O7}AZvlL&4*LP+HKK(BO3_N`O=AGvKHk~#z aSZ7pS=GMBvqV-)6D0hKZZ?ijV93udjLOE9e delta 135 zcmdnSyOfvbG%qg~0}uq?|CY9qho8luLO--PwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?C^*%DNaPm!-WR+C`(q9A^c=-Cw hJI(uTI&EgK&ZxS~t#yG#>$@OO?gL2S<_Oj}MgY~FD+&Mr diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc index fa260e46a73481d7a198bb645e852ba016bf5769..c8ff02135ee68d3692b4dd7d84ed7bda22031d29 100644 GIT binary patch delta 132 zcmeyx-z~s%nwOW00SIgv8PhlNykqg0sUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>qiM5FFC^*%E2a>`6*W>aDY(Hd-l96SMiAfe`H%jXY zJqjWS@8BU6^|sPWW&aCB$iYMGsTU9R6hseta>jV;gZJe#@4fGvneX$-Jo!Y3i9}q* zc0F=+PM=j9ys*A`-C-Jr{;UzHtU3eQ>R_e4I6&P+4S5N<95|^DQj;#8yhu8 zfM096oh|=1_nXWMlaJ~ORw@|!cyR}BbzVzRzMW~0UzNek=ThrmcZ%A9y8kwcSar*Rhgd;>#v*Ng~j9Qzh zWWZg$igVD@b8|Zrw#S(pGHQ2x`$40{f{JM{f^?r8!xjHa1;23$(jco2HTZ|`T zV~FsD@}PV^E*y*xRZLcgYEm!~MK6eTya-3;FS{bq7IK(sHG+^fIG4AUES{5{MHpsg zz_Rjq35wRbc}Wy6iwp*^Z7r)`(q|#D-ss3&=nK3@>ez<2V%K;T9%X<31w|!{qyPW_ delta 569 zcmdli_ezfUG%qg~0}uq?|CaV+BX2LWLA`!xacWVqes*F}VxC@7Mq){3qP|ONadt_5 zfqnr{COv$rl(UCmXP`u$rYXW-(7zWE19RTFnSD zn}MO0wT88Xb@EK-%2m?bFCrHiYI#wPD?Gup+qc2>Cbz&1e&_3a-WU12Pq3!J>3 zT~GJ}3nQ=ob1s2SwFx2=zLTwhJ}K}}Cv$!NB zv#1DUjV4c#6i7x5M5u!Zh#nA2Yw}HQIYzz7Ke*kwEPw*mKwNx(vL}xb$7N3C4-De0 nQj_a==5qjP2uGRMl~HkWChrC|kkLgJljZrO7@a0t@%;n<`J;w` diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py index 37919322..0ed8dd23 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py @@ -3,9 +3,8 @@ import logging import os from types import TracebackType -from typing import Dict, Generator, Optional, Set, Type, Union +from typing import Dict, Generator, Optional, Type, Union -from pip._internal.models.link import Link from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.temp_dir import TempDirectory @@ -99,7 +98,7 @@ def add(self, req: InstallRequirement, key: TrackerId) -> None: except FileNotFoundError: pass else: - message = "{} is already being built: {}".format(req.link, contents) + message = f"{req.link} is already being built: {contents}" raise LookupError(message) # If we're here, req should really not be building already. diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py index e60988d6..c01dd1c6 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py @@ -27,7 +27,7 @@ def _find_egg_info(directory: str) -> str: if len(filenames) > 1: raise InstallationError( - "More than one .egg-info directory found in {}".format(directory) + f"More than one .egg-info directory found in {directory}" ) return os.path.join(directory, filenames[0]) diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py index c5f0492c..3ee2a705 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py @@ -40,16 +40,16 @@ def get_legacy_build_wheel_path( # Sort for determinism. names = sorted(names) if not names: - msg = ("Legacy build of wheel for {!r} created no files.\n").format(name) + msg = f"Legacy build of wheel for {name!r} created no files.\n" msg += format_command_result(command_args, command_output) logger.warning(msg) return None if len(names) > 1: msg = ( - "Legacy build of wheel for {!r} created more than one file.\n" - "Filenames (choosing first): {}\n" - ).format(name, names) + f"Legacy build of wheel for {name!r} created more than one file.\n" + f"Filenames (choosing first): {names}\n" + ) msg += format_command_result(command_args, command_output) logger.warning(msg) diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/check.py b/env/lib/python3.12/site-packages/pip/_internal/operations/check.py index 90c6a58a..4b6fbc4c 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/check.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/check.py @@ -2,31 +2,44 @@ """ import logging -from typing import Callable, Dict, List, NamedTuple, Optional, Set, Tuple +from contextlib import suppress +from email.parser import Parser +from functools import reduce +from typing import ( + Callable, + Dict, + FrozenSet, + Generator, + Iterable, + List, + NamedTuple, + Optional, + Set, + Tuple, +) from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.specifiers import LegacySpecifier +from pip._vendor.packaging.tags import Tag, parse_tag from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import LegacyVersion +from pip._vendor.packaging.version import Version from pip._internal.distributions import make_distribution_for_install_requirement from pip._internal.metadata import get_default_environment -from pip._internal.metadata.base import DistributionVersion +from pip._internal.metadata.base import BaseDistribution from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.deprecation import deprecated logger = logging.getLogger(__name__) class PackageDetails(NamedTuple): - version: DistributionVersion + version: Version dependencies: List[Requirement] # Shorthands PackageSet = Dict[NormalizedName, PackageDetails] Missing = Tuple[NormalizedName, Requirement] -Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement] +Conflicting = Tuple[NormalizedName, Version, Requirement] MissingDict = Dict[NormalizedName, List[Missing]] ConflictingDict = Dict[NormalizedName, List[Conflicting]] @@ -46,7 +59,7 @@ def create_package_set_from_installed() -> Tuple[PackageSet, bool]: package_set[name] = PackageDetails(dist.version, dependencies) except (OSError, ValueError) as e: # Don't crash on unreadable or broken metadata. - logger.warning("Error parsing requirements for %s: %s", name, e) + logger.warning("Error parsing dependencies of %s: %s", name, e) problems = True return package_set, problems @@ -60,8 +73,6 @@ def check_package_set( package name and returns a boolean. """ - warn_legacy_versions_and_specifiers(package_set) - missing = {} conflicting = {} @@ -118,6 +129,22 @@ def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDet ) +def check_unsupported( + packages: Iterable[BaseDistribution], + supported_tags: Iterable[Tag], +) -> Generator[BaseDistribution, None, None]: + for p in packages: + with suppress(FileNotFoundError): + wheel_file = p.read_text("WHEEL") + wheel_tags: FrozenSet[Tag] = reduce( + frozenset.union, + map(parse_tag, Parser().parsestr(wheel_file).get_all("Tag", [])), + frozenset(), + ) + if wheel_tags.isdisjoint(supported_tags): + yield p + + def _simulate_installation_of( to_install: List[InstallRequirement], package_set: PackageSet ) -> Set[NormalizedName]: @@ -152,36 +179,3 @@ def _create_whitelist( break return packages_affected - - -def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None: - for project_name, package_details in package_set.items(): - if isinstance(package_details.version, LegacyVersion): - deprecated( - reason=( - f"{project_name} {package_details.version} " - f"has a non-standard version number." - ), - replacement=( - f"to upgrade to a newer version of {project_name} " - f"or contact the author to suggest that they " - f"release a version with a conforming version number" - ), - issue=12063, - gone_in="24.1", - ) - for dep in package_details.dependencies: - if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): - deprecated( - reason=( - f"{project_name} {package_details.version} " - f"has a non-standard dependency specifier {dep}." - ), - replacement=( - f"to upgrade to a newer version of {project_name} " - f"or contact the author to suggest that they " - f"release a version with a conforming dependency specifiers" - ), - issue=12063, - gone_in="24.1", - ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py b/env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py index 35445684..bb1039fb 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py @@ -4,7 +4,7 @@ from typing import Container, Dict, Generator, Iterable, List, NamedTuple, Optional, Set from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import InvalidVersion from pip._internal.exceptions import BadCommand, InstallationError from pip._internal.metadata import BaseDistribution, get_environment @@ -145,10 +145,13 @@ def freeze( def _format_as_name_version(dist: BaseDistribution) -> str: - dist_version = dist.version - if isinstance(dist_version, Version): + try: + dist_version = dist.version + except InvalidVersion: + # legacy version + return f"{dist.raw_name}==={dist.raw_version}" + else: return f"{dist.raw_name}=={dist_version}" - return f"{dist.raw_name}==={dist_version}" def _get_editable_info(dist: BaseDistribution) -> _EditableInfo: diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc index 60660d1056fe79067804a2c23d16493c22a438fd..d7447064cf03ea1b68fcf700f772bf9b1590ec45 100644 GIT binary patch delta 96 zcmbQuw3&(LG%qg~0}$9UGNw=D$?}-0A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQMB%DFAF)8gBpq diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc index a96ce310aded742c9e0d10e77422535d0a8773f8..94df5cc08b34730f547c9f89e086f050d4fbc3ff 100644 GIT binary patch delta 187 zcmZ3*x1NvpG%qg~0}$9UGNv&wr^n eU=&^q)c=8*k&*Eu6C)$bXEp{#{>c;BW&!|M4LF$q delta 168 zcmZ3_w~CMVG%qg~0}uq?|CYwIkynq!phZ8lIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC$FxtS%0jSpx(G9MY(Sov=7ihX2Y<>Z@e z$SSM^q`xx*1wVjfzB2*2A3$=y5Q3YdSv4317Xpp>z|6?V_>qZ`k>xQ1-{fg*GXW1p BFVz45 diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc index ac3952f9a1c1c8dd6173a9556136a7263513ce25..f9c8b9f5c5d444746fc04050e7ce79581d87e069 100644 GIT binary patch delta 6509 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 Q{N>Y;1Z05Udh(0^3)J4PmH+?% delta 6338 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 diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py b/env/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py index bebe24e6..9aaa699a 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py @@ -1,5 +1,6 @@ """Legacy editable installation process, i.e. `setup.py develop`. """ + import logging from typing import Optional, Sequence diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py index f67180c9..aef42aa9 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py @@ -28,6 +28,7 @@ List, NewType, Optional, + Protocol, Sequence, Set, Tuple, @@ -50,7 +51,7 @@ from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl from pip._internal.models.scheme import SCHEME_KEYS, Scheme from pip._internal.utils.filesystem import adjacent_tmp_file, replace -from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition +from pip._internal.utils.misc import StreamWrapper, ensure_dir, hash_file, partition from pip._internal.utils.unpacking import ( current_umask, is_within_directory, @@ -60,7 +61,6 @@ from pip._internal.utils.wheel import parse_wheel if TYPE_CHECKING: - from typing import Protocol class File(Protocol): src_record_path: "RecordPath" @@ -288,17 +288,15 @@ def get_console_script_specs(console: Dict[str, str]) -> List[str]: # the wheel metadata at build time, and so if the wheel is installed with # a *different* version of Python the entry points will be wrong. The # correct fix for this is to enhance the metadata to be able to describe - # such versioned entry points, but that won't happen till Metadata 2.0 is - # available. - # In the meantime, projects using versioned entry points will either have + # such versioned entry points. + # Currently, projects using versioned entry points will either have # incorrect versioned entry points, or they will not be able to distribute # "universal" wheels (i.e., they will need a wheel per Python version). # # Because setuptools and pip are bundled with _ensurepip and virtualenv, - # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # we need to use universal wheels. As a workaround, we # override the versioned entry points in the wheel and generate the - # correct ones. This code is purely a short-term measure until Metadata 2.0 - # is available. + # correct ones. # # To add the level of hack in this section of code, in order to support # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment @@ -360,12 +358,6 @@ def _getinfo(self) -> ZipInfo: return self._zip_file.getinfo(self.src_record_path) def save(self) -> None: - # directory creation is lazy and after file filtering - # to ensure we don't install empty dirs; empty dirs can't be - # uninstalled. - parent_dir = os.path.dirname(self.dest_path) - ensure_dir(parent_dir) - # When we open the output file below, any existing file is truncated # before we start writing the new contents. This is fine in most # cases, but can cause a segfault if pip has loaded a shared @@ -379,9 +371,13 @@ def save(self) -> None: zipinfo = self._getinfo() - with self._zip_file.open(zipinfo) as f: - with open(self.dest_path, "wb") as dest: - shutil.copyfileobj(f, dest) + # optimization: the file is created by open(), + # skip the decompression when there is 0 bytes to decompress. + with open(self.dest_path, "wb") as dest: + if zipinfo.file_size > 0: + with self._zip_file.open(zipinfo) as f: + blocksize = min(zipinfo.file_size, 1024 * 1024) + shutil.copyfileobj(f, dest, blocksize) if zip_item_is_executable(zipinfo): set_extracted_file_to_default_mode_plus_executable(self.dest_path) @@ -423,7 +419,7 @@ def make( return super().make(specification, options) -def _install_wheel( +def _install_wheel( # noqa: C901, PLR0915 function is too long name: str, wheel_zip: ZipFile, wheel_path: str, @@ -507,9 +503,9 @@ def make_data_scheme_file(record_path: RecordPath) -> "File": _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2) except ValueError: message = ( - "Unexpected file in {}: {!r}. .data directory contents" - " should be named like: '/'." - ).format(wheel_path, record_path) + f"Unexpected file in {wheel_path}: {record_path!r}. .data directory" + " contents should be named like: '/'." + ) raise InstallationError(message) try: @@ -517,10 +513,11 @@ def make_data_scheme_file(record_path: RecordPath) -> "File": except KeyError: valid_scheme_keys = ", ".join(sorted(scheme_paths)) message = ( - "Unknown scheme key used in {}: {} (for file {!r}). .data" - " directory contents should be in subdirectories named" - " with a valid scheme key ({})" - ).format(wheel_path, scheme_key, record_path, valid_scheme_keys) + f"Unknown scheme key used in {wheel_path}: {scheme_key} " + f"(for file {record_path!r}). .data directory contents " + f"should be in subdirectories named with a valid scheme " + f"key ({valid_scheme_keys})" + ) raise InstallationError(message) dest_path = os.path.join(scheme_path, dest_subpath) @@ -581,7 +578,15 @@ def is_entrypoint_wrapper(file: "File") -> bool: script_scheme_files = map(ScriptFile, script_scheme_files) files = chain(files, script_scheme_files) + existing_parents = set() for file in files: + # directory creation is lazy and after file filtering + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + parent_dir = os.path.dirname(file.dest_path) + if parent_dir not in existing_parents: + ensure_dir(parent_dir) + existing_parents.add(parent_dir) file.save() record_installed(file.src_record_path, file.dest_path, file.changed) @@ -604,7 +609,9 @@ def pyc_output_path(path: str) -> str: # Compile all of the pyc files for the installed files if pycompile: - with captured_stdout() as stdout: + with contextlib.redirect_stdout( + StreamWrapper.from_stream(sys.stdout) + ) as stdout: with warnings.catch_warnings(): warnings.filterwarnings("ignore") for path in pyc_source_file_paths(): diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py b/env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py index 956717d1..e6aa3447 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py @@ -7,6 +7,7 @@ import mimetypes import os import shutil +from dataclasses import dataclass from pathlib import Path from typing import Dict, Iterable, List, Optional @@ -80,13 +81,14 @@ def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None: vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity) +@dataclass class File: - def __init__(self, path: str, content_type: Optional[str]) -> None: - self.path = path - if content_type is None: - self.content_type = mimetypes.guess_type(path)[0] - else: - self.content_type = content_type + path: str + content_type: Optional[str] = None + + def __post_init__(self) -> None: + if self.content_type is None: + self.content_type = mimetypes.guess_type(self.path)[0] def get_http_url( diff --git a/env/lib/python3.12/site-packages/pip/_internal/pyproject.py b/env/lib/python3.12/site-packages/pip/_internal/pyproject.py index 8de36b87..2a9cad48 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/pyproject.py +++ b/env/lib/python3.12/site-packages/pip/_internal/pyproject.py @@ -1,16 +1,22 @@ import importlib.util import os +import sys from collections import namedtuple from typing import Any, List, Optional -from pip._vendor import tomli -from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +if sys.version_info >= (3, 11): + import tomllib +else: + from pip._vendor import tomli as tomllib + +from pip._vendor.packaging.requirements import InvalidRequirement from pip._internal.exceptions import ( InstallationError, InvalidPyProjectBuildRequires, MissingPyProjectBuildRequires, ) +from pip._internal.utils.packaging import get_requirement def _is_list_of_str(obj: Any) -> bool: @@ -61,7 +67,7 @@ def load_pyproject_toml( if has_pyproject: with open(pyproject_toml, encoding="utf-8") as f: - pp_toml = tomli.loads(f.read()) + pp_toml = tomllib.loads(f.read()) build_system = pp_toml.get("build-system") else: build_system = None @@ -151,7 +157,7 @@ def load_pyproject_toml( # Each requirement must be valid as per PEP 508 for requirement in requires: try: - Requirement(requirement) + get_requirement(requirement) except InvalidRequirement as error: raise InvalidPyProjectBuildRequires( package=req_name, diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/req/__init__.py index 16de903a..422d851d 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/req/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_internal/req/__init__.py @@ -1,5 +1,6 @@ import collections import logging +from dataclasses import dataclass from typing import Generator, List, Optional, Sequence, Tuple from pip._internal.utils.logging import indent_log @@ -18,12 +19,9 @@ logger = logging.getLogger(__name__) +@dataclass(frozen=True) class InstallationResult: - def __init__(self, name: str) -> None: - self.name = name - - def __repr__(self) -> str: - return f"InstallationResult(name={self.name!r})" + name: str def _validate_requirements( diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc index 3a3128d8c7f95e381222b7121b9a2137681c0498..141095e7f9e4763cae36816985dcbd25cd732471 100644 GIT binary patch delta 1195 zcmaJ=&2Jk;6rb5$uRqpn$F5^L2_;Tir`V-37xNh~NI_Lm6rs{eW!2W&dd8Nc{eanZ zQMd%5zzwO@f{;K$h!c<=D)CQH^^%H;R$C!);6QJwA{5k9-y6G8d+A8~+u!?`H?zO@ z_WI!;=FFR>nIW*=q;zoMsyRd7zItqalM+Ul>S%7lO1QeEyGbkQrmU2kw$d`DIT_cm z4B!c-J6YGXOv#f@&dpnS$y3ghTd)e03pVXLHp}w_PxA`T_Z4YVM*AwVzQ(4uG^_eVZh@zG zMP?Owa>5QBuo6$cF>y}w8CHg;0#6=}D$9aJR)vDI8?-TVAFs03pmCbnq1|)rAc)rJ z=bI+DMHayTh>Jrn2yMsd4u+Sx*A@KZ;0$ci`@;W}dp$@wSn7oBRe^j`B4~swi zvUN7#B51Ko_9uMZZmsyek;}a>XuZouJ(=D5pl3T=)ZXdYjJq4H)zy_25PxOe_6Gj@ z!e8gTFuJXDUKa%@DWMD`NCJF8{?3?Nrv!>6BXJhKcr+ATo)YVVha=%dKWe{%bfO4p z4MohsD^^h&Y;&z9X3Vah9r8m2sB?~TldCA^x*Jq9cv zycfM}tmeLY?ryzxr{2C*Z~s|;CHl@-Jp9f1yUq5UX6IJ3^ZS{dX6KLQ>7CNCeU+3K zubhwmF<6Bxy$WWgyt_=Y(>q#ezdeqz>E2Lfj% z*29gDAR;upRsumsz=nuaWSR>vrGdsNkg?kzLUZM08fZ?YQx0sLL{Gp&VMZ6t>bXO> z|2TqdG&Wg^A8VI<-x-U5qdM+33iB|v?D}lv@VCTCF!9e06u@1TQhJXR?~&YJWFfj~ ko~S+0iDFzidYe}E6-slv1Yl1kN_AJ7sYuKHtl=0v0u>Dvt^fc4 delta 1518 zcmaJ>NoyQO6t3!R*48qbk+qEMv1~=^N#r?+SlF>Hfh-6eEa%`R(2P|zsbP0@z=i_Ki<`cY5DHtxwfmAimRHctC^acGE&u&@P#^}rG zUV5$^gcv~vV3X_?hdxn0%N)RlEFHf&@;LQ4{c+gbBMj1CjuofjONmKe$&1907dD34 zFUOpM3h_6Ns38Wx(4e9SOMrnYq6CN;3%)A;Gvh>w?;qfK$hhCwzW9T&V{DH-tao}Z zchZ-|8PLEJg`3h;Tj1@)2*3`B6>%KVi&6yi5}XIvB3+59!}k}v1eR}Z9N^N`s5*Q9 z!e78=6Kk}I^3XX(Wzo#PhEg{&>-O#^5-MTWhGGoStMf%CeJEL;oC}i z6pxO<46XtEPX5^>U5)gW_lcy28_H{vr2e$66qJz(P>WX(CK0ew!pz#f<$brf=wRCgLL6{*Tk`%*`T}N9fN14+ktPW#@-J zE$@-CdS!Q__H<(A(ZtN-iP!hZXy!`jXUC_)_xA|xU!=R$nWxpcN7cEXZ*;12kE_=^ z#mPe%HBe;0@cS$)gVCW3uDVxAzSL2Qhcho6FmltV3vcG;r-#Kf#E(*VMcZpeT5Ek3 zR)Kvfu;xNV&=6ALZ@KgBG|(sw1-BZu!;=pohuh;%A^s<#6iNc#68LpQDa*p|!iq9Y z-kOiADMry{4FT&X&LYI+R&M#elho%N3bFIz20Kb$b^Wt!&EeO?yCB3C5B>z`%9PS) cr0|UNgx}?-^M{&BXZHv|w=dk!Z!75HUyo2%hyVZp diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc index 04b27c9cd820aeb919e3f980b9a96df236dcad50..cde89c7080f1422c53827b82bbe923be551bab92 100644 GIT binary patch delta 5157 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 diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc index a2fc17b3600f5b7c806c915eca3ae6d54c005ee2..5072d14579065bc4250082f255984422484bd172 100644 GIT binary patch delta 5640 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 D(BINm delta 5727 zcma)AeN0@}m46@eJ;U%d3||Ij81V1_4-g;*Vr-1Tj>DG&aoS8iCd0ftFnB)jeS^PZ z2OPPr9dBzlx0^c6R&knY6U)1*+gT~@s*2)Nm3G@dYJ${QPf3%gYE`YY5pfeI?MmA{ z=ROQJM$tYrzjy9A=bn4+x#ymHA0NLi{^@lw?>BjQ4gsEt4{ybv{cc{l__OZ@56+8% zDyrsWamo|+aN3eANqNKGRB5=Bx2?&tRC&0Z)3#(qsxn;3X?t>0sw!N?X-Bd;RTHk^ zv@_{T`NMuuAP(vR+peTNRU5A5vbq$OoDk})j&1>Akg3BUK5UgxjLG>)*7s=Ip_cF-y9R`FLQI;1-;O43 z80=E($nctp4sOCnhT;~r9=hyX8Mj;AOl*AYAlbap*v-6SCAd;)n1Hd}Y6F;fc-6#R zBh7QQwOQQJ6^sm_H11FpFfh*J(FpNqT8+oV9X|Mo0uyS62|WUn!3pACU#S5g*#eUN z+(rm&w2((H%V2ySe&MfyvNUrA$aPO#Qd^{|Sc%wu&<@|xZin{cceFd8{e;@N zvOIS?VNve~>61sLm?T1?oe&NSt~FBWVQ*PNqMiM>Whd*hKK-O)Ut)HGXj&qZRz$sk zMiUx|#4|LaWuw_S4S3GzTs9L?Ni3rhXu79JHZn((5iK@NQpmB5X2wZ&j-r9QebLx~ z=oHzVNUMbAerf$LalQ&BOsf%U5c~)}gjxW_s+%;DjMH^mT!E{imSzR;8PDI+E&DY> zwUz@>8cl~Lr=!_Kv}J&32eO&jmRXQw($QqgG)X2ihch%Os%+3f#3$KhN4C)kb|@O7 zW`qWSO9EAp4kBQ6;_w99>r7d=U=#a=^N_`dl0dG@C5!X-A>EG9iQog!-3cv1$-%h< zg{Y*n#)NTFx}B(rY;-b7G{r(UV~4f=9oSqoqFJD6%+hcN{X15?FG@9{4kywi6p19# z2~#!_$*{NbvJawvij6j+l_rE{ge?HNoB$^<`)CLOEzuT)waK<&6CurxxgTof0?tGK zbgO2hg>H%S#iU+TUt7IE?yv4<$;lZHps0tn7Va+LbL+u2XBztKY+;{=2e=d^2xs7@ zJ;pvPY_cttcHb1t<|>v~R4>Cj*I9H{6bIS0;!-bm(jBvu%+gE@9HL{u_%ZvWc(^WgXW`2Q0fuRI-|&`R z*?IMA@Ad9q?A`xv$Nuk$pUS{y(dur?IH=MIcCos9a|B4;LXKofTBR}MtH^O_BuZn` zu$42gZwUK)bzCf9@tTCfom~so+EVhBU9|vxzN~3-;dMYaO=q+$jk6YCS%9xv(R4Je zCP^eSn}zBUNkab8lc4!7{It*6j4x(dtZe-(x9Hn1nqfA1+nG|Ul)!sg7F@;4W1?Vl z^K^}wSf9s}d#3gc(>Px@3_7=E?44Cd74yo9q1;GHqy}(A-0*yF8C$Cl1qfwqE;u17 z>_3CbJdst2m{eIc!J%Y^I%-xe#G+b>Rh5a2*i{oqjC0PS+Cc933b`HR&aaR=K<+wf zQk--<`T~))33Mlt0rqUe4zZrS)!?h*1%pQ&MJp-cTPY9he;Vpwqxh6fMvn17_}Cuh zlF`p--_vgg%WL$DBe|AFyKLbB?PS}x^mOk4P2CE`eI}Dg(+s*Yi=ZJKL^us_R~7Ri zcOU!dmS!j4->7g*c|j?AAyimDA%e#i0G_bR7NMm4Jx|@Dr|#m{-#E79>G_LLVXtIu zp^s#E=R7UPMCUiq9`14aP4-f2)pS0RSdH9MMHWzYmI<3xKD=3K)@mo>jL6EfoEIjSaOm*go<%-4xt*H#^kUC*%9) zZPEF>^_8{|hjw6P<~5ocWftqNQFU!d@sf(6<?19fAU4>3DpwMiwI6%aTxod zANe+w#G`Y`tVVx;O{cLhjS%^PLtjSVJO2VwxPLVK>{<;MR-$X29pYJbtMk`we3}?e ze#|J6vEeRZFA3o3l_c#&4TR^}r}wv-aMEn7$eVj$>z~D^ehe+$0e20W)ea}J({v6Q z@@!_7C*8_^)-Bo00g~1zKQ7T%-E45yZEB1hMfefM@gzIhU2D5hSc<1hCHv>@?f|@( zU4kqBT-TYd^8;tMUub`&>!q%XdzLDjuREKso0_S@q@Ha~3?$DN*o%96+Uo0}t%#g+ zNiq_VXA@4;x4Ii&>G2K!8;)!T_JVMu*n8UaZ5v-_n8^mG^oGYW9~&XZoDWnR3;trR z*KPHN zPd42KNx;)Zca8Bfy^_aeXdW-dx+AKpD<#~xGx6Jni5y8}VNU&QZ*M5@CXTvpDPBPf z2v^a86#GGMz;>ge5f8^&_I7Ut9FDc@gI>j$-)PRYeOMANv&Z`CJ(vT0`E@gF-^478 zGs<4*3k<%50?hjLgAJho;kP*0?}0EXj!menxo#@GQL$;^!5dYdLe~bAp$YrIs20O0L-+)T8wBF^aMcYr1(Ugs z{h|Lp8Q!_FUH>Z2Vm2>S?nyihRrpT_#6jniVKW9ej-R`A3u^cv_);Xm0?uAbeIJ zxHnzcwUp;u*bUX*=DuFoxM*#>k?%eC%$a8{v@hk?oHo7B{$(iGaW=9ni1y}-;`?6z zMgQxYU)}s#!;-h@^qwzdU@zOCzMZ$8-Uf;Pg&i5F%>F*qG;enG%fhw7ik(~KYfUz! zx0?F}>$PoGpx=@0{WbDCE_Z*0{7!`#Xhj|!-A(JkJ)}mJr*tb^k~6VLM7Jh0Q&Wlb z6upXb;R!BLLSKWH?t%+MGBFwAb%mZo1>8Nlg+BnuyL2SRh%L{g(gtbe4oo-aw+-FjRef{``8qEH&i zNW;7r#|5XO$s}CtyKz8XzFgzv;O<0{;K{Agf8tuPOllTby118q8x^r4(BB}WP@WGd zL8IW9N{-<7FC{4Y2ZXaIx845Aa;y!HhYXv`l z@l4e1gGXY7S9!`0i=U$ouhT79J9$Opg@q?4e4mIJ4Yz+QPusuQwxu%aT#{_3|I5^| zmKKL7eIWpR&Y?^Yl@EpS4}|UygpLn{E{^RV%LSiX1hemtroP;pV@JhKIDPLQ5`R}U zbVYnA_NxE2!0QdKHvBO4Zq?9rq2i;;?pv}Hl;Er83_#aND|YhSySQ@3L8a4!6rvXR|sv zo?T$G+PO}@rMkMpLJ4<8yVcd|UctNDIh#)?(VbR+B}t`hqoy2W>~Lzk5q78O;}0`- ziBFCO;@8KFkq|}sQaENeWFMB;Wk-~Cj9FfLm(1-|vF?qiv4rgnXF0pWXWi)J%I=bR zW*Ll6Usp7nP9J10YqZ0%gPOgXb5WU-QJE9ktP`q>+G)cDJN?@`My8KeJYRFHW+Js< zd_ho3B8!4jc&jl{XpDQE%(y`ncvC6dxz5}fWG141^J>j_#c;*&?2+h^l2Q9)+>D9o zd1s<6uhu|$!m`|eqQ%X3T77&sox}G~2*}#q4wqTR<6Z-Dm$j4g@>_9q5ME9wC)eQn zgmmfaHJ?FZ;`4?f9Pm@{;?7y#f&C%4kQh&H3wIJXNfdW*@F{R7r%HCNheOG%^z-O> z@NROxj+r)pB6{9k`ujn}XyW&*-?1KyDZ8_F(ivt6zmPTomDj`B94!ux|J5o0AEzV} z8GM^EM*MI%wTP&M&r){~0_J9i)O=Cd@TW?8kLtbZb5ZG&QR$=I`wJ~(2;M6!Hg2N~vr@cW z{$(6|1>ujNpWRQ^3j1b1D~T9E&NB$dVL@@RA|J_ZFj%~jY=uvYH;@!zR!IvXAHbo~ z?wAj8RP+NoQXE1)WXyGvX8`896{(|TpXu_2u(CR-LKFkAmUCnhPM15#n2^7qpG5z^ z2VH_U7qV33^1_XgqB{`20rmP}`J!dyoN#zi3Naq19J7M2#(`Rd+rHiT%{BU#0GBPC;Fa21exQU$Wpsr3JS0TH4KKT~ftINq9 z7^{AX7+^z9Jn4tMbp{FVfm<^Tf>852N#cQ}a~K`6&HC?LO^!z3H63;8T48C|5Q{6b7YCG)p0JIwT~;NqQxa zyl6U( z*;=~uX0+org@Dq|`K%77*DMb)MO(##S%NYc@n&7e4+9n+i$0U|d%( z$qGegNL)PL(@2LhGcTp?c|Ufcc@^n{Yt7H-?*&V1Xp*>w0${@`vQN0SpGdTx`+(RS<5g1o^fQw{xYg-& zcQ-mbvkRyhzi3XOGV~p~N%-S*`QETP>t@bQRhW}PKKUdXELtsI)PvaLMU&sg(QE{~ zsD~~umZ}9=Ppul=F(B)0_`4IU=>o>~g!} zq;gCa8X@%c!w^^V1|NF6_`xQJKFS_O>lbP_euVMGKwf_(9POvsB2EW?plwl|VcJR6 znCiZWJ-m-;)N2>dA&dQ+^p4ZXRWNq z?+F!uc|Lb1)xfiy3yU>2H)||w`9(Rb)n#XCpA}X6+-|3roma-rF34k-wy?f7 zj^#OTms9lNd&Y=mC$8&q5BS)PT$^<>dbrigay_)xp=RW;KHg8YB0D$N=61C>T65_F zsD(=1s~Vd--FB|b=I-=ZeR=E(CugN*P+?q7T=^lB?Dq=a(Au=(V>{hE#~K~3Q1wT% z++Eotg?Td_Z&Rm#0e*Ta1B?T(7*92H(vx_|V$57eN<4EhXJatb(-7BC(SVkg<;`}^ zYvUarOr894R8R}I2I7)qLb=xTK#{1U0=r@+&V;PNoCr~SNHH`Ino17f_-cf53T9O( z$V!nRUcTrCqM5b0lxU{7s0L0AmMSu(G!ECo?ZMidi)zDVL;iT$xFN`pIq4K)(t}~L zm^CD*W@3}h8{)o;)6g0#k%`j7qR0QqhEi!gO)X35aZ=T2Zz{;Ug z@&f#JD083}?b$&g5JtVmL*EU5=oL}5bh&JzTLiQ=tF4W*H$M;%A3rV56kiE(r$@0H zhVVSXiwIc=0>UPQ(+Ht=5UGn420|xz8T)u24;2q$Ns@-V?-BlufHg5MroLFDenz+} z4&V{WkP1U896^VWfxLL6G7**`L?EvTsS-H3HJ-d8e6Y2KsAcl-k<=-MHbFI{JdrzH zdrqD>DNhVaRPqLLqW(66?Ua;JB!TORri5_0=|tOj&s)+{{gZi>L5B7xRyIsw8#KY! zPjrw+gt{l+Cj(VPo^jd4j+#!S9!r=sS%Pxp1Qm?dIPBfg8B~hhu=`z=*bQf*V@Gs* zBZCoQSIs1)1|vmM!xXiV+qf!0zqOk>f()j?+ZN z*U@d$cX$Xgch<@|+VMc|&KnUecp9w;ZQ$9JR@6bsUFd-ps$r11sMKul9#M?S&M4E* zYjqd2y6w`75z~feA@B2u^e=SApqzT2FtMwenD|w6HeIA1^{qi@Kv)fhyPHS{?Atv@ z5n2x>cCVH5bnF1+?(wHuDHTvU-L0)OU4#lt3r@^OcmuaGOZZ?<6d@l8f#H`3`4RT) zD*jv(&bgB0$Me*r1n56{CV`xEFNj+^_BkP_H=AXV*DlZ;yoVsJgY Hc7XdYX=HQh delta 3809 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 delta 3128 zcma)8Yit|G5#HtTB|bz_lt_tsogTJJKPX!fq^K2LIhL*ZS;WetQQ*pF-by<8bjR$S ztcajXr7+r{(2p1w)DG&z{t*OH?6xWl6fSBY4*H|7Kas6M!qrCnCq;i0C@r-{?f&WP z@gX_x4==#s-0aTmH?y-d`~HsKy;%8Yzu$vk41M`%^i6Tz6jhN@f-Ggoh$2i95c&)2UL#bKR0RZ8hZId0WcdVn zYf7SIk|;VzJt9d{k`ic*`$EzA(={O@$K}nn*7j#MJ7$DjiT}^kS zVMbL1xnrEjvO29&Sv3A>6L9dx%iJ-H!^RbRZ&Qp}ivamM`p+!7<2&}=(9P6m%5Rmq zp(WojXAxMyw1KT>G39C4IP2(Xt_Oa-8pteKZrC-S`sMh-_@~Ov*1HYK zSww4$KRJ}PT9{t2nVhCm%K)`@E%-pgFi9JYH=T*@Mqo9zxBw=aoDW~-F73ZE_`%>6 z-%>RBc-;<@KWuKnal7f%R0;v6LF2Zwx~hs<2{QeXS>tccc3f+CT}}484c*JeE?2F8 z(YG8;-VG$ba3^WajT5f#;`(N$*uqE~(=NKkzT1sk?nJPav0E6aVPvcE#QjkV!$`L? z@~kHy&1^S5cem~sBMNytP4~t@w8^bl|NQ>TFI>{DOn)$arEe+L|CsJHTpr%Liy34- z(1g+H*&6QvHqOzqYo>oxrIUg_0&$d-F^z+Ho@WQ~j%O=wHs(EV)GhWc$NKMv`tvRn zY+pzApeK*)6&^Tv$&ThB1wo}Vn zyDY(`g$RRI99v$O&fNG#up1vVz6$QfH8&!mvv|vK=Hx*jrcZ;br9o*BM^4Yseh_Vh z=~q<)-G`avTR>(}z6$Z}E6rU?&0UWi5dR0k`qgmLN;rNe9ADhA(s}q!=ixO6^4G3$ z#_n*mHdU-ppo|c^+|2#;?_*<6sKImcBZSW3ES}(u&$!s=1k3-gjdM1gg~b|Ko9-_0 zr7A}wy0;_~an|-TB-*kVDEFa5w2KbWdEIrbXcwc>R<;R0?AVYy2~M5k^g!8y`#j2W z6D)>b8w2QCQBtb88lK}f?OkE*>ah@bvm7AsSrY$;70=?BOWM)gReKK2pm^o+%=WaD z=Ent%hZ0CqaP4`0obXVfc__b%C{U3CN`RHL@}g-; zmig0!m&O#8f;F%#>Aa*V+w={KDRnZJmL);a6PYs_(Rr2fQ)v;(I=_*=8n3HGR6KMH zfJMu@ztEef>I4kAN0UwJ=s zwf%ZvCHmr0WazPGb%R&~&V-&x5Bd!TWEVd@E~Un;%y}wVpg}{~BT8z9FJs^{{4+U| z+nh8kt#xkJiC55<0gCA!Bl?I4^~ZD-LqNX=a?0*2W$zv{BpPUDN}mMyGZn2rB`aVa<5##(h-jyY#GTPvYc6AG`%#FQ?{S_0C} zdf~z|xRAXSkl#nuu`xnvFVk|$g%8U)0+Pb}i8=hl-8ZR+rvW6J7%>54^{XMh* diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc index 94cb575ec6aeaec0b9854bb70219122eae98bc48..380dd6fed96bddcbd5efafc6ebd61111c31dd7d9 100644 GIT binary patch delta 6948 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 diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/constructors.py b/env/lib/python3.12/site-packages/pip/_internal/req/constructors.py index 7e2d0e5b..d73236e0 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/req/constructors.py +++ b/env/lib/python3.12/site-packages/pip/_internal/req/constructors.py @@ -12,6 +12,7 @@ import logging import os import re +from dataclasses import dataclass from typing import Collection, Dict, List, Optional, Set, Tuple, Union from pip._vendor.packaging.markers import Marker @@ -80,7 +81,7 @@ def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requireme pre is not None and post is not None ), f"regex group selection for requirement {req} failed, this should never happen" extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else "" - return Requirement(f"{pre}{extras}{post}") + return get_requirement(f"{pre}{extras}{post}") def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]: @@ -132,8 +133,8 @@ def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]: package_name = link.egg_fragment if not package_name: raise InstallationError( - "Could not detect requirement name for '{}', please specify one " - "with #egg=your_package_name".format(editable_req) + f"Could not detect requirement name for '{editable_req}', " + "please specify one with #egg=your_package_name" ) return package_name, url, set() @@ -162,7 +163,7 @@ def check_first_requirement_in_file(filename: str) -> None: # If there is a line continuation, drop it, and append the next line. if line.endswith("\\"): line = line[:-2].strip() + next(lines, "") - Requirement(line) + get_requirement(line) return @@ -191,18 +192,12 @@ def deduce_helpful_msg(req: str) -> str: return msg +@dataclass(frozen=True) class RequirementParts: - def __init__( - self, - requirement: Optional[Requirement], - link: Optional[Link], - markers: Optional[Marker], - extras: Set[str], - ): - self.requirement = requirement - self.link = link - self.markers = markers - self.extras = extras + requirement: Optional[Requirement] + link: Optional[Link] + markers: Optional[Marker] + extras: Set[str] def parse_req_from_editable(editable_req: str) -> RequirementParts: @@ -210,9 +205,9 @@ def parse_req_from_editable(editable_req: str) -> RequirementParts: if name is not None: try: - req: Optional[Requirement] = Requirement(name) - except InvalidRequirement: - raise InstallationError(f"Invalid requirement: '{name}'") + req: Optional[Requirement] = get_requirement(name) + except InvalidRequirement as exc: + raise InstallationError(f"Invalid requirement: {name!r}: {exc}") else: req = None @@ -364,8 +359,8 @@ def with_source(text: str) -> str: def _parse_req_string(req_as_string: str) -> Requirement: try: - req = get_requirement(req_as_string) - except InvalidRequirement: + return get_requirement(req_as_string) + except InvalidRequirement as exc: if os.path.sep in req_as_string: add_msg = "It looks like a path." add_msg += deduce_helpful_msg(req_as_string) @@ -375,21 +370,10 @@ def _parse_req_string(req_as_string: str) -> Requirement: add_msg = "= is not a valid operator. Did you mean == ?" else: add_msg = "" - msg = with_source(f"Invalid requirement: {req_as_string!r}") + msg = with_source(f"Invalid requirement: {req_as_string!r}: {exc}") if add_msg: msg += f"\nHint: {add_msg}" raise InstallationError(msg) - else: - # Deprecate extras after specifiers: "name>=1.0[extras]" - # This currently works by accident because _strip_extras() parses - # any extras in the end of the string and those are saved in - # RequirementParts - for spec in req.specifier: - spec_str = str(spec) - if spec_str.endswith("]"): - msg = f"Extras after version '{spec_str}'." - raise InstallationError(msg) - return req if req_as_string is not None: req: Optional[Requirement] = _parse_req_string(req_as_string) @@ -445,8 +429,8 @@ def install_req_from_req_string( ) -> InstallRequirement: try: req = get_requirement(req_string) - except InvalidRequirement: - raise InstallationError(f"Invalid requirement: '{req_string}'") + except InvalidRequirement as exc: + raise InstallationError(f"Invalid requirement: {req_string!r}: {exc}") domains_not_allowed = [ PyPI.file_storage_domain, diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_file.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_file.py index 1ef3d5ef..53ad8674 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/req/req_file.py +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_file.py @@ -17,6 +17,7 @@ Generator, Iterable, List, + NoReturn, Optional, Tuple, ) @@ -24,17 +25,11 @@ from pip._internal.cli import cmdoptions from pip._internal.exceptions import InstallationError, RequirementsFileParseError from pip._internal.models.search_scope import SearchScope -from pip._internal.network.session import PipSession -from pip._internal.network.utils import raise_for_status from pip._internal.utils.encoding import auto_decode -from pip._internal.utils.urls import get_url_scheme if TYPE_CHECKING: - # NoReturn introduced in 3.6.2; imported only for type checking to maintain - # pip compatibility with older patch versions of Python 3.6 - from typing import NoReturn - from pip._internal.index.package_finder import PackageFinder + from pip._internal.network.session import PipSession __all__ = ["parse_requirements"] @@ -136,7 +131,7 @@ def __init__( def parse_requirements( filename: str, - session: PipSession, + session: "PipSession", finder: Optional["PackageFinder"] = None, options: Optional[optparse.Values] = None, constraint: bool = False, @@ -213,7 +208,7 @@ def handle_option_line( lineno: int, finder: Optional["PackageFinder"] = None, options: Optional[optparse.Values] = None, - session: Optional[PipSession] = None, + session: Optional["PipSession"] = None, ) -> None: if opts.hashes: logger.warning( @@ -281,7 +276,7 @@ def handle_line( line: ParsedLine, options: Optional[optparse.Values] = None, finder: Optional["PackageFinder"] = None, - session: Optional[PipSession] = None, + session: Optional["PipSession"] = None, ) -> Optional[ParsedRequirement]: """Handle a single parsed requirements line; This can result in creating/yielding requirements, or updating the finder. @@ -324,7 +319,7 @@ def handle_line( class RequirementsFileParser: def __init__( self, - session: PipSession, + session: "PipSession", line_parser: LineParser, ) -> None: self._session = session @@ -529,7 +524,7 @@ def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines: yield line_number, line -def get_file_content(url: str, session: PipSession) -> Tuple[str, str]: +def get_file_content(url: str, session: "PipSession") -> Tuple[str, str]: """Gets the content of a file; it may be a filename, file: URL, or http: URL. Returns (location, content). Content is unicode. Respects # -*- coding: declarations on the retrieved files. @@ -537,10 +532,12 @@ def get_file_content(url: str, session: PipSession) -> Tuple[str, str]: :param url: File path or url. :param session: PipSession instance. """ - scheme = get_url_scheme(url) - + scheme = urllib.parse.urlsplit(url).scheme # Pip has special support for file:// URLs (LocalFSAdapter). if scheme in ["http", "https", "file"]: + # Delay importing heavy network modules until absolutely necessary. + from pip._internal.network.utils import raise_for_status + resp = session.get(url) raise_for_status(resp) return resp.url, resp.text diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_install.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_install.py index a65611c3..834bc513 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/req/req_install.py +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_install.py @@ -52,7 +52,7 @@ redact_auth_from_requirement, redact_auth_from_url, ) -from pip._internal.utils.packaging import safe_extra +from pip._internal.utils.packaging import get_requirement from pip._internal.utils.subprocess import runner_with_spinner_message from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds from pip._internal.utils.unpacking import unpack_file @@ -222,8 +222,9 @@ def __str__(self) -> str: return s def __repr__(self) -> str: - return "<{} object: {} editable={!r}>".format( - self.__class__.__name__, str(self), self.editable + return ( + f"<{self.__class__.__name__} object: " + f"{str(self)} editable={self.editable!r}>" ) def format_debug(self) -> str: @@ -244,7 +245,7 @@ def name(self) -> Optional[str]: return None return self.req.name - @functools.lru_cache() # use cached_property in python 3.8+ + @functools.cached_property def supports_pyproject_editable(self) -> bool: if not self.use_pep517: return False @@ -283,12 +284,7 @@ def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> boo extras_requested = ("",) if self.markers is not None: return any( - self.markers.evaluate({"extra": extra}) - # TODO: Remove these two variants when packaging is upgraded to - # support the marker comparison logic specified in PEP 685. - or self.markers.evaluate({"extra": safe_extra(extra)}) - or self.markers.evaluate({"extra": canonicalize_name(extra)}) - for extra in extras_requested + self.markers.evaluate({"extra": extra}) for extra in extras_requested ) else: return True @@ -400,7 +396,7 @@ def _set_requirement(self) -> None: else: op = "===" - self.req = Requirement( + self.req = get_requirement( "".join( [ self.metadata["Name"], @@ -426,7 +422,7 @@ def warn_on_mismatching_name(self) -> None: metadata_name, self.name, ) - self.req = Requirement(metadata_name) + self.req = get_requirement(metadata_name) def check_if_exists(self, use_user_site: bool) -> None: """Find an installed distribution that satisfies or conflicts @@ -542,7 +538,7 @@ def isolated_editable_sanity_check(self) -> None: if ( self.editable and self.use_pep517 - and not self.supports_pyproject_editable() + and not self.supports_pyproject_editable and not os.path.isfile(self.setup_py_path) and not os.path.isfile(self.setup_cfg_path) ): @@ -568,7 +564,7 @@ def prepare_metadata(self) -> None: if ( self.editable and self.permit_editable_wheels - and self.supports_pyproject_editable() + and self.supports_pyproject_editable ): self.metadata_directory = generate_editable_metadata( build_env=self.build_env, @@ -829,6 +825,21 @@ def install( ) if self.editable and not self.is_wheel: + deprecated( + reason=( + f"Legacy editable install of {self} (setup.py develop) " + "is deprecated." + ), + replacement=( + "to add a pyproject.toml or enable --use-pep517, " + "and use setuptools >= 64. " + "If the resulting installation is not behaving as expected, " + "try using --config-settings editable_mode=compat. " + "Please consult the setuptools documentation for more information" + ), + gone_in="25.0", + issue=11457, + ) if self.config_settings: logger.warning( "--config-settings ignored for legacy editable install of %s. " @@ -914,7 +925,7 @@ def check_legacy_setup_py_options( reason="--build-option and --global-option are deprecated.", issue=11859, replacement="to use --config-settings", - gone_in="24.2", + gone_in="25.0", ) logger.warning( "Implying --no-binary=:all: due to the presence of " diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_set.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_set.py index bf36114e..ec7a6e07 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/req/req_set.py +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_set.py @@ -2,12 +2,9 @@ from collections import OrderedDict from typing import Dict, List -from pip._vendor.packaging.specifiers import LegacySpecifier from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import LegacyVersion from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.deprecation import deprecated logger = logging.getLogger(__name__) @@ -83,37 +80,3 @@ def requirements_to_install(self) -> List[InstallRequirement]: for install_req in self.all_requirements if not install_req.constraint and not install_req.satisfied_by ] - - def warn_legacy_versions_and_specifiers(self) -> None: - for req in self.requirements_to_install: - version = req.get_dist().version - if isinstance(version, LegacyVersion): - deprecated( - reason=( - f"pip has selected the non standard version {version} " - f"of {req}. In the future this version will be " - f"ignored as it isn't standard compliant." - ), - replacement=( - "set or update constraints to select another version " - "or contact the package author to fix the version number" - ), - issue=12063, - gone_in="24.1", - ) - for dep in req.get_dist().iter_dependencies(): - if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): - deprecated( - reason=( - f"pip has selected {req} {version} which has non " - f"standard dependency specifier {dep}. " - f"In the future this version of {req} will be " - f"ignored as it isn't standard compliant." - ), - replacement=( - "set or update constraints to select another version " - "or contact the package author to fix the version number" - ), - issue=12063, - gone_in="24.1", - ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py index 707fde1b..26df2084 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py @@ -5,7 +5,7 @@ from importlib.util import cache_from_source from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple -from pip._internal.exceptions import UninstallationError +from pip._internal.exceptions import LegacyDistutilsInstall, UninstallMissingRecord from pip._internal.locations import get_bin_prefix, get_bin_user from pip._internal.metadata import BaseDistribution from pip._internal.utils.compat import WINDOWS @@ -61,7 +61,7 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]: UninstallPathSet.add() takes care of the __pycache__ .py[co]. - If RECORD is not found, raises UninstallationError, + If RECORD is not found, raises an error, with possible information from the INSTALLER file. https://packaging.python.org/specifications/recording-installed-packages/ @@ -71,17 +71,7 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]: entries = dist.iter_declared_entries() if entries is None: - msg = f"Cannot uninstall {dist}, RECORD file not found." - installer = dist.installer - if not installer or installer == "pip": - dep = f"{dist.raw_name}=={dist.version}" - msg += ( - " You might be able to recover from this via: " - f"'pip install --force-reinstall --no-deps {dep}'." - ) - else: - msg += f" Hint: The package was installed by {installer}." - raise UninstallationError(msg) + raise UninstallMissingRecord(distribution=dist) for entry in entries: path = os.path.join(location, entry) @@ -315,7 +305,7 @@ def __init__(self, dist: BaseDistribution) -> None: # Create local cache of normalize_path results. Creating an UninstallPathSet # can result in hundreds/thousands of redundant calls to normalize_path with # the same args, which hurts performance. - self._normalize_path_cached = functools.lru_cache()(normalize_path) + self._normalize_path_cached = functools.lru_cache(normalize_path) def _permitted(self, path: str) -> bool: """ @@ -367,7 +357,7 @@ def remove(self, auto_confirm: bool = False, verbose: bool = False) -> None: ) return - dist_name_version = f"{self._dist.raw_name}-{self._dist.version}" + dist_name_version = f"{self._dist.raw_name}-{self._dist.raw_version}" logger.info("Uninstalling %s:", dist_name_version) with indent_log(): @@ -509,13 +499,7 @@ def from_dist(cls, dist: BaseDistribution) -> "UninstallPathSet": paths_to_remove.add(f"{path}.pyo") elif dist.installed_by_distutils: - raise UninstallationError( - "Cannot uninstall {!r}. It is a distutils installed project " - "and thus we cannot accurately determine which files belong " - "to it which would lead to only a partial uninstall.".format( - dist.raw_name, - ) - ) + raise LegacyDistutilsInstall(distribution=dist) elif dist.installed_as_egg: # package installed by easy_install diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc index e1ff409d1597ef4ee04e989424bf862e9ab44d83..1316117c917304e842859dfeb23f27fd3b31bb43 100644 GIT binary patch delta 96 zcmcb{_>Ph1G%qg~0}$9UGNw=DG4klu4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5)J006WUAj1Fv delta 72 zcmaFIc#Vqv Z04S56mzblUk(!f}U!Gr-lQOX_0|0*78eRYZ diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc index b34c29e289e55072280e12b617e8364b260ecb8a..113e1b8ee1e3c5648c01d5a3b8c52ca153db5fb5 100644 GIT binary patch delta 99 zcmdnQd5V+gG%qg~0}$9UGNy0j+0E$DsUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{nzKhtg|0L>&C&Hw-a diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc index 023455d6b1a21d00d6eae4e1dd7d1fb7c5a6e30a..bac4930a8aa9589aee44559d2fa0c9dfd1729bce 100644 GIT binary patch delta 96 zcmcc1_?408G%qg~0}$9UGNw=DG4hzAA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_9{_|X8hQW# diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc index 87cb38a1d710aa6e0650ecc4d584af5c2ee382ba..00a0a457369760c106274789f264452260df5d14 100644 GIT binary patch delta 2881 zcmZWqdrVu`8NbKZ?*|6Iunoq>=4Bw^9WYM=<`oE!kP;f2IIevmCdQC!vk+!!S(R0g zE^4}OQ@y6y(pJ-`s;${9O+=I0B%M@kS*7bf0-^bXRokNOpvNB6IztUDTwlER}6p&9Xs=d#S`S3fIVKr$86X2IfA5>1KWL$d;X z1pkpdC`nMWI->sNaYYo8C1h8qkUT+O5nYvnRdx?4QlH2MMJoAdAb2`3!#I`;U`Sb@ zUY0we^KnNw>TqYlvN8dmD}DXnt$HlRu(7JplYz6$Y@o_FA6%ScqVZT&PiQe1h==E+ zRpY@xgkc?>!9a+aJ6AO{plzD7?yJmGqL%|*BExc-ye>K<9>fU^#h$#j3(ihDN%TY zC>|v+iD662GG`XUEJNbuk1=u94<~Y+LqY`PSi!M3ShB&EjNP@poc+H|_9QRh<=71j z=c!MuRGypjPP}hDx}yD1pAYF=S0QDv@j9xZaYcLIb~Bbv~O5EX^UsQV7$HeQgzHBt zRFNzpf^W7O%($%NS7ooEU6rR$LKZV6(Cj{90ao*0MEeEKV>4lH)aIrYyFco%CFNE6 ziyuQOc-dC0RVQTrti27Xcn$p4mJffo*))SX<_ zU0KnLEpmu>Ymo3V(_Q}DMItMt6+AoUc2omP{SCF!N0vr-R#cAIRX1oD&O5k?5%*`o<{4naYA zQ||B)w|Gk(!xuyhhc4uQ@*L~KIxtsWi9GN^d9$+xS5J(%dYf!h0#b_d>toWT6wZmVkPBfFg-O>h6F~QUR@U)*<3diCx!7%$YUfS*ORl;2$ zAoOsQaGh|W+Nl$cei6^VIQn{ZGwMxcs#y{0gz36^>27%7T3w@%&@B^uUT1<#T_H+< zvHp^70{{!!H{4 zNyNCmDO}%r_^jcNNCF=nXhG6cL1RQDTCO1u?HyuhkKVP{JO*WXs?})D!f;rw;bI_ z4S5@oREQD{oY|Oqu~Us2M6(9`=U2vVeXXL|+^;O)=_>vsb*rnMMl-2@_UKXLG#0Wm z7~C>;jPMl%A_S%gj1xFX;5Y`il6{@O?YW5Cmd&3e~4LNq9G<43^Ot8uuypcI6H7$C0r#Zu;#K6uJ;+G z4@d?#;o-p3mP=3YQp(`m(3hn3C7iyNQ`chL)H~tQ!5>O8Qp!;S2L_91LXQu&_TDWR zxZHcskeBS`8v5@V26&pXA4H#aBPz?v_aiFX!pY5_4t#0)Fs8wK-==#^eJ=WKm!xlB z>cQYE2>D-m<`CMwBI!UVv>S6F1t+n-TZ(U?9}k!12r(wXa5(njyFJ_@9l%W!I|hX# zUicM+$IxZH%-^ zn~9ObU>R+<+|6rR8N8=9T%P(sU5KsZd$zTP6*c~SakLc;!_P-+?c~vBWdy7Q@(F|p z2&tL^daM$ifa)=;^)W1s;V4sH;WcJki57u52#r1X#u+53+_seR62jmFn96vWz{)AB z^P21XHeMl2l~kVVTGLwhOKoXu4X+YpYD%eHiF1aMw6=83%+>nR?jBCtlUDR*G=jo3 zEt52Ir5>KbbUlxa1Fp|s@?N15;oP~_f`)gkGo(#q4AZtHTBbaMQf oE2&BAN_YttVgGG~JW=B1lvJ5fVD6I$IweEKmBc?NLIsEZ3p3mEmH+?% delta 2728 zcmY*adu&tJ8NbKZ??>YJk%yfa#|ep@1e`!#BtRVJL0*uAPy!;_-W{8b zyQgEa$d?T>`h<2(Juyp9hU4&eeS3An|C}gL(SIUL!?EpSQ{nh@*xxRQC*ren{y99E zjfJEBDIpr2JvB?C5uk<>`eyv^Cj5zC!hJ*Btqm?~yVKh46{Gp}{g?JHHZ1jT@Cu!N zgI5~V5~qX<#?cB3w`dABa$$kX%ANOx2si*Z?v}6^LGrzZ8iLz8dY0;(rEfb z>1##(G{~ThK{tag2AvG{F(_xy0a8vo?6SD*Pi68w`9%**T8h=oR(b$lv*eP~$@eWD zB{>Se%}p4dWAY;mjzWK)os5Ez=dm`TK-40*Hy3S!pXRyT?=bmogn9032j}#q0*C+L z7+%O;u@*k$cwGzJ%PZj-{a2n-d(YbYkW=Zrke6S|Guo1Wl#Ib!`2j0a&9b+#uHv|# za0$f>f!FpGCbb25e0EvfiAVB^sAjf-Z9T zU`~EoRzkLmgfr(q7E!6+xtx6Zm3V!Id z!gs#BB9b7X&9T675e4oxYlY*^D4?pMG4Id;pOSW<#x4}hVdRmN&vQl~x zk1|bqiE%G8klQfExFEb&?Xk$7y@LCvo~=|jk)EWrhAK!9F7B*VXS|17I~(Nmt>uEN zHW#e5#bh4pYF~8@hBXJcpI9D zDj8{rDu8dAR=43R+6uJk2ks~FUNek`(YKHgi_qwi|2()^gk<~t4soA7q=ehOhNTYPaWG#wM;;b=5Og%{`~kggpLxoepJBKuCEx47nUq0{@j zYKa;ybiJ%)uKEbR$m$+yV%mHTxm4G*b5xiMQz1fsfl|u840Mn|IRhgDmYj^49$4zO zn`L9=VwWxMgj?M~HybBwIn!~0h9bh85Q_-0@o7Os2jtX@fv4wqnLNisc=N3Npdijh zzbDY`=!wjQW@EyaEJ3UAe$PeI<&g(mv95<;quWZLz4zyO&Bed`!4k@T0b`y(P5|<@Mb<_H&GLvfa3!$ ztgXbrZgn%$Gz>Qf_PXvl8`+TZEcC7#ZC8$cZY*Y#%CnwrTQH&y``~WU4+jT#Y&pP` zXc#yc6fzJP$XOhLtAkY}1gSxX<1k8b`f*%<%6ZwtZZUWPln3vBpAuEodO^9QVhqMU z*DGmcR?9g&OC@g=NjiC}=bR-=jn~@V-II3INCsJEcr@g6 zvCfd)_K{9s8~q(_*EG@D$;s*1BppcZJXFN*lDmS1<^zt(_gTOmX?LHTjl38Y_R_C# z%OWX$fq;o2lONm@>=-_RlVb&LoaVqZx7lVemi=Kl%Rv{(QD diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py index 5ddb848a..1dd0d704 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py @@ -10,9 +10,6 @@ a. "first found, wins" (where the order is breadth first) """ -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - import logging import sys from collections import defaultdict @@ -52,7 +49,7 @@ logger = logging.getLogger(__name__) -DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]] +DiscoveredDependencies = DefaultDict[Optional[str], List[InstallRequirement]] def _check_dist_requires_python( @@ -104,9 +101,8 @@ def _check_dist_requires_python( return raise UnsupportedPythonVersion( - "Package {!r} requires a different Python: {} not in {!r}".format( - dist.raw_name, version, requires_python - ) + f"Package {dist.raw_name!r} requires a different Python: " + f"{version} not in {requires_python!r}" ) @@ -246,9 +242,9 @@ def _add_requirement_to_set( return [install_req], None try: - existing_req: Optional[ - InstallRequirement - ] = requirement_set.get_requirement(install_req.name) + existing_req: Optional[InstallRequirement] = ( + requirement_set.get_requirement(install_req.name) + ) except KeyError: existing_req = None @@ -263,9 +259,8 @@ def _add_requirement_to_set( ) if has_conflicting_requirement: raise InstallationError( - "Double requirement given: {} (already in {}, name={!r})".format( - install_req, existing_req, install_req.name - ) + f"Double requirement given: {install_req} " + f"(already in {existing_req}, name={install_req.name!r})" ) # When no existing requirement exists, add the requirement as a @@ -323,6 +318,7 @@ def _set_req_to_reinstall(self, req: InstallRequirement) -> None: """ # Don't uninstall the conflict if doing a user install and the # conflict is not a user install. + assert req.satisfied_by is not None if not self.use_user_site or req.satisfied_by.in_usersite: req.should_reinstall = True req.satisfied_by = None @@ -421,6 +417,8 @@ def _populate_link(self, req: InstallRequirement) -> None: if self.wheel_cache is None or self.preparer.require_hashes: return + + assert req.link is not None, "_find_requirement_link unexpectedly returned None" cache_entry = self.wheel_cache.get_cache_entry( link=req.link, package_name=req.name, @@ -534,6 +532,7 @@ def add_req(subreq: Requirement, extras_requested: Iterable[str]) -> None: with indent_log(): # We add req_to_install before its dependencies, so that we # can refer to it when adding dependencies. + assert req_to_install.name is not None if not requirement_set.has_requirement(req_to_install.name): # 'unnamed' requirements will get added here # 'unnamed' requirements can only come from being directly diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc index 2e1352aa51a62735e4058d8dea9ecea4fc406496..56470b97d4ee85e90aaf11c7e7dbbab1e645d1ba 100644 GIT binary patch delta 96 zcmaFJ_>+<6G%qg~0}$9UGNw=DG4hz9A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}ht3G%qg~0}uq?|CTn9$H<^TKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOZb7yySb8j1h_ diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc index cb88ad91e71f56e35ae2d0dc87a3eba2c388966a..248e0fdddb7cdbc197b348cc7aac0922f712fb42 100644 GIT binary patch delta 2765 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 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc index 9ea48b4b170a1a723005121bc988e29f2ec38f59..4f0508dbb36b4bb945b5221d29285e9b89467c06 100644 GIT binary patch delta 9066 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 delta 10244 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 delta 7472 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 E0gRO@-2eap diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc index 0d5a08ae649d2942affa81e07762bd83570b0d90..2f8d91a1d4490dad0779880ad1cb6ff6a306af93 100644 GIT binary patch delta 2011 zcmaJ?U2GIp6ux(6c6RoEyWO_i?cWqyw@XX6lv1h!38jjqe?%meRm5TEcG+fs%AGBx zq_vIu0H%p;h6J#QA;^Q+_!FC`5B?GpA9(3XOzVOXA4rG~y4c24^ucpyTN)DMP3D{P zch5QZoVjN*O&{-Y-f%dq2-a?lqrdxRoWA-NjL-$7qA*gi%EfUQ8*eVm!JCis2_YF3_A^4jJp!pU$sEs8ge1#GxnP0vCFFcK9h+~$6E{Tl0?57#>_ZYTi!2$9py%fsT)xUNKFL=HDZD1fAxOpb`8&KZ1k&nK}JK@oBwR z7??OS)EP~tXe=3(PZ6rcQc1a1lT!l>wOBGj>e4l$^{8NhLvoB6aEC3S0ZLm}snsvaudq4jtAY;gEV<86ks8s3R2_PLO0; z3q7R{N0c<2By=dE#0i!6MiiAKMnm1*9U&l69fL|TnmR~RgCvsH8%)uOO7IJfM%paE zJ+wNBR_rL)FlU)fFppSN(x(mb%+^&zrsHdUG6Cupj3{RNz~3 z7hHH=oDnbBW^6#OILr=b&Wjvn>s}V^fs8%ycdi7s|D)AIg0K48-FVi#o4Zm5#21!! zhv^$}ce`Y|&YM7RT{3~>x`S_b&##(9u9{spS_p7Wq*aV|G4L@kRDS&zn-^E;Es|{A z1kz4;w0`|1se*^o>z|lfc{s)V=aQe7Jr8#=hqRiRZghoK=zrR(Dr-P`jA^C-^5yhz zlv8iBA2l3aw4dZ~m2P$2s0x5#KDRnX1=(g3fYEF4y5b7pvwFFEr|1T0gwt;qHtFZw z4W1@uzMYxFB?WV^{m#ABe;$}+c1-A`gj}00hi*EX7o=v|Jnt-s;Q%XRkjrv0m4+C} zXSv3vERIm-Ph&SqmM6j2+ny&Ut}qcB46DXb7F=DI+NPDO^xf)rhCk|9Y&no=Iq-ep zz%PjAk27dy z;LyX~(J~`GO9yUWa+K}^N?YIbn>T>p(~FA&xLMy*)W5~a%!K2qRGhMjmE~i}G~EUi zWsRY24E8eU(7!73mpudIwY6X@bIN`m22AKHMITfeSuk0!oOUzSL4d58-F&$5`lrPM z6F!(BjmIDip-Cm)NKQw{5WB}3HKv4c9A*tQ(y~NJy4#o;lzpt!%b_gAq^im48_Dd|uD84Ms{V*9X$BL`v-%j*~s~1>jjpv|j;oJjVDwCt+dPi*Ug$ zZkef3l a+j9t*&!n$QGi_bVjLz-Rb0tRwmcqZK%Ga_0 delta 1353 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 E3;s}$`2YX_ diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc index 3495460743a57d409237abcb48dd97622bbf9132..4c68017df367e5a6192cefa30e27e0348eb576ce 100644 GIT binary patch delta 403 zcmcbRa5#bIG%qg~0}$9UGNy0jxy$A;LqD`QwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i$)3$ADhM>X zfnkH;cC(FUI|BE|?Tou*?7exmKoSe1#^iq@*SWqkGf8oMU;q-6ABdVTUzIeQEFZ^Y{Gz1U zW-|#7R>q~1>t(w{KXNgs8eZWyT<9}Xe1_l*mq{!Od@gO4lC$JuESVglp&@upRIkJJ zCXe6*)n1%v##8w}2r`IBeiUL55PQHQ_(V`-Lg-|v8Hp3+I@oTDNOic};1|9it$mSS`-XtT t4H=~l_X#dtz8}~bM5RA-0STZ29>IQ}PM;YfS9#=s){9DS_Sa%$0|1bog6{wT delta 412 zcmX?{a3O)`G%qg~0}uq?|CY9q=PsK;gMMgnYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJA$vBbxG>O&28IoW+s!tb?Fif-w=?ddv3CQ*=8XbL zER1H8MMST2e_>{l;`+?s$jE6h`Kzc2$7M;gj|^<0Qj>MWoS1?1=0Y)ZMi#L2YH>BW z8^YqB7??QqJDhJw%Xc{U_}tLc>u|oxqxOLnC_4F-xE}{l6WD~!b`l<}j0-2X%XSHV z;9^iUyv}bpQ+$Tt43|kPmp7})S#mK}PEOF!5W6g@_lbd#Q?kSLCXe6*)n1~iw3T0|qxyz`#0@F=>r%QGrF2&$UzRfZ#K6j{FoEr% zfanKSAPZ=lp!jsIiCi;`r}BRg1Zw;!#2_H{fJg9&pvZ*K$x<^CC(3oO-4K!b#K6p{ qJef~RQUOQ(->1`OhR9VOIgoSYH#=!DvH<|6?|?P{ diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py index 9c0ef5ca..0f31dc9b 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py @@ -1,15 +1,15 @@ -from typing import FrozenSet, Iterable, Optional, Tuple, Union +from dataclasses import dataclass +from typing import FrozenSet, Iterable, Optional, Tuple from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName -from pip._vendor.packaging.version import LegacyVersion, Version +from pip._vendor.packaging.version import Version from pip._internal.models.link import Link, links_equivalent from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.hashes import Hashes CandidateLookup = Tuple[Optional["Candidate"], Optional[InstallRequirement]] -CandidateVersion = Union[LegacyVersion, Version] def format_name(project: NormalizedName, extras: FrozenSet[NormalizedName]) -> str: @@ -19,13 +19,11 @@ def format_name(project: NormalizedName, extras: FrozenSet[NormalizedName]) -> s return f"{project}[{extras_expr}]" +@dataclass(frozen=True) class Constraint: - def __init__( - self, specifier: SpecifierSet, hashes: Hashes, links: FrozenSet[Link] - ) -> None: - self.specifier = specifier - self.hashes = hashes - self.links = links + specifier: SpecifierSet + hashes: Hashes + links: FrozenSet[Link] @classmethod def empty(cls) -> "Constraint": @@ -116,7 +114,7 @@ def name(self) -> str: raise NotImplementedError("Override in subclass") @property - def version(self) -> CandidateVersion: + def version(self) -> Version: raise NotImplementedError("Override in subclass") @property diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py index 4125cda2..d30d477b 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -2,6 +2,7 @@ import sys from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast +from pip._vendor.packaging.requirements import InvalidRequirement from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._vendor.packaging.version import Version @@ -9,6 +10,7 @@ HashError, InstallationSubprocessError, MetadataInconsistent, + MetadataInvalid, ) from pip._internal.metadata import BaseDistribution from pip._internal.models.link import Link, links_equivalent @@ -21,7 +23,7 @@ from pip._internal.utils.direct_url_helpers import direct_url_from_link from pip._internal.utils.misc import normalize_version_info -from .base import Candidate, CandidateVersion, Requirement, format_name +from .base import Candidate, Requirement, format_name if TYPE_CHECKING: from .factory import Factory @@ -145,7 +147,7 @@ def __init__( ireq: InstallRequirement, factory: "Factory", name: Optional[NormalizedName] = None, - version: Optional[CandidateVersion] = None, + version: Optional[Version] = None, ) -> None: self._link = link self._source_link = source_link @@ -154,6 +156,7 @@ def __init__( self._name = name self._version = version self.dist = self._prepare() + self._hash: Optional[int] = None def __str__(self) -> str: return f"{self.name} {self.version}" @@ -162,7 +165,11 @@ def __repr__(self) -> str: return f"{self.__class__.__name__}({str(self._link)!r})" def __hash__(self) -> int: - return hash((self.__class__, self._link)) + if self._hash is not None: + return self._hash + + self._hash = hash((self.__class__, self._link)) + return self._hash def __eq__(self, other: Any) -> bool: if isinstance(other, self.__class__): @@ -185,16 +192,15 @@ def name(self) -> str: return self.project_name @property - def version(self) -> CandidateVersion: + def version(self) -> Version: if self._version is None: self._version = self.dist.version return self._version def format_for_error(self) -> str: - return "{} {} (from {})".format( - self.name, - self.version, - self._link.file_path if self._link.is_file else self._link, + return ( + f"{self.name} {self.version} " + f"(from {self._link.file_path if self._link.is_file else self._link})" ) def _prepare_distribution(self) -> BaseDistribution: @@ -216,6 +222,13 @@ def _check_metadata_consistency(self, dist: BaseDistribution) -> None: str(self._version), str(dist.version), ) + # check dependencies are valid + # TODO performance: this means we iterate the dependencies at least twice, + # we may want to cache parsed Requires-Dist + try: + list(dist.iter_dependencies(list(dist.iter_provided_extras()))) + except InvalidRequirement as e: + raise MetadataInvalid(self._ireq, str(e)) def _prepare(self) -> BaseDistribution: try: @@ -253,7 +266,7 @@ def __init__( template: InstallRequirement, factory: "Factory", name: Optional[NormalizedName] = None, - version: Optional[CandidateVersion] = None, + version: Optional[Version] = None, ) -> None: source_link = link cache_entry = factory.get_wheel_cache_entry(source_link, name) @@ -269,9 +282,9 @@ def __init__( # Version may not be present for PEP 508 direct URLs if version is not None: wheel_version = Version(wheel.version) - assert version == wheel_version, "{!r} != {!r} for wheel {}".format( - version, wheel_version, name - ) + assert ( + version == wheel_version + ), f"{version!r} != {wheel_version!r} for wheel {name}" if cache_entry is not None: assert ireq.link.is_wheel @@ -310,7 +323,7 @@ def __init__( template: InstallRequirement, factory: "Factory", name: Optional[NormalizedName] = None, - version: Optional[CandidateVersion] = None, + version: Optional[Version] = None, ) -> None: super().__init__( link=link, @@ -353,13 +366,13 @@ def __str__(self) -> str: def __repr__(self) -> str: return f"{self.__class__.__name__}({self.dist!r})" - def __hash__(self) -> int: - return hash((self.__class__, self.name, self.version)) + def __eq__(self, other: object) -> bool: + if not isinstance(other, AlreadyInstalledCandidate): + return NotImplemented + return self.name == other.name and self.version == other.version - def __eq__(self, other: Any) -> bool: - if isinstance(other, self.__class__): - return self.name == other.name and self.version == other.version - return False + def __hash__(self) -> int: + return hash((self.name, self.version)) @property def project_name(self) -> NormalizedName: @@ -370,7 +383,7 @@ def name(self) -> str: return self.project_name @property - def version(self) -> CandidateVersion: + def version(self) -> Version: if self._version is None: self._version = self.dist.version return self._version @@ -434,14 +447,6 @@ def __init__( """ self.base = base self.extras = frozenset(canonicalize_name(e) for e in extras) - # If any extras are requested in their non-normalized forms, keep track - # of their raw values. This is needed when we look up dependencies - # since PEP 685 has not been implemented for marker-matching, and using - # the non-normalized extra for lookup ensures the user can select a - # non-normalized extra in a package with its non-normalized form. - # TODO: Remove this attribute when packaging is upgraded to support the - # marker comparison logic specified in PEP 685. - self._unnormalized_extras = extras.difference(self.extras) self._comes_from = comes_from if comes_from is not None else self.base._ireq def __str__(self) -> str: @@ -469,7 +474,7 @@ def name(self) -> str: return format_name(self.base.project_name, self.extras) @property - def version(self) -> CandidateVersion: + def version(self) -> Version: return self.base.version def format_for_error(self) -> str: @@ -489,50 +494,6 @@ def is_editable(self) -> bool: def source_link(self) -> Optional[Link]: return self.base.source_link - def _warn_invalid_extras( - self, - requested: FrozenSet[str], - valid: FrozenSet[str], - ) -> None: - """Emit warnings for invalid extras being requested. - - This emits a warning for each requested extra that is not in the - candidate's ``Provides-Extra`` list. - """ - invalid_extras_to_warn = frozenset( - extra - for extra in requested - if extra not in valid - # If an extra is requested in an unnormalized form, skip warning - # about the normalized form being missing. - and extra in self.extras - ) - if not invalid_extras_to_warn: - return - for extra in sorted(invalid_extras_to_warn): - logger.warning( - "%s %s does not provide the extra '%s'", - self.base.name, - self.version, - extra, - ) - - def _calculate_valid_requested_extras(self) -> FrozenSet[str]: - """Get a list of valid extras requested by this candidate. - - The user (or upstream dependant) may have specified extras that the - candidate doesn't support. Any unsupported extras are dropped, and each - cause a warning to be logged here. - """ - requested_extras = self.extras.union(self._unnormalized_extras) - valid_extras = frozenset( - extra - for extra in requested_extras - if self.base.dist.is_extra_provided(extra) - ) - self._warn_invalid_extras(requested_extras, valid_extras) - return valid_extras - def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: factory = self.base._factory @@ -542,7 +503,18 @@ def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requiremen if not with_requires: return - valid_extras = self._calculate_valid_requested_extras() + # The user may have specified extras that the candidate doesn't + # support. We ignore any unsupported extras here. + valid_extras = self.extras.intersection(self.base.dist.iter_provided_extras()) + invalid_extras = self.extras.difference(self.base.dist.iter_provided_extras()) + for extra in sorted(invalid_extras): + logger.warning( + "%s %s does not provide the extra '%s'", + self.base.name, + self.version, + extra, + ) + for r in self.base.dist.iter_dependencies(valid_extras): yield from factory.make_requirements_from_spec( str(r), @@ -584,7 +556,7 @@ def name(self) -> str: return REQUIRES_PYTHON_IDENTIFIER @property - def version(self) -> CandidateVersion: + def version(self) -> Version: return self._version def format_for_error(self) -> str: diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py index 4adeb430..145bdbf7 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py @@ -3,6 +3,7 @@ import logging from typing import ( TYPE_CHECKING, + Callable, Dict, FrozenSet, Iterable, @@ -11,6 +12,7 @@ Mapping, NamedTuple, Optional, + Protocol, Sequence, Set, Tuple, @@ -21,6 +23,7 @@ from pip._vendor.packaging.requirements import InvalidRequirement from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import Version from pip._vendor.resolvelib import ResolutionImpossible from pip._internal.cache import CacheEntry, WheelCache @@ -28,6 +31,7 @@ DistributionNotFound, InstallationError, MetadataInconsistent, + MetadataInvalid, UnsupportedPythonVersion, UnsupportedWheel, ) @@ -50,7 +54,7 @@ from pip._internal.utils.packaging import get_requirement from pip._internal.utils.virtualenv import running_under_virtualenv -from .base import Candidate, CandidateVersion, Constraint, Requirement +from .base import Candidate, Constraint, Requirement from .candidates import ( AlreadyInstalledCandidate, BaseCandidate, @@ -70,7 +74,6 @@ ) if TYPE_CHECKING: - from typing import Protocol class ConflictCause(Protocol): requirement: RequiresPythonRequirement @@ -118,6 +121,7 @@ def __init__( self._extras_candidate_cache: Dict[ Tuple[int, FrozenSet[NormalizedName]], ExtrasCandidate ] = {} + self._supported_tags_cache = get_supported() if not ignore_installed: env = get_default_environment() @@ -177,7 +181,7 @@ def _make_candidate_from_link( extras: FrozenSet[str], template: InstallRequirement, name: Optional[NormalizedName], - version: Optional[CandidateVersion], + version: Optional[Version], ) -> Optional[Candidate]: base: Optional[BaseCandidate] = self._make_base_candidate_from_link( link, template, name, version @@ -191,7 +195,7 @@ def _make_base_candidate_from_link( link: Link, template: InstallRequirement, name: Optional[NormalizedName], - version: Optional[CandidateVersion], + version: Optional[Version], ) -> Optional[BaseCandidate]: # TODO: Check already installed candidate, and use it if the link and # editable flag match. @@ -211,7 +215,7 @@ def _make_base_candidate_from_link( name=name, version=version, ) - except MetadataInconsistent as e: + except (MetadataInconsistent, MetadataInvalid) as e: logger.info( "Discarding [blue underline]%s[/]: [yellow]%s[reset]", link, @@ -391,6 +395,7 @@ def find_candidates( incompatibilities: Mapping[str, Iterator[Candidate]], constraint: Constraint, prefers_installed: bool, + is_satisfied_by: Callable[[Requirement, Candidate], bool], ) -> Iterable[Candidate]: # Collect basic lookup information from the requirements. explicit_candidates: Set[Candidate] = set() @@ -456,7 +461,7 @@ def find_candidates( for c in explicit_candidates if id(c) not in incompat_ids and constraint.is_satisfied_by(c) - and all(req.is_satisfied_by(c) for req in requirements[identifier]) + and all(is_satisfied_by(req, c) for req in requirements[identifier]) ) def _make_requirements_from_install_req( @@ -604,7 +609,7 @@ def get_wheel_cache_entry( return self._wheel_cache.get_cache_entry( link=link, package_name=name, - supported_tags=get_supported(), + supported_tags=self._supported_tags_cache, ) def get_dist_to_uninstall(self, candidate: Candidate) -> Optional[BaseDistribution]: @@ -668,8 +673,8 @@ def _report_single_requirement_conflict( cands = self._finder.find_all_candidates(req.project_name) skipped_by_requires_python = self._finder.requires_python_skipped_reasons() - versions_set: Set[CandidateVersion] = set() - yanked_versions_set: Set[CandidateVersion] = set() + versions_set: Set[Version] = set() + yanked_versions_set: Set[Version] = set() for c in cands: is_yanked = c.link.is_yanked if c.link else False if is_yanked: @@ -799,7 +804,7 @@ def describe_trigger(parent: Candidate) -> str: + "\n\n" + "To fix this you could try to:\n" + "1. loosen the range of package versions you've specified\n" - + "2. remove package versions to allow pip attempt to solve " + + "2. remove package versions to allow pip to attempt to solve " + "the dependency conflict\n" ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py index 8663097b..a1d57e0f 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py @@ -9,13 +9,18 @@ """ import functools +import logging from collections.abc import Sequence from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Set, Tuple from pip._vendor.packaging.version import _BaseVersion +from pip._internal.exceptions import MetadataInvalid + from .base import Candidate +logger = logging.getLogger(__name__) + IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]] if TYPE_CHECKING: @@ -44,11 +49,25 @@ def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]: for version, func in infos: if version in versions_found: continue - candidate = func() - if candidate is None: - continue - yield candidate - versions_found.add(version) + try: + candidate = func() + except MetadataInvalid as e: + logger.warning( + "Ignoring version %s of %s since it has invalid metadata:\n" + "%s\n" + "Please use pip<24.1 if you need to use this version.", + version, + e.ireq.name, + e, + ) + # Mark version as found to avoid trying other candidates with the same + # version, since they most likely have invalid metadata as well. + versions_found.add(version) + else: + if candidate is None: + continue + yield candidate + versions_found.add(version) def _iter_built_with_prepended( diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py index 315fb9c8..fb0dd85f 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py @@ -1,5 +1,6 @@ import collections import math +from functools import lru_cache from typing import ( TYPE_CHECKING, Dict, @@ -234,8 +235,10 @@ def _eligible_for_upgrade(identifier: str) -> bool: constraint=constraint, prefers_installed=(not _eligible_for_upgrade(identifier)), incompatibilities=incompatibilities, + is_satisfied_by=self.is_satisfied_by, ) + @lru_cache(maxsize=None) def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool: return requirement.is_satisfied_by(candidate) diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py index 12adeff7..0594569d 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py @@ -66,6 +66,7 @@ def starting_round(self, index: int) -> None: def ending_round(self, index: int, state: Any) -> None: logger.info("Reporter.ending_round(%r, state)", index) + logger.debug("Reporter.ending_round(%r, %r)", index, state) def ending(self, state: Any) -> None: logger.info("Reporter.ending(%r)", state) diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py index 4af4a9f2..b04f41b2 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py @@ -1,3 +1,5 @@ +from typing import Any, Optional + from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name @@ -17,6 +19,14 @@ def __str__(self) -> str: def __repr__(self) -> str: return f"{self.__class__.__name__}({self.candidate!r})" + def __hash__(self) -> int: + return hash(self.candidate) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, ExplicitRequirement): + return False + return self.candidate == other.candidate + @property def project_name(self) -> NormalizedName: # No need to canonicalize - the candidate did this @@ -41,14 +51,36 @@ class SpecifierRequirement(Requirement): def __init__(self, ireq: InstallRequirement) -> None: assert ireq.link is None, "This is a link, not a specifier" self._ireq = ireq + self._equal_cache: Optional[str] = None + self._hash: Optional[int] = None self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) + @property + def _equal(self) -> str: + if self._equal_cache is not None: + return self._equal_cache + + self._equal_cache = str(self._ireq) + return self._equal_cache + def __str__(self) -> str: return str(self._ireq.req) def __repr__(self) -> str: return f"{self.__class__.__name__}({str(self._ireq.req)!r})" + def __eq__(self, other: object) -> bool: + if not isinstance(other, SpecifierRequirement): + return NotImplemented + return self._equal == other._equal + + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + + self._hash = hash(self._equal) + return self._hash + @property def project_name(self) -> NormalizedName: assert self._ireq.req, "Specifier-backed ireq is always PEP 508" @@ -96,14 +128,38 @@ class SpecifierWithoutExtrasRequirement(SpecifierRequirement): def __init__(self, ireq: InstallRequirement) -> None: assert ireq.link is None, "This is a link, not a specifier" self._ireq = install_req_drop_extras(ireq) + self._equal_cache: Optional[str] = None + self._hash: Optional[int] = None self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) + @property + def _equal(self) -> str: + if self._equal_cache is not None: + return self._equal_cache + + self._equal_cache = str(self._ireq) + return self._equal_cache + + def __eq__(self, other: object) -> bool: + if not isinstance(other, SpecifierWithoutExtrasRequirement): + return NotImplemented + return self._equal == other._equal + + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + + self._hash = hash(self._equal) + return self._hash + class RequiresPythonRequirement(Requirement): """A requirement representing Requires-Python metadata.""" def __init__(self, specifier: SpecifierSet, match: Candidate) -> None: self.specifier = specifier + self._specifier_string = str(specifier) # for faster __eq__ + self._hash: Optional[int] = None self._candidate = match def __str__(self) -> str: @@ -112,6 +168,21 @@ def __str__(self) -> str: def __repr__(self) -> str: return f"{self.__class__.__name__}({str(self.specifier)!r})" + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + + self._hash = hash((self._specifier_string, self._candidate)) + return self._hash + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, RequiresPythonRequirement): + return False + return ( + self._specifier_string == other._specifier_string + and self._candidate == other._candidate + ) + @property def project_name(self) -> NormalizedName: return self._candidate.project_name @@ -148,6 +219,14 @@ def __str__(self) -> str: def __repr__(self) -> str: return f"{self.__class__.__name__}({str(self._name)!r})" + def __eq__(self, other: object) -> bool: + if not isinstance(other, UnsatisfiableRequirement): + return NotImplemented + return self._name == other._name + + def __hash__(self) -> int: + return hash(self._name) + @property def project_name(self) -> NormalizedName: return self._name diff --git a/env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py b/env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py index 0f64ae0e..f9a91af9 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py +++ b/env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py @@ -9,6 +9,7 @@ from dataclasses import dataclass from typing import Any, Callable, Dict, Optional +from pip._vendor.packaging.version import Version from pip._vendor.packaging.version import parse as parse_version from pip._vendor.rich.console import Group from pip._vendor.rich.markup import escape @@ -17,7 +18,6 @@ from pip._internal.index.collector import LinkCollector from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import get_default_environment -from pip._internal.metadata.base import DistributionVersion from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.network.session import PipSession from pip._internal.utils.compat import WINDOWS @@ -191,7 +191,7 @@ def _self_version_check_logic( *, state: SelfCheckState, current_time: datetime.datetime, - local_version: DistributionVersion, + local_version: Version, get_remote_version: Callable[[], Optional[str]], ) -> Optional[UpgradePrompt]: remote_version_str = state.get(current_time) @@ -232,17 +232,13 @@ def pip_self_version_check(session: PipSession, options: optparse.Values) -> Non if not installed_dist: return - try: - upgrade_prompt = _self_version_check_logic( - state=SelfCheckState(cache_dir=options.cache_dir), - current_time=datetime.datetime.now(datetime.timezone.utc), - local_version=installed_dist.version, - get_remote_version=functools.partial( - _get_current_remote_pip_version, session, options - ), - ) - if upgrade_prompt is not None: - logger.warning("%s", upgrade_prompt, extra={"rich": True}) - except Exception: - logger.warning("There was an error checking the latest version of pip.") - logger.debug("See below for error", exc_info=True) + upgrade_prompt = _self_version_check_logic( + state=SelfCheckState(cache_dir=options.cache_dir), + current_time=datetime.datetime.now(datetime.timezone.utc), + local_version=installed_dist.version, + get_remote_version=functools.partial( + _get_current_remote_pip_version, session, options + ), + ) + if upgrade_prompt is not None: + logger.warning("%s", upgrade_prompt, extra={"rich": True}) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc index 13454892d8847e27eb869d97ff70a3ca629cab14..c46e790a21a06b1b77cb69686ce342b424be6458 100644 GIT binary patch delta 96 zcmcb}_>z(5G%qg~0}$9UGNw=DG4klp4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD5(e0|2h#Ag=%b delta 72 zcmaFKc#)CkG%qg~0}uq?|CTn9$H<^SKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_8320_8cF~F diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc index 0db1131fb24d42a454aac235aa7da7497d47e99b..c51c35538a5c070abeb8ce04ab8ffec301627a09 100644 GIT binary patch delta 149 zcmX@6d_$S{G%qg~0}$9UGNy}d&wB A3jhEB delta 75 zcmeyscY}}TG%qg~0}uq?|CY9qXC{+Dj(%uyYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{p}Tc&0f0N}nGrT_o{ diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc index aa0e8670daa54982017eba13d22f7399c6b5104d..0951201b7c07a59bdd55ca6d327b374f0095d7c9 100644 GIT binary patch delta 99 zcmew%G(ni>G%qg~0}$9UGNy0j31sqU*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tb%7 delta 75 zcmbOr{6mQ6G%qg~0}uq?|CY9qCy>b?Uq7@swWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~Dbs5<0KnlJOaK4? diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc index b1ffb34967546458750fd382f10da8887dc283ff..5d1265fb3ce3153858629e5c19e314b59cfd42a1 100644 GIT binary patch delta 1240 zcmZuw&2Jk;6o0dywqwWZ*llD(swF|RMkz))R8iGdLNQ2@N&%HfXoY09J7cpOd)Lga zX;MW5qzC~g&>qSK4sa<7hf4V~fP>-SXd?s?5>jt2=F}5!Hg#wVPdo2>e(%kj*@MzY z^SeJ33OPW!Oh~7d1^7c4Q_4S7CVc{M8z@*n36;9Ul2R#Kaw-)|Nu_G3DCMr!(=DAq z2dMH5u`&`c*_)e!{wrB-zmC9ytQo4Zd|RU0o?;cK&SudrwiTK|+hD4<_{H7I?xqC5 z=b7X^d%WvW?mhRYb*x(zznleHra8o$!Ij5VNU^a(6_eUII=iP@m3M&_za`cwthD@J z9Iui3?8hS1*nimk770xP|G$-%HqQZU5njX$#e4BFh}58SBEza~OZ7^8n!Kr!L|T6> zcF9lg;C(<{;^Kn1&_g^wnC63z8yg|xVT0bVZ!*trGy`YQV}2AiUZw-bj@-a+TzBj) z?yw}oSr`nsgBtUlfVzGs(HQ3e4;=w8B^4F1 zec~az4bjvOo;chSu6rZNPWucKwe5CU$SY|Me@5gl3U;zH6pfoEGfgfAk<0~s=C>lY6}6@) z{CNyq!4+Oa_96VOL8&$}mWIaC$fysE`kk}C7%O+*8XA{J#kFB^?J!^b^4y&ZV;PJl znSf;E#vo;L{7igJU)hjuse`C}el^j;h`UZyuO)h`MFXeRO3EjPcwt&SuAEkGiVpx zT#bLz%{2`}-vK{^BAvv8%%xsH2VHiBH_<2lgYZveW0??gUm|2~q5*m82xgBUdjz>( z;Z%Gnv-@l1s^$($m2oP~ irDNGxIhL=ir}Fpg%qMG~&QDa#{i_z=%&aP+!+!u70uC(z delta 583 zcmZvZziSjh6vyYy?B3q){YnnRpgCNuOkozRQbb7+!8B=%2!pV!nYo|q?lH5$qzZw6 zf4~$rA%#|A74l~!f5E1(NTrn;NRi4ncOEGEiubF$cF#=l9PVjeuZ0|8m`Z zjen^`!&#nm?y?};Fs2oN*{4wFhbom9qIj|lbwxI>AA;eb_EYJhf~pY%IS-x&b>paAWw3W3%I@h?bV RPJ$Koa}CVX+KOWlzW~IcbBX`} diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc index 2f1bdbb498f54231486976c4c1810320b5b8ff68..ad06dd9ffd68a79af3254f6de24cd2e14e7830d8 100644 GIT binary patch delta 243 zcmVV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bhB9l zbOHgGlgg@4HS<~iB6a_pcJHIs41gv&?Yv}Ave_w zIM^6J@DBh953@xEa|J?f0001h0ND!^*bfur3l57lfJE304}eDF4Hk$2*b5Ah1c^D= t3>4fTHLzjSAUM+$O3@%Vm@&9Pz*M?Tl2OngIFtMf9|Hgm7qcD=sR=U?QHKBk delta 194 zcmaE;eO#O8G%qg~0}uq?|CY9qN0!;3NJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#khz43amwUptnR#*CG5ZPa|m&L;A0RJoove{!~TI6 z$n9X;oXA$p>QVr-r-9)nx5y2C;V0aD-KGsLH+cCQ+#c|XePUo`RqSBA!Ob&)rPJ~T skH{Sb(+!E26)diac+D`};dmfqm+z#&3nE^V#dzeIfoeBf@T}wn0EjI=U;qFB diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc index 041e6b46262b567a0bf861e18dc41fd212c695be..98eb913fb256af30f2d9ae8e2d4bc50654b4d728 100644 GIT binary patch delta 99 zcmdnRdWn_iG%qg~0}$9UGNy0j$zk;9&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t A@c;k- delta 75 zcmcb_x{HJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag0HY8i0KaV-i~s-t diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc index 09fede0bb0c90299eaf79640345b5040b1eff3c4..5230d7f9eaea205055eab45341016b27c575090a 100644 GIT binary patch delta 338 zcmaE%(5lFLnwOW00SIgv8Plsb@|rMtbnAx}rxq3Krz9nor)DMUyW}UA=BDPA6zjXD zlqM&ZWaj7T2PY@yq!uYSCMTw(=2q(a__*i;8Tl?*iFxVy0Y&*)smUdq3z;mr#EXDt z7aIeK7Ysid7(Otth_gLZ)Vnx&ACDsQO+~%QPk2r+9+kB`aT_gbXBLFazVx|B9 delta 309 zcmZowe4)U5nwOW00SJQce@oNe$ZNu6P^=$XoLW?@pPg8gn5UPNkyw(MsPB?moL!P% zpkDx#$T+{t9gC6Wg;qu2;YykPjz!0?HIMV#&7vEZRX9dI@^od(ED;glp94l_)Z{p6bv0w?(;TyXT^Odql&DF#3$m&I9fPqePQP;c1? z+p1C09w1Xw^OoMIqFUWnFB%P9tCy{sdPCPL2rD^VGf?%Ry1JTIDX{XUR@=1Jv1KB? zPJEK>K0%#K&}DnbQz@DH?h8L}J!u{I=JtJa-O2fOs(t%y;Z30%KfjyXH9uQ>)j{RteWsV9~!tAf)MzUQ#Q X+A*5?uBEDFG%9EXuaLU@SY*s!6z`a9 delta 690 zcmY*XOK%cU6z1NUDKIci1L08+h6ZapX)Ta6x+%s)H_}DpYvqCr%#bonnf6?$k;lS? zwZ?_UyEdsSHQh)s@kh8~g&{F6T^o}cS$S^>C7xuy^PO|%`|cz6EdDpHd{q?L#p3>t zv&vCV*+S@q7Er}~r-Kb_d1+4w(qk0DmV8bZaELxf;Y-#$7yTcn!lb4e*1`+Z*(shd z*zVvC<@zp8EC#0IS%$kE!3xb547~Bg=pVd{!ZaboX#fYA(wmFU6jKICuAEl0YzQ5f z6{XLF6-hKCE6%*v&>a0PTwiK=+TFEw_h!4>Qb@C8RKYAa9C(r+qx2YE(dKDRT=IvaQTRVgkw3bkOS?rCq&I)ibwEQfoN-nSC~K>bjlTHEr8@?0{`huSDb| z+l`lf#6ypy?8fWXFtR#`tbX%{U+uiu8T!?MUpM&Or2$ z`ah+sNaF{CAOlSRiF57;bG(5d#S%dbQjnl|cLJs9BlkK|`^WB=I2&ezQ2@+?rb!y6 zQ3Ug_N~%tsIbFEIBKv8K^2{tkZ^@q@L|6?X15Jj@oToS}GZ^^}%cNM+%QdrZOdM8t z8x?`C1n0^eV}w7c)J3qZZTn(qvtRLDLrA4>{U6r(#Xy?DNGv&y4V#R9bb-p-2?k@& S)}CWDZSw}?>4EZ8xki%bG%qg~0}$9UGNy0jX<+u~&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tZ)#AQ*v2ERL^64N85M09Z8mernY$)?M}AgA+znL$i$a~@kB3*)rOce%nj XZVQNZuz(b}al;e{ifyju)@1|$d)hbx delta 177 zcmZ1@xk8fXG%qg~0}uq?|CY9qr-9j^KtHrNwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{ag3UervMjX(H28J&j3}UJaA})*SHTc~Tm6#qeG2#;g z3#&p0=M7oyPYleQ3X|R0bUA?Z2WFt~<{Gv<7RCjWUvq^E-4GB3DV6VFfhv`s?8OaI ODi2aBzqy`Umk|IlGBy+d diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc index 0596ce801059d7a06be8c66492e4d7ad61aea85b..ef44097ee9894a23fdbcd476183af8866c59cba2 100644 GIT binary patch delta 152 zcmew(&?U%onwOW00SIgv8PhlNgtK~d=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9B~vqo?~1Df2x z@STG}N^bIRRs#tj{ego)P;@%iM6Ma8mjx6TC@nC&ETB5sgDsVrK~Qb;2DUSd0BS=p AJOBUy delta 138 zcmeAY{3F0~nwOW00SJQce@olQ6V7T-pdVVCT2!o`omiBZrKQA#yKO;3KC%-(uC?{p}AJ(rdjPE9Y;;P`dBcb_;ftyodaxQl?GmzeVn)^2s qkU84H}EYXOWi4Z<$;s>)hqlt;Z)IZC~j4|=wx5h8dee!v)Fj05OJ@@>c z=l8zP-*)ZDXKC*j9*>KIrY2OV$$R2EZjK4d9ZtT|vMi;MV_AO=b{0ZM&Eu z!0kmo(MZ4LFVd$i%{2+$uwkU*;zrSO%o6oNaKn}(@&qv)DtaMDbb|e0#BN#^_VQkO zUyue~Nu47Ilaw+cKaZy5RKJ#)$)kc!QYV#}jI8IhLh4LLRuPttXJiHCi>aZZ{uC%$ z|CC&q)P}J(g)%xFw2jy#xV>)UZCjV%4zfTj1stP4)^xR)YAaxa&l+}&$c(BJ0k8xQ zZlNhx$dv@RA6~LXhh6=)Kiqbgoi4e0obau14E*3~{RcSQN85g9lbM7Up3P$ki&0N> zZF*eJ>Ijc3NR^8l8TYSz+k_P*13qjSyqU0eEA4}Hlu zVy{M~Kl#oMvUNx}s$JO!I__uUFbG4)=2T=@vI;&4kT^iF#z;~hZegVE9Wln-pU{#& z6ngFa0)MA2^k&;~{Cd3HI&}N+=f2xLWxC-&3_IEANLeL#tA1#Z$-#B|KHZHmkj@J51PvA6t zJ-E6vhTc#}Vwn=QH?VggjT#nuoaAN^&Hye^J@g2lrhkS9&h!CJSa2N%!58RoxTDX^*9!*t#c8-$jrc6kUWJ#i?w7bbZf~i7t65r}ygs?2Eaks) zMxbNp>bdV5o9M^kxQ`1rSFBvi!HScstuLL1l%Uk6J~+HnD!cJtrP2$Ls4WlHYxHs? zDy12B4?fRmtQ5nck>s?jU&6^0n3g delta 1780 zcmZWpO>7%Q6yCLWZD$iZwiCyHiMw{vL{62T{*t6|f50js1PO_xEe6%vWXH)iYp*r4 z{Yek41wB+MQX36Y6ZOy{AyFtuky20(y&w=o;zCHF(JB?PBK#+_9Y$XVWRTSsR#ViMd4AokHKLObuLUkGw9 z?inKplb&e>E2Zx7DaF*3o-88Mut!fBEJjJud!~@C8)poxt27}V6;lw!zc?fI3bhdy zkZpw%^iEChA$!>hy2TeP7e?fiZV~}>89tn3hJd1;R3=c#%$vnBWUV9I3-}HgRi-*& zjbCP>4}>K!3M@xK#Y3PHHwZ?SEFZG@!u`yXi4)Ac1Om2PcX9rK%Ft^4-pbILH+Xf| zNpL{>#;F*!eZQ@vh%$~ndKvL|*)xP-2b ztwvgateP}EAMFUhyzT_+x`(UtS6&64puU!^^|9FhtB=NGaj^{O9Niy_%Y(2=ci^{~ z8!O6k8>G9em{T~*pb$MB8%{QswQ_g+p)e%-%$}_O^=IRju9_)+m-!E1A$_x}liW<6-1u zyAYN)PBX#swtM_9&tTC|PwD6YJ`b3SwE%gMUX8cbJ>s&KQA#yKO;3KC%-(uC?{p}Go~|)0J;DhT>t<8 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc index 09749886418a66fdffdf4eaaa8a4deacf93dcfbf..d32c6b30a465da2d58aa7ecb7c0bd4a39f0a0657 100644 GIT binary patch delta 446 zcmdlYG*g)GG%qg~0}$9UGNw=C+sIeR=+UYlTAW%`te=vUSe}}dsPB@WT$-DjS5mC+ zno^paSdy8aryrc0n3Gzh;Fz44lA2qo@8jd54`k%KWF_XM=LZz!XQd{WY~Idzfk{w` zk%3`411CcYV+vCaLoEa6e z3~0#Y53CbZ76Ta#3?JB-Sw(Jhh<;E4(l=z3=6lcdUcqu%M)v}TrOt(rc&?D$iO51iGh(-qb5>8QheP@54%>T^0;Gas~K1d(=}PF&1~I2nOtGEf@~ kY<6bnW@L<>?9Z`RK!Z_yLBxvWg|VL*fXojSlVvz1094#_OaK4? delta 350 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 BVNn18 delta 306 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 I2>@>VUykB8?*IS* delta 9509 zcmbtZ3viUjk^cXEX{B8~kOb(3SRo;_fL=(vB*1ziKtciuuvrYtYX4u-ihVJ=LP&rm z+azGev4w}T<(!k?I4R?h#7<-&^v{U>wfm&CsXs7x&1U9-h%2KbSqj_2^Wh%$vp=)M9m++L%qf8rAF`Beh&jpf=OL7`_>J z3%*5ai|85q?J*FhL)R8{k(#A0P#b%VYA$FrzH4iY*c2lYZJUy=w)7a3jFTo;tCC4W zDf4wD;LI7g$D}MkuQp|&+M=W@GVmQtN5#@Iw0>d00hoTQYTw79zT8DQQf#R=hE%78FpIn4`Hi?ZUR*|l3) z3A|J-(A^y4l%f9~!O=ZX4*c#$L?_zZ>}B7*0`l4{)aJ zg%%g~WJ|A%Ma_-xyIH%hMcvXfqC455?1NBbmePBHN2g5@X8~022X#QGrtOPG0{rxo zLSJl?asU!XViIJW8~ET1KB621;i%$KR|?mdly2ZdV$r-PT}e%q&U(&L35R z@%;d?CFD49!o~Inh6+K={Yn^)ZGdB;SnL~;Y7i~*OROFLogU#ZWFHVyW0+b*ExTY$ zkInAEA=x?nAtCKNG2x(`#`_a;Qd1g3!KivPy4@4>^s0C(wpR`IMl>UoeH^TgyHoPaThQ*}qbYkW4QR0%UgyZ3xRqj+<@H=n ztIDqdRg={SEwKYa)TuHKdL}y4Mr6x+!fW{Dd9GB!FDINpnAfGBbnIfyX!qia&-J^U zMlFG<%;Srwnu+`~@qT)}Y;}X_G_Yn~p1EE&a$jbp+{OPkGpDhb7$&wKKkNVj>Zv94 zd4h@`6E*>J;G>&Hof!d2yb%>(RQkxyZ)JAN4Se7H3a6jwF$bW@lsNbsVweF&r7I>Y zYv3=#1vrSz_3JClo-!$BuOVc$gCVys7#@hSadh}K z4;QS3f6f;imF00>P*}367UVf|u`)Fh#$41nvtcx60Y2o%3j5)X(Y9>M7zw(4opl(fg=A5fba3o)n6z6R19Td?%eP%`%eON{Ggc7oX#QG86Z_#!<%oGrBY>;ZsT zu3{^RNT8Jeth^5kR$cL}ir0zw27qSv_6-CN%?S?8#!y`$;E2I~j$WI1dgc0ww#xhE zwwb|`)T3dXX#?2K8lueOr_I4Ok!Cu~a5jnq;}>YpIgLxH2Z60TyUHDlpvSAOZ(L3c zvG`Uss6+;R(LRJSDbY;bbZXEhpJOQ#A_VsE7pm{Zawe>PPgbXGWV96Qvjnyg=m*eD zfzT0EOJXYh!hI3e3Nj9o%hctH=+XxVXr`#g=fCY3DWg6F+!H(2RvT)U5>9s&F(cN6 zmSzbv6$$h9mC&rdh}$3Xdi?A&r0v->=`hKM34u&@BE?FH*8*@&$WB@ZYaN zX1@WL?LW;v$b3=Njf_j@!24j|M^Tr7#;A1Flys`~{?;+$q$zhydCQcGv*xQcC*?KV zSzA{u#*rD-1juSeuRkK%ni1K5#c90v_JbzUp@%Yt}FeA*n})^u6;3>MF94$TC9m1ELXlfG2Hi8xagbH5<0H z>It}mo`CAbgr+~V0}JuJLETy_AVHO}BxEZ`6h)RJss_R#=3zenkb|jV zzsIXaz)>BMp@>8Gv}5^<$4AuV4%%-Rw=2qg!QQPMWl2KYF3%w~=;&dgfTPXVT^<<- zLvOU)jZA>L&|MZDa`=KmbK{PoXkREu!-dL(Y`fDeGJ+=>W%|}gh^VM8fQc}mm_eA| zqSpq^7Gl2MSSdLt-e>B}Sjhhu#2%-R-;Krx(ydYHlN2c<=jp=nW0%rbjJ94i*&b;e z%Y8a7|rEZQ|99+uDz79>`m*k_pGUBjbr=Ht@za{YuT+w z5@Lw8?9Y)rsD5B|{VMsD^!hyMwWM@3U(3s=FE_qcZbaKF@n?!Md0t!Eh$6=y3c4_x z;j4{$SuA{_TkHt+kl)MnI=M!7ELKW*{I>NhaXLJ-LR3-L2rtr_;uFTQL`#;5QhAv( z&WWfa{+=>qTEU9ME^`k_gWx(!U4LGyC zD~L$o8CsxJG_X49l0A2P-6dPmq^U^s{mb5S2n)MZ_4YU~aq2N83_z$e90a!?F4|0} zz)I?5M5k}gvc!73B@^zAX|f#R;Z0e&l;AZp&elK#Xa7)GMMYwwQOq)bcGL3tb;LKR z!GQov2l-{v>*2rIv?BAu_RA?XPxX&`&#gW^Fy?(|crvAiFS+Z76?FI^!ZSz<9{+AT z$h!x8e#ISBqsR&j?|;${cxv4S9H?z|FYLwpp!6Y~Zhw;N*g{f}1u$%^DKB@*NZX-- zU=*rzh?5I2XV1*nRSz(~o3?Iz3U*};!DEVGhvNVYlrLPK_z zn5aGMVG%VhSpxo>{A$A{NYag~y77K_eLjfK8`|3$m2d5gEXIzvut?bNi|V;|323Yk zKuZ`19v%oqRV3OR{`;myavirf=b0-TQe>7AlME3;nt%u@8z{EYKdi3vJP8%LN84U%W(G;{a3IaN5aG&+Iq0fb^uKN-kNE zTn0r}jfw$Zqhi8Sm>F*+CdH^4@pNNB+Z<~rplwmCY65U8-eVGhCk~mMNj$Z4@yHse zZ1)3ta{oF8ruVaZT1nEY??4rd4a51 zXw-pxUwMcwCNGsl`O|;)8~_8F|ehxcHSvcKLrq9F@Cml ziQLA&*GU!K+nsu-VO7bTxgCqU91A;W2s^~_vXGkb*olWuOj`4xet*|v`NP!~p67!+0 znFF5w5W|lT&nK*iL}o5HorLZpK*bO%An+vu;vvAqdbwwBJr1yE_m-K1utDW-@4W&W zUT|d^+~V>wql-keL=-A0J$rn;nw1VOajE+$XM^ttcx*z4r zft9fO%z+MBeuMwoo$vZN4MWkOSq8!i?%zn(;=VbA{+ir}%aj`I#cB5~>SOLkiam7u zQ;jOM)Yomb~O&docY{nq>{Jntmt@lyvE zW#jjz5!@-%6UnE0POqOdW!_8#f&cK}_2LAKh^RUVjk6qs%aO;&2Jwo>PJ#1f{$o!e zrt~kKYyU9Q6m&zjBAd#{+r%+97L+IA4WpW(+myhQ{oCj_lkB zr>uj3S^h2G?qBs+)GoETmeT@Ju9V6c} zx}UIa0^cS;hG@xdx7Uwbofm%?al3Jth$sa|s?)baH7O?W%EU_c4+g!ut>$Zo^7VSf zDI<5JNzRj65)M`Rdyn7O&Du!nSpvst6oW6MCD5A_F8q2Z{n zrc|cJU(+LcR$RjWd3cdr$ZrlixPtXitCv7M0jfClzc7_kODtqDwG;v>fj$Du2$T@u1jIYLlU_d9GlYMY zzyyG1?(v5_QT?U*Cq$*kTP>rhd2{{lwq5Rq-J3Tzce=Z_x|-Qb#1@&blv;HBi^oZJ zom%e`_y9mliN!$dElIz+R}kAcLQ_g7kWIirpoBmL0dW_prxsl)n5gOLmY~=FRH(B~ z0;0&GQb`m#j4BPi5TNWWa;r#sB2$U5ozDKNBoWYmvTnein+E*qCiZiP;J*}k$|6Zq zMp>5Mk>WLTXNHsMap$tSyb>*LWaEZN}_$rh~MiO3#ZKZ1=F56*8I?2Q^ZA0U`hHo z5v?0W$4FJ`Z~A)!5$Wtv4mdn#?>2cr?$elsOq zUh$CxFtwa_JTTU2ldG;IrH|E*RgIg*)?Z9oG-U+oddh;a!w(&rGNX-YSZt@)jnzL? kJ8nHU?&la z!hu6Q*&7^dVq!@z96fsQVB%#r)KDi)s`2CvU86})e&5XQ3Kck+_8q?WzVCbAoA1y2 zes6wgZ*L(m=AQhO+foVn6`A?~J{;8xFl`V@(u7J>cBHffv*O4FC9M?Hv|7;8nnYys z4x#Egq1ppEGED0wIjOIlp7(9X_H8DNoW~8ya<*%`3r4}C%n>cW;pW+-5-6A5QV_dp zIgXWaSfGAfDza>JQbhF{Q{9He24MsoA!(UPX@$yES&-8zRhdRLrc=@fd#FyEaypHz ztLY}Hvsg~1&9H8!EwD>xEjg980^hoiZv(zO&i9Qb(1cd|~VF>OJH zbLHsku+nK4?C2^rB~Jv2_gU$RB^bTx6^a&T*X_@2cje6wxp&K^kezHOwuR>!S*vJe z>RI#imT%a?$e^tOTFY2srJ&7>448>r+^i?o%sQ43fr8SGXM{Ru{xWxGvq~+OIAOVv zuNpu$$f~qTOjt!@RR&I~b0xAR%_e0Y0|9Ra0(Dabb8;N-5pM+|@F>GDp1P@d!MI2* zS=@5RG7yAqrDm8|^1WiJ2pZ3|oK&7Uj`yj@9hze9t(0SDQpJ*=_uO-1;}a=i`|NDd z$}U+8Or(l-F=g7W&p28x!?hBr=oXC?;p&*6vwhQCIdxc~$Li{Kbn*m{HS(x`;Ewt* z*7s=O>>c&TSbr6yB-@A<7z`%N&Fiq(Abvx)N)~I^92AZ5pr)TAyaR+uIZ*SK$cOn# zN<0oSfm;mT2^3vM^)W6->MpeF2C_yT$Gh*&>?VdQiQ%32NI5pbF_b{_{5<2?{Vrku zhOS?M1(cO6Hk=1RZLCUu!)CGG@pUE4^SI+pO!{oUt3it`Y*+Y}n`I&52OYDXf2~k-Sb+f)(+Jy?e>={hru@<*DAoB2wF@No`q!x*KMYGbJ=ognkLhvUKYg7rYRiH7f?RLNUkA4 zm<<$oV0aI%)QsmjA$D=>d2S%V8_BW29J3rowiPvc6lxPnk>C?4z5}vOeo`<0+%-@h zoG5pmTf4TW%G%iG)ja~!cA|X#gUa~zkSTxkNfm{AF-aTU9I6tS_H;>`!p$(xEaX1sTn z?UF(^Qo}YO7^7eleSoBiCHSBT2~WQH=1b8R7)jKq558?IA;^>G-f6d``rvfu+iyd;k$8m#gmY@g zk+_712A#2JAajsG+A&rPaZ9e)9$Z<|FZnflCC5h%x4rOv(!=i-KJrYaQdNY2ciBnV`OLR&5{%9uPphIC z^$e=wtB109BC9gdpHX^zjY~|FBb#7dFtBc6%kYq}upl_gI>l<65TYtv6co;}Uavp< z(0rRy#!Y*YROvJ^$9yYp1asW3SkQjHXP$zVq0BgD5u284=7|$yCQSUXY2r=!Cz(G@ ztA7g>l~S)+zgz+EI8uo@`!6zpu@N+yE+%tq7FGL zR2c~ZYG2qJ8;-g@Y|Te=@jA=37M^n-5IMaC;%OZ{PN5wye?HWB{lV70rlNNn4+n;C z_AU?XTk5+%uy46{-_u9^#$QP7HXilw{^Zh9=6?Ty zKWipYPd^u=zLxAmH(nZ5zr~|!HW8)e9pw8ik8}|jXK8R+uRIfc%xZDb`-Ew|^5T@v zLgCp9Fo}|@d0puH?|j972YwvH-*xnRdh18S^TP|hKc&Tv9h9~%&>H8ZbMyz%c-3!0E2)xf?#pLGE7x6B92gQCwO)CtPuyO%ea^* zu*iY$1p%=%cW%)KKP`Rn{^G8M@MEuuK>cdl-CcLz{Cec}&=a9HUqtOa^$E5EzQ}g4 zei$N6a#3s`*%~FnS^yVT9FpKDVtsu*{_BFA6!j>gOaUf92&&0kvX9J-lW>Rvjw)O)LQxifcPHy`WZ HEVus$;d2@j literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc index 20c95c9d7acc6adba12c9f3655403cb92fa8ef8d..1e886d8a375ac4d8d5a32644a98f55036f431e54 100644 GIT binary patch delta 99 zcmcbj{6?AQG%qg~0}$9UGNy0jImPKQK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY#&wPz08bqu A_y7O^ delta 75 zcmaE(d_|e(G%qg~0}uq?|CY9q=M<+wg??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ9M?H^0QQm_lK=n! diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc index c1b49fb6ef51a7eb3240bdbf45c8c4fc19b80556..6871e24cbc901e4997919e1bd6f34125bfca1908 100644 GIT binary patch delta 1328 zcmZ`%OKcle6n)P#9#3qKZ;Uj@Gl{IUP>??(X34Xk(zIr!!e1TC&9(8|-PJ$gcG)m?uT)Vx}o z<^#>4cO0~<`9XKW2=>26(Aq7I)uc5*0CcY<1wl$!Qpl2y<9uOVwPpxw>Y{xjsYNVZ z(xOO&o@3B+YK~?TKZ8z2vod$tQjU>IO=qQPp0lm;Z*0F(AHOMdoW7KQ!_=9X*UptL z=u@S9zfqo@(W^BxKcLN)OSOto&5xH$(>hBQ%Oy>pnahui^yfh^`lm|ON#hJNru1@+ zE8^>F49c~^H3t9|$gWIMoeLw)RzH7Fd_f@I_WCvPHA(|lq_h%2o(&+GWKo`%PK2LB z%SnKr$Zrr#gm&pie`u+Xzbj?C@A*T&n-VxbC@RHPnxzeK%BWPcl=(1>0$`r+CG|)K zSdj+%)Fu($NER$h6MsK^uZgqWiY(2Lzel@ohIlk1lGIVL^#<5Lz@3&o>^&z?L zqKE2#_^(r%1xh&-Y@>gSeglFdhXJUQt0S_LjA?r^1lIW&un)KoZUZ{KQ-FLhun9(G9Ec zi<5XFYnd%2&0~q^F!6M5E9p%oy=Tfm_^2%-d|^NA$l69np#ts*>qKZlKn4>4pb;#@ zE&^D4_crd!hl!MZ4lED&)x<=19CRkT9Hkf440qb?lIhthIq~}rW-<~TC-+nSmjH?ump<&?8zr*3~hE=?`4ai;sTo+ xfV%>vv`IWo($XaECTY7*#<$7%Z8H9lu2hY8IZv(}7&rjX3P<(hS%LjgqozXh}2^>K@I8&E;7cBRn<5Yw(0 z{ZERKxZ6Y2jGvaq8cogBy=H>@L1#%Qx#<+v)4zj`^14z9j=nt7Kb||(pF8|Q{vi7U zH!{_;=+|+@J5(qUYFO+;&o+**%R+h&%^r0Kb+X3|Y7{#rjv1wbkv%}1<0X40I|CNG zXjs`}#Io#@HnmJ9iZ7*-kSPP(83dR|8wzS{o*!BXM>dgHYGJn6A;4L_BEE>R$~L8@ zpvJvD0GSL;utvFCeU39d0KcKX=Fuh+>g4r6nAx)4c3S}Dz9WP2?Y>}N7(?me>vo~2 zV;bRM7=YjNr5uymK<;Ee%h9^^NW+!{k#~>~kT;MZ$uz|j@7HrGxX>DaitLa{N=mxN zy@x(l6}LwyIYA6-eA1qtHj3uBL0@xdJ6L*QJ5K|+-5$on_y_;+S6!EOUpey0?(6Yq z7IKS&=LSFTS`O^{-aq`EID8)tM}&YgE#(pAeLwCfZ$&=CxSf4a-zxLw>9cIPK3U73 zu_8J%g z+rY)wvT*39KzwQMjleE2`dZeN+8>qJvJzWrzOJNJqS||*cSBF`Ex#2T5vutoq8%JM zIn=RRiL(RUkCR=X!V3gB%S+WIx+9Ex&=UZT1dxF>53hYSxmUZ#$>#xJX11zOD8AHs zE!ebyyuJ|oJE@Jrxy_Z^93D6dc)nB9DtsjE@#>y@9#VOMqPsZwIB*Zj-w7(>8R;ni zcT!)42?M#Ju`iOEOy30gPj)Uf_EZWa-8Yb@`$5RV8XeG^=@2M%ghLaDqpT{uHdo6< zo~+`}Jshb%K2iMtL;2vkvsDo%Y}={`g<{G59&W0S5#@Q@5*{c$)3!Nlk$v&wpM4CU~@A|xRT^WxCS8xA@K=? zbChSK%+|ans4_WUU5s-<;X>1I%uI58ll#@hCmX9v$pYCQm>GmrzkrlaDV||`U0Ua& zw9aL5-D`q+AU&)w_1YXjwI6|M^*0|YCJiLML`Bg zgE>Dwa4{$tU*wVb^_?3gws`_exRTscxLzR!A@K=?bChSK%+|atsPc({jZ=A&x)j%E zW+pklPYkTQ%9G{Q4V8fO2WFtu7m)fX#WRerOY2;e*10UMds$Eqs!0r0llbKM>LMIK qjUPc8H}6)rVP?ED`G=Mk=VeLbPYk@AzKoMqwH;YNjLn(aTbThgSypra diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc index 1508fda6a686df9e1066bb22fbc9dd741848e8d1..b3a21c867bf1555519d113099a435c5524873d17 100644 GIT binary patch delta 5249 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 delta 3075 zcmb7GeQZb zU6>1SVSPZ4k%&cgNE0>$3<}SNvckrIQQ7zNcFwW&>87wig-DvB7$D zmB>qmB_lfkC1RfF023!Xg5(kPpsEvHC)j{@8K;;=%mM9E$RU3jcT4)rCKRh&uv+~( zQ;ejXRY->Ok(|8^E2ly^vWl@e-xx$gs(ok>|FPV;D*;je!aA!2wS+z}y9EtWHtvU*l{=Uvo)nO?V>L2WvLn1k&-iy~v{Z;)g#{Q|8 z<_|b$69kTY3&?Sl(jdF*c>A2i{upUl7dfb_RKYwI*L{p}J9$+f$XR-Gbhk(Yj|!fJ z4j|*?ipo#EdygA-{wq@Q~kr3}YYv+ZQTmJh($D;=7BlQB}OlJ(I4DT49n5hAE zM&5S3Y0yDHPg+?{6)8ybS6Pl+cIp&K4f)EM)~O+Dg*4X%l3xiG zK))0QNZeIOMoSFjhRe2YL=$6WQD;E|d|&F>U6hM)F1Dh%Q>ZEYtOtkSkuB3dOW!v)74B$)h}XURD%dczS^C5|7d8 zw`1yFAJx$E9Ez!W*MP0vw(K1=excx1fb-;UUT%$k#nb=ZawbmiTDp%d%h6V%#`MRT z7W5{LS~I#at!T+)v=)sRqRU0vyN-JC=wpVA92%aP{#Mp8eQzV=kfXsgg^e_Y9nYlz zDbjlT+7PX@LL$rWhWo$(R%XSiSdNt2nuB-sYVcn&f9kZS^TN zw%4Up$SN%AkaKlHd)f4XX>#Zqe{E=H_0Ac`uDh09b7uRQ*s0j*WAm1rb9MJDg*04l zJojvViZNL8=6L4=zI2)|O=u?7_xQCbfr75wiv{Nk5{?;H_1M-$2eP^^_%Ak`Z@9Sm z{N_a6jJtZ)QZqW|bd4RmYbhB!Hg9*GTQ#Acv6n!zwbmva^L)+&-aE}hGKu#v3Q>vo`NMzx`VDKHv7J6VtOvi5PKN zXSh?`JBEKf?!l;d2ma?`5fVI)5jSehTZFs7J>C)Tm=j)_6AI^q{ELS3hB?8#$gy_E z-?NZC?^(*mS@WJP<{+2nrng+*;T_6|d(cXTWucZ{kw9u^k1&BfiZYpEbNyRA|+ z^+ox525%(ps>|M2;oq7rTm$8rfF$+7$N_pQ(^92(u)Lq7stQ`@pId&7D(Jf8U^Lj( z8B%H#z8zNX^bp7+^!{9~55qv;(ax?T=>m~K@)tz*Reyvh2Nt@)i zU`a2#$S=uNe;)bV|641I8$Q~dLNHz1vp^^EVQoV}JI4GuTME%Rp-Rt_>IG$;>SoCH px(23QLq_X16}!16Bl>*_*W^RjjgBU->Us&L)aTg7sBT~k^glBd+7|!- diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc index 01a4edff423b89976327e56ce22ca6ee1fdb6cd8..c530ffa1cdc36f4ca44e6228368b90d2ad910bd1 100644 GIT binary patch delta 566 zcmX|8J#Q015Z%2y-&2?$*riDGCKN zDQVyeYD(&eUqHz}Skoa2cacoxidhqwV)o73`FOLtXnwoW`QB)R1noYhhYwsrewyH) zITv8D`=N7lV5N3e%iTSflGNc|TI1ezHxlM%{m5F z&Bh8$fev4=tmNAO0^oAB>D|4zZfH8vZoyS15-^)eliNmvrn#+S52Mbggbp&T>a+Lz z-BmIYX7ZmWUyXeksO6iOQGt!uaq%|Ygev#|vZuKPCa7^(Zoq&}V delta 839 zcmZ8fL2DCH5PolWv)N>mw6<2X6&sP7E@~r)V2kurK|xbAYO$BF&Av8iH`!(O#ZoC& z!HXbR-GjXd^``Vx{0SZfvGibBlpe%GZiR@4o}5Wj5C?YN%)D=AzL~e5x?4TD&*^lM zp%i!j%-pOiWG{Beel;q=S$R zSgDuk_E0o5RQy_ZP`zOeUuF+E@Flj)=KsZY@D6vB4duXbRAM?$+5gE#$1gHVE9~GBofVy*|S6Mj*~i4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9b>mfhOrG4& zuB(2P*JKCd4PlY#W)saOTU-}byC|%7SyoPwUkeqw~NHYjZZT`SLj}-t(5IKDS delta 158 zcmbQM+^5WQnwOW00SJQce@olQQ^{mdq#s(GT2!o`omiBZrtod8`1~ C|1_`w diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc index 4740e7b90fee4848c63e826dcb2fa1f9de0829b4..9d00729a911fe6c1fc170cba09ca27aed69e9b8b 100644 GIT binary patch delta 673 zcmYL`O=uHA6vs2!ZkwdpZPI+TsC7$%C8TCiYO6IdjoA_pK?Fa*gM{hs7!#5#ncWy$ zDi)!j2wI#=RFHU*ilVX>D}vzJgDKHVP{E7ft>8@&oC%5#=Es}2@BQEGdoSV}ap9dH zxNOvt02FRM7k&d*KfQ7E{CG_K_T#`wRQujQ;4*IxusmkV;GRtb%RG5${|0z+pPMD0 zx!kc;`LuzsA!`e;fl5$TbhTbVRnw5?wYmz;qF$9xs<4c(lvbgJDvNS1r^wXNl@hEL z^b=SwA=M;j`*Qvf+Q(0iQKne2ZM%71A+P$BLkjpLj^cQGi^ua z*ER=u1^hHv+12m?+lDjk`mK#~c_XPaI+3BU_Gr`4COSL;tXcI>vVj z+D)`g?thwEPko3bI%0AwmT19iwOftrjWwg0zHy~l>kN&zV~Le)TTFi48SZ%I?qt_$ zt=hw-2TRW;KTf1>dz)G7oU;XHMwxz;A;=oA$x4!hS?}%$Mo`N)E+ACSSC9!cXu|yY zBArm&ni~89K%Dr5>A{|a%p{`ZlpuL~LTpV`h#C%At3ts(wTnr*&cJdV&10Vv9sXQKqTlg2!(oapXPCI#U)Bo+gu4R` zh^xhFA!_f*U^mS$>=b{02oJNmVe64U0>B)39~hfSvj|&eZ_r(SVbMeejpi2XbAqOaK4? delta 647 zcmdn0w?&WlG%qg~0}uq?|CTm+Bkx~EE)F1%8Hhjcn=HcQ$H+Z7nMqe&u9mfg9i$Ef zY8YoTq%f9nLU=$v>uN>_d-77IXN+ue*3V8XO3c$s z%1A89Ow@NtEzT~4m z!&Xj58RmVGj^fM*#aSI?Hk-2+F*8a{Ud5rzC^GpRhhek?P+<{2j8FqIik|`rppASC zI!5d5SK43JwzC0qQERhvCVq~;+YvOC(DTVI4c6>i>> list(join_continuation(['goo\\', 'dly'])) ['godly'] diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/compat.py b/env/lib/python3.12/site-packages/pip/_internal/utils/compat.py index 3f4d300c..d8b54e4e 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/compat.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/compat.py @@ -1,9 +1,11 @@ """Stuff that differs in different Python versions and platform distributions.""" +import importlib.resources import logging import os import sys +from typing import IO __all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"] @@ -51,6 +53,20 @@ def get_path_uid(path: str) -> int: return file_uid +# The importlib.resources.open_text function was deprecated in 3.11 with suggested +# replacement we use below. +if sys.version_info < (3, 11): + open_text_resource = importlib.resources.open_text +else: + + def open_text_resource( + package: str, resource: str, encoding: str = "utf-8", errors: str = "strict" + ) -> IO[str]: + return (importlib.resources.files(package) / resource).open( + "r", encoding=encoding, errors=errors + ) + + # packages in the stdlib that may have installation metadata, but should not be # considered 'installed'. this theoretically could be determined based on # dist.location (py27:`sysconfig.get_paths()['stdlib']`, diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py b/env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py index 72bd6f25..0911147e 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py @@ -87,9 +87,11 @@ def deprecated( (reason, f"{DEPRECATION_MSG_PREFIX}{{}}"), ( gone_in, - "pip {} will enforce this behaviour change." - if not is_gone - else "Since pip {}, this is no longer supported.", + ( + "pip {} will enforce this behaviour change." + if not is_gone + else "Since pip {}, this is no longer supported." + ), ), ( replacement, @@ -97,9 +99,11 @@ def deprecated( ), ( feature_flag, - "You can use the flag --use-feature={} to test the upcoming behaviour." - if not is_gone - else None, + ( + "You can use the flag --use-feature={} to test the upcoming behaviour." + if not is_gone + else None + ), ), ( issue, diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py b/env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py index 0e8e5e16..66020d39 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py @@ -12,8 +12,8 @@ def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: str) -> s requirement = name + " @ " fragments = [] if isinstance(direct_url.info, VcsInfo): - requirement += "{}+{}@{}".format( - direct_url.info.vcs, direct_url.url, direct_url.info.commit_id + requirement += ( + f"{direct_url.info.vcs}+{direct_url.url}@{direct_url.info.commit_id}" ) elif isinstance(direct_url.info, ArchiveInfo): requirement += direct_url.url diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py b/env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py index 83c2df75..22e356cd 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py @@ -7,10 +7,9 @@ from tempfile import NamedTemporaryFile from typing import Any, BinaryIO, Generator, List, Union, cast -from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed - from pip._internal.utils.compat import get_path_uid from pip._internal.utils.misc import format_size +from pip._internal.utils.retry import retry def check_path_owner(path: str) -> bool: @@ -65,10 +64,7 @@ def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, Non os.fsync(result.fileno()) -# Tenacity raises RetryError by default, explicitly raise the original exception -_replace_retry = retry(reraise=True, stop=stop_after_delay(1), wait=wait_fixed(0.25)) - -replace = _replace_retry(os.replace) +replace = retry(stop_after_delay=1, wait=0.25)(os.replace) # test_writable_dir and _test_writable_dir_win are copied from Flit, diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py b/env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py index 81342afa..998868ff 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py @@ -40,7 +40,20 @@ def glibc_version_string_ctypes() -> Optional[str]: # manpage says, "If filename is NULL, then the returned handle is for the # main program". This way we can let the linker do the work to figure out # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) + # + # We must also handle the special case where the executable is not a + # dynamically linked executable. This can occur when using musl libc, + # for example. In this situation, dlopen() will error, leading to an + # OSError. Interestingly, at least in the case of musl, there is no + # errno set on the OSError. The single string argument used to construct + # OSError comes from libc itself and is therefore not portable to + # hard code here. In any case, failure to call dlopen() means we + # can't proceed, so we bail on our attempt. + try: + process_namespace = ctypes.CDLL(None) + except OSError: + return None + try: gnu_get_libc_version = process_namespace.gnu_get_libc_version except AttributeError: @@ -50,7 +63,7 @@ def glibc_version_string_ctypes() -> Optional[str]: # Call gnu_get_libc_version, which returns a string like "2.5" gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() + version_str: str = gnu_get_libc_version() # py2 / py3 compatibility: if not isinstance(version_str, str): version_str = version_str.decode("ascii") diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py b/env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py index 843cffc6..535e94fc 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py @@ -1,5 +1,5 @@ import hashlib -from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional +from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, NoReturn, Optional from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError from pip._internal.utils.misc import read_chunks @@ -7,10 +7,6 @@ if TYPE_CHECKING: from hashlib import _Hash - # NoReturn introduced in 3.6.2; imported only for type checking to maintain - # pip compatibility with older patch versions of Python 3.6 - from typing import NoReturn - # The recommended hash algo of the moment. Change this whenever the state of # the art changes; it won't hurt backward compatibility. @@ -37,7 +33,7 @@ def __init__(self, hashes: Optional[Dict[str, List[str]]] = None) -> None: if hashes is not None: for alg, keys in hashes.items(): # Make sure values are always sorted (to ease equality checks) - allowed[alg] = sorted(keys) + allowed[alg] = [k.lower() for k in sorted(keys)] self._allowed = allowed def __and__(self, other: "Hashes") -> "Hashes": diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/logging.py b/env/lib/python3.12/site-packages/pip/_internal/utils/logging.py index 95982dfb..41f6eb51 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/logging.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/logging.py @@ -154,8 +154,8 @@ def emit(self, record: logging.LogRecord) -> None: style: Optional[Style] = None # If we are given a diagnostic error to present, present it with indentation. - assert isinstance(record.args, tuple) if getattr(record, "rich", False): + assert isinstance(record.args, tuple) (rich_renderable,) = record.args assert isinstance( rich_renderable, (ConsoleRenderable, RichCast, str) @@ -212,7 +212,6 @@ def filter(self, record: logging.LogRecord) -> bool: class ExcludeLoggerFilter(Filter): - """ A logging Filter that excludes records from a logger (or its children). """ diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/misc.py b/env/lib/python3.12/site-packages/pip/_internal/utils/misc.py index 1ad3f616..3707e872 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/misc.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/misc.py @@ -1,8 +1,6 @@ -import contextlib import errno import getpass import hashlib -import io import logging import os import posixpath @@ -11,6 +9,7 @@ import sys import sysconfig import urllib.parse +from dataclasses import dataclass from functools import partial from io import StringIO from itertools import filterfalse, tee, zip_longest @@ -20,7 +19,6 @@ Any, BinaryIO, Callable, - ContextManager, Dict, Generator, Iterable, @@ -37,12 +35,12 @@ from pip._vendor.packaging.requirements import Requirement from pip._vendor.pyproject_hooks import BuildBackendHookCaller -from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed from pip import __version__ from pip._internal.exceptions import CommandError, ExternallyManagedEnvironment from pip._internal.locations import get_major_minor_version from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.retry import retry from pip._internal.utils.virtualenv import running_under_virtualenv __all__ = [ @@ -56,7 +54,6 @@ "normalize_path", "renames", "get_prog", - "captured_stdout", "ensure_dir", "remove_auth_from_url", "check_externally_managed", @@ -72,6 +69,8 @@ OnExc = Callable[[FunctionType, Path, BaseException], Any] OnErr = Callable[[FunctionType, Path, ExcInfo], Any] +FILE_CHUNK_SIZE = 1024 * 1024 + def get_pip_version() -> str: pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") @@ -122,12 +121,9 @@ def get_prog() -> str: # Retry every half second for up to 3 seconds -# Tenacity raises RetryError by default, explicitly raise the original exception -@retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5)) +@retry(stop_after_delay=3, wait=0.5) def rmtree( - dir: str, - ignore_errors: bool = False, - onexc: Optional[OnExc] = None, + dir: str, ignore_errors: bool = False, onexc: Optional[OnExc] = None ) -> None: if ignore_errors: onexc = _onerror_ignore @@ -151,7 +147,7 @@ def _onerror_ignore(*_args: Any) -> None: def _onerror_reraise(*_args: Any) -> None: - raise + raise # noqa: PLE0704 - Bare exception used to reraise existing exception def rmtree_errorhandler( @@ -316,7 +312,7 @@ def is_installable_dir(path: str) -> bool: def read_chunks( - file: BinaryIO, size: int = io.DEFAULT_BUFFER_SIZE + file: BinaryIO, size: int = FILE_CHUNK_SIZE ) -> Generator[bytes, None, None]: """Yield pieces of data from a file-like object until EOF.""" while True: @@ -399,40 +395,6 @@ def encoding(self) -> str: # type: ignore return self.orig_stream.encoding -@contextlib.contextmanager -def captured_output(stream_name: str) -> Generator[StreamWrapper, None, None]: - """Return a context manager used by captured_stdout/stdin/stderr - that temporarily replaces the sys stream *stream_name* with a StringIO. - - Taken from Lib/support/__init__.py in the CPython repo. - """ - orig_stdout = getattr(sys, stream_name) - setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) - try: - yield getattr(sys, stream_name) - finally: - setattr(sys, stream_name, orig_stdout) - - -def captured_stdout() -> ContextManager[StreamWrapper]: - """Capture the output of sys.stdout: - - with captured_stdout() as stdout: - print('hello') - self.assertEqual(stdout.getvalue(), 'hello\n') - - Taken from Lib/support/__init__.py in the CPython repo. - """ - return captured_output("stdout") - - -def captured_stderr() -> ContextManager[StreamWrapper]: - """ - See captured_stdout(). - """ - return captured_output("stderr") - - # Simulates an enum def enum(*sequential: Any, **named: Any) -> Type[Any]: enums = dict(zip(sequential, range(len(sequential))), **named) @@ -580,10 +542,10 @@ def redact_auth_from_requirement(req: Requirement) -> str: return str(req).replace(req.url, redact_auth_from_url(req.url)) +@dataclass(frozen=True) class HiddenText: - def __init__(self, secret: str, redacted: str) -> None: - self.secret = secret - self.redacted = redacted + secret: str + redacted: str def __repr__(self) -> str: return f"" @@ -680,8 +642,7 @@ def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]: def partition( - pred: Callable[[T], bool], - iterable: Iterable[T], + pred: Callable[[T], bool], iterable: Iterable[T] ) -> Tuple[Iterable[T], Iterable[T]]: """ Use a predicate to partition entries into false entries and true entries, @@ -781,3 +742,36 @@ def prepare_metadata_for_build_editable( config_settings=cs, _allow_fallback=_allow_fallback, ) + + +def warn_if_run_as_root() -> None: + """Output a warning for sudo users on Unix. + + In a virtual environment, sudo pip still writes to virtualenv. + On Windows, users may run pip as Administrator without issues. + This warning only applies to Unix root users outside of virtualenv. + """ + if running_under_virtualenv(): + return + if not hasattr(os, "getuid"): + return + # On Windows, there are no "system managed" Python packages. Installing as + # Administrator via pip is the correct way of updating system environments. + # + # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform + # checks: https://mypy.readthedocs.io/en/stable/common_issues.html + if sys.platform == "win32" or sys.platform == "cygwin": + return + + if os.getuid() != 0: + return + + logger.warning( + "Running pip as the 'root' user can result in broken permissions and " + "conflicting behaviour with the system package manager, possibly " + "rendering your system unusable." + "It is recommended to use a virtual environment instead: " + "https://pip.pypa.io/warnings/venv. " + "Use the --root-user-action option if you know what you are doing and " + "want to suppress this warning." + ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/models.py b/env/lib/python3.12/site-packages/pip/_internal/utils/models.py deleted file mode 100644 index b6bb21a8..00000000 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/models.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Utilities for defining models -""" - -import operator -from typing import Any, Callable, Type - - -class KeyBasedCompareMixin: - """Provides comparison capabilities that is based on a key""" - - __slots__ = ["_compare_key", "_defining_class"] - - def __init__(self, key: Any, defining_class: Type["KeyBasedCompareMixin"]) -> None: - self._compare_key = key - self._defining_class = defining_class - - def __hash__(self) -> int: - return hash(self._compare_key) - - def __lt__(self, other: Any) -> bool: - return self._compare(other, operator.__lt__) - - def __le__(self, other: Any) -> bool: - return self._compare(other, operator.__le__) - - def __gt__(self, other: Any) -> bool: - return self._compare(other, operator.__gt__) - - def __ge__(self, other: Any) -> bool: - return self._compare(other, operator.__ge__) - - def __eq__(self, other: Any) -> bool: - return self._compare(other, operator.__eq__) - - def _compare(self, other: Any, method: Callable[[Any, Any], bool]) -> bool: - if not isinstance(other, self._defining_class): - return NotImplemented - - return method(self._compare_key, other._compare_key) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py b/env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py index b9f6af4d..4b8fa0fe 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py @@ -34,7 +34,7 @@ def check_requires_python( return python_version in requires_python_specifier -@functools.lru_cache(maxsize=512) +@functools.lru_cache(maxsize=2048) def get_requirement(req_string: str) -> Requirement: """Construct a packaging.Requirement object with caching""" # Parsing requirement strings is expensive, and is also expected to happen diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/retry.py b/env/lib/python3.12/site-packages/pip/_internal/utils/retry.py new file mode 100644 index 00000000..abfe0728 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/retry.py @@ -0,0 +1,42 @@ +import functools +from time import perf_counter, sleep +from typing import Callable, TypeVar + +from pip._vendor.typing_extensions import ParamSpec + +T = TypeVar("T") +P = ParamSpec("P") + + +def retry( + wait: float, stop_after_delay: float +) -> Callable[[Callable[P, T]], Callable[P, T]]: + """Decorator to automatically retry a function on error. + + If the function raises, the function is recalled with the same arguments + until it returns or the time limit is reached. When the time limit is + surpassed, the last exception raised is reraised. + + :param wait: The time to wait after an error before retrying, in seconds. + :param stop_after_delay: The time limit after which retries will cease, + in seconds. + """ + + def wrapper(func: Callable[P, T]) -> Callable[P, T]: + + @functools.wraps(func) + def retry_wrapped(*args: P.args, **kwargs: P.kwargs) -> T: + # The performance counter is monotonic on all platforms we care + # about and has much better resolution than time.monotonic(). + start_time = perf_counter() + while True: + try: + return func(*args, **kwargs) + except Exception: + if perf_counter() - start_time > stop_after_delay: + raise + sleep(wait) + + return retry_wrapped + + return wrapper diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py b/env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py index 79580b05..cb2e23f0 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py @@ -2,16 +2,7 @@ import os import shlex import subprocess -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Iterable, - List, - Mapping, - Optional, - Union, -) +from typing import Any, Callable, Iterable, List, Literal, Mapping, Optional, Union from pip._vendor.rich.markup import escape @@ -20,12 +11,6 @@ from pip._internal.utils.logging import VERBOSE, subprocess_logger from pip._internal.utils.misc import HiddenText -if TYPE_CHECKING: - # Literal was introduced in Python 3.8. - # - # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7. - from typing import Literal - CommandArgs = List[Union[str, HiddenText]] diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py b/env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py index 4eec5f37..06668e8a 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py @@ -208,7 +208,7 @@ def onerror( if self.ignore_cleanup_errors: try: - # first try with tenacity; retrying to handle ephemeral errors + # first try with @retry; retrying to handle ephemeral errors rmtree(self._path, ignore_errors=False) except OSError: # last pass ignore/log all errors diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py b/env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py index 78b5c13c..875e30e1 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py @@ -5,6 +5,7 @@ import os import shutil import stat +import sys import tarfile import zipfile from typing import Iterable, List, Optional @@ -85,12 +86,16 @@ def is_within_directory(directory: str, target: str) -> bool: return prefix == abs_directory +def _get_default_mode_plus_executable() -> int: + return 0o777 & ~current_umask() | 0o111 + + def set_extracted_file_to_default_mode_plus_executable(path: str) -> None: """ Make file present at path have execute for user/group/world (chmod +x) is no-op on windows per python docs """ - os.chmod(path, (0o777 & ~current_umask() | 0o111)) + os.chmod(path, _get_default_mode_plus_executable()) def zip_item_is_executable(info: ZipInfo) -> bool: @@ -151,8 +156,8 @@ def untar_file(filename: str, location: str) -> None: Untar the file (with path `filename`) to the destination `location`. All files are written based on system defaults and umask (i.e. permissions are not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are + permissions (user, group, or world) have "chmod +x" applied on top of the + default. Note that for windows, any execute changes using os.chmod are no-ops per the python docs. """ ensure_dir(location) @@ -170,62 +175,137 @@ def untar_file(filename: str, location: str) -> None: filename, ) mode = "r:*" + tar = tarfile.open(filename, mode, encoding="utf-8") try: leading = has_leading_dir([member.name for member in tar.getmembers()]) - for member in tar.getmembers(): - fn = member.name + + # PEP 706 added `tarfile.data_filter`, and made some other changes to + # Python's tarfile module (see below). The features were backported to + # security releases. + try: + data_filter = tarfile.data_filter + except AttributeError: + _untar_without_filter(filename, location, tar, leading) + else: + default_mode_plus_executable = _get_default_mode_plus_executable() + if leading: - fn = split_leading_dir(fn)[1] - path = os.path.join(location, fn) - if not is_within_directory(location, path): - message = ( - "The tar file ({}) has a file ({}) trying to install " - "outside target directory ({})" - ) - raise InstallationError(message.format(filename, path, location)) - if member.isdir(): - ensure_dir(path) - elif member.issym(): - try: - tar._extract_member(member, path) - except Exception as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - "In the tar file %s the member %s is invalid: %s", - filename, - member.name, - exc, - ) - continue - else: + # Strip the leading directory from all files in the archive, + # including hardlink targets (which are relative to the + # unpack location). + for member in tar.getmembers(): + name_lead, name_rest = split_leading_dir(member.name) + member.name = name_rest + if member.islnk(): + lnk_lead, lnk_rest = split_leading_dir(member.linkname) + if lnk_lead == name_lead: + member.linkname = lnk_rest + + def pip_filter(member: tarfile.TarInfo, path: str) -> tarfile.TarInfo: + orig_mode = member.mode try: - fp = tar.extractfile(member) - except (KeyError, AttributeError) as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - "In the tar file %s the member %s is invalid: %s", - filename, - member.name, - exc, + try: + member = data_filter(member, location) + except tarfile.LinkOutsideDestinationError: + if sys.version_info[:3] in { + (3, 8, 17), + (3, 9, 17), + (3, 10, 12), + (3, 11, 4), + }: + # The tarfile filter in specific Python versions + # raises LinkOutsideDestinationError on valid input + # (https://github.com/python/cpython/issues/107845) + # Ignore the error there, but do use the + # more lax `tar_filter` + member = tarfile.tar_filter(member, location) + else: + raise + except tarfile.TarError as exc: + message = "Invalid member in the tar file {}: {}" + # Filter error messages mention the member name. + # No need to add it here. + raise InstallationError( + message.format( + filename, + exc, + ) ) - continue - ensure_dir(os.path.dirname(path)) - assert fp is not None - with open(path, "wb") as destfp: - shutil.copyfileobj(fp, destfp) - fp.close() - # Update the timestamp (useful for cython compiled files) - tar.utime(member, path) - # member have any execute permissions for user/group/world? - if member.mode & 0o111: - set_extracted_file_to_default_mode_plus_executable(path) + if member.isfile() and orig_mode & 0o111: + member.mode = default_mode_plus_executable + else: + # See PEP 706 note above. + # The PEP changed this from `int` to `Optional[int]`, + # where None means "use the default". Mypy doesn't + # know this yet. + member.mode = None # type: ignore [assignment] + return member + + tar.extractall(location, filter=pip_filter) + finally: tar.close() +def _untar_without_filter( + filename: str, + location: str, + tar: tarfile.TarFile, + leading: bool, +) -> None: + """Fallback for Python without tarfile.data_filter""" + for member in tar.getmembers(): + fn = member.name + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if not is_within_directory(location, path): + message = ( + "The tar file ({}) has a file ({}) trying to install " + "outside target directory ({})" + ) + raise InstallationError(message.format(filename, path, location)) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + tar._extract_member(member, path) + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + ensure_dir(os.path.dirname(path)) + assert fp is not None + with open(path, "wb") as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + tar.utime(member, path) + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + set_extracted_file_to_default_mode_plus_executable(path) + + def unpack_file( filename: str, location: str, diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/urls.py b/env/lib/python3.12/site-packages/pip/_internal/utils/urls.py index 6ba2e04f..9f34f882 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/urls.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/urls.py @@ -2,17 +2,10 @@ import string import urllib.parse import urllib.request -from typing import Optional from .compat import WINDOWS -def get_url_scheme(url: str) -> Optional[str]: - if ":" not in url: - return None - return url.split(":", 1)[0].lower() - - def path_to_url(path: str) -> str: """ Convert a path to a file: URL. The path will be made absolute and have diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py index 3551f8f1..f85aee8a 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py @@ -28,7 +28,7 @@ def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]: metadata = wheel_metadata(wheel_zip, info_dir) version = wheel_version(metadata) except UnsupportedWheel as e: - raise UnsupportedWheel(f"{name} has an invalid wheel, {str(e)}") + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") check_compatibility(version, name) diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc index 38e3d1c9d816e809300175a32170630dee45d062..0bef924582204744520d9d12f6259b6edaba96e1 100644 GIT binary patch delta 98 zcmZ3&vWJD|G%qg~0}$9UGNy0j$!GLv(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tAN(E%Y1 delta 74 zcmdnPvV?`_G%qg~0}uq?|CY9qC!f(EPd~IcwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?>~Fk>YEm+~5@ diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc index 278c517c7cead382b1e49fca0fdf5e60f9dfb3d5..235363db134b8d4e2ef7b9ff25496cce17dbf2d2 100644 GIT binary patch delta 693 zcmX|7O-vI(6y9lfr`y6pO@C0(3dBOIz*<5efyz&^B^dq$A;SLX6KEZ$kK}lbzY^j&Voz|? zcWQ!$bNrgXare0gHdbRf*E?XN>)(idsXJQm6z1-oDAexxLVMnDKK9vj zvQ+Ia)E?MvURUX~T+xx}r-z{SS`RGiYFNoI)8J zSu2yZ$QkOGm_p;BkUCb;U0iaGBh&*=UA?HU_`~%Ki9wneo*|v^q`K=E8%HN)Qb{Y7 zOzUP@FfEeIkRCu%JB~7r0qBxu&@I@I+B_e|lE p{e8?l&tQT=nO`uB6q$k@w-5CfU%97kc$y_oLBP|77Gcz*{{{L$zKj3> delta 651 zcmX|9O=uHA6y8a8XLr+X8r-&`tu+<;vyixz7Ft8Jr368tv@{jb9^M;F zDh7&Z3pdjxvB+Ih;IpK*iCd_dL);Bc3xO-dQ5_x%w*`K|HgYhC&!RQR;bcPXUQ5-K z&Pwl{t2MP_E%m9RbKR?)-YBg*Z`J;C>VtZ`*4kNV+ic%leXmcx(_vKYTfB@=KZN8H=oG}|uJc2*UdPL>Y4{e^{qL!VJl`O`x03f4 z$pACKL}P|W8FVq|rclSuvhObYBnBIDI~uJ%mZuOJgZ)qfC98VNb0qas*||9~42{;2 zBg~&#yLR5U^99SR3!YE%E*XPyC63Q9+X*1b9J&XumDsV}_Pz!u%F%MFrXIeZ*hoN< z(vFD+Cn!2SGcnD&4DLqiKRH<_dfElB?P{s`~29MFRuW?-*v70tk< z$W%+54b~Zq!qZ4JmSpq-gJ}wNe%^6xGRvrv$z*NA^Ro1}WHK5ejgp$#x~%$AudpGXfmR##yjKPH9Nb@omnW0 zQ$xZJw~9)f3#o)qTYgl6fT}iIMaiE?srsW;`h)ZpXGGOhYE@_}6*YZG{OUP(&BG1* z-pN2-=sE(4XR)CtBqnK*9rN6x>?-JWqZC!4T?cEB!<+m7*-=< zL~RzE)u5Q@{B`1pMvZ@qxEjcNd(~_Pm7LrHPQeL5LqiIQ2)U(Oi*@+|w z#fe3!kSQLf#YH8pvq9Uetr=YIs(#BhX(0i2$I%mL0>w?!O+vdL-$*0O?MyVzqQVJq z-t<|$f2F+Qq0#EBGf4zDC}}sl;0lr;yXtBY`cM&PAGo%W2z%ffA%|JNo04etx?3Zp zmj%3ANtjJ}JA+$s=Kw+&KtsCP+S=g83*Hzx!ESjgaH^+nj5xZ$1YzxFC0|S1E<7;^ zU|7;;c5O)906IPhuB~JyCOVA zNCo#@0~$ell8rQmgo_|*W_G-B#`3$yes;TYpT!hNR{zns*Sz%w+=jU@TvHLyF<4> z+O%X@5~z8}S|BpHZN6o$>0hz1uLlQ-g}oDe(P@=!OXelZVgL$0%=$uZBCvr_r^SBT z!H$Qv5hwe0=sh2lt9zbGg>*JmkW__Dg(r?pf;Y$)a%s4xCg;XyQZtjI6ZAPy#5{%_ z@{*#;X_~|h4plm-qzcLzia~QGD0V*Gi=ZHI`aSGkI2wM!3NJK#d@T`;tThsWk{gP| zg8*?;JVyoA663FR(k2D^OPp&1TY7fPEX7K7|J#7b5!Z zXRk*iTI&x)i5FD~_t-OvF6lZoY_c+6&d`1|s|a5~ zz}RV?z0na0@J8Y#`GgaVeb5nnJ_DN!M_QFrycIk;mC`3uwRF*E7cFykMu|}E?fjHL zUy$yH=^Wm48UbH{ErzlOfroPrq?$9sjZ!F1PdvyLs(ou4~QO)V=^ zYreoIzP68jZFkzg^jqJ+T5I;yKhjfATC9seN-jHKdB zB!IhwoTHHb>!>mJ_ha5cq!A}*-euOEt58sH z?R?cjcC*mX7@1|qhx%-M@Ucrn+avr8Po|)yvx=%1LP62<#Wc9SJ2XVPS#Wp@xSJgA zAV05Who8qDy*BdaT+S=nUywVTf9Fkq^1Zot7d&im?;siAeEAXyEn7U3(2J$K za$3nx%|Vw+IZc5eFpp2Abq<%`V>kAlI>y<=?x@ZG3QAa9PvSNlg(6i;lAfg^7{J@( zxD5-?WDrV!3Wmr1eI7cjINDAgR98m_h`$#P5&98sf%r{O9n2UTX>vlt@VqB%{W=xj9cJIbg*qREpGm37hdXS;!GFuu;rN^_V!G) zj{5PWt#vH(L={@tzh@i`>@2MYky~l_lGUNH?^|G{lB&%Xa55WUHbO` delta 3245 zcmZ`*eQZ@3s~x?)kd!?rC!6G;x0Ha9BC`?ft{O*^kCgIsN3%r&bS7$kwD)wk2(Z6F5OH z*=0x4Av=>!ZEcWTvODRPo03g(bFx|E86}VGO?ow&ms;f3WUK5;o?2>IAe_k0ZNW2^ z|K_$XU*js-@qcu;JwbP+juW}L?cbJ&ofk-*n_Q(ca-v~woLy=0u)jqt=42P_YA~A2 z5B0hqag7#`?_yV0d-m%ZR#ppEagAUTBeMpHdVM94r@0 z{UwkT3u&o8CrVQBaFI#^%NchWgRpf|?Xq!9PrU3u=AM>TV4Ua96WaCAGHqj9EK%=H zWLN->abLJSiME0=#HcHxS zS8WO*JuKl^M*^(k2>bg{^J#?{MQ04!@70Ppe_bowdT@FDpQo@d^w`0%TIeO4vW5S zvc%r=#rbyJx}JUI3y@zhi~l*&&0g(pT{mxhP#s70^E|c88|L+?Mon?tynZhykjFXf zoPUt$nCjnW(hG)p-MpS%T{vFeWMiC!nKkW9gw*yVY z%svQQVn^E&2NIwQDZx;x*733F9h0fav5^E_4UC9gHKl1bMa4rjh6-jmeNapl#KWp> z1`0HjOBK?xsKtT~fda)Ir2>MM1sn4PSF}Bfi&j(XQLN>|!*&OQkleXoAO9QRDqpiV zf>Xhp(SdWB#ht&ihrjT2T(x)HF>*sAL}Re8gJ+(!EbCr1x`4M-4f(=skzyOs5rq0(k*IBET_w5su~4xrjn&m6iW!tBB1kh z4nS?Hl!SCyOevKaxhPa5QHj{7)>2yGJ_;EH?N$}q8t`?{%cix z>yzu6#lkCyv9>FGlR)cy*%M&H-G5xj;_(#(yc>2K(%2MrAFDu}H$Ksgqaad@09x;8 zjid6);e0uht6C@W&b(pV|FC@m~!OTw-ta?1F@R*)v5X zOvr7FCFF7z{xpxOd^B3dt7(otWUEFhDqxil3b{A2OQsQ=Fm=u5zR+*kIqH9oSN zU0#Dlv?p?lkRPzkec=sbpf^5E$I%4#O0}7aaL+%bW)wzT$^ z9_H{**Ci58JV!^-xN1={rIeh8q$qeH9LMlSPXJWgFiTJNwaQklhiMHX_Ok`7jH)>r zJtWfn?2)QL$)yjBgMDpOIHh7XHJi>$qL9kS!Zh%;62eP8Xv$GM5j$deQ)bYv6Mc9z zJzvM0Pk`VUcgJe6_;1)#3NN(rb4M$ zz&&aI`>cY2$B{eL8^e*!_V%@+;Q0=@gj# zVAD%_GROwwqhu$WkM~+s6BVJaGa|bX-w@RHY02c3Oiq+Vl`n{8sh9!t_v3NW#WrqT z3ntTBSCL=Wj&FSm8~oDHU&t%$&251f66grFPsG@83K?e*-bO%|A%u1BfL>N7*#FfQ z4AHly(_fi;I04@88y+O&EPHi(s0Fj}SaSB_@=f;P_7}Hkap7@|gOeUXz!G`nk!mg! zsa#5zbMyrefU}Kw6-V%CI5E;mzN)=DGC({%C?@n{_^W>{LD$?H9rBr>z_n(A+Tl63 zmuin}D|==~FDbFgj_Cz_6X+TQAHq`zIKk*J0_GgbMM^7*ES7UcfnvGT$27ir_4mw- zlnX%{G}<^{z~##buOPgJfE`A$#Oove=Rn!19oLr;s%$#Z>(Y9$1J?-g+R4PA-ln;Y z>qwMcoA8WjmGom&`VoL?hfyNsXJVx^g-^s^BFoueQSrr!sFYQ{e58~wWT|#v?Gi>7 zpX}hZ1ejQAvcslb!-7VwY;m%S*x0+1J$;&g+BCx%Qop7fDeZM^#(XwFWUeB delta 127 zcmca-eb$=iG%qg~0}uq?|CY9q=OnX1zJ6$NYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJEK4Rkz3k1=T+=F!E}xu)ZN6Hl1f8&y46R Y0-E2MfkKnNaqDpaX|VieEuJlc07D@w0{{R3 diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc index 7362dfc557877f0190ef07feadcafcb3953af55a..f871956e19690b0eb6f8074f28511425736875e5 100644 GIT binary patch delta 456 zcmcbbI5mm)G%qg~0}$9UGNxbO$lK29(V-t&oLW?@pOTbVo|=`Y?~&w_esS^~$xzuVy6%^SJud3HuV9?wJcDsQ`%Lx)jI+6> z`d`p>zc`sgDqH4?Ven<~kc)=FD;(!A&v2aYKGS`H<7}_F{1*&^C-+DhvH`8QD5$*o zsML3E#($Idsud`+q%fy5*0SX>r8CsBm2iSW0|Zi7(iv;m7BSW^WN}YU(3E1E$XLUi z#S3Bz0GUic%s7#8En6Q$E&F6g4)Mv$)%h4%CvQ{Nocu&RiH$WaCo#QvvbTm4ub-3OUmcPLx_JNsQgzEvX&<9o^{eg{vSMWNI#zh{D%RE{i*g--Z m47?K8dE_th$Y17B{J;qk;$q+x_`nTf@c`9-+WcGN7CQirx05yi delta 388 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 delta 6379 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�#9tLu{?JbZ4|zN@T|tfQj?NrDkQ|+0=45> zFqY}72sQ)*f*AobgW3@)QI2~S9m!AQ1+S_BhJuU+sPwN6J**jT*V`}K3LkHq)=sUQK78Kko3Sm< z=z$BD?xNC+5h?hjsJ`Etu?4RR9T_W9d4jk8j0z_I{$G1|6?>2BU+1___n{$?(C|FC7U>*)JBDo-C7aGhfnL%l98kEH9~Q zLB`90dSNI=%ERtS*77gtYTEMxfc4u#jrW4)k8^I~k` z^_g}7DCP}0+thEZ+pvd+?l4kb1Rf|`km7#x0ri!sBc6;5#iTW~6;#8YAa4MK*Ihy` z3N4OL1p6hyd`Ylf5-gVlCu<*Ucl bool: """ Return true if the name looks like a URL. """ - scheme = get_url_scheme(name) - if scheme is None: + scheme = urllib.parse.urlsplit(name).scheme + if not scheme: return False return scheme in ["http", "https", "file", "ftp"] + vcs.all_schemes @@ -121,34 +114,22 @@ def __init__(self, url: str): self.url = url +@dataclass(frozen=True) class RevOptions: - """ Encapsulates a VCS-specific revision to install, along with any VCS install options. - Instances of this class should be treated as if immutable. + Args: + vc_class: a VersionControl subclass. + rev: the name of the revision to install. + extra_args: a list of extra options. """ - def __init__( - self, - vc_class: Type["VersionControl"], - rev: Optional[str] = None, - extra_args: Optional[CommandArgs] = None, - ) -> None: - """ - Args: - vc_class: a VersionControl subclass. - rev: the name of the revision to install. - extra_args: a list of extra options. - """ - if extra_args is None: - extra_args = [] - - self.extra_args = extra_args - self.rev = rev - self.vc_class = vc_class - self.branch_name: Optional[str] = None + vc_class: Type["VersionControl"] + rev: Optional[str] = None + extra_args: CommandArgs = field(default_factory=list) + branch_name: Optional[str] = None def __repr__(self) -> str: return f"" @@ -362,7 +343,7 @@ def make_rev_options( rev: the name of a revision to install. extra_args: a list of extra options. """ - return RevOptions(cls, rev, extra_args=extra_args) + return RevOptions(cls, rev, extra_args=extra_args or []) @classmethod def _is_local_repository(cls, repo: str) -> bool: @@ -660,6 +641,8 @@ def run_command( log_failed_cmd=log_failed_cmd, stdout_only=stdout_only, ) + except NotADirectoryError: + raise BadCommand(f"Cannot find command {cls.name!r} - invalid PATH") except FileNotFoundError: # errno.ENOENT = no such file or directory # In other words, the VCS executable isn't available diff --git a/env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py b/env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py index b1debe34..93f8e1f5 100644 --- a/env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py +++ b/env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py @@ -70,7 +70,7 @@ def _should_build( if req.editable: # we only build PEP 660 editable requirements - return req.supports_pyproject_editable() + return req.supports_pyproject_editable return True diff --git a/env/lib/python3.12/site-packages/pip/_vendor/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/__init__.py index c1884baf..561089cc 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/__init__.py @@ -60,20 +60,15 @@ def vendored(modulename): # Actually alias all of our vendored dependencies. vendored("cachecontrol") vendored("certifi") - vendored("colorama") vendored("distlib") vendored("distro") - vendored("six") - vendored("six.moves") - vendored("six.moves.urllib") - vendored("six.moves.urllib.parse") vendored("packaging") vendored("packaging.version") vendored("packaging.specifiers") - vendored("pep517") vendored("pkg_resources") vendored("platformdirs") vendored("progress") + vendored("pyproject_hooks") vendored("requests") vendored("requests.exceptions") vendored("requests.packages") @@ -115,7 +110,7 @@ def vendored(modulename): vendored("rich.style") vendored("rich.text") vendored("rich.traceback") - vendored("tenacity") - vendored("tomli") + if sys.version_info < (3, 11): + vendored("tomli") vendored("truststore") vendored("urllib3") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc index 043c508f70510f34c310eb382904da40d07d9e1a..dc113967cb1d2e50a32fcf07a7f7db318822ec88 100644 GIT binary patch delta 361 zcmaE+@?M$uG%qg~0}$9UGNyA*E{nO6E#tO}ou(QsYS*5DM^Xtsac8oF8Rr&xv6<2#rm!(rOAmUnfZD8 z!O4j^sYMEo$%!ecxt01pJ}&w|M!ri{VqSWFKv8~HYI4cu0uE6|0rr&4;*y-qq+4tt zMp6Fco1CVT#kkb@`3ouwAPVC%^7FGdTXWrJ;n8Gz$qaPnOKu=BS%F`cQDCwif2sa0 zo-&||fELGR=B4GYWcUp7N|6|l_{Cw9o1apelWJFF0pv0QadF1vEBw=VBCoKB-(=zG zh`7QcHhI2)+~lJI;%paq<*u;EZ@wvz#AtYfo$ETg_(gW{8S0nV6>o9~Oc1}qAqmnF YbA?3;L`Pm_5&uxl$iTu|WDYbK04g79TL1t6 delta 437 zcmaE_{7i-SG%qg~0}uq?|CZJ`kyn!O(?s|qvQVo2ppv0BXtl4oFGWSG2+ z#UKnUXonC4^X<|24rqKwG` zTWlakQT{FF;>?OFP9UL|n_re%TqOW!>XjDd0996rp^NAhBo-B?PR`~uWoIi$Eig4S zpFE#aWAhEpn=D+nI7(9U5|cAaDktydlV#+ee4DRyavZ+`W7p(*{%I^xS6Cz_3krzH zhPL?MWZ~(EzQQ62q%ZKwUtv)IGgPmzs7+QBkYkCs!Xh@=T0nYpyg)poHb^l@Gl&kq d!XgTyW3I4Bf#}GqEaD$rnHX4ji_C$s003FHfDHfu diff --git a/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc deleted file mode 100644 index 1a37cd86488d4cd39ff03b25205883341f7df087..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41287 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 Pt#Dkbw|rb@g8RP!=GbK# diff --git a/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc index e65fb1adb49151f6072fb989a519daa49567d627..596596fc1599167d787d55506875aa0ce72cb564 100644 GIT binary patch delta 59181 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

  • A7SaD^dLr>aS?W1U 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

    L@`|e delta 161 zcmew=`&pLfG%qg~0}uq?|CY9qN0P~)NI$eVwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKm+1(rh#Am`28Iu8417ZUk)4qr85lXWCp&OR@B-=Y sAP!h$b36w#qmUI??G0W*h)O0-<;nS+a=bwLI|GpT2qHF5;Y?%&05T*lssI20 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc index 773319f4288506c2afc8311e72382a7b490dc779..516bcf99d0aa51d7a088df4b8a1044569711c816 100644 GIT binary patch delta 1195 zcmZ{iUuaWT7{KpIZj#%iX`3cBno<_FrhPClauSsl6&j9 zH;&Y3i=vi3sO3X^kl77HMF*qgMIU9;vDQ5ZB9f}=%uHqvE8oz(k{mWNr6ScWGr1#M$|#m* z=*a^ar9fGHD5GR)v78(o9Zqt=7|tuYYK$=>Pcv3^qj=9p6nND<>3kANf!cE1DMUYm z=Ph@nQ$!Fh3t0jed)G+E1V+k^3W1@ILU1?WCn6}VLHHyQf|r37BEjB7WM|fSo5$cs zgtEi(ugHQ>5%S`yT>o25tMYBfio_!5iHS)77J2%Y0k2Qg9a+Z-ky~2rl7DjjPpxe} zX*D_@hEzBh5bL!ot^zv$EEOPaId?Ojqw<`8GNwz1{Y?8zZ!+c;6?Sa zF>gHbC7uSuzlYXU%c1iPWCEmElu+o3>HKys#kz?KKgTu^4gQYh{1|O6@uqnSFFfk& zsLr?VbCM(QtYef1ecIXPR=5jeu&eVBX{+Aq{Ls;$am^mt!@h!tiC&)6(RGlluTFH$ zN<8=T?icPO7^1O+nc{DStshY)h;>lT{Iy;EQ3B&+m zJ>qjj0g*sVB4!a^bJW~9gB2A^Zebfx$2*q@Np`hDxs*_o|#OV(WC4rYA}6G z(v7rf8H}=XsKXgq8IGrRlWo;sQybmkIn;D;$PMpxMZw<}4ck*z_})MN(BD3N743DUeGj;(>@3H-#=~Wc zn*V0AXP)wEy0xmn!Zp#Z^n>+Bfdpo5c{4(b~7b}2fMv`4R*=bxV`30r*kE%#ArIroEU)nQ}YxIRn>I0 x=HQQ4tj-KdM8+%-#O=G{?Y!* z7lD9}W8c?bKG6LZ2FDfX3%l-IzhxYv#UU*bcrN;vK!1X{xIab^J2h7iPBLLgU( zga^Gv5>?k77J(n(Mu_c)ee>jCMM>efJFb#NB}g`e$qbko4zgsQ;4xe(+29WE4Qv0r7ox1pNFw)5&eh;go!wY*v(MnQzjiq+KM=>!^7x3f>03i zF;1kKl`{X=sY4bRnfEc-h|IpOyu` z+vWUKEHEWH2UCd}p3Y>&t`S?a{#J9w9ra}m`=5Xt7d_5SzW)}X*RY&(&R5XFBzm1e z;b|g-3#YxQoyTEfdCwdbJ$n&(gma(g(Yg$gjtkzPx8~bIc+l~bcP1EzgPo1aP3AB9 z;_=jwJw&y5oVqaq-&3(nH`D2?kuJK}z3GM5odQwtdC&-=4si=ni;x&5g^mGJ9n!TG T^gg&&j?CE46ZtELbb|f>c8?Q| diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc index baefd6fccf37d1b64ad5e1c0172e9121d3a5a237..c21780d84c66f5f06700997cbc80d926a1e9be86 100644 GIT binary patch delta 99 zcmeBGTB^iznwOW00SIgv8PhlN__2CS&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t0c6G%qg~0}$9UGNwP;$m_)9(XSs`oLW?@pOTbVo|=`Y?~&w BBBB5Q delta 76 zcmca$vcrV;G%qg~0}uq?|CV-VBd-&aLAictacWVqes*F}VxC@7Mq){3qP|ONadt_5 dfqnr{COC=ISaedP%QZ;_DLIY+dh?CHLpnQwMx zc4jvQzf&83Y-n&JzD6-#>K*SgD*mP>-#upJTJ7xBUNw+=TxcO&w;sZ%pT7PO0c zPKzXr%*wJ}u*}FAvXarPtWk(eXSBRd!|{wp^yN}yd^{21f|1B+g+*hM8aX{fVi|b~`33vD8=A);nK!-x=G)x6gh#wuQeq`)P6~mimeP?0QRl(0-ha%I8JY zp|TI->`p-Oe#F%cR2EEJLagF#3E?uzf$RU) zZA666#GHerr1s{!xX!|%vOq+F+R=Lgdk|>L3T5%GSZAk^DkW(LS7;lD-y9rNsp>W@ zjauf#thGds1F3STD)V_mBj)_OQB|rJ-47g8UR4$hQks7|o7YW=>tViVlwJ39zcIzt zE9j3#c zt(UJ}x+?Aa0ykH$t$wn&X>GlE&llT~V|0Z5ptNm&?yU%TfSJCDsi&cqrvQQ+s$$V7 zQh1HD6QB!h%1o)KpP|&C_Jyd28&&1eRjSU6mRZsXJq^4&Xa80-y@=~Q>^O$n@{ND#ETH!eL>5w9EP8O$c{&m?IzX3o`+D-XXw%4tVg-Z zaNw8_{eWE$&bm~bRAt)FYQg8$h9Q(>2e{lwvKedEv}k`gUMS7c*EmOQ2ks5B7XSug zTkV7g{#R483nfc8=fdT1(kSTmv4g<5nVHEc-7FdfQ$J)N>Azv1(92EFOlZYowy^kE zR=Ybe)_Q*EjjFKUkM)k)Zv|d8Jpll1q0kBn7o@KMi~!gVyb&aTCjOhhBBnQw_xT;e z51Ya@2j6Q>}eoF+8FuC<__ewxm)z1D%IxPasMPh@X)DgOWtVI403 delta 2357 zcma)7Uu;uV7(eIU-rL@;>vq?I>*z=qSfCEqZ7pm%FpNzEBOUTbSpjF)bH@s`9p{$K zE?vq4CexTWa!m$7!xDTLAtopf@+ca8@da!mOCQw42j#_-jSw?q^!skh#z_5hn*Ppr z&+q%r@7(Wv=iJZzGab%vtE=q<+QAR0wk@Km+$PqyKev0^xWy|O&|8o(o4HP z?wzAoc3%wVjrXm`Z1WA97l>3HGJdnZBx2uf`+j{0a_<-T)6nq%fGz;|d_0H)ej}iS z*UDgugwRDh#eK>OI?WKpIInmjOt^;r(2hYrX_*wV7Dkw*fiUS*C(K~YTC&0f@RI@) zCoNgaNtolw#^jZGnAHRHNy*sb@a86An+1}#J_^VZrevi{Sc+){>j^C# zO{aOm*#j6KI+HFr_~laiTOiQfgMu=YVwu6=#&|+2h+|MCGJu}uI&Ou}Y&>X8*qd^n z!N6H^-$`oS^RB0gHc@GqulHWIU$oDL=G1(B%R76gdZ*n*2XWL)@o75MIX(Pcm3Q8? z_JaHTb5niub)Ko-qD<=6%y`awE`(;)yt-j_*By1!UA6U&+B!F$S39TVqAV-*^RBHQ zbb?FQ-0r!q+fAXoYwO_k6F1Xe4CGz?w;lbzKWHSi4GV<@j}AFYxqMG%qg~0}$9UGNy0jdBx<>qaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJ9dj8o0L};+$p8QV diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py index 3e83e308..fbb4ecc8 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -125,21 +125,21 @@ def build_response( else: # Wrap the response file with a wrapper that will cache the # response when the stream has been consumed. - response._fp = CallbackFileWrapper( # type: ignore[attr-defined] - response._fp, # type: ignore[attr-defined] + response._fp = CallbackFileWrapper( # type: ignore[assignment] + response._fp, # type: ignore[arg-type] functools.partial( self.controller.cache_response, request, response ), ) if response.chunked: - super_update_chunk_length = response._update_chunk_length # type: ignore[attr-defined] + super_update_chunk_length = response._update_chunk_length def _update_chunk_length(self: HTTPResponse) -> None: super_update_chunk_length() if self.chunk_left == 0: - self._fp._close() # type: ignore[attr-defined] + self._fp._close() # type: ignore[union-attr] - response._update_chunk_length = types.MethodType( # type: ignore[attr-defined] + response._update_chunk_length = types.MethodType( # type: ignore[method-assign] _update_chunk_length, response ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc index 61dfd4f3a15d96a2b10897f3df4e671ffa63b93a..04f7aa7eddb4348b0f6074c61038ed71e85b6fb8 100644 GIT binary patch delta 98 zcmX@ge3zN$G%qg~0}$9UGNy0j;bHWcq90nET2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?M~SGBLWIk_N>ptwGy@%#ee;e&%q9#AvVUHX14}k^C03OrL0wQqUjiujH%_#;yX516KqYx>`VKx12^+0bwc&LJTA?WX(>Obm8vSK7bsMP5hb- zxIbtqNu?=L(kcekl(Q3Mg>c4s_Q>5TZe)MEk8RtGq2v%=Lg+^5LD&djx+}_OaXk?_GO9OjAq?tWWo%seOjb(SD?C6H_|&1497+OM$ej z3`_k8TM4X7KZtbPIsULEb!&EEmd&l&#bC!{0pO=d$NdNk1{e2l1?5E>-2)%fRh*?| zgXEkPozNlVIWJ2}m6&dFoTEL{&GC6-gylIg`M$YKr~gbvB(=3{VSXaU+K;84}$O>ouvO^dPH*+gw*r z@HTrdyrcWaV9&3S?47~8ouBtE_CAR0_-gONaP*dE!SiA4{m`mih`zS!6hgiCgFWn@ zaH0v;_ai%=)_Gl#-}Yfepagr+0dGI%L0b?80kBI*^Xjcm9(idB_0Z5WGg6yIT& zqnEZ~V{1NWdFIUwjyd1bbc}17V&!Wu!wmA_I)&Tzut;C-nJ4zja30oXKsVsbmQ-R)X)?vLV3l|nsUrvn5l#Xu z3bYUD3_|ul*v+oTHi&8VN$g!07iU>t{BepK*cv_2@z&yJVIYwfZ?a+{bq&==7aeQL z(1_ki&!LC&2p15F2vZ0WLL-tAE)j0Ps|Nt)g~v9#)APh9I@ei>D8{$`U^L6CiJjv1 zy+GycR?;b;t!c71BDbc<4x;+W@=UU~QtQ2w#3+ty^4uMEBl&H&ipC?j+uBitk&>-D zVa*|7wN$V88M~Y6c3>XtQ9Qx^NS)Y3a0|ZA1X7a#^|~Pg)33F&OUZ;=CJHgg5}R-B zYUXtWuZ@16X5X|XrN;UqT0cJ@6z`*)`-Nq$p!y|*7ZrR41qioUU)y@C=`-wH+sdnc zV47ZjWf!Yd;YH2aO*_!0w|<-RIQ4o#S+PCgoCV8!tk&KmV=^$??eMWCHjUIN1e}hV zcjV|3{yAIrWtwXP2tURfX)P cS3xSmtG~fk(n)vs4?_1ZLX!QS9^#YmF9~|!sQ>@~ delta 2174 zcmZuyTWl0n7@pak-JQL5x4XT&Y?l_w0%a>wgW)P|DTUaUiwKLj4m-1S=B)JUwqJ*U<_(-6oGhsFs68`;mQ9$L%T)XWWW8-|NrOw zx9^-iw&C*n(5JzmkAu(d8-M42iA{uR`Hv@B){XO=%*igzTkvIk1%JlR)^06O2xfvj zr-&o~c8?Y+gfby!6Say$I1>grB72VunTUhy=49V-PWE4PU;vKGR5D!vbU~$3@m&<| z>Z42_0(}MO{h*K98)9;$9EQWHMjfdr75K)O!*cZWS;0N~`@6Co+qyb-^z?R5ck?eh z+(FnvLi7vg&bAlQj~fax(t{F_imMI{NTw>KI~8Nl)Jy3SSoET#r3VyE(}#7U$+RHI zt_19lO@Aevcku7f5zpzSys9aho*VQvF8HLpmN;i1O>~pEbIno=+=8$SA%(CUp$Wip z7j;w3DTWA(xpT-O`jObeZ=U{DY~$UF(04Vx9Io;x#hflH2kA!NZ_TT5x1gzpNy1Dl zN#=kh9MRPx!H_9|tf2k=#R=SRIkWlVSTws8a_*3F1IlCSh+13)N{LSRd--;H)Bl-! zBY2V;`feZ*U%@sFDx+i_N{;-1fz!YYA-mgwc-H_djhz55a@Q)NCr3_u=aPj+67Bxg82m^`=ZT20-V;fY~7I_re>EGmBopnbuq&1pDf%0V!?<<1Th z)l^b0f*Ftw)VZFKv?0avC?h46COaDfH0!F1M!;`~v%H?)jzpB@ig;d87ZVnG^I zWR)1?5j@2MVo@q6_5iB!bT$Q?E1QhvvO`1PP{lS0vSdo66V?mLN9#72M}vD94R6rT z!)u?u8eDmsb9xg$M4HZZUTD75I@NkLvKFgPytn0AxbloRAx_3#4`Ka@Sr>TDp!+|6 zdbn^6w89(tIuM?5!tb3~AGolccgl`*f8?hQ>=d+y&51Dz3nf(uThMejb=EbvF_h1% zBX+kI%`pk?h-|jDPY-xoF6KkF)0@$Ttt`SmP^a8%5Vl`G zp1L1lp}iby7n;f$?xT;!9_nrdr4=wtxa7HlVh-ps!K-68u?wXg2-^^L159zG9c8>W zBsm8g==-t7d^PH&l&5e_2c5wZy7>?B+woTPkBm7SLadDTs~*F4O(Z3auq zX%||9u8bqja<(=%oM5u=(b?Ko{w?}R?S~HzqI);)Uq~rnh-^Oy_ud9eH0b%-gx65a zEV{f+Z`G}UHzinKNapY)cASio0x;hsROIQ|`Xs!lAJn&uV`aS%u{=@i%2>Fk?*Jpm z!Mh9sQj}eac*?z`AcsMh^89ZfHFVbz?&~Q0Ll6}$2yfC-L&9#UN>4Xj>Gy)t^5*dI z%nlKawKe6moFH3XeDaxzC1%XG6!(O|BWvne^vU8QO@=^yiB3PTl2r`V)Puq%ZUai} z(y`LL^QD8AG4Exf#HP<^gOpEITfS^IKV%LOC7UIf0ck@({#l}_jF`hjDiM4MEVnsY zQj3QPeJbvyWAUWhgPtNiA5V>Aodo~#Ni%{UfxVIJF0i1iNm#^x2zf_bU(n?tP1#7E z1uG9<1Gx;(8qfbFa(vVGT<9Cld!1{z!8QNP?YPcuy5$UC7m_~;Oa5>#idR>&~G%qg~0}$9UGNy0jnaJodT|cxqwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lAdmXV81UmIw2 z1H%V41`&zrmJ=KQA#yKO;3KC%-(uC?{p}Q${W}69b?T4GbUH7(^tdTTZl`Za2~Hvas?e21ZV$ i4(A&@0{xzyp4WL~F7n9C2)@dr_>mbXv008|CldhXn=F0+ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py index 1fd28013..e6e3a579 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -6,7 +6,8 @@ import hashlib import os from textwrap import dedent -from typing import IO, TYPE_CHECKING +from typing import IO, TYPE_CHECKING, Union +from pathlib import Path from pip._vendor.cachecontrol.cache import BaseCache, SeparateBodyBaseCache from pip._vendor.cachecontrol.controller import CacheController @@ -63,7 +64,7 @@ class _FileCacheMixin: def __init__( self, - directory: str, + directory: str | Path, forever: bool = False, filemode: int = 0o0600, dirmode: int = 0o0700, @@ -79,7 +80,7 @@ def __init__( """ NOTE: In order to use the FileCache you must have filelock installed. You can install it via pip: - pip install filelock + pip install cachecontrol[filecache] """ ) raise ImportError(notice) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py index 586b9f97..d7dd86e5 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py @@ -142,6 +142,11 @@ def _load_from_cache(self, request: PreparedRequest) -> HTTPResponse | None: """ Load a cached response, or return None if it's not available. """ + # We do not support caching of partial content: so if the request contains a + # Range header then we don't want to load anything from the cache. + if "Range" in request.headers: + return None + cache_url = request.url assert cache_url is not None cache_data = self.cache.get(cache_url) @@ -480,7 +485,7 @@ def update_cached_response( cached_response.headers.update( { k: v - for k, v in response.headers.items() # type: ignore[no-untyped-call] + for k, v in response.headers.items() if k.lower() not in excluded_headers } ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py index b9d72ca4..f6e5634e 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -68,7 +68,7 @@ def update_headers(self, response: HTTPResponse) -> dict[str, str]: if "expires" not in response.headers: date = parsedate(response.headers["date"]) - expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[misc] + expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[index,misc] headers["expires"] = datetime_to_header(expires) headers["cache-control"] = "public" return headers diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py index f9e967c3..a49487a1 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -32,13 +32,13 @@ def dumps( # also update the response with a new file handler to be # sure it acts as though it was never read. body = response.read(decode_content=False) - response._fp = io.BytesIO(body) # type: ignore[attr-defined] + response._fp = io.BytesIO(body) # type: ignore[assignment] response.length_remaining = len(body) data = { "response": { "body": body, # Empty bytestring if body is stored separately - "headers": {str(k): str(v) for k, v in response.headers.items()}, # type: ignore[no-untyped-call] + "headers": {str(k): str(v) for k, v in response.headers.items()}, "status": response.status, "version": response.version, "reason": str(response.reason), @@ -72,31 +72,14 @@ def loads( if not data: return None - # Determine what version of the serializer the data was serialized - # with - try: - ver, data = data.split(b",", 1) - except ValueError: - ver = b"cc=0" - - # Make sure that our "ver" is actually a version and isn't a false - # positive from a , being in the data stream. - if ver[:3] != b"cc=": - data = ver + data - ver = b"cc=0" - - # Get the version number out of the cc=N - verstr = ver.split(b"=", 1)[-1].decode("ascii") - - # Dispatch to the actual load method for the given version - try: - return getattr(self, f"_loads_v{verstr}")(request, data, body_file) # type: ignore[no-any-return] - - except AttributeError: - # This is a version we don't have a loads function for, so we'll - # just treat it as a miss and return None + # Previous versions of this library supported other serialization + # formats, but these have all been removed. + if not data.startswith(f"cc={self.serde_version},".encode()): return None + data = data[5:] + return self._loads_v4(request, data, body_file) + def prepare_response( self, request: PreparedRequest, @@ -149,49 +132,6 @@ def prepare_response( return HTTPResponse(body=body, preload_content=False, **cached["response"]) - def _loads_v0( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> None: - # The original legacy cache data. This doesn't contain enough - # information to construct everything we need, so we'll treat this as - # a miss. - return None - - def _loads_v1( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> HTTPResponse | None: - # The "v1" pickled cache format. This is no longer supported - # for security reasons, so we treat it as a miss. - return None - - def _loads_v2( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> HTTPResponse | None: - # The "v2" compressed base64 cache format. - # This has been removed due to age and poor size/performance - # characteristics, so we treat it as a miss. - return None - - def _loads_v3( - self, - request: PreparedRequest, - data: bytes, - body_file: IO[bytes] | None = None, - ) -> None: - # Due to Python 2 encoding issues, it's impossible to know for sure - # exactly how to load v3 entries, thus we'll treat these as a miss so - # that they get rewritten out as v4 entries. - return None - def _loads_v4( self, request: PreparedRequest, diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py index 8ce89cef..d321f1bc 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py @@ -1,4 +1,4 @@ from .core import contents, where __all__ = ["contents", "where"] -__version__ = "2023.07.22" +__version__ = "2024.07.04" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc index 3d6321e73956f452f67fc2099205c568b92fc9fa..3ae92eda51a24a0169dcd3cf3b99af7df3f0ba03 100644 GIT binary patch delta 107 zcmcb>^n!`!G%qg~0}$9UGNw=DNoP0FGceaPFqv3o=+U7cTAW%`te=vUSe}}dsPB@W zT$-DjS5mC+no^paSdy8aryrc0n3Gzh;Fz44lA2qo@8jd54`k%KWF_XM=LZz!XQd{W IOuStR0KW#Z>j0AQ>gn*aa+ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc index 520fcb7a8c9c75f02711d62b162f018ab09d4a1f..2e7a152f317b0513f3ea66cf84b3da3e2133628a 100644 GIT binary patch delta 98 zcmbQvx}KHiG%qg~0}$9UGNy0jS<2|qp&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{p|PsVKko%tI( diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc index 9dcfb07f1149f287b3a8e428185a6f74abaead93..20842c8902f8e5d34c6e513ed44131dfeca0ca06 100644 GIT binary patch delta 1704 zcmZ`(O>7%Q6rS4M;Si1cjufhp4HNAi)Z0wcXjeHnum+ zZj^?L1B#G1(P$9qp;Sfm67>>^6L8@U5;Tm{ERf;dpkeR z-}~Mhf0_9@*Zy5R9wRVbp|tp6a;-gEzeovLCyeNXQ5LFDod!0fhggQmtFkWHw5;Nt z*1?o_-X?_S;B>g6RKt3>8qp(^u#l<3j55iNT??@YL}=UhRq(atP)odeGb)QV1I8d= zTyL)?^u)gcwjBwmH39~NJM@mgCiNuPcqLU$>uE~tw4E#uHh-k)Ah{fTUDmtcNQ|{N zKJ`qLL<#F=3A>AR*cq0Dy%bE$CdSgMik{fdrt=7qt_G2OR$Qf3@jLCSk3#Hq;x&J- zEH&Mx!$5XM?(gqVvP|;yaz5m@8Iu!}7iQ;;$@w>Z)iCTECC@N6$S&U8TP?id+T1O$ ztLBnjHVadZwOF-lo?E!U7A?~&Ikm#vam%dOd|<*dnO$8jOixc0z;UL^X07O4;ZE7M zJaJJPe<=|Jw@l0Co?&@6IJO5)w-aE6JeCuWgp3zj6qcA*! z(2bBqz;0+wB?<2y7ZJ|EbjQUvO5wk?`%OJR(F12TDDTHRtwjlx2w)aAcTr#HxkPp= zH?paHyYwJ2v!%{J1)T6OG~8$5&+EN#Bro~0vtZW(0=|rb=M|pE@TU;^5QYGJnVFvH zV$%%Z2pXZm1Id^$-O~Wj1{!Hkee#?*dH2%8`0!@uPwDRUv9&Sr@?R2-_U{mYNAcmU zcw%_Z#hQKEaYouy#v)=z&WK+kH#MZ5SNxFU@?+uybufWFcPLXue5H<3Re&58%E6yU z_&+h;#m$ol`~89c5%AaWp0em&8$RcU;Q^E^FW>D)41+lqyaCBwb{j>*dWq%eiPxL& zCwMhMy&DA%iZ_7ak0G2u2#RwSJYVsa7i`xLgMr@WgW^f__^Yi<_tf)Mhb>m@aXtZ8 z@D;mJz-@_Ax)V~UysHt~_A`m^%9IXmt71IXt92{S-h5$~fY}}u#n_ORZ7hJ9AAwy6%9PE0^8rqYlW3l?Hc1UoH^5Hze*wP2_oY}Z->V^BAbMHBG z_B-D_?2X#j)%*{+T!z3}zVmnE+p(?uc=csU$TsnaO+4yJKD8;MYl=9hR_50)62fb6 zt@v_Fv6Yr;tCV<>n}VJ8RHii~FLgz+^<6&=er7}3El}RnMiq3ZkhP6g&d&X>Lgujw z*FV~PxCC7?RbmHyv@~rF? zSj8KIASNLFj90p%+PPi&<;RFrhD6M&;IuVqO7~yg?tUC^CM~pkpH8Q}O4}I&Mknzx3ce&d>_Wr6HHC^iz3)iEdV|5@Bv|Zm?WxgMD z1MYhkYky$*P4T7lN>S~uGR}Af>J(vzC&gFF3GJ7{#Ev$>OX44;o5I21S@E%2n?rIu z2N3I=xt@e)EABU(KGdhICW6L2)e_v%ZhF=|RY(JGzzv4ZXKr{GYBJz5HQ zm^SbM_ULAc6RG8;QQ|V;Ivh-u8(?DX5{sOqWFC&ZfG~!zmtE3m0&@@yXT_nk^{CtP znfZk(++U*!u_wR9ev+onf-}ILdgSNA_)hKEb>qA4?ZVQIwgj5pO;6LB$ZKD0jzfwm z$4by)?c_&e1!V)yIH!CH0cVjP1&9^Tjoc82;1I4v%^?p|=>qI<2B1g&GDyDk>6Ccx z^E0<|(|tnqgV!rRmG^HS-#RW{yD!7}K3=MSA_`0Y#z+QKjin&u2gL9C^96jWM`AR@ z(abC@2@v2M3c#O1ctW~S`|B8d7Ge0VAE}q4#`LRk3dXZpkIa2>+Ht&~?l>^98=-iR zIr7G6wt4bC_-4aL!pTcSeE-}1_VrhM*Nn2!Pq~%0MnlpQ^uBpz5WZ0P9p07 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem b/env/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem index 02123695..a6581589 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem +++ b/env/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem @@ -245,34 +245,6 @@ mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK 4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - # Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Label: "XRamp Global CA Root" @@ -881,49 +853,6 @@ Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH WD9f -----END CERTIFICATE----- -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - # Issuer: CN=Izenpe.com O=IZENPE S.A. # Subject: CN=Izenpe.com O=IZENPE S.A. # Label: "Izenpe.com" @@ -3556,46 +3485,6 @@ DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- -# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Label: "GLOBALTRUST 2020" -# Serial: 109160994242082918454945253 -# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 -# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 -# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG -A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw -FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx -MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u -aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b -RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z -YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 -QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw -yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ -BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ -SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH -r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 -4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me -dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw -q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 -nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu -H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA -VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC -XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd -6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf -+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi -kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 -wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB -TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C -MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn -4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I -aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy -qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== ------END CERTIFICATE----- - # Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Label: "ANF Secure Server Root CA" @@ -4633,3 +4522,277 @@ o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== -----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G3" +# Serial: 576386314500428537169965010905813481816650257167 +# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 +# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 +# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM +BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe +Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw +IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU +cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS +T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK +AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 +nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep +qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA +yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs +hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX +zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv +kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT +f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA +uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih +MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 +wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 +XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 +JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j +ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV +VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx +xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on +AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d +7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj +gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV ++Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo +FGWsJwt0ivKH +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G4" +# Serial: 451799571007117016466790293371524403291602933463 +# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb +# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a +# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw +WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y +MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD +VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz +dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx +s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw +LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD +pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE +AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR +UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj +/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Label: "CommScope Public Trust ECC Root-01" +# Serial: 385011430473757362783587124273108818652468453534 +# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16 +# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d +# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa +Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C +flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE +hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq +hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg +2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS +Um9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Label: "CommScope Public Trust ECC Root-02" +# Serial: 234015080301808452132356021271193974922492992893 +# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2 +# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5 +# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa +Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL +j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU +v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq +hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n +ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV +mkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Label: "CommScope Public Trust RSA Root-01" +# Serial: 354030733275608256394402989253558293562031411421 +# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8 +# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93 +# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1 +NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk +YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh +suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al +DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj +WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl +P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547 +KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p +UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/ +kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO +Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB +Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U +CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ +KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ +nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+ +QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v +trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a +aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD +j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4 +Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w +lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn +YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc +icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Label: "CommScope Public Trust RSA Root-02" +# Serial: 480062499834624527752716769107743131258796508494 +# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa +# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae +# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2 +NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE +NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0 +kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C +rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz +hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2 +LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs +n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku +FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5 +kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3 +wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v +wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs +5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ +KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3 ++VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme +APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq +pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT +6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF +sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt +PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d +lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670 +v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O +rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS ECC Root 2020" +# Serial: 72082518505882327255703894282316633856 +# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd +# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec +# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw +CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH +bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw +MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx +JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE +AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O +tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP +f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA +MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di +z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn +27iQ7t0l +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS RSA Root 2023" +# Serial: 44676229530606711399881795178081572759 +# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 +# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 +# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj +MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 +eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy +MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC +REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG +A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 +cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV +cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA +U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 +Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug +BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy +8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J +co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg +8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 +rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 +mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg ++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX +gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ +pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm +9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw +M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd +GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ +CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t +xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ +w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK +L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj +X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q +ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm +dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" +# Serial: 65916896770016886708751106294915943533 +# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 +# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 +# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/core.py b/env/lib/python3.12/site-packages/pip/_vendor/certifi/core.py index c3e54660..70e0c3bd 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/certifi/core.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/certifi/core.py @@ -5,6 +5,10 @@ This module returns the installation location of cacert.pem or its contents. """ import sys +import atexit + +def exit_cacert_ctx() -> None: + _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] if sys.version_info >= (3, 11): @@ -35,6 +39,7 @@ def where() -> str: # we will also store that at the global level as well. _CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem")) _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) return _CACERT_PATH @@ -70,6 +75,7 @@ def where() -> str: # we will also store that at the global level as well. _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem") _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) return _CACERT_PATH diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py deleted file mode 100644 index fe581623..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py +++ /dev/null @@ -1,115 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Union - -from .charsetgroupprober import CharSetGroupProber -from .charsetprober import CharSetProber -from .enums import InputState -from .resultdict import ResultDict -from .universaldetector import UniversalDetector -from .version import VERSION, __version__ - -__all__ = ["UniversalDetector", "detect", "detect_all", "__version__", "VERSION"] - - -def detect( - byte_str: Union[bytes, bytearray], should_rename_legacy: bool = False -) -> ResultDict: - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - :type should_rename_legacy: ``bool`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError( - f"Expected object of type bytes or bytearray, got: {type(byte_str)}" - ) - byte_str = bytearray(byte_str) - detector = UniversalDetector(should_rename_legacy=should_rename_legacy) - detector.feed(byte_str) - return detector.close() - - -def detect_all( - byte_str: Union[bytes, bytearray], - ignore_threshold: bool = False, - should_rename_legacy: bool = False, -) -> List[ResultDict]: - """ - Detect all the possible encodings of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - :param ignore_threshold: Include encodings that are below - ``UniversalDetector.MINIMUM_THRESHOLD`` - in results. - :type ignore_threshold: ``bool`` - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - :type should_rename_legacy: ``bool`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError( - f"Expected object of type bytes or bytearray, got: {type(byte_str)}" - ) - byte_str = bytearray(byte_str) - - detector = UniversalDetector(should_rename_legacy=should_rename_legacy) - detector.feed(byte_str) - detector.close() - - if detector.input_state == InputState.HIGH_BYTE: - results: List[ResultDict] = [] - probers: List[CharSetProber] = [] - for prober in detector.charset_probers: - if isinstance(prober, CharSetGroupProber): - probers.extend(p for p in prober.probers) - else: - probers.append(prober) - for prober in probers: - if ignore_threshold or prober.get_confidence() > detector.MINIMUM_THRESHOLD: - charset_name = prober.charset_name or "" - lower_charset_name = charset_name.lower() - # Use Windows encoding name instead of ISO-8859 if we saw any - # extra Windows-specific bytes - if lower_charset_name.startswith("iso-8859") and detector.has_win_bytes: - charset_name = detector.ISO_WIN_MAP.get( - lower_charset_name, charset_name - ) - # Rename legacy encodings with superset encodings if asked - if should_rename_legacy: - charset_name = detector.LEGACY_MAP.get( - charset_name.lower(), charset_name - ) - results.append( - { - "encoding": charset_name, - "confidence": prober.get_confidence(), - "language": prober.language, - } - ) - if len(results) > 0: - return sorted(results, key=lambda result: -result["confidence"]) - - return [detector.result] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index de029cd9390c13bc79fbbb6433db9a42b0e884bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4586 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc deleted file mode 100644 index b7569dbcdb8b92067c1b99e3c003f7e8dc28de4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3896 zcmb_f-ESOM6~8n4;mPjWh6FEemeeChiL)f$m0Lbaii(005R@8ZrxJ1>M&p^g_BgXM zn>%-%*ma~lq9pXc7h7V!i zz}ir>?w$gD3Ur~Ny9LliUh1xj53*0YIv0o6v(@4F^l_y2?*OG>;<;uOpP`4uw^c)|s4+mv3D z*UXzxcbLIhv4dqEL1T14+>#wZaTw6H*%Exs3)@kb(+&tyS2lpAsFifVO&h-#`?4T9 zfd0c;l}U6lY~WaO!6Qj7wQ;pA!|Bu|R|`te!p&>*Hxm(8VS@*mk;0Hj1tSPSK9egj zoc!ruTxkw>|T&_;Kl7%-2DBcsxQcinnpe*Wk4sb`abA8_pd z@+o5E_hWxlm3g>Km5cl3*|%npDaU06$gv}~B~I&$yq?y!auUDm_-!N^dG@%tl*??0 zut`yfkSqckP={&@fkVXvHN_h1Q8Ug9F54oQbGi*!HM9&y`tAQ6!xr1rHkqXkXmDvo ztyw*4)#H`ltjMq|pYMINQf#xDMEGw{^+_K_4onj}4zQko!kFyc?8-kn?5fsz>a-;rw#6?uU zg&q;qmQd`TUBAwwTQY3bTQ~^=+pn*1-w*GE!guRDSgZTqQoXeaWH>$}@`1D7{^H ztMKd6K7=u+mpoXIGgPY8Kx{FIF?m*dNtNzUsIA`aI(wqcRWmA30^cD_P!2uOL>W^= zDojCnA;vIlj1MqVh31EJn{w_xJ7CO*#<+M6o3Z8$E{vZ-0Sbey;?mK_)rfUdjrWk| zgDjEh2MSy56+vIltxLfDyeg62y%Th0lrCM32g+-())Qo8iF*SXzo~D4x|ccOUQTIA zG#+RHo9wPOsNCKB#xSC-TL*3E#jkJe0;>+q#YM-rqsWr<>7lAM9!ZNa*^EocjRp!Z z6me1IboV}GP&F@#m{b}Z$chr}0SBvQRceTHpyPrnd?he0s7|27MFf>z?kaWSLcs4z zOPy?-8<0W$;~U_M{(#{=+sm`^*{wHz^Ty+Iow52etuyw*!@_QHbf;M96f1w++?kl^ zOw7DroY|c`|M2<;rHS3ii+{QN=gZr*S2~kFc(>4*d{u3KJoenq*oDs6g?F-lD?TYc zo9kSf?TpR7yV@E11q4#80Lp4)X_6L zqZ6IciEU#-W%QxqqbgCwcNWA+>Ab*11;3jEt|zV+s#@BH8J8$Ld&+vw`zo6vC7>0%n216y~>_RBuF zk4Miaa92B{7q^Xz%DGitoWhN{>WDalIWAcAT5S9D>MB{*?Y8ZAUt~j;<%W)B391Y+ zP6IX6ID?N|aesKeDH5 zxv59zzrf+teg+$#(?$Y;6r)E_#Nx7}0($VZh_7y`jEr+UXg8yzg(%410!!bFFOBaf ozIsJ`7Y9^B5!KILM$@zq8@Wmo^nCjOIuNt^nDVNksP1&spGR{#J2 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc deleted file mode 100644 index 9c16e0612c6b509910e4f645873fb4b19f38ddac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 807 zcmZuvzfTlF6rR~%w|8)$gu8eol4w+Ng-n#jg4i60#z;(n!fPhO&cJS%n_Xw;FxOaV zrHvJ5M{Bh3|FAMNmuZNxvLit$sGQk7Of*iiZ@>4w_h#Sw_I;_>Yrve1 z+u;vOwH;mGeD-t|cOI^G9zR-N)Ba{ZiShG3;blZxCAFIfrKd3_LZs#sNh)%a=;lg(0H-DaoWDd{Ig>fsBa(>4 z?bsv{w8HW|m1Zb2kyH?lV#ay;B9)vXCiW3ewox`vaVnM;@7zUsqS)<>M0=*a9A!y{ z@IDhXmB@}lnL<&aNik)w)P!11vVp9aCJJMBDz_@W2BXH@aOuz;-g}3S!W*Mz>nLpf z!(F*Lj1HHE@%!ncaA7oc`Au~+(|B8#jf?9Zn9cB&8Je%R10ASAW`2saOHn8z{fk8H z*;eGN^^5AJLFeIeDeHYXXIyBW{FX5%E`;zHEPQh>{i*@~+D|X=n}@B>H_w0pCo^FF K`d4qRxaT(^N88%~ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc deleted file mode 100644 index 43d391f812893b2eec960f0de8d192493bcecbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1414 zcmah}&2QX96o2Ejy-vFMAhgK_E>WshSQRm}J+uOqLQ)~oCRD6?@nz(-Cs`AJF*94( zD2E&(v5}}aq4ZyGNx69E!Rpi8%2k~Jv@Go zwJ`8W1ilejeb^+CvET4(%!~-LHjSvZZyt@Tefzc49Fx}j@E!4;7PxkKPRAXlQQDlz zF3&<$V6{|m^$q$+ej6Z5OCn$>h0;t87vG+F}>J zo~iWz?bS^JJw$)QbxKQg3&u-_(m0DHrCj;v%1t>DYWS&0xk|pg5RJ8o2C7dxXlijL zm~@TO6fD^+Cnyb*KnO~OfmTan z6jq8JZ(!`5^J9%!sVcmP8u0;=7klvBnL4Qd<}{xt|;^7F>i#gF>t57VbMT>j+g zrQ3b;nX~-6)A(`nVDeF8fHv?(UzI@jRe^R0J>nW0rKN*DfhUB|qFAWbE%7;|WkV&4 zV9_i{*-mpjyK&7GWu~TJ5B{8)=WiqT|6%RBIcGt}=kYdQP#(qtJ4ujjbrHKaA*rOE zx?Tlb&;eb8PoQ+eolvu(@};z#q%_T=Zld@GrQdXeWT??_mkz>@{gl13hVPj-RVMEu zDW^s=5n_)ibqRk<1yuRn*1&K_T~%aRDQ+Qou@7g4ZCyB-1$+9$AlAa;@E^c!P^$zd z_K0gfzNl19tvbcKO3!+D+?&bLs%mvs1h(bHefr0r2VhV#S~G^LGF zfp0;*jbXwXYSkTG#7pPnAvm}AWt6Gv#1fK|8X@HD29O)aaP=6j9mDdeJwuwm&b@aA Ixa(YB0ah+jH2?qr diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc deleted file mode 100644 index e8013b985ca2b6b631bb82e88c63ff386d748b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3014 zcmbVOOK;mo5MJs@(UL4F?h|RdNSY!##6puIK#iiPEYUU{nKCT7Xmp`zac#4vNM%Vm zkWVs@9}u7g(qpeh{y_gjFUd{dr3HHO&5n&4NS`y5WXF!{CMCd+v%}ffe6utAQz|79 zcxpfYw)RbokYBMedZI(&;9C$L5rZ^{As8V`XoVV~R=5!sNQlf5Bm96Ek;kEdbt4k! zqM(bh@Z<1M8x6E^(26W{tc?ZQ1Zbt>{_#LJ2D;?2P7HJ@(4~)ciSBqlv(2TVWl?91 zdK-+&cBkcnqn$kPohQp_5S-0u5 zrQ3lCy>96CG0W1CxyyShbTORVWRoHk(-tBjiVWH1^>R(5ekyC|voxG!p&t+$w_`I4r! z9HV2QoYb^?9o-uKiEEnSG|^;nc}doawUVOv3At7piF3;AoHl*8F8@FdU|jONRakam zDTPg)qu+o6Q!kX6yXiUYLL2@#wr&+Rm}NQl9c~!~W^WZNbG6X!g7@uPlONwKxTeQ$ z42f|IZL?j_wwP@=yf9=9Isw6x?JkE`acx^DwKAp4*(@G^eO?P1b74!eT|4QRK3JX{4(!70XIp zsj9__FU}Vii)iV`?o^lLqUy(C0If8C#}5}P6+b@gkDZ_nt)F?7#c|lgL~B@k_nAek$9W>8EqO*}jzSmHKJ=D$=OKAd|h zUH)$CsdR0pG?)a3Jw^2EoW|rLcUDb%eQ+LUUzNP$^Vo*&?EEu$!VH|jb6H4~<+@y| zE9$H-&QzDxvZmDim|CrC3-VbnUPUh=T!Z&a_-Atv`QsV%TzY3_;1x9e|6W*y7P!pmMsrF(KenF2WR z3YwnsN*EOQ9NY%DI4Lj@%3ESBWW*mt9tWKuDM(#0pYU@vcCW+iCaaj6%rZ9|$JqYr zVy{`pmRQPkiuq1&LI$C04rWY<$)E;6LD({#j!PXIN*9)kAi%+o0jY1WR&9}_jBva)4)nQ>AZdIWv@)WY*vEqE+(-a*^7}(HV9ueKX&ek5mkA% zSXaK3eQ{Z>D0k$_T|YMbii_16BrNzh*0gljZ80b_h95R&xAs4k8yEH~YF zUi7o2Q52L09CWvTyf}~3}f6lr0%sKa*^WEb=c|1-6ZTPEyCw}E6YxI<)t@=vVB_o7wPj)3!PTm&qd5Sdhy*-R{@*{)?^@->HaPV<}{kFjB@US`=* z%79RPHY+DHW5a4pr9-j!crrr+R;}_8ovDU~wKy}{DAX>L4i9t!Z9>q1l- z9+HM41A~{e>dJ{LBqdQ!CQ*ybMXi*d z&>gV(03iuZwoqQS%6x*K#g*-jCu*17`rLlU9j%~(Y^4tBtcQaM3tS=pWJ5&MwT&li z;<@3J2lhMe@X<=yNxig+?nzis3UI0uyzBzb-dXY~7xfL3fJdtuRN`B%I`@002yJ9M zsfb$`;*>%aF($UevoaNx_&80|7BMzC$+F-MF_C4WOjR0J;lf3lfn6|B4(ZZ98K;bn zPKz|ABvaEOqw(xmCYg(krl?4jcx;l2a9kNrCR9Th?ev47qno3ex%w|M2tBXp? zG@~XH)1o>~6*z5vs9Wc1t`r1>lrW;f&Zs)YGU2#o)BU5rFcjB+0o0#!_la6!&RJ&2 zXTYD~e#1S%K!nDTF)~A>l7tyDVK+FNdsQ%3yZJi@ve;!f$(y^%xUt3YWk z?A*9j_^|(SKkj81f13Sbz~IQ>*^yBAyk?gaL~G5)AX8O9YhIzLgs!jVkfeAjrYMr6U^0s0?eA^` zuPKx%!Rs*=%XE*9$JAsjI6#%_YIZUR)+_i-1jlJAmHi~kQgV=HZU$4y(ct8?I-bq+ zb|2{pDoK@gO~&HaK_4YJnVbwtH^KTW3!>s+MG)Wy5DVUv?#XFZ1E0>-Z->Bc^Og?- zTlpt+-`*zA1A-T*)7^)ap zmB2$^VdU!#63Y@E2?z{7GI~yN{0pjN98VdCY|$ zbGm&nplJ#o6m@en_eOS0nOK_U8h6;WnH|Ej2p6}>U%Yz@-nP8AZAoZ*YsDC1BA_1L zIy;EMHz_8V7_&>Vnyeu_vq_=$ytjQxXn%u3=+E!FDF)@+Fu*?)N!IY#)AN7L`JVpk z^cbAb8+#Xq9cosNQ57IFlfWV+PILYpH@J1f6%e8z2Hhsb+J-`H*K%#wthyu||MDnw zy5^cNI;{c}t8Dio#t9Du*uX)SLH6E)=V~{<1NU#hwa!>4VE^`}aCfVKQ_7(-f5u|w z*e!mBS4(*{Q7U)Jd#`uGja-2&w@TYo@0{&1sjn{8iAxzkyG9ghkrEq8zx)q*rlXFJK&28o4!~oRm$?Ve9=0A z7527fVj1i#m3VN=2rb(h>?jo#|4n%#3~;?$Iy>P-B4xVRyzN z8V@o}Me)DJ2Kw*`O66S5j+{X<;;8Z*I>?kg z^)HFn(LUQ>Y;1n`@xsS1Nu{TK-chU-3$-1~wH-y@fug^&;P1`*d%x^o@gJLa7x((V zI9X`z%eVF|@9isg9GVZU`raw}>I%NjWnbr`{=Bd2nXgk%!h`wRgO6^k)E<7`-cx9Q zFW>&&1O9UtK=s4iLTWycw{#a;j^|sB&ky|UVzKL3p(~Q_ zimY^9nIBm7y<6-)Ug$oP?>>X8gT)5_!}k~7U-h-UXatqltYF1j3#szm%gyDMgnB*U z0~Us^4MWif)gA&dRC`WIN@wM%6wcj}bYm)(+Tc`3lAMi862th{_;4gVs8==m)1(Pd z>OkeBPBVNOG%LUeI|MU^ZqjUtR5qqEta2Ey6A)_@&4ELVvDma;(y^1s^K2Asaj3r} z34j{WQ^)8t##@M$FvAXkT=^+<-`*iFEWAxvbCY8OT%qqmzVE^dQfaGM46otv$B|b! zyb>#H9c$IZUb$xBZ0!%m7nOzdO9In%t4Un5Z_GL#bT0NTbRoN=#O_$LbG8$UwsoMM zShH8#_CL6`*!L)~)Y_YGJi11J@Vf)AanP?=*D@T~quJHzNr+?pa*P}BY&>yBiO3M} zwCat&vKX^wtYb}~*=S}et>`zer<73u+o%$Us@w%T^io?du=T=P|L$XA=z#UZcfv`- ztsk&3ED<&pbkCZVwr4D=TcURVBr%I-KXjgpfQ1QDpzvDbi z>2^@VUA#X>|DR$0QhTgY@$9wVa_`qsW2v(Hwfb1S?$ZwFe!X665XydlDSIPR_NG|F z7o+TsS@;aQbFX(px$~FWJzpwcZhjoE2Nm6|z4Do!HqQ6Kp9H1W+HnlM?{cp%HBY7Z zQt_AKcPq}lo`1LEEO(xA@2iydI`Z_%)TlMbn)C*(MQ_xbv{tQ+edlOqPo{(H$+>odvrT`Md`%@kAdJdJP|@4}(w%Qt%k|xcTiv#noAvfTcpc zFV+=6jD@K_nM&m289gg-bvCi07d@Foc4J$VV=}opPuUNKiA*i8=5ROQ2_nW zNdk_+$3{=$$V9Iyh_R?Dr}m zEnm5!cX`V%#cim0o4no#7d(B?~us;PD5XK$BAI6VVC zIXPeQ1pD&3FRyU?sL(#J>E+Ex(RDMI*ArP&EpJ9lwVdo~FSaGw3taZjV1>WH)#wY{ zJiMzY*67*wl|mj~s1;rGO+o0^bg^bS8jM7XHKUQp6rKHgbUHpUTC9Qh2+?9ATr?hx z#BYsG#-qXETci0V7`eGuT%NFACqTf0s!=ye7(plOq^xkAGFqs@nb>BV~ z9s|}`Fuof|hkY!~f_*F`#TpC7cgG&0WB;POrJu_0D}kAUo-YKJ6Zu58Zy`nRDG?aa z3(IS{)xavX@L z5LivG2I7zOtd`3M;C+pzuLbl%var&(`uKOxz)DVA&*+2s^VB=Mb}x)KD2h>q5c=&$ z1zq{Oa?Eg@@TxCe#u#$fs#}VWC{0*tGO7Tz949TOam#6rdi!{LZh)K{#^;7P8VQq; zSv)e!(Y!|HAK>{19A!30W)o*N88TEQs7|Q=QD`%*zTpkCyf(eoP_M5|uMC~NNX}ly zXD=HJ4UCh4NjxygQTQGSCviB*k^YeA8(809$f#DHqHEyoDVhXt&`3*Iy$6=Cngk0p z+~QJ@pD4{(X*S$662qmmeM4H$;?}bgfA<6F9>CoL5?{TE$Y2-`h9xnL;)p~v9ML4R zgbIi(Zs5fY$qcDMRrW*b6oe8|XCM@4xW%Km+(s<~;ZbT^iKi2LIwk(*TiH8xo}Bz1 zpZs3p!K<=2hOQympF~q;|2DdhNO%E<7r506e(J!F*YYDU^&@)S-^pJ81=;&U5Rr>x z_~Mu(m>V&`=7upoaN`FzKIY~S_8gMC>f98@ff$=OObn7d@sw<>N6VMLllDOpkXYnkx}(F#67Ccfdv|7 zd2M>Hq26D&pCs+wxV_t8sOLx0Gl+WzIU2e}h9Y<v+*a>{3t)HI4bxM?Ibiyfy#ECTmlB0X1e&s9UFkzaU*kX_-|QAhKCC4KYK*EglxxL0o;% zsD;QpO6O_P(StjBBo165eL>t8lz0S%5ed!U(2Qi}k%q`z8qcLA!y|i+m!C^!R2@@g zf1JieV;NUt5DPTi;wO*4Z+N!1w>|+@XV5A9-v2v zq@UvSQ^{ z!e=f?JTQ*Pl?i-hLK0zg50R+^o=QkYL#v1+*Ku-PG8(w2$r0F=9KqOxiVD;?z?^Fb6fIzpPwR8)RrCWe3-2!Ck7N8Gxi?Stji&|{D1<2AZK$dO+vUCfOrCWe3-J+<3 zZgGo~Zh^(FTO3=u#j&}xZjNnBD;U1COE|h@2!?OEXE^;#GB40g*z_+@1U5Z1(h^mF z21`_30t+((p|%^J0wxr1~>=9lsOvSi?iNWEoI5WGPnEe=Nx zG0PlPc{*l}D=Rd7j9tyZpI140%&6nN6TRa3C$Q~Uz%RItW{`Lcic1!#{LA4wdWeYj z2y2fd^B9dn5RYjdY2eUsi_fY}Kg{g2YExiy0R?7fAkpVh+{NQ}4Z-|`9w2f*hwtYk zlSiA7vOEoddWJ??uF(@KwOmv0fCUV*!GMO0l_>`Dfn?MlY68CfI8HjNdGO=AUP(^$bcDH)&7jLdofu`x~7 zIyS?VP1ZUJY(^%qEoXwU6{28lkqO2jGGX~JvNvF%8r!KHzHDi1+g7uwv7Pj2SVCi6 zR29wBSrs7ASZFPc1!QR~AWLHbSsDxILye_u35}%|o5ljNG!~Ghv4AX%1q2$))T{!4)9;-F;A!Zntiz}zs0%Q}Gx3`#bH`-TjGL-eZ&8IIy%dN$-E_}MUp zXH$|{r4k|g1@r<+w7^Rg8fkGTQ8pu2S9Wf%1rHu;y9sP=H-T;2O)xQZmwtibqwk|M z66biqJVehSCi_`lSRBss%wpG5nALtdPK3dUBPg0Yo=U>r(7SR6_KEVKlg bl*4^i3D9pxW(l<0O5oq{^(asOJFoIzw^#2O diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc deleted file mode 100644 index 89eb880b62aa4d1c06a7f9f534e2fbad1300a5e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4401 zcmbUkTWk~A^^Wav#<7!ef?4MQi6MkySmNdZba`i!ERPZg5@%akyB$qDlf=dzyLZN0 zVi^{#sG3Nu2vt{MrPVfH6^KgRewF>Gl>I~MPX^OE9R+QqZa?^o8faJh)1G_BV;lpe z<;uQu9`~Gk?!D)pbMBw&>S__Rv9JF*`4b+YzY)Z0Yzf%F04yL0NlX%@m?*;_$tKy8 zwv;_;r?4aGNU>3t!feu+s)^R5xF|<)XVR6bjn-1QCh1Ojq8H z18FI)OpR%xCJ&3T>9`^XZHA`=QnKMWkJA&@AdvAH*+{FA4JZGN-$3^Xvw$>*BN;S(Tly}UEsXRE8xV+Cr>n)Em6A47EZpE zr-;2k2-hzj@{CQHHXL`TKcTvAk~vfv_{Pu`*)temo$PHAux z5U&J?jWOb_R;vMk-g0tM3kXik;#7RE+Rmbn;Lay1B};sh_w4@X8SCB;qIu^1j}Uqf zq%PYo+h43ZK`f|hdAp_KvLo-%$`K$zQ_|+a7x%#SoCV#U&2)k#%JJkGPa^9e9#++W zN^VkB%iHdjJQ!k}&tfKsS5`HMRAmboSh-TO$#UYcRgGHiuh6=!Y5<^{wJMJ`=_H;} z)rd}&x&FtO?DdYS;ec86&M*zx99E#=v^*Iq)d@h3Q++Yg+aSO<>p09VpL84w9N*yeE>aw6k!2 z)vdxq_Ez%{q9=ClCF|b*{CMlUaSzCZUd{*Z_n+rp937iNOwyj*g5P&SZLO3Mv6sk|(lLI6!1ONXL;u&hSV?7#=d5rljFK6B#2o_s+<8 zcu+VKG1#$4|7gV6G6f+%mc>|B;0qx?DJw>;0IA#9?Ln+CT!TZAp@GPm z@F|0zN^63wq_b1gf+T99QBT#SmC3jyD>2z<96LQS8W|Xm2$9pHLx7wc3_5A9!Q`45 zOx$pg{eW~+DqiRm9I-?IQ&dvk1ZXq!VlUu1Z)G+jrX2>VszVC7idOh7H?GWGS>}Vw zTo8J|i+oTAls~Y{9f1BDe_*kx;NQD}{H`A{bEjteXSKD~_Fo_W^mwtgPjBt}B2s8Q zJbP}1Z~ZJ^Z12|FyC3k~D_-A%`=-0--JyGTtoRPC_?n8oPTkiDz{2p&;T7N3CoZ<3 z@rehu?<=-->uufhj$gSA@79u@9=*Ni0pGLQwzt^UtGD$M?qADXGD`twvFtdew;n6B zo|xxWw)k!_zdX1S+&@3KFmiKbv0wM?rjrMCU$E%w(tTaGwcmYs=ffrLq3;ak5L(gK ztNVJt82rP???;w?{1;z%jTl@ZbLk#)um4MSiCOCZid_!9b05SnREwX!cVVgF%kiZP z_Zz+%U+(+iebDsodWdY?dJk&by*Tmdd$W!k{2YIa(Ycm2H-F>s+~Lo*6`MnPbLfFP zM7MvJ&hIMneLCOwkUt0;S@d@3-j0H|^R}b7=Y+oJ!~^e%Zz}g?4Gu9kms{q{^uDQ* zAvcC5_0Iu#our;9m-C>Y)U3d9nIuq)Sn>U@GB&N8=JOCPtpqTJ%wo?$@3dLx9Ri(( zJtba(5|C6}#P8_?On~pC;VG5u6jRA6!SzkYCz83AO2^-P)kNT{XP~23pvvXf{H;a* zo4WtaqW_5QKT_}?oAs;^TDR`+F8WXE{*wj&+q0fkzH$EO;2?!F3c7Evp{F*M z-TJiN#_nF{kh6Z>#;{GdV*fz!*|1xLb!Q1`xz#~fEoD~Ay0epQxi!9c;C67iqgUVF zw~l~tZ`%g>tcMwv4K1?&Lhzw`MCT6&y@pep$-oO6(iHV&e}witLcNdB&L_^33=>*z-18I>fUfXA DuV0=k diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc deleted file mode 100644 index cb79f6b036c18231c0a6eeab31eeca6d8725f395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12100 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 z zT#y^`z%G`&RKAGtQj8DxLVbtQc}9L;?0&tE^?p#^PUW{zm0HO6vy%lx6@=U1xs;bu z8CkYMVPz4x9Tw;nrFO@+gz@sO>t%p1d_%=ddnl(XzvW9%?(zEO9(2*#W3KJhD{i9% zl!Q`H8p=Rfcv4h3>JBIm6`&$if;Zhrr1lBj?`}RjKcU9)N1fyWnmZ!cv`DYWE)MRiRa(u#Jxmjwlm3uQ|<&ew`+4Q=3kzP8i}({|Lu@CZB#hkXZ+QSISzcmke;(*nMMr<5JwY3K+i zh29RGl%1gqBtZemzx$|NmEEA7sNH%)O^e#?Zt$-1lrmZQOhow4SDcplgpXQ{DjgBN zH#p6F28zKu(Gt!ZtYmHj!-QsqA6b5a;*d@6XQ~ABaPlnGlj;S%z2HlEYux=)USFye z%Gff57ghLxxrO9&qWT*6-{$0gRDT!%L#+*@R*D)#4Td3*+B89YNxMV!-V-{E zI%Dv(wP%&j!SnD!L^$RJ!<8?>OYkzh0iY z=#^oaPYv<352=qL!eQ6Sn)b9-8!oZ@p?4n2!3DSj7TEn5K7mi+C)YlsK8G*hOPC>Q zj%R$OoXq#9l&_TwVG%Uu`xF){zk$NcOQ_of%!Q@OWw0Fn619R_3H`l(6_uTNUPP$l z1FqKlI!?nb<+ptAv#g1O@Pb|i*G3skg8P&!JgA6rTtt|~m(3szG%;N(xjA)}ud>i} zdXL0jxD+?S5o=RyT!W=B(#A!vU(Z~g+CXiL2$gO8z}HFWPt2Q4`%#;z3O2S-*P}12 zwvojAH_NY{+d=OZDP3SI^ETKHJ76d5iU=c_FA1&UBg{{UQodq$H_IHBZ*A;>y|52b zvFxWV+xU(;0JEf2)caofgYt^2Yr3x{hqXPT_zrt_uJNyw5wg_13#y@tygUiZ^DZTg+!bXQG z@HO(>(+kQ!p^}gPmm9Cy?Z)x}%SF?p%1hMWa2Y<3eAU_&;VN_0l%DAgxC#55JS*To zWkUSBHOZ+W!V@-98+^?2KHQ>A&5{PvLOMtf86aasSY|hqGBad>tdP-zuKB!^MEU=) zCO?ysOeIq@S*m$y0V=ye4#)|&LN3S+*Zs7vyOu|p7xF=V_}BDq(=PE^_?=30yntyz z$mQg87{$_u;^H8q}9^n~lmWWlTTN%PFd?vbI4v z8&AcJ@C9tLJC*MamK{`issdDmN{|Q-rcB+qQ&}0Rz$hC7EpvLVk4d8mZq(sbwu-WX$}`{(5_z7)*aeD*0M>xI?X!NZ_=i1>n3&EwQbU( zd56|@;(r~^@qdmwb(=Nl(56ZI28Z+iZ>L`4I&rZ@hlZ^iwCd2Jb^Qjd7bN&=&4g?H z659<(>OUZ{N5}phdsphzz2m^-j*0b?2J{%%r*C54IO)^7W6#9yNj-b^8PcbJ&n}5c zy$2`uOzxD}ci6!0eR@}|RJlsxfaHNm75jGV+@oW+qydS2llvxi7@X9*OP~IUox6AJ z-z8~aV$z__J^FX;pVY5X-(lA>*67uz%b=b~HT!3dzdYi<69yEHxR54Qs#F(Rr%EVU dW=}%VlezNkNyu>_W82h)QtwU3-``(&{|}^oV}Jkv diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc deleted file mode 100644 index ded84547ef7844f4e0eec85561590ccef5d1f90c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1408 zcmah}&1>976n~?ym7QHXb?ao^UW`LZMe&Lzmq3e2YKKA{yCq95x(r%r>{YFg?aXYF zH9q)Y$Ql}YD$c(U-2bGPmgLY1n-+TN&2-}ua>^TNm26HO(3>~!&HMVjH~OW~mxEzv!_;Pu!@OwTNMBes&7S0kXoR}h*9 z5L(PU)=OWWJ*YYMKLk$>$ro3qddTFB{%jnC2WUF1Dx0(EwXC1~-GgCOD?G3u|&D!ld!8rM18%KxH9Xvk5S{QgF z1WyaiA#9OQJE(g)GeW}5EiKd!jN`GjXT6ac6Vloc9um)PgJb0vinwJOxy706^E6Ne zR!ap}-)M;BCvpU`(!e3vgU1MS6^?+cKnIEKDA)1W+a6G(lF17dSJ|TWjl~{(H(Tl7 z?$u2K14Mt*v2#=OdyMBcrBND5O1bjSm79DjDB!0e;VSujKAdP1^;MsC(bVKjFzINy zAy~YXPf;4gz7UiO4XqaUUkUe~U|hI6KKIjBr|Zkech{KMky+2h;37j;ZkNSz_8{YN z=(6;_8%G_tH;~;dz25rlnkyp7mV17%<8L$J_M)Ck@3S<_xEtUQgiN}uAMEg6F$%5T zfY&kh?gtZ%X;l?oL5*l3dAScKcH^-2o85eFe|WO+>Cc+(vpOII}A5 z$(6UN7wT?NLg7#qaIu(OKA%lG<4%;5#8n$|3#9^IfqE5X z!Uf6-tfGil_7^2MEBs@Wsg8?9BxgDyevX6t17b(hI9Wn!nC{at^o`xxNN7 Cj8mEb diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc deleted file mode 100644 index 81327296f9bcd98f7b02568239ce23ce81e26f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27222 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 I#to7G1DMI-JOBUy diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc deleted file mode 100644 index f0ed53970b5bb9145da681f9908e157a5fe2b331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1408 zcmah}&1>976n~?ym7QHXb?ao^UW`LZMevFymq3e2YllLK-NHHqbQ!eL*sE9{+nL$8 zYkcs*&^0vlRGfbyxc^BnEyp5Z}fAcF%7ud zfBd`ky9Mx6P_U%}n8pw%6(US8I3g1>@w4Z5$m&_we`~*22Ie zA$VG74q=Og+F{+(nGq6ZZfT)@Xq=3#J?pj9n2^?n@GbG|HaJ#(sfb&qkz1U}K2HNx zV6{|m^^Jx|ek8{rD-9fxeRzy8SK$cA3UrXzj&hxhz3l@vDw(`gag{A?fq@wuP2I$d8zzPrZ6j?8*41{WE+a=R>!v)zox zq07=oZX9*o-avM<^j7QRo34l?TkiS6j=#->+lzWGeZLyuXgjf{r>5~jh{B2EqpRGzMnb0zVht)ouTpE zUi!_h|1fFrFL3RuS;%FOt7KU8jeDD;W5`G!wLUnGD&mqn0Dp$mc zrhdZqnv=;*Y8<>fQbTY6f6iXz?;`iVadT_ak9Pf(&*N==1<7P!JNDDfZIr~1m{-8 zJ-PNq^+Me(N+=wv0xlQRF)_B~B+r$TE!2-CDSs@*+~>1NXWWT$lDKL^ZlP4*D^RbZ zOt?T-_ Dm+4dv diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc deleted file mode 100644 index cd81e146b8d4734388161a43fe0d6b87bb4e2f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19144 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc deleted file mode 100644 index 15fff8bbd4eedb7fddf276a96b0f9f4e3705008b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22173 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 G&Hn?vcIb8h diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc deleted file mode 100644 index 680f2593d05d63f49c164f7a1fdaf3c92c12d5eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83021 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 AwEzGB diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc deleted file mode 100644 index ce4a3abe5231b87b0b32bc4be022d246862fd53b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77006 zcmeI52Vhj$b^axRK=dMd2hp3T%l1X|-g^_0?jQt05|SvQuDveUabNfD*y~>6-b;FM zGB{3SaU45wib?Yz$4=rD|G)2?duPsD&8(zdVl({Tvios$-tA+s|vWuZ(7XD}`k&1|vjfg0Px;eAX0 z33aybJ(^j5e!D+5P|s2qNKT_?FwHEt96TFx%KU~uA+!CSQ)ao30kZFbG8&4Gx;S^J z%q^W|l{gZ9L1P94y%i<5^A#<5|R#S-#)V z@hrF3wec+14VmRyQzQdrqG3EMuNQmDHlF1=*~YV+9>%kbLp9+3f@e8BoWU3e&jz2` zze8pRbThNeSI8{)5jq9N(ads6spNVXHAiN-y^vY15$zN>CE6))N;c1OI;tL>)XmJ& ziPH|ndQ_l>f)y(WR_c;BcG?avfX)7J-b$C`Km)TU?%w|R0H;7A+v+K znOPoF$SjXFc$U+{bp!4@TsL5xxo$uTXE3hO*%^#`hcG_#yC zSI&vqssZ<%tr~ExkXf725QoeT>1Jk`n~+)VBV?A-2g~~(ssZPAuNv^RM61EGXO{ac zlgxz7!lOAe%cVQZERQ)`HQ@A6XBpefW*p0rZN{@hpHpV}iU-K2DO7`8ndS8Cqb?rd zD0weJo#nF8Q5Tnqj=H!^ZqH(FmdtXUuJvHtU&yTWEVqy?v#hPbt04-WEqzXz2XE}YcRK;kWlW!GRtK`rDbgELC9?QJ9u`~bIL69 z5w6M5IiVVG`Vgsuo%aen!p=st+;$ipFb>s#>t;KLVS1KI%QbV44)__LC&wJFBXarN zSGzbjlUbg(iqm5Rx;A8XbT>20?Pl{Vr-xpFuRCOxac11b%;&BK+(z&$myCLrQ$iQU zC8x+Iq)aqagJ&BZ$ocr9)VBAXAssWEL zn`gO&#nSsd)3aejkoh}!c0xBZ%hwk&%l(DSGLDYAc$C@eESJq)4LCR3uVgsAv&>?j zUGglqmD{tN8~v3GUrX>T=LXM)^H#_!M+qUb6Yo%Fx$odv?mId*z!dCfxP011$k{w( zmhV)yGZ?p#ZEV2hLl4Gf!WoS5|J``jW|oz~W;SG%m4SakW+!zsvwQ`?vwW3N&vI_I zP611r%&= z-!U?q;Yydy?BpDo<@zPE*FK`Z{NK#+)pb3ybk=mKj59=W4#$*PqTx4loRaNZ1x^p& z-ZBoqIA9#Uy+!;Kt2ajm)XaCd!Lw6xWR|ZZ|1vAD7q4iVjF3WR>5`CH#?j33l}5j> zVFsg_<&OsR?sLqnYL0a+w}7%PEUwN^Z~Mn!Ai-S!FYsEzXhI ze5kWL#xOQu2J9J(9I651&?zvUEu)i=Sx)J!8gNg!GMlNgdgZ{^S^ezf$nM?kTV^Em zVT?nEi#Spdn3eF|IF}0*fz!j7mea%dfN{2Nfz!kIfN^HzrCy~nxBL^%V$<_DvwV$Z z@@bta+VR^kE)hmvj6-G_M>ESQ;a3NYvsDDTEsPHk<1D5bHl9{b%pKHw`2*Sna9;8`5CuLfKq zTdn2mijKUvul)3 zbo7EHuaE+GR z?M`O7ZuGk_zN%7j%ClYl=2GFR4CC;P4ddwbE>4*w+nX%su4raC*Jie3o#m8SQakQ+ zx1gTo8I0$#FzT9TGRvb2nPuFa%yRi(W@ec;n^_)DsI#0G`Y=upnWcN?%Da@U8g%q5 zr-W*N?Z~K$`Q#|JfTTd7Uak*-?w|Q z8t`?6YQPLeGfRJj?v_htJA>KGGMmh6HqS21ky);P_hy!_I(i1SL94&zzI+0I~` z9_|WbHbR}{bbIw%eao{L-dSkK?BX1m<+0zrndPgCdX`h3n`gOZ@GRrtS!OevXSq!H zE=)%Rtg;%>wIQ=h?$OLLFVP;18R^WkT4%XrID>IJ;S9z&diSlKx3t!(cQct?nj^E^ z%H8W(tp?O^^_y|W?v_(S55_oTmT|a>$T)bGaqukT;917uS{GwGHqi4|M!jdHDiuj* z)3skGbGzZ2amHQyW*kf69ULzEiT(nK+vt7|#`is2orT*Xb(UMtcIBI{%vNW)-O$}~ z-H=%>AL=Zphs*|_&h*tFU1yD7xy^gA|6(5S`k~Rzmea$Ci?2QU4P(cwa!R!S(yZ#p zAY@qlYO>0;@*}Gqy~-)}%temYS5668WgNW9IQN)w7-q0nI8kc$JO{US+&MzI}{VfR0|(QGi~RrB|8R{Pn74m02m1Pj>hYK^z31Op^+p zyPJLXta5G`3ow(xtGTk88D%lE`I}X~?r^r^sObOt`vdMT`#2zT-(u*y@;9r@WccoY zuQ=Rg3pe>O0H;RlDxDS`UD5I3H(Z<>DgdWPy~?>^48Xaz*P>HHMmfgH->mXghO9E~ zm{q>^kX6R$+M&_26*C{Q%4NcpLdGGhTx*eB6Mwd>vZ97j>%Es%d{*hPaJFJLFiwYtta9!gabWN&=Vq$_ z>Q&AScX)7X(F%~c-z!}Kv<@8Lb0rJhGOST7+Cy}v=pxa%q6Omw;EG|`2k{X}QE3LM2a zs$_SN@MzKAqGLsei;fZP3|=GxZ4c9;4VThx%1G=t`gep>Y-QMR_H$06MEHEL95;4(35U0^l`Tyy36%~ z9&(4FweEu7(<#>mzUUgDFL0NjFLYO-PsowJNc6>`FA;sI=rwWI%S2x;`YWQZ5PhZS zt3+Q-6-T^A__d<16Ma(j^`dVOeWU1`MBgm>7SXqgzD@M)qVEuWr|7#x-%XW0y+`<0 zMc*s>KGCN{-!J+B(GSY2`H=fCUhzj<3G|~fks{=8vy-7HxT+qZV)u-&Ooob!O(BHA<#c| zL!sYxrO-cd!~CB9)C~v!nHvH9b2k$D7j6{vh8qoi+KqwUbl-vgr5g+Vt{VsaD>okc zJvRaReK!&M*X{)LZ`>s455%{B>t2BP@7!d+r@wbo!2jUNpg(j|p|{+Np#Lam(|>Z) z5dX8A4*eH51NyIWe*KY~g*fGALvOn|&=0%0&~`Tu`eQdA`fsir`V+Un@9C#*A^6|j zBItj(#nAtBOQ1h!-E!#H+{4hHyA@9szJ|Z+dj#|yw?+un z1hmpU1g&t7LLYFCac^#!tEj`@2YM70B)DD?{_BzGk>KAw@n13i>-Cz#kM{mZZ+)`y z0X}IrKG($On)qB(=>C5>*R-Hw{Nm3wKgV9bA?LaHTyrm-Yl{83rbNy)#m{oC!I`J6 z&&6tBA6Uf;9?mJxG~K zd4w{bavx8Ln)yQgv{!Di|6QO zS+PH-j-!mE%%+T@lv2h}#!`L`X_f>2Uq(FO=0_=foz2W!^JA3d6iMj+Fp_ltH=#myknX-{`hO&ur zh_acokFtewnzEI$o3f3vopP2^N7+f)MQNt&p`4@arBqUCDEld=C4`2yvOlrK@fO8FY)>y&R$ex33gl;5QM7Uj1ozeD+5%I{HrpYjKkZ&Ln{@<)^; z?%LKcxI4<)0}3O!*hezfyigNl|W7+9^M#{2S#bl%G=mgYuu0|AJiTf36PK z1kSb0TexWH;+w^5n-htXweR}jmr_r({OGYYXK2ObOOn@;FH62W`HJMLlCMs_Hu<{b zlgZa7-;jJ`@=eJ%C*P8MYw~T$wIrfL4j{cv{p7$ol4v+sjq6NJyTVixH*K=D_a{Y z8=GCCx$;z1)6IclX5}fK4Q`HTZELElsj9DRYHX=%tvj2jY_4jpYrHx1WFpa2S=CZg zS65k|Xl+e2x7;kLs&6`8Rh?+P(0BdLt@G}`f9V7BmTkfQ%bMz%=2xCgAW_Zpxlfm9 zo!?UJkE*G;u{zP*+yj}qIe6`k)vGsFZmQU_wsP~5y5@)u^JTpc74Us8_}SU=-7R=sy9H}f16MsftmsD1Ua5jd`}Dd|()U_Lst2O)OH_;~)vKUSKTPe-xJ2VV zjQeWbk8yvE2QVI}@gT;7H6FrvsK%v?hiN>V@d%AaG9IPzXvSkS9?N)~#^V`J(0C%_ zNg7XPJVoN$WsIll^l6NzYdnMTOpRwTo~`j5#&b2E$9TTR<%}0-ypZuCjTbXsqVZD3 z_i4P0@%_<3uE)_Gbl zw87Ixp-sA8YO~N5KX0qhHc#7yc6iz;w9BuzTWF7;w^wMNr~N_)JRKA|t0Vm)Zy)bgT&;@+`;@fnT% zdu?GVkNjIvBnH0HBQ~(s!Pvn0W#Fq?fiD%u296D!%EJ-Fh2F^zVpX(v#s*ub%Y^U=U9 zgT%m1Lt+ER2F^zVpB^FxZYYfn92+82H%O*ub%Y^U=VyW5vL3d~D#@!1-w4#CS1q^~Bh~v4Qi@ zz_)8Aih++#jtv|eI1de+s+ueYK2jDNI5u!T8o07d418!>Y~a|y`Doz7)5O3BX2b@L z4V;e#J~%@Ryl+-);MlYhG;N*ueQ{;NA1Yz&pxg z1IGr=M+5IH7Xxow7#lb?a6TG%`$94Bmc_AwV*}@-fwwLe18-Uy8#p#_J{oxQQZev` zWwC){1LvcGH!c$cuX`XiaBSdwH1PTd#K3DFiVYkaI3EqX_8~Fwsz+i2#|F+v1FwEW z47}p8*ub%Y^U=U79}@#FuP7`i<^!%v(hs;UNk8Da#5~{{aryz*h|>?aMx1`YHRALG zt`VmnaE&)YsBdXTq90D z;2LrI0oRDr54c90e!w;2^aHLDryp>QIQ@WY#OViIBThfy8gcpo*ND>(xJI0Qz%}CZ z1FjL92V8^91Fk{l0oNe&fNPL>z%|G`;2LBea1AmKxCWUAT!YL5u0iJUlpynfYmj-s zHOM^R8e|@D4Kfe72AKz3gUkc2LFNJ1AoGB0P*)ysUDB()qM}eNd+UZEDggpYe{;n>2a3gdryV5%_4RAG>*!XQ(HL8c0WOce&1Dhx7J7-Xt2s4G<% zi(Ou&7QTRURBYkc!g*-ni)+-v=P|H~$HLyi7>C7UVRS{d3WH1)2AL`hGF2F4sxZh@ zVUVf9AX9}wrV4|)QiZWt+d8%IS#$$&6^^TL9#-LV8`Q$BXklXu#}>{*3!mAf7H-CM zm)OFwh4awDEnC#WO}JPXkA>s0u(2?PndXWF=q?=#pWdbxZon1pxC+Nr*jO0XtBi#~ z#=;=e&Vfuj2Quv($h31H)6RiRI|nlD9H=Yp92RTbp%$*kvBwsUEu4oIKDA3Nd;%Z1 z*ut@e^U%U4_o#)B<17)6h2ycXv2ebOh3odIg^yuq6IbE53L6V!n3)%2;o1XgVTbW} zT!rH*Y%H8FRXA}-EnJNzGPZDR;XJf(%@MWmQC#_mEgV}o4=r4ER4sf2m+RuOa6A?^ z7S5Bg@a@WKweTTV7~imwn#Z4K#XnNZn;)rNiA`G(o3^jsqLDAX8%*0LeQR8w^sR9? zWAxG+AA4hd=GHjG>09Fvr*DlzoW3;09Fvr*DlzoUXKp)3?SUPTv}bIDKmz z;`FU?h|{;mAx_^Khd6y}9OCq?afp`}YH}->eS2#h2=~hLfr;8z%RJn6AVZn8Lih!@ z(0UNdJHmy|l)NZNX zv1y0!vl|Z&QjahX@$jHVJ{EW2=VfuFjVoFhF3S!XSac3PS{jDwGNgQy4BV0$(y;>ya8MFiK&xz!-(G z0^=0M3rtX$C@@K3vcMF9+hqb%b*ImR)MgCHTSfwbxIsn!vqK%We2}Rr{L~O5B#C<|C zw@&ed$CHZn9#1JYcx+T`@_1UY*<*`htH(2nXFZ-%Jnykh@q)*TikCcIR=nczs^an@ zJ?4rcc?VZ`T&cK9uqd@!agCq5R&kwT`+CI=n-+~U{Ws<_SLcEueYcPj4k zxLa|L$GwXCJnmOKAXt<-sCdZZVZ|eU;Y!7$er}awwZ|Go=NC>W9`jhMc-${sr+7lK z{iI^OU-*<_gU3e2Cco}!#b%E!imiU(Gm2+Do>M&Uu}$%U$BT-WJYH73;_<5D@*e*E zm6DoT;c=znDnY!zifcTsRb1zBz2XL7$+e-Wjf$HT+czt2@pHE-Zu7WZafip9in~1S zR@@_4n%b+l&(Gbjc);U9#X}wsD<1J!sd&_5m14EW8bv2qno1}h^K)wzk9(|BJmK-A zV!g*xiVcFL?Tv~}imB6z&3@q)#a2J}jN)03=M>L-Y*W18@uK1-kCzp%c)Y5(yeHq3 z(o{uH{rq}dskqAHYQ;4k*D9{_xL$FC$Bl}cJZ@Ip;&H3uHpTYsiaY$=or=3W?pEC6 zaj)V&kNXu5cs!_h$m3zfBOWUik9w?9toB%==sYGAk9n+BJnpeh@r1{diuE2(DK>a) zRBZBiTCrKNy+yIr&po4f*5f(F^B&t2FL=DDc*)~s#Va1KDlRYf@2`%7R(M>gxXR;d z#WjLMQ)?C1`MK*AH+bBrxXI&Y#VsDUDsJ<*U2%uUor=2@+jlGO@pJbo?(?``@qovJ ziiZS;rVc9}@pCH`k9w?9toB%==sYGAk9n+BJnpeh@r1{diuE2(DK>a)RBRF)nmVo6 z?6F0$)#Dk(vx@EK6weEmrrH!Q_=PVjUh;D4o$6A zT;p-A;yRD(6*qX?sJO}FX2mTYw<>P)xLt9F$DNA1JnmN9<8iOzKE?L^iU<7MgNlbd z9#%Z!u~PA<$125Yk2Q+UV?yzmU}>sW@wlH`r+C8SNyU1PrxY7JHYzrGJgwO5u|=`f z;~B-Xf~Bc*iswDHDPGWp+b=3!^6Oq!yyEey;_}{l(yY+dWrbjAYNg^T!6B*DifjDB zYZcddT(7vn<3`0ze%;NATm0OuirYMHSKQ%or{XTZ?rz0Be(qkyeIEBK9`JZj@sO_D zepvB{pIfPTROhCu6stYfC_0Y`#bbWmTE*jjZk^%@k0%xD{lcdd8$32DHhDa)*zB=I z@OG=mGdlOI$8$ROyvH`3d%@#H#Y-M9D_&8&eN}Neno)dyZ&#G?^ZTuWNw?RO6pUN+ z^pJ^94;Xf1#Ci+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zE^vi!mDub8ZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD% zF3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~u zvkSD%F3>i+z!lOep&3G}1hmaA&^Eh3+w1~uvkSD%F3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD%F3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD%F3>i+K-=sBZL;i4G3$)EH&^Eh3+w1~uvkSD%F3>i+K-=sBZL>S2DAMd=u5ETP z*EYMDYnxr5ZFYgS*#+8WcM96r32b)9EO>gzcxiT*bZmCV6n(p3MDx(Xf`b1CgLHBx diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc deleted file mode 100644 index 35cd32fa1c47b4fb70536540eee788402a757db9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77517 zcmeI52VfM(^~O)AAc1HSy%$kLk!bGNNFdRLKmr7!9Fpdc1VR!gfe_Vc4(X2V*pA~k zj$v+})tP@!$u})^4!a9|88fy;gbm&9a(hT084DOxDI*T=zHHCFH>m1g(tn*m&c-eez z&u3l0x{!4d>tg6bNfgU~qP6i~ua%;%x;OKoB*c`Xi@2KTBGUfoV(I{1>pc^9v!``$H?O?k$}o_Eu% z=pufp96!Hz?aY9AOlCm8KQmzJm5~_`p=X;Jx)WV`r8+Zs(WUL_2pjMAx1x(^`Mrzn zq;noHc^C5-?{W+eC0(K``nkAA(nSLXNG~@jxM5TqKmfk zu2f_u@0y&8e@$k{iK9QRz)_{iZ0e_>Rq%=&49LvE+U=D zd+qlw<{8Qr+@#G?m{(PW(F9pB7RZ5T%vu}S8brLv~6_Ge9JHRl;Hr$4&rxjf#*EARR| z1Llb3UBu5s7yIvzE|$vYSk7lP(Z!r5y3~GVG;v{Uz0pM0bBHdsHkf07TKeO^52^8hSIhcP8sB z)?8L|T*EwbxMwcwJkBL~+&1pTJPWvIA*;!}yd|z~X)F9EMts%COB!87tGBOCV4XP} z7yIf29B67X%;CQ}fgXS6MHJOm<3+<=&N&JQLxjJl-J#a{MybP*R5U3L_`q8S`* zb6k_?LQPF3(S^?8IgNL*f3duaIsMV49&Y+&z99Ms4z?>$!XwT=ho6LZ9`ZI$> zHhyLpb4jDywRf@i*KeYWWjp6x^qTPm<~H7y=%UB(UG$jimS~&k zVm&7BqP-aVN8UwFFcJ2g>s1Y76EeDp+-&w`tmtBDK2J5#MUNS++0jK_=qkG7E@^bJ zXa39pN5;wwcs)JwF6NKtT}<=W49_kzU_FaC>WiW5T~jgO9FF(L*?L6J0E2G6VWe zWa#dfGeBqZv{|gVtSPLsS?93MWu3>G$C}SNpLGGN$qZQMV)Srkm_eg%`C~`gcz0T- z=priJyE=h)(SQEjjxMHN7+u7pCz-*HE?(7S-$)oe&n3E8yFa?K<2S)9(%#Z;3S(Dp}Hyo+xybdeb(OLdAc_UF0z7je#FH(r<>unDb)U0k1Ar?v=V19`?R7lF=!;Js$l+&1e{HQ#W8;#=B@=Y(!zQ1J0EN zp84Z_S8rCYM%VUk{ODq?_?ZE(%47z#O?0t7zjrb9xgXiE786}W+8?LV@4 znRkY+d*$e6j%>Mo5M9KfyLAIzTdcYPuf#uILyteYc;zO#Xxrb&0sFm+o>+B*9bL4| zXc+B_9ogjk?hI_{8Ry#HGfnA(=pqiWk80TCSa}!yvGOkZjd#($Sad0ZeK?}P`?H9% zO?UI|>|Tv7T-&p%3`>|Z=xCd3Yl!8=&hg@1G^1fG+j%sMUURMibLaAigg(90_MdCO zRC8SzZFAKfb9VKe5y`f4M3c7d-8q*zx`<-;j%sjDeD7jCU5_X_X9o22q-MZ2{N6R0 z0X2h(E&ermcW$pn7w>vkH3MEx{LFy8_m9`mbGb4Dwr%n*_B+;y!ak~rfBi?bd3_LF ze41h()iA{$UG&7t4Cwb~2K4y7i}%uh2A$^7c^A`SU7x^O{O8Fqr}?fP+C4c>h7pAM zBi==Hz0pKouSOU9-j#RZ2Y+tzP7-p%jT=;FOM zM>VuB98Dnl{^+8o_qR@fqZ;yqiLN&iHZ_C)sJ5_IqicH?uj#_ffWC{JBf~4{`A8VA zx$BAy+s@^&fH}u2(S>$zB#b%D8FXsX^@+}T*B{+QeHL9r`oid zUQ;umZSpSK6ai8*nn2V|&47M?&48W-e6DFBFJ+=jOX(|@l6Sphnmw9W+y~Lc{`M^I zVhNKO&^F#h`(k+)j>=(Ac72Wv?vCYM^c(MDUFJLk`s3HTU3vGJyvte2Jii6+Q!2kh zX{`NO1k#q>+*U2M;cgwgKaNEmbaN5XiQjdwBCetwHw6Glcbe{@B5 zMfeteiFF32JHCa#%(-1^U*w2}Et#B)wfnEDiEpt+^BqXEO;$kLoPFdiQQncPi|=Eb zxZ+;&pKk>=k`4Yyx#6qVVEygWYO=h!q8)?Ftp?6TAE5nGW%+ecotbfk0AQM zv&clTk79_X-?QlPpDjm^zrIC}sc-Rmr|@;1seI(>PGsYG7VC;1SuABDi*_u};+&X? zt{2(9^Q=S`@yO=7#ry6J_Rt?$^q6dbwm%zS9T%$)5TEYX2iS(mvuMYUEY{nT$f639 z==RjJc$MbaZiw9=t{h_32Jtsmy!b7kut z!LUp+N6OsIjvjM2JK6(ys);Om2JvTdFzc226cOxa_o^<$^x0p3kfWD47J6Z1u^;gx zi>U+o)1Arce@+0VUh1bX;M43se@lB2;~W_F&5Xs+?ulnHzp1*=?(A7{tjPotT`#hD z$Bbvu?#W02+w*@{0c(hT1jCfR%m%c69a(INzCS=3%d^<$o{Vy_p4cM=$p)TVdo!}w z>g9sqHVsLi*_ErAO0~I`eR4-!kD7w>V7uBdd*Wq(2kW2(0{43 z0h|{vvY2Mh%%FX-`+qS{tUQbUSl4-}U!R%rAHm>ZT^mTYt;F+R1L|s8PYP=W>kQVp ztk_bk_blX|S=^q(Ivq;exq)dh>jKss)+MaDtof`nS!c5@ zV!e@d66<)@5v=1_Z&FKX`=g(akhIKM)HfsUvDAqLAL9ByWr?3{XE@RD7 z%V`?}S^GhGOPS0?to>OBunuEQXC2O3%xf9Rn#`KYI+1k<>k8JDY87p1wOT{ER;|-p zDpBi+SE*9c4QeB4nJOpUq&AaoQ6;1mYAfkBRY|&C?I7K$wvg^pLDF??S4E`nP|HZ)sR~ISR+~uQrEVg9 zw`wGPk9x1(()-jA;`ggZNI#$slYUTri1fqiBcvZyA0z#^`UL4G)lkw;siUNyR-YmL ztU6BmITa@Ty!ry^7uAzHG%Y$I#2paHBoQr)oK#)YgGs7ZR(|@cc>>w?^I8c-mNB+-lL|F-m9J>y-)p( z^nUes(g)N(NFP-HBz>=X8R;YHY0?j=f02Gf{hRb->OXo*pHTlL{*3w`=@)LLXB5)E zUs6*^zoDj)KB{s^zpJK`{*XuO5gs3$Q8TIMr)n1I&s8qzFS*kFotjPU^J)%hhnh?J zgqo+f^`y!peoEz&{!Ps%{kvK~`VX~`^q*=G>CA%#Cr2ke+NdKd5ApNhpmh^w> zy4#bmm+Bh+7wshKU(Q)Gb<)PM+CKYNpw~!{E zTLPh(1Ltmp%!XVAxfaq7ay4WDWD#TzWG-YWWGdtu$b865$aRp3kQ*SmkSUPqkQ~S) z$OOnV$W4&(kQtD9kPJvVWH@9fBpEUqG8i%vG6pgPk^&hBNrQ}nWJ0nbgCKZV`?)NV z+{|<1&>jI920;YR;W6*$QX!Keiy`@tJjnHsS&;vcgb}VME$1}T7W-2ROgUUs;UjzdmBPC{;mya@75$crJ5LS6#- z7UZRnZ$n-Nxdrla$af&8Am4?&0`eH-m5}d2UIqC+_4?A31CbBr z_CK3hLz%iI)EaE8+8;Wb-cZ$8d$6iDbaoi}gRM=$rmzZygZrzR&ki;dgZq)z&yH+u zZ?3PYY6vzrwbZxP9|{G-Rju_+XS4Q&Le0UdmYVwdU_+?2H56_+n_kt>Tvt^cYF(e3 zdUjfKeRE#$P>5bzI1k%Vq1L>XYP~1T;il?PIGjwc?d-5s#mmZyD}w6^*RKqglol1Q zJ3FOf_4=aHit-?064cX|uPQ7HZYm9ymK7D3ogEWv7GC<{0OB8bx-EZm3+-0^zN&Cl zV_tO~?RQmvQK)5KYg2Q6Gfin~tZK-w3pF$}wKatsRDP)OP<}&wb$)YuYh6?0qPztQ z^XWB*<~3KjI`6~15Oo2lhJ&fo2h6<(*hX-slPu%xVHhhgj$ypO1cr$MlNcroOktSH zaDEy?j!c=(FhgJ_!z_VZhS>sh80HGhW5^T8XP7UrfMKD)B8J5RS20{Ia1Fz?0@pEI zFK`3H5`h~TZVF@!IJF?Ul%XI=s4$6f86n8a&{n>20~+@fc$5ZtP#ZWFB3Q@0E5&{KB`?$Q_(+^w-nuv%k{ zpwbu;+#`6tR%$>}}j~4X{r1p2-XLmX8a~NLu-Y@Pa z=3kNG%wHIFi64iQgh~7>Q^fqM(wzC7`K6vp81t`A6Z5Z0cjkBIPcZYZO&9a88{o|E z%%5Q9FBu@_U!UpB@64ZI<}b|@^KTgJ%<- zY-fIF{sc4s{@G&w#<|Y?&in~x{-(KN{^mSqerNs!Gyj1+F@JczGru!`f|vt zp)k=nEBhU7V{su)|ua#Kf%m@^jb0h zvFn}ro%s{Y{Ku~s^PgA}Nacq#r+W`+PWK+toNhm)nZSEUGlBPzW&-aa%>>>YOlUu(nb3YnGok&EW&TENTM*j@XcSi zRLsAuFv-&x@S54pX~2y zAAU%GLexGh=_hU2{;O6x`%CtB_D>x9ucn`HV*9UI?TQ~){OF&(N|;}%SW7=y#`a&g z*4f|LKhf-8LO;>R_FrG(?C_0p?%4h(7xnLXkYRrv@iJ*+LwF@ zdvM8@<}Rn79A^7(DtGpG_D?kXZ>FEvX8Uj1?1~>({8;u+h~lS$eo~(8zqP_;f0z9& z`%`J~!Y_WdRcQNHZgbh+Wq-^536cG`Z`1bQvE5~Vm;EjKCq(w&xn0|T*G^}DXa7XA ze{iR^|L&l(zq5a$*}p2N?O$Ex?CB+iDv&$jkf=ukh8zDe}dWn zd~HbEzpgf^ASuJU#XZBj#huOpq{&Ti{V|Jmi#vgLi#vgLi#vgLi#vgLi#vgLi#vgL zi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLmoI^Li#vgL zi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgLi#vgRi#wrxi#wrxi#wrxi#wrx zi#wrxi#wrxi#wrxi#y>9|CIl-e$MaoMmxWAPIG?8U7jw#7e@2h4=%sM5A>w~9Ppo) z-)BR9caQ9`@;hD0^y(P`ubv_B{7&H2GX!2eL*Ugj1YSKu;MFq(UOhwL)iVTkJws^M zGlX_MLul7CgmyhcXxB4@c0EIA*E586ekZiQze#9+f0NMmJE8skO+x$on}qiFHwo?U zZxY(y-z2oZze#9+f0NMu{w84$zQ0LxyLyImm8)kGsGf28-Q{;GQ7HSl{O;;^IY;H{ zcYi(ee6HW!`A93j(;Mm4?*v}`PT!PH5+MLc4w^wCi_5yM8CM>vuxCekZi+cS5^< zC$#H#Lc4w^wCi_5yM8C^LH$m1yZYVL?{vx~VV*VO{O9vtQ4FI6#xRT(7{@SP zU;@KLfk_OL1*R}eWjH^LAxEZ6XP6-{lVO%XE(3lap7vl41AZ@?U>*a0KbRn&0l%k8 zuz&%-FG;Y70l&9La1{f7e~jQ72K*iq!F3GyeHwxr80hyp05>w+B(Ri$2CqD+Fo}@{ zuZ+tDY48f{C>Er_D^Fc1NP}0#)q*s5Wn3#rgIC59K^nX=mI~6~m2smW4PF_`1u5Ax zZWg4$D`SNq4PF_y3DV$|al0T5UKw`^(%_XbC`f}>#wtM?yfW4Z(%_XbBuIl-U`MSW z4PJR_z2IJr`ve;_?iXy-*d*Aj@ql1hV~b#`#)E=~G`0yI*4Qq1MB`DxV;YYOp3rzw zu%Mspb0L5FXhbczT(F3-U$j_og~pYFs{}h%3$D>q*9xxFSR%MyW2xW5duvssAKrpPQwg|RrJSccbW1HY%jqQR*G#(W^rt!Go35_QO3zGHw z%PBRwOyhFFB1U?D1y^WXDY#1GYQZ&x>8G-yYX#Q{c9aON*HcRcH)z}_Sf;UDaFfQ( zf?F7~qZNW%_0(;Gl^VAT?$EeXaF@oQ;BJjog4G&p1Qla;G$go3PpuWK(^xOKSK~gx z295g#8wER>1e^8L1A<|VErP8Y4+tE`7_*`w!95yl1?x1{3+~mpPq0Dbe!)hK zO@hrD4+w@CvpZS@TLq&B1rKR#6FjW3UGRv;qk_jY9v3{J@uXlus(yc^4qC>T6pl0 zu*Md_R*eS*4+(a(2_Du{+Xas>W<`$*9@BVS@Px*bf(2CB^5-{AKEI6g{t6apEEZg$ zai!oYjjILMXk06}PGgDSdX1%m8#HbdEYnynxJlz?!7YrGp9Qzd)Q)X}m3rpwf;;rg zI|X-X3<~bnSS47ku|`la(&txjkH%WTIz4l};9iaU1RFH&7i`qnB-pI+fM8f-i(sq9 zgMx=Nwh12A*e-ZPu;ZxUF+KIT;0cW<1q=Gq`}+#Y&oXpb20S$^x?HeGW3k{0#;oW{ z!BrYp3$D>KuN7RUu|#map1D+TgT{@5Wg5!`H|b?J3vSU^r+x5jmHH~FlL=UDOf;*QTqIzFHFbh_p!i~^DEK= s6BeBrHtEcu5vNC9b2>Zc%(!W1MvXr+Xzf!&(kJx$eqc;^Xi^~X|2{%XkN^Mx diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc deleted file mode 100644 index 6bea18b75b749d8f165a696f495e324363e84cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83094 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 pfnlZ#3^Uy#q_Lxz=?v@Cf3-j~x{tqqPkl_FT diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc deleted file mode 100644 index b4038668f770df749b48474103e86e7a019ade55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105269 zcmeI52Y?;bb^dqNJM3E!0t5(DkN`Lk0df{rNYS^!#OI#mj{Fzr(`9>)*VfqT-s0q#~)TuUJ_*ud=dYc}3EK|0NYy zS0*i!R<>(+2Nyk7IRYl|0v1d-Rh%P98d5%O}Y8*O~!Z9w^&NN1dqU=v|)kB&~_w zHIGJHB|o=lGXvjwH+_D4U)6YQ%nV%K)w}dxHg@^?qj!1C@p?5UC>CPu@~9ZQ+~-7X9V9zg zpHIxY*ovw~f6}*qTGwLiws+p;`Q9lr@HJ**mq&Gxmky9E7rWR;-sQec$1b;)t7=^T zPMLwP%U3n>vGPicUGpx_RW37d{Q&JBs~SBWs~V3Ttalf^i>>f(j9ULMM-kDx9d_|9 z&(ucO$;K|PU#_Zgeas9zww!md{ylh?XFW=UMJ>V?h|8|%jL$qTp#l;m(wu=&y>v! z++Hp-&=>F5c$Zg=RgKHX>9dG=m#-k38MqIA=V4=J;F|1s7h9DX7^zmxV*Jv_F?Ku2 zyL>NkM8@Upn1O5BD{5lwa!n_#$$FRTW9)LdTKgPCtJvi$&U%-7WxdNa+3_ydG@Ti^ zHRfF`m#J#JYVZ6<<_j4;F{=Np7Wix8jpzMU7maI^R6E=;0$HF%U6>1F4tte%Qexvd>!RR zWZY-h@owtXIA%y=x63Zx<@=3!m&?(+yk?ADE|-g4u0K$5kj)G@&n~gcedCyc*NIw< z>$9=THQBt&HF3|=pF3*>ZU7oM4 zMkUd^Tob*^IZdFTGNKpMkF@j>x!oUqxP4 zP4LKgkBs}r*ro6B8xNbk&%k|R-o>%-uH9q6ZwL2xKQVTz8i%9dsfwW z&REr&_AbvCs~VS^&I~+X554DX?D9SDns<4w7`xmf8@pVS%?w-6uryktao{AHZ$N1$_zeY?Orc^9K6f- z?4p-vDW@m6{{5_Le0SM9yu8A@^)JuXOCI-Xjc1IxfuBG&H+cVYxtyNh`fP6CIZu*0 zOrzH_Z5%UL{HArStMe{Dwdh?gzqe5XU)`QYFR!*|V=}(Oa?#86-n%?w%njyUt|=G2 zJhHz&ou;Fg?)cxFH1CCAvMpZ2D% z@mTl_Hja3?95XNdy=&~6Z|P|+MeiQ!yvwu3*yVD}3|wwH?{e!q-6g|5ie2s-z02it zYK`l&YK?26p5SsEHE=oGoq!jbtZUr6TxQ_LqIVD5 z#k)LuZ(^6PsEd9}qn_XyvayRbyLgw!?U{GEXVc#0);$?D@KrVKU2e_hU9O3-%jFom zTrTh3I5JCP_wWzEyL`U|`8(!aydvjaZqJSx_=;my<8ry!lfYI;P*tx*eeId+A4rlw<;TVw2ExlCr@9$D{lO^jVGm-8;yH|#Th+KG=3SgenStxdWd^Q~ z-sLspn1RdX=IL?&n0L7xy^H0HR^#y)-@}&kF4t$Z8uu^fU9Qh6VO^<=U(LfYGaS=I z?DBj~=Ur~i-X-HJZQ8roD(~{Ra^B_oz40#h&t?X$>1|_tT&a)h#<8-|yL^S^?(p)+ zc%OmG@5Z~-!)fHEvDdh>U9nX-%As!!;*!4Kf4H{q~P}*Ve?? z?e(s_OD{$5(wAB9a_gVZyL`93bXUONBjc-zcX7B!yoI#|MI*`A7o>fe#*wKd6&M7v1?V$dzZ^u z?{ZCyUHXzg^erv#LE>|X-nHMO{lvrc->&gXZ{VH7#xd{S#xFmG=wbRlcGqyuFm9li zE%Va5mW5+>ICekrF5kJ&y%xW;(YsuZ_ju{=s3^GHbo}zD=w0p^M`h8wI6JOD|8mLh zp}!r!N!32@UB3TbicjxddLo-0xF%)?9`jC>jr*Ud^Oo~2&QP|pWpi)eecrqDLa$KS z@OvM|4fJ2uyId1TWjrRvF4t%8W`=(IiFfId z-N&wZmo__Y;E^#ia5;|3xE${_a5>xk!5WPlqEFdvXO5tE)68(3yvtl4@8mF#ztfnP z`@~Thm$Tyrp6$;)D&za#y?41s%nV%qU^0Vc-x#~c@AI+C&$5?(U%g&qjK<8ss_wN&UfOPY-Zq^=v^#pL>9*jRBQCC{Y3Bf-%q?tuleyVJ(1OGT=Q;6WQ_HwhIyq} z)y%h+Z#k!dBQo0P-2wZlcj<$8Cx?EG_sQs|Y*pi)v8r)7W(FRWosYvcSv5iLnun<; z;>b7k?!f)jyYxiNyXIYbuIbq2)^eGFpT;1K&SLEHY(91wtLEWdW4F~l?_K(3Z`A}n z^nQ&QY?RP5+=a}J8BW~iy-QEUs)o^FsA?Q1#`!oFyId3JG?;g}CVQWZkyZdfVCKwZcZZ+|z-X-r%-lbm$=&nN6yIem=>znp2eQV=hF8MLTNqgyCdT!tGE`5ym z3)}RVfm`2c%)ou3cX>`<)flbz6YEj9JESymQ0lI7@{4$4bT+r7z<>^O$k>KhNrS z6u*Ui6lHssXU(&;<+|+j>7bx|>Gzmtv46PZ7&AbOTKal_@+^OA{k>fBo_Usg#yO7` zv-BqX1)Ggo?s<}OLONfU{!D*j?Cu|)<@@awDj1f_WCMCCRxs`zXXJ7D1RWVY%QXYF z29by5=vgkuJj>;ixfL;+`ZQg7`!4xDU%~iJcOBExo7sD~TodnuarvF@)L6_iOO(@N z*ecIP1s0=~9u8yL{lv5Ml^+}I>REa!_RY+*{7m9pF)nA7F87J|Z+UE1i&@Ot2$p&w zdKO~}{Jj6!fUn>{WvJ{u1gys=7@zjzyLhMB&)jEk=9cryKF^Y4%yKzq11`sGK;Omt zUtEqAjLR__a5+{mF2}A8&J!vaqm)(4eypCo|DL5k4pfH9dKT;DS#JLz=Qry8;!5#5 zH2J%XxPs00%edxvt#8`1+$Y8?eHvqy=ZtxlIn{pRc#CWH7Y)WwtCz+_UW3sW+52Af zNH!aApO_7}HJc51-ljdP&k#Oj9^g;(tlh&^%vw&E$M1iwNKVDsTFF+)_LMzNcA)G@ zvV&#&%MOz5ot&oE$ukVlnq#%*WG$a4dpa$y^C8iPW&6nXlkFw@5!vHq`^ugn`%&4C z$(|`YM0Tj`fwBiD!*Ko9v>GE6#MQE$Wn0J|AUj;Pt881@j=eY zT%(KZ;k3F^2k{}Y-DF3~9xB^jw!7?MI?K_ron()aJyP}v*-^5ilQFo`*kl~+_+&!3 z(!^vEcyclYc4{&Wc6u@cc4jgQc6Krcc5X5cc7Cz|c40CX_N=4^_UvRnY;Cd#c5#xx z)+I||mnO?#mnY}Iu1M;`l~yLJz^juru;(TXuxpb>*mcQz*z=MNup9MCH_4tadx7kQ zvKPr-oJ_}_A5SiU{i|dw>|ZCB!v0M%I$Y^*lgq%DCktUekz4`$cgZN&zfZ1&{fFc# z*iR;B!G0>43Hy)9)v*7ROosjEWIXJ@B-gXzp|f|{Xf~y$$ma*fqlM^w1oX)(i-+lNgLQNCv9QB zlC*>UYSJF|Ye|Q2rLQL)!QV(a!G1I84EwF53+%U(17N?C90)rmDZq|Ps$nN22f|J1ITUtIav1EqFYcfnqh+zoqeau4iv$-S`GC-=eL zklYV@WAXs(P053>-%B0}SNeYPF!%?_Be2C}Gwh?uW3YE5kHg-XJOO)G@+9ot$y2cR zBwJwbO}4_`mu!Q*KY1GVf#ez32a{)EA4;BseK>g@_L1a;aHY-3i{QtSmtY@HUWR=l zc?I^#`#-A!u~8d6ZYrH zM__-EoB{hD3T@*&vQlcC{Czf3*`ej_;@_RZuC*k2_RVSk;x3HzJm zSFmp-zlQy7@*CLSC2zt0KKU)|AClj}{xSLe)s>&5`uT(Y#Tu*~!8Q1I82+uqzo#*y zVN`T#a_VyYJFjJniaH+E0{^wFYgxyCTj9Uf_^-_;D?i`%b8YQg$mg-go!6VZ-sJVB zGAUPYm_xsy9QsA&&@U;6epxy6E6Sl?RSx|cbErljUsoRehVtk)nMYA?m_xs<9QqyQ z&@sxPjuQVw0C9NM59+Nd15UO9Awa_G&c9-l`mW8*`|x^j+oA+m%NzVID=j zVGg}aIrIwU&?}YSu2N>ZTAA${WwvXT*{)M&yIz^?24%Jzl?iWRenY)McGH!w%Nhf`qA|d$8Uy@LV}KuN4De%(0k&%l@Dq&zeyTCR&ol=3 zxyAs$&=}w~jsZ|}SpRpZ{_j-%f1UMTSNf&K0B>jv@TTh8uTa_uL3QnqtZV!PSlRdqsJ4wzZ5zhghI)g#rh0R_>P_oVZ`xt+mUXRnQ*Zb! z_IbU@>rGy7_O9M=)c6%uov*6ue2rB{zwcky==~e2I^R^)`If5Aw^en%qpCATRcD;4 z&IDDRNvb+iRCT7Q>da8pnWd^TM^$H@s?Gvd9bKtLqxVIsI*F>z5{++{DXX2Mad5q| zU(`2LYYob9jmp>Sm1{OAbKa~xcZ;(2t;%+{F?Z`q-&KCPUD@^$WyMRC<1bT{yFyj& zN>#b5ROPN#mAgh&?pjs3>y+EBSEjx}ne#@~ftytQzQ^jPD}7%T@CT}ZMdj8R@Ge!uyQL`ZQ6;=rmGC}Q!uyqrA5dj^P*w3ERmF!@6(3<$)Ri`?GCrot__!+L z6RM0)DvLiQO}a(7e5N#ch=T%Q%P(6K7_4FlHQeEj~)v#Bj zI$mXEg}$Nc{E@1`k5${Yt0w$J74E013_nwy`?>1FFI4SbQ}rpSmhMo6+NpZ`IxB&$ z^h@d6H&nCVWW~T$ex+*hYt_HssB*ofI{aJJmfxvT{$5q&52}f2wL$e%wV}cqp}N|X zzG)lkO?%aww!5h}{L2%0y~*oMUT^lU-tZpLzO8RqG1p7wY*3EBSvmd|<@H;Y*KcE9 zS04MWa{KMd?UyLGU#i@GnezD+%I8-qpI;@FbG35$HOl4JDwkiUTz@(s$$H!3T? z8-0VZHSVePguPp}^Bz^rdsQ#*Q>DCL_3;5!#s^jD9#V~aSQYFMR-{mK`r|B*sj57# zdh&!S$&;!fPpLv|QB~NgdazBE;Az!>XO#V)Ro;J2WB=!s*g;<|XS&k&rI>yo#Z;7HdQ^((4k@NPrI_xL zV!B((=pI$fdsQ*-Q^mYr74rdA%m<}}9#XY@Sk>|oR?ARpcwg`_Rm{g#F`rPyd{Pzj zDOJoZs+e09 zj_n`!)2x5fG1Qxmsy7{XQ*Zbep7MH=*PFcFl&?3;(|P}9&-yp4%~xrpeziu+*JxaR zt;XxuX}o^D#?m+Feonlf)(J;_k0bR^Z_r!8d;yHsF<*cq^+z>Qze6MSJ2ghXOJnrA zHAcTjWAuBa1MZUoxL+#a0p0(3Phw=w8j(C0Z&Rf zJtgI|Me1d%bka8Ir>CW#qPF4Oisz)9o|kfZLHF`r)E&8(sG4-8m!+Iuk#c%f%4vU_ zFVH#En@*}Xop)1jx_q*7W9PnIDl00sa|S`b%57bzFJHB^zHZpY#=7ClY8$54HBMZe z)YWhAjm_Inpux@++mEIhK+})rM4HoSPNF%E<_wx%G=pgR&>Th6g60^So;3YwdeHQx zIhp1Zn$u`LOf#6~Lo{d7e2nI!Gy`cqLUTM#OPYge_y^m!SJQN+=|*!9O)Hv1Xgbog zqv=G`n&tqS_B5PPvAqpV7npvXwjax7{Tun2Y=AUTB(EKyaSek#K8Ao#s&3KxBrI|o8k>=lMCeci$ z`FENrG}qEhrTH|?G@9#Zrqlcf%?z6Vq?t)`J(|umuX(1d6nje zG(V#GG0k?GpV0i2=4UiNr}+iVYcwUA9W*;>UZ?pb%^Ngt()^0%*EGMOd5h+^Fx%RU z9X9dwQ%~L2cG|kNYnRs|xqjoa+olY8?aWc@_@NaqDSoo}sp3BtuP**m@t=$TQoN@4 zuf=~W{(JG-;-`z(75}67pT+Bo|5d!9_}|4Fi=QdpRQ#Xf{}w-6{J-Moik~ljq4>q( zmx^C5ex>-;;@65_FMgx=&EmI;-!6WqcysZV;;qHoir+2XzWL*uFWLN8oBw+ArJMg| z^WSd1Z1d%tKe73W&40J~?>Aq$`5!i4wfR&1+HUK#7|DKZU1QCv+Ld+N+STKAuB%;I zx2=lnYZ_PAtZqo^8fsS7uG!WlZme0!%CN0#6U7(0D(|I<%Du+Smyb#tv`dz(dRJVn_FYn``Linxj;LF^qH*<_forg3^{U$Xfy?UZ>sOz*x}iQ9Shs5Z z!20Ej2CmuIxNP;RlLibLJP+0)1)^Jp1MFsv}v3A|Tl@+Cym6esxR*Wij88W1@Yl|(d+LS7WRJL!krCo>1 zhn8A$@dYim=3=Q$Mf;9e-&WAhpuM1jK}SI+gU*631_uZZG^i3345|eO85}I=YH*04 zo57)i!we1=bT>FcaHPRef*uA(3yu-&=qc!BTY3xn7#u6;YtT<{oWb#e6Abzb1{e$! zoMnxwhXfxs_=w;PgO3V6W^krpNM%L)4wnxq4XqRo1M-6y zZaBhl=Sag*Ve4qaF#*RKjsx;k;|(W-trHC=1)OX+CG0%aa9Y?p-Ec<0nTE5%&a(~Y zgspQ8=Y_5F4HpDlXn0oGxyJD9u(j53QNYE9Nx(Y8C3ftNrH0EYD>`@C(y8?^wR*q0mj|JWbd!h(NPt33FJmh!~UlG1Dv|L9g0{A1eW!Jh}e zji;JT@Q-a{!9T8D9{hRmH?!a$-_C-6LWex~^Wbl0!9THs1^=W@dGP1K-^_x4awiM^ zDP8j5&x6021^-mL$6uOuU>^K=@HeyIpMIca{uzZl`19azX2CzRV8K7@pgj2V;BRKZ zKl>mH{yAOq;Ln4Q3jQ67dsy%%$K=7E2Y>Sl{!-mB z7W_+k<-wl^e=`gIrM)cpm-WemKM($97W~WmSn!|IHxK?i_?ubqujp&RUw>R4{CV&< zv*2HOoCW`?6Y}8CgTI*t|LPMg_}2``gFg@cW)}SC4zS>FI57|YJouYg@UK15g1>Qa z9{hRmH?!bhH`s!I{mFUo=fU61g8#geE%-N_ng@R#{LL)*H=b(2zv=Wm`19azX2E~{ z=@$GKd^ivOJouYg@L%|03;v7F$b&x*{$>{Z7oTClKjh4c*7}C>cIh{iw@bgFyq*7s zazOeG<$&}X$^q#&lmpUlC7{k zfb<*60qHlC1JZ9O2l#I&2l{U)2l{U)2l{U)2l{U)2l{U)2l{U)2l{U)2l{Vm2KsL( z2l{U)2l{U)2l{U)2l{U)2l{U)2l{U)2l{U)2l{U)2l{U)2l{U)2kyl;lwE^*?%JbM4!Tc(!@Oc^YCwO;XfIFl2YM6WpY0FvGC6aKa#$1!~Q?`nTkI~rtqIO zHP8Ne_HS<4e>(o;u)=@F^gR6Y@NaJ6KNEjqTj4)zW?;571Bf0s1LFKtJUN=%@Su{gfY|pYj9T zizz?Yd+zKI{`2PM*+0+zF8rHC_MbmDg#Uv1dHCny-`v7~;rtN(XD!SJKl$Ltg+GP{ z{>CS8KOFqjEDYg)c1@oB^X%`!zgY}^YHLFHFRIPMKM()r7XFKCL-;3)^YG8Zzqy5f z-Qp1bOX~8me?Ini;ols_{yUb|h45dtv~oyg`}8T__UTi;a6}t>2(B%6aZmXI(x-d@ z=~KRd^eJCJ`jjsqeaaV*KIIEYpYjEyPx%7Ur+fkFQ@()oDPKVPlrJEC$`_D6Cy~z(3^+ z^iTN${Zqa`|CBG#KjjPbPx%7eRg?%&+~geerFcT$L~W+nB+)T>5t z{Clc^K?44LNx(@0{=GfGDFXieF~Dg8{yiqZhXnllG=Pr?`1d*h9~FGe;7kD~(`eJs zN+BlG2!|VDG7WL(NJC7f(bmz1m`o!aYlz7-!tsWfOe36Vh{-g<$%eQ&DV%DEM@WRz z4RJGGIMWcxUO3wj&(8|y8Y1|G^9}L*tZ<dlW#(?V#*9Sb$a6`b2hMNMOZ+Jn# z3k@#{c(LJ-7WSHl>bI{nEZ}g%5dlXUjtV&1aE#&3v4-Qq*71fD0!}oX6mYWPlz>wW zrv;pDI3wUp!&w1m8_o$h*KnS&MQOg_g0OX=;aOp8jp5m0Ypvm;fQt>2fOUpT0xmUN z7I3-YIfgq|7}kfaD-Bl#Ty3}};JJnk0oNKf23%*jKHzzV8v<@L+!XM9!wUjlXn0Y; ziw%dg44H+& zElo9?7Pd||oDsIpG@KQ-&NiGAaIWFJu=9Mw1pyZto)vbkF+4kLtua${46Y#h8vCuIMQ%bz|n?d0**Bt7jV4cgn$zbCk32rIK^=1 zRKsau>vY2z0cRS{3OL(vPQbZ_^8(H{To7=f;aLG|49^Z&Yq%)jV#6e0o#B#zOAVI= zTyA(yz!iq|0aqHX3b@*EO~7*v8w_`@HEax9*BP!4c%I>gfEx`r1w7yIf`AtqUKH?R z!y&Et`4&n;Z5%XASXCNsI3jEvX*eq2Xu~l9#~O|cINorAu&OlCa8lSh*>Fn0sfN?S z&eIKN*w&ph4QGX&XB*B5JI^(o7q-qfToAS{G(0O{jp5m0=UT%>!s^mu!z5sx;gWz$ z4VML6Zg@_>6^8WzR~oJgxY}?{z;g{70*sSa&pzrO*88;%G#(r{G3(S~CJjx`(?aJ=D!fD;WT1)OX+CE!%UX#uAj z&ImZua8|(ChI0&e&NZADw$3+P5OAU4SpjPd&kk5?xG3Oa!z5sx;gWz$4VML6Zg@_> z6^8WzR~oJgxY}?{z;g{70z92Ic1;TU0|G}drj!10C?0!}oX6mYWPlz>wWrv;pDI3wUp!&w1m z8_o$h*Kl6I`GyM&cP=zMD{QSXJUd{m;UXb^e+`qcwa#!!*t*nkS-|Cn=LB3~SRZhu z;i`bE4c7!b*RUbrTEoVG>x4Vj2RzSkL%@x;^Csdas!Qh^UJ&p?!;5U^9Tyu8ff&W_ z?~bAE`1@O|=)PlAyNYfDwpJawwR6`kT?cQe?!EQ!o?8#;zN1A&ml-YIIG|lO>~&D- zprNh$q++*EDt7yLu?tAWE+7@VfK==PQn3q2#V#NfyMR>e0#dOHNX0H76}x~`>;h7; z3rNK-;1~@wDRu$9Y}DCX(8u6dK`M5!TPk(|sn`XiVi%B#T|g>!0jbypq+%D4id{e| zb^)o_1*BpZ;KeS`i(Q}>yFf2?fnMwaz1RhMu?zHK7wE+<(2HH57rQ_&c7a~(0=?J; zda(=iVi)MeF3^izpclJ9FLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA z3-n?a=*2G3i(Q}>yFf2?fnMwaz1RhMu?zHK7wE+<(2HH57rQ_&c7a~(0=?J;da(=i zVi)MeF3^izpclJ9FLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a z=*2G3i(Q}>yFf2?fnMwaz1RhMu?zHK7wE+<(2HH57rQ_&c7a~(0=?J;da(=iVi)Me zF3^izpclJ9FLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a=*2E@ zn50s*#4gapZgq)b7ieO)x z1)A8cE>Y|PP3%^eD0YD+cB@MiyFe4W)g_8upo!h;62&gi#BOzoVi#y)x4J~J3pBA? zU82|pn%Ko)%Fx7ab%|mZTTSd%mne3DCU&b!6uUqZyVWI%U7(5G>Jr5+(8O+aiDDOM zVz;_Pu?sY@TP?8*G_hM;g^fR+lJtfhKk_m@+i6TV0~q#a0u$)g_8u zpov|GA!s9@iCuiYh9-9L`5Kzo#pi2iVi%vUp^065zJ?}t@%b8>*v02-XkxdzM6rwO zn%KqXYiMG(T4EPlP3+?HwXG(0@%b8>*v02-Xkr(iuc3)ue7=SzcJcWdda;WOd9e%h zVi)MeF3^izpclJ9FLr@m>;g^f7D^PmKreQIUhD$B*ab@La;g^f7D^PmKoh%# z62&gi#BQNPu?sY@TPRWN0!{1|N))?56T1b8U7(5GLWyD*XkxceqSytR*e#SOc7Y~# z3nhwOpo!f=iDDOMVz*GD*ae!{EtDvBfhKkfC5m03iQPhpVi#y)w@{+k1)A6`lqhzA zCUy%Yid~?IU3|WVCUy%Yid}3qv0Ern>;g^f7D^PmKoh$KiCv(H-9m|C7ieO)P@>oc zn%Kq7Drh617rQ_cyZC%z$U4eeCy z0#dOHNX0H76}x~`>;h7;3rNK-AQiiSRO|v$u?z5G7wE+<(2HH57rQ_&c7a~(0=?J; zda(=iVi)MeF3^izpclJ9FLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA z3-n?a=*2G3i(Q}>yFf2?fnMwaz1RhMu?zHK7wE+<(2HH57rQ_&c7a~(0=?J;da(=i zVi)MeF3^izpclJ9FLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a z=*2G3i(Q}>yFf2?fnMwaz1RhMu?zHK7wE+<(2HH57rQ_&c7a~(0=?J;da(=iVi)Me zF3^izpclJ9FLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a=*2G3 zi(Q}>yFf2?fnMwaz1RhMu?zHK7wE+<(2HH57rQ_&c7bI(yC!zA)r(!A7rQ_&c7a~( z0=?J;da(=iVi)MeF3^izpclJ9FLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B z*adpA3;c`f>_QAdgyB`a@15O(#4gTUwzCT{WY_g#7dv~g3-n?a=*2G3i(Q}>yFf2? zfhKk_Shnk$*u`Mk(8O+4Dbv|Cv5RB9*adpA3-n?aShll^!LnV*#4f~;p%=S2*2FGu zW;k>m1^$^kySQ0p zZ%|?vcY1c$*~QHa+u4g|(3$>;ipf z7w9{?K;PK~`pz!UcXolkvkUZ{U7+vm0{_fn7oB_ahVSg+W%$l6@I6ms4xL?`%6E2w zzOxG~D|W53i>)ShtJK*A`pz!UcXolkvkSD&F2s=ONZ;AT*0N&PI=k3vo!u&Rc7eXL z3-p~`pmlbu)Y%34&Mwe8yXgGc%dpOFl{&lF>N~r@vSJsVKRedMZk0N_*m+OHu61^? z^PY%Z>+E7@-`NHF&Mwe*c7eXL3oI*kt+R`**4h0Nv1^@OZ1tU8pzrJgePXkWOO; zq|=xI=`?0Q+Svu9on1iM*#)GXT|nB|1*Dx_K-$>_q@7(r+Svu9on3(M>;ipf7w9{? zK;PK~`pz!UcXolkvkUZ{U7#1cK;PK~`pz!UcXolkvkUZ{U7+vm0)1x}=sUYW-`NHF z&Mwe*c7eXL3-p~`pzrJgeP;ipf7w9{?K;PK~`pz!Ui(R1a>;ipf7w9{?K;PK~`pz!U zcXolkvkUZ{U7+vm0)1x}=sUYW-`NHF&Mwe*c7eXL3-p~`pzrJgeP;ipf7wE+<(06u$ zzOxJTon4^s>;ipf7w9{?K;PK~`pz!UcXolkvkUZ{U7+vm0)1x}=sUYW-`NHF&Mwe* zc7eXL3$)HI22+>>3pBBd!IYtOcF{R7w9YQXkfHDF;#d>A7);q#6T9dP8CqwzplQt5 z**d!zEZbJ=>|z?Ep>=jK4bsp$yXgEGT4xv2APudvi_V{+b#^fg($G4)7)%*jXBUGh zL+k8f8l<6hcF{R7w9YQ3$r)N_7t`bnt+R{HpP_YjF<3UV&Mv0O8CqwzplQr_`zCfV zShlU!*~K(DL+k8fnw+8U?BZAxyXXwrRujAE{27|qwP$v*vlqKSFLr@m>;nBXW}p|l zKreQIUhD$B*adpA3-n?a=*2G3i(Q}>yFf2?fnMwaeP|&a_p^07GtTHsQi&(Op!I)8>HcJUa3p>=lg7=odRT|9+Du*8Z+L4@9Y9i?BX#5+gV~4cP}`N8CxZGKT)k| z%s>;n_&_A==8xxd|<}~IbPTE>^q^2>Sw(B(JBe2(@oW|TM z6}!DsvD?dwT|g>!0jbypq+%D4id{e|b^)o_1*BpZkcwSEDs};>*af6w7m$iwKq__t zsn`XiVi%B#T|g>!0jbypq+%D4id{e|b^)o_1*BpZkcwSEDs};>*af6w7m$iwfET+! zFLr@m>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a=*2G3i(Q}>yFf2? zfnMwaz1RhMu?zHK7wE+<(2HH57rQ_&c7a~(0=?J;da(=iVi)MeF3^izpclJ9FLr@m z>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a=*2G3i(Q}>yFf2?fnMwa zz1RhMu?zHK7wE+<(2HH57rQ_&c7a~(0=?J;da(=iVi)MeF3^izpclJ9FLr@m>;k>m z1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a=*2G3i(Q}>yFf2?fnMwaz1RhM zu?zHK7wE+<(2HH57rQ_&c7a~(0=?J;da(=iVi)MeF3^izpclJ9KaCmaJG($XjTz{t zF#}EPT4xvNJG(&N*#-J(%s@Yl8E9hHp4kQZY0N-BjTz{tF$4WHW}u(O4D{2Ofqoh@ z(8R7ivkUaon1Oy8Gtf_C2AbHlXLf-mcI}y6pr6JJ^wXGuzOxJT)0lyN8Z*$uu61^S zzOxJTon4^s>;k>m1$way^kNt2#V*i`U7#1cKreQIUhD$B*adpA3-n?a=*2G3i(Q}> zyFf2?fnMwaP3+=k29zSu#4c`T7@F9{%?v{mySSNQXkr&PGYn1a+B9aI%EYcsV+NYo z#mx-c*~G3*W5!k!ySSNQTTSd1^aWMeYGM~RGi+Awe?AkNCK;PK~ z`pz!U#I8NF3-p~`pov|3W*2B;*Phu0n%K2z%s}7S1)A8kXLf-mcI}y6pov|3W*2B; zw@P9cXkynoyFlOB1)A8clGp{B*tO0s(06u$*4eF+*aiB|F3`komBcR4#BP~)g3R5&m2Cy`Szp^h9yd_X+l2e_!~~gPV(ro+@%huDGUXU-8D`;-cyz*NT5#>nDp{ z8_~9+?L^y)mbfCcmbwnmj-s8UrnBpUny#`v3^+C#KV>U)az;+8m0Z)xcxb$zAW zMauo8*Zxu-AmxFggG2|*me)ynh-@=d%B|)2!=z@olt)mX9FaYxz4qRX1DQjM3-BSl-g0U-DpvZE?dV*Ycjg5pD6X^a*Rn5TtYtdyn z^e#u9j4o@&NX*8{@si$Uze(@1#=Ohkr%0ryN)OXGR*7yGi7jKS?oE2PokW*=TV`O{ zqRS(c$XS<4ugT27@#gm~TP-u7AMq~T)<;I!S9-;WP}5KPw#>j|T4rF`yvu!)nSreq zU6w=dl1IuhM#(WoizcJX5ssH_EHkiXqKu|o>MgoFcG9~Tx6cf%kr^0c%L-v;XfM&_ zSlUQ`ZRK^f=~DySF`0K+Zbgi7u&+^lH&%O+WEfuITc7@<*5ZCcT?Gy4-HG9CeJSMVGIgd6(r0(mGLI!K8QD zL(;pb@p;!G8vbinwNi;L`%XreHTk2<*3L4P%Vh?R>(c0QZ;LMDXPJT9CcVp=WOV60 z^Dg_b=yJ;uj7tvhvdy9!dYAR%B@b9;V2?Iu;FgvdI7-XA+$OxLX;d}uT7)gS9sj`I z zOyg_O?G$*Idt2V+$dle>tIf!G%xmLa9>?apJi_Io%WbYKx{THsiDEJ{u-?4O(d5qz zY_%B~#)0T+-ql%IoOR>8+gYN^BP27!i=)dLi!RGo9$oHjnSteN;a&EV&%121s~XD| zU6#koI{;BaIhS`?KUrF*h+1?}pYX2bgrs-7{(&;GE->biT`$mS5G__YmpNqRS}QjEsHe zo9}YFTvs*rXnB|AWOV7^{FwoL{%+1-`JhPdh{Md#Q=+SL2CA(<@@TnMAbA$eTO-rx z^338@98z)xk~PU08Eb5fjAipK%eKzI(c#V$YSCpmTxa0X&AV)~6-f4y^e+3tDk5}( zsNGGlev-`KY`)7HyA#Ith%VP2c?Zltyq~Z*n|FH!(dChC1(Ksnu0XQ2`^bpRyF9DrMVDLVUuR%zKJPLrc2#3}tc)PJM#lPNblIatmuF%3YOJ?4GTuY* z4_6tuMrLzfA6=fa#FzWqjF)9wX<)fT-jAiCEsrl>r#QZ(WPEvq{P)6aHTQDg{JDW! z=8G@eEWRu!-OG3-?cx~wtpa$oZ<_YI@VS0`6=xt&Fq+axmsTW$TEWt)?+oQy7NB)U3lU}oUV z!F+7q?Jv>g-j*3S{`^-pwwiZY?kcZqH}O|4?{b^?szyp))p%sf3~bH+sW4+PM2?dy zx{UOTuWIbkJ{4v;`PmO^EV?XPX5g4|Wd?3zD-9@1bTzJ=>oUHYgX62(0EsU5v*_|H z%)2cAe)Db^T^_A@YmnS4xzeD~MGu!*;pH*xs>ZXnPbXNPj4o@;yWG-N8hE5!c{iT# z#?c)p(PdA`=&~lc!poW~osnT*9LJt$U{97AIBxSU>n|5wZe!l%zLptSe`QxS_5#mA zExIh*jEt{i^VT3^=f=?;6nK}%vHJ;@llK!mW=o>W9(u|*V|`GpKjDuRSlqns7$OeJt;?N4pp1cKP!z_p+-Rx3v2S9?3pgWBrTgyUYo^ zvT5eEygRtr-sKou5?zkeRvNHx;9d4)-sM)8^DfWFqRZ`bd6(Pd^R7mhdnP}fV2ypU z#r+naY;Z}VN&Ti!)I@~-7sjp>W8YS+Cey6nTQYV7;k=UqCXdC}!q^3QkKdi9xs zqe|u1tBV{{_E^F*LJ@!6M-Wj=~%VSt{xmWUDjjhwTFQOaIa`m3=(&!G8=yHU=&lwrU zD4BuBvCP0SMgzUvRgK%&RgH16s~YQHI`1+zqvRN)MVt4zCHu{vciEb2zH7Oc|5|1k zF45&E+Q@5ZGcvwH$r%~X%Q6FxaJ89%ec-i++Kh~&NakH`lgzssU5*Y}4r$7?yik&YvCFOLA7m8p{rR<&yVnY_;sbh%&~O8LVX4VWdQtW3%Y8Y|&*oS9Dq5 zS=`-K-lN^5oa@TQEnh0SY;Rt48KdO=+KZ!$-V(Di_MSiYa(}y{U=(du#=Vkv6s)ne z2A1u9&7x}m+C7Cuca%hz$4N$)HObt|Ud_8KH_y8qb-cz)N~_*>W#O zWZ8j{PG$$zgx=+zb~ntjeRj#?jg_lhu20w4nm_ll)js{fXfSV}bM>#SlxdtTx}zn! z+%FkjjyC^F4$riC(Pckzba|e+qRV=l^RjHw<=z%u)?0LW{A6@_1}`05?r&E%mh<0H z@Tj@G%X)hf5W8lzoE&z%NmO=%gMZp znuK@F!^zArE{}Kl+9zjaeEqJ}yVy7IE_<@OVMfKg%W~4Ytg*}xdYARdyJ6OZ-eo+@ zyF8w)HE_GJ@*c9xz%5%IUG$0Q(zRS`NX9ny?)V_OJWleCg5%1S8Cak6E=O&12DX;T zd;Zc-E_npY3@qo$46L`j%U&(ItWRbJ)+D_v=ZrJDUgj{#=yL1d=lvQpuSMCeY8`^; z@?7kh21cm8M98Ac8e1phmdWUH>=s>?b4Qo{v$Y2Hk&G^D%)8vu*2!45&xJXP{C5H9Y|)(!S z$1zUgdUes|oWXp{HD1fW7Txk7x*UZ?m$6CSO>jgOUAA5>GiY?#=cV^*tg|~|_G)(% zthda-y=@heWm_lXHkKJ!w!F)J!mAqD@-DYaezwLQuP(ai(_hsr!nyM9q#(LHraj-! z*Zx|}$at35az@7fa?Qv%_7QYrj?BQe(c;vX`>HlsqRZo7ZobR&YPokW7hU?wW@H@2 zbQ z=yHVSU5zelN@UhsD%w$I>A5~z;~6ApWIXpv??fQva16Pk%d>cy zqAR}TNbOF7<#rMm%L*J#uHTHq(c5RjEGK=-8uKmsl*qC!*Ih7=&|hMj%nGbG-?D6X z68R#F{u4Qu$FtAXSWbTO!&lT{+P6Vuc_dq3U^&+vFzcI_5xAvA7EuWz%a){P z8L8&|q$T&Ys~O9d5m?SQ6QiFkBXGNy)3fx0Wdk1DJj=4p6S$47EwH|M*??zt=^X^? zEVAs$e%goiNzbx1nGLv&&B9o=$Z~Yya}31%@ML{aHuK`>l5+z( zAzwCNo82{VPs;{8hF!r}Z$JCTBV8`C*dCF!Rq{(?do3f&(X=eG+`}Tvb5BN=trl5E zz&y(c43&9UGP2wzj4atatC6K9Kbhn)t~9dfEr@LMJj*fJ6^!NN6^x_FFU*<(wxK^)oe ze#{~qdzSsCSFn~u77_bhp0#-LU;XSijcl9^TI$(+k)?yX=w}Xc1xr19ts+a$`cHE- zz8m@bUyIz0$O;`qTZ?uP9V6OG^d`}pMcauE5gqSt!M@X^JVLZwYWhfdxad$Sj?+(Q zlxQ!}o}!~g$B9l9Z7bSew7uwL(OX4t6Kx|pNOX$39izB|D*3ilc&g|G(K|)&5*;8q zNp!mC^`d2>y+yAR9VyyLw6B|iV{{XpNtGjY6fP0%E;?AWhv+QPuA-f#m)W9oM2CqE z6dfx%S9G46k0UK`3!#hLVt=G1ZYg+~TMk{}Rzg>~)zCF=Ep(k*58dE4LN~e1&@FB& zw8CwJR=Vxb9nL|k+)n5&w;NjR_CWW#8t6W^-yf;g)qxMVdT4`dgdTK1E-M!F<+%D)s zcLuuHJq+FIjzG7$`=Q%iCDgfUXq`I=t#^+=?{UYV_qiR=2i!jB!|p-oqwXPpq{rMT z@T=Tu=&Rjv=xf~L&?jW1uN8e#^mU@I7kz_!3fsKVJq>-6dj|Su_ZH||-P@pVcL$;G zaPNe^%RTFl^qhM)_&x5u(D%9bLqFi2hknp~2>N07DD)%lqtK7Jk3&DUsaigG*yV3qg7u*)`MK=ceBewwhV>cH16E_a}lp7Cy zTIO`mxCtn~#Z831&6Pvn=_Wy+b(5j*c2l75byK15cL$))yPrZoB6`g0znBsH2S5@!dRZ}(dXk*o^-IevL zsv4Knx~iJlI7&}S z8D%`B3uO|eJEb3G6y;9Jb(9+^6DXyWZj?JHT`8R?V<{6UJt(~>Z76q9dQ|tLn%`z*HhY27}fJ5DK}GYqufsUUr0SiST85> zTb3ArdI`#JSYn{+xp6&5ST7y?nkDv9KbBR8ZDX>L_a|2Po?(pQo&+e1Y;Ol#P@xQZ`XGQ?^jHQ7S3hDLW|jl%13Y z$}UPHWjCdo@)wkYl&?|_Q4Uj%P>xcLQNBhwPB}q2NjXJ1O}U%$*OYrG-=f@0`8MS~ z%HL4#r~EDD0m_4v?@%71{2k>CHR8!7)nd7ARCls8fSjq(iT-zjgV{0HSN zl=GCgQvQ?jHp+id-cI>%$~!3Uq`Zsr1In|M=O{mO<{*>}1%AZlbO!*(mpHsd<`8wqWgdt!4@Q}XqRg2n^Kg`TB+5J*Wgd$%uZl9Sjxw)_GLJ`@C!)-2 zqs)_0=5y(VgUJZgF(YI<$d^kmfZx~S>(QPUfurl+E&H%3iQM@?^vnw}Zc z{#>UWxYjgOHCF7e+*ft3q^5HJu7j1ks?K$1eMMt!MQy#Ss;}5rS$D3BHCF87h3Q=H z#-nxBJ1T1`>S`OR8>Y}oEcQdeKQy{f*xHD1DVU02Vav7ln{jHUA` zmMoh+XYslIcugztnpQ}|tobumR;*rDv25k+IV;cgNVLiJ?<=BXihg;pd`$y}QNFjb zzH?Yl9~%JSJ&4SO4F>&olUQoFyhrhIo*O-=3L+WHz-UbX*Fc}?~9^17pqyKDDP zoj7?)InJ?aLS5yKy$DZ3IZmP6pF+7mg>uHH5muA%OsqTl%aYqsJXlk8XMGP?4*wT5 zd>h#=+q$^8_`5}Ovt6c7FD`3!woTh?(e&byc4tdU&rHs?W-%)1aArofEsNQ9MWr19 z?FCATN;_bqQh^TI(ovw3LT7<43S9-dDRdX;p-?8!Q=ykYZ-qVreHHo%^j8=lFi>HT zz+i>z1coRK6&NOPVYt8uZMj}xq{1kH(F$V(#_Gw96Bw^869gtIlnYE!m@F_wVXDA1 zg&PEJRJcjtW`$b>Zq?)5CUCp9+#ztMw%jE!y;z%O6bsJuI7@N1;>9_NbA9VP#rYl= zC@%E4NO7^pC5lUdd{vhzF88e~6jyp&rMTMT8pXAK-*t-Xed`9rjUG2CZuYoEajVA) z#cdud6}Nlbq3AqTDehFfuuE}waZ%?kXFGLH{NJ(DS^OVVUOcT^w-)1PXSXV9+n(Mp zjlEwQd%raFJ|Ol!Aoe~W_C6r?J|Ol!Aoe~W_C6r?J|Ol!Aoe~W_C6r?J|Ol!Aoe~W z_C6r?J|Ol!Aoe~W_C6r?J|Ol!Aoe~W_C6r?J|Ol!Aoe~W_C6r?J|OfyF!Vk!^gb~3 zJ}~q?F!Vk!^gb~3J}~q?F!Vk!^gb~3J}~q?F!Vk!^gb~3J}~q?F!Vk!^gb~3KClJe z$JTRNsrl!&NzFeai^PwZq~@0}yzzpy0D{AuQo zr~J48hUN!`<_Cu62ZrVchUN!`<_Cu62ZrVchUN!`<_Cu62ZrVcw!r+@dQpj*e{qM@ z{Hgg1%=}9_sQH(6O3j~|zrf7Dtdp95d6(4usrd`c{3~>gKfAJ9YW~#x1!n$L-8A#B z?va{5HGhGbe@zcH|Jt6Z`BU>3nEBWBRP(Rzoti&2e}S2QLvJMNsfvNdZ^B0);D+a3hw+&9spPIkG%wIWJ&A)v}YW~#xg=PK= zJBFzF-LTaBsrd`b{Mo8uYW|%gQuC+gFEI1(8lmRjJu)?aYW@Nr~ zVE8;gum#WaW9z-6)%-PM)6Ab{{sPPV`^KvI_m5A_pPIkG%wIcR&0jY$HGgXU0yF=C ziE94(NvZi$^B0);8z!mw8>gh^Pt9Lo=07+^&3|ZGYW~#x1!n%k)71P&ZcNRen!muz zfAmH*|FN6Xb$&5FmVeWA{sLL&KYp{C|HQ3n=1((!fo1-ax2pM1-JWLtH1o&i#|7|} z{|WEu+tvKj?@BX&n)ze%-{fZ^i}z!p5-fURfTrRJYGqd0Yc>iznV^LU-8NR;v9U%huDAaoYelQ{qapFg=GKiJba~%*nj@K)c&dc3(fuu@D)yC|Ah-u z`=|CVH2W{YSC)zW7cWZfpW46B?7swG(I@s_x&-!5zoRJqW=5O)7sR6fGJGYa*nj!5 zH2bI7ztFP(3Va2t*nj1U)c&dc3(fwk@Rh@2|JAEf`=|CVH2bf?S8R*@*RDzD{%Zg9 zQP0BpR`zxHN_nyW`gLjcPqTlaW&aK9y!|(BNbR56ztHTzX@j@_=1r;nQ~MX1{kLrL z_TRcCwSQ{=LbHFx7H|J;6{-DG`xl!1D=WPHw^ye2Pwii5_TN$I?eBJ^_D}6!X!ft# z;qAY(Dz$%V{{plBgPHnkMU^)^oGYx(Sm3e2TNBmG8 zakk<`{E!lHu5ZN;Z4l>s#6#@Fg&y%xFLAL)Jmg4R3QYZ;=69Mc_4_OEw>YHvUGiM~ z%i56i()^Bx9GU%7zfaDl^Yg0mSPwfOvfd5U?{Gk|z~ z1`w~$0OIu-K)gN!h}UNT@%juPp3eZ{`3xYwUj@YXtAO}^6%gOA0^<8sKzzRni0@Yc z@%<_wzF!4|_p8A0eiazruL8sSRbY6(3JmX8f#LlsFuY#{hJFWz^BG|HTiAeMeg}rX zg$)?~7B*n`TiAf%Z(#$5zl9AL{uVZ1_*>Y3;csCBw&1t0VQc31)bFX^k>BBl!ti^# z9vS#OyP}&SzkWcs>J&=QDtKJ_Cs7Gk|zL1BmA{fOtLwi03nacs>J&=QDtK zJ_Cs7Gk|zL1BmA{fOtLwi03nacs>J&=QDtKJ_Cs7Gk|zL1BmA{fOtLwi03nacs>J& z=QDtKJ_88nGr({@0}SUgz;HeT4Cgbza6SVJ=QF@?J_8K%J20Hj0K@qVFr3c-!}$y_ zoX-Hm`3x|e&j7>u3^1I}0K@qVFr3c-TQHx&*6ICfdcRs|_p9lACe7~!vOaV1^hte^ z=I*Z9mD5|zXfwFg**0zOZpgM~F_L0i7O_^-wjJu*3zR673UpBDD9}lvvp^Sxt^(Z@ zx(oDBC==+Z&`Y2HTz+i>z1coRK6&NOPVYt8uZMj}x zq{1kH(F$V(`1SA@!8ieaT{d8X0KYyMP%gl)Qw2;G;MYq6rV8-u_5e2s@ax9_HwobD zmCl%xwg> zC}M6SSfPlyjbNoB<~D*m6fw6EtWw0>hInz8BIY*ITCKRp<6gxYkNXt&d#qKg^LRk9 z-eZGeqsN1ahddruJmT@F;xUiM6;F6Psd&ocX~pTSbj&m4-G>R6;w;749_J{|^*B#) zzT(9NiVJ<~BE`iXmnbgvxJ+@m#}$ezJ+4w*E!Zl%MsclgU8lI-;|9fz9ycj&_P9lH ztH%n(Z5}HXw|m^7=sZ>_?)11zakpTrY_;MZ#fy6tYy8Ih6!&|qRjl)PK(XFqgJPq{ zgNlbd9#%Z!@u=c4kH-~Hcs!|i%HwIp>8<_iD=9TQ)8j0~*@CUIa}?)#oToV7;{wHn zz>+g%*+q(r1$$gvqPWzzE>m3YafRYakE;|{>%Q4FifeuAI>q%KHz;oO8*ftF>|3`e zZuPAdirYL^DsK02~dYq>?-{S(s zg&r3vE*9*OU817y)>VqD6)&z)T9vc)J1-oYtDjw3- zi-#4D_>GS$9`kry@r1{dil;oDR-BHRZONG)*%|Hh{p)d-;%q^@zKU~w>paEzzIB1( zLf^Vbak0lGic1B{vda{g`_>hTD?P4KTm3YafRYa!S2~rimN@YQC#acUZ=R;;|9fz9ycj&R=l`HajRfi zwnA~6$4bTRe%~F6&SRD0PLI13cYCZ>+~aYtVvWariu*m*D%N>Cpjhv*L9x-}LBR`$ z1k19A6_0p4sv938K3tYPu6V-ZNySsT@rBch({VG3NzsKFC4B#Wv#9@txg|xt$G_0M s{|lYV&i0;kwrto71BSoQXW)faMP1gk`AOH3-mSh>)T6#zaZ%C#0fYdc`v3p{ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc deleted file mode 100644 index 44cec8b16c5f7fa3a9ab3bfd6b9059869d01509e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77534 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc deleted file mode 100644 index 221c874b57e169a3b9970a2ef76974267c7809ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7200 zcmd^?Piz#|9mn77KhLgrz3W}u*ajN|#`Zek1p;YGT?n#6q9~XWLn^Hjjh3CUG3*~_ zW=!$cv{s806D5L5so>B9haQMfd(NSis-7bC!j@FFMpUJ0+RC?02u+kzzrQ!X*)@($ z$t9PLvoSrKZP6pyxZa#i z=+SKJv@pWIQ2y`#BKQX1#@}Y&x*6kt8-E*(AH~@87h9K8S<5DW@lDFtwtt#7)PAF9 z^2*5JaRN+#-o5wS-u*Yty=V3Md2TQF%Gc)Jm|p(Bo}XOQhT1>LyLJp>&;K+zdDpk2 zF{%71{(ck6CiPf0nh!(eNN!j8OwHpXG$~W(yBsb ziW3_u>{ z$TrnWgKJ7vJ!FK9h|xUd>q1NPi%tdfrYiv)SXe-CsNndLxTItglOi2)T2AEhua%3r zk{ftV$TaLZvy`W>^ezfH`g=Hq=sLssfx?59o zzS*m3R>VX)}Ft#9$Gi9RW9WUnR7;=Q2tTbEa(}dbTLzyIh&cCx6hSJ&yMUrkg;ZLWAAJ(e<3$*See3 z&#rqG!RUs6|EyFL?5;mp#p`(1l)=c--%mR`A^+I`Dj9vrO>j{a`GI{5NO zuT%$Kucm&uG`wAWOTXuDRqTDhxs)tW@CbvfEw zjrQKO??wA>E7fQk`AYxD()eGZJ8E%^R!cTIe0^omYLpTBFMy0tn<5t z%DiINV+RpZ-@+P=*G4(w5%F#MbYH1|tc>p{~pjlHZiPZJ+<+g!p+rYiV;8L&_5{dTf z_B#uo`b8}9Alb2;?5`&KZ=I?p2XFT;506%dM?XAO9X|Sp{_61YYV!C;yQ{4y5kleA z=MmA-b+h}{bj0SeJQdM??Rl(uu1z&+72ett@K-gwq*QPh-g}|tj`sQ zqnh^CT(02O$YWR@I*y978Rxw{kI!bC<^UvSni7g7CrBHo<%B8AnPzU@{mjqFx~W1r zXPdN*;OB?C9`pFYplNBv+=f!QZ@=IkWv#e3DZ%zBtOAlRuZTy!K(PH$G#u=#b%;<) z&8GyrZ{|M}$R7H=0=%$WmAtu&s*?4pWG&Q;4rgv1x}Cne>)C40!J0t9hua=fR_ksF zcHatqA&|*WB!{0!w>u$weir{$m^A(FYsUDva(}0oboM(zqcm5v-1pr<1^zSR$K_G( z_>WDFQ8I~S>~%^`(k;;>=;ZjgnIZRHN=7J=uisBZN3Z-OU#X++ok^2 z&95lR7e|D${hwm!uVVXycw#a7Ak?(zUwPUj8e0t45<5D5D}kn(pYm|j&0AXCJk{am zom<_!r_arI?soIRVVOTb{~-E5K!2H|zs%8J=IAeT^p`pM%N+eF$J_e}W}?+%Z44R|#4j7uu{!sJs0d`$2$!N&w26MRhYF~KJ(LcV75Maahl9}|2` z@G-&11RoQ8lA`2`kuOR;FHuszBu_>$j1a96MRhYF~P?K9}|3% z669+oUxIv0@G-&11RoQ8Oz<(mCn-t36#0_mV}g$fJ|_5>;A4W12|h_}v zV}g$fJ|_5>;A4VMQV03AkgtP$Oz<(m#{?e}d`$2$!6&Jcd|l-0Bp(xeOz<(m#{?e} zd`$33>L%Y-@^zDs2|gzHnBZfAj|n~|_#|y3Uk~}Vk&g*JCis}(V}g$fJ|_4i^^$Kp z`FhF61RoQ8Oz<(m#{?e}e3JUew}X6rCf_sU8zvtUd`$2$!N&w26MRhYN!mlcz2w_N zJ|_5>;A4W12|gzHnBbE%LcR?7M##qm9}|2`@G-&11RoQ8lJ=2rKl%2Nj|n~|_?X~h zf{zJ4Cio;BAm6j(J3u}r_?X~hf{zJ4Cis}(lXQ@Lhsbx3d`$2$!N&w26MRhYF~KM4 zIr4pne9w`O2|gzHnBZfAj|n~|_#{0~zVDLndGayA#{?e}d`$2$!N&xjq{HO<9{CQF zj|n~|_?X~hf{zJ4Cio;A4W1 z2|gzHnBbH2fkM_BA+Ph$GoMPnE81!kN^^(ru1J2~dr0ZN M{^lcrO#bTpFQ_+%?f?J) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc deleted file mode 100644 index 676539b2aea4a66588f7bb7a0f65c5384f94cf5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3921 zcmahMT})fo`P}P!%{8{MLrg;;1t$?v+y*QlKh6KLK!Glp6-+mIjjk@f*I?owcJ6gr zkW)olq(PM`KiWhpRT__-vWM}K{I-dZf8(Muyz6J1D=v=9^0VoVf>F6xey zBQ3=w4ofLH?Tk4&ETc?2SoA)+_jAi82W?>kC&#Juya zP~#I^ghZx{%~{E8MoTeyG6TR90rv&gdT~ah14+}O$*CMtTmYJRGid_Oi?|8H`Z>)` z85A~}FJ|>*W_rTXEMruQ&m=QO$ibQ}X_@JqHf_9_Oj!nHo-&G)F%O=u9Ez7jE6rQF zxC-mvfi?^h6Lb<2bs^?3q*<=T>H~x%1YI;F-JwefX%ScQ4R6e;H*(l{!xL-J8w|y8 z8I1{XFC5h!hC3nY$_**z0oa=mbr--*i{yPF=9?fPH+y9?m$H&Sowtk~uU!Z>24U1k zaujo?;N5DX^k^qFtQ^fm;$oG=XbJr1*8YRAOsp;Bl9(qSfd=xzpN0Eq3m9Nqk|*jG z2fiv>lMu^QqJme6l@mZ+(IS~AAx9)6P;fc&w8SIiWU`r?1DhzSn#?3ERb?%Dm9bR~ zt-SyQt~fWXYNnZM3Y4Kys?D=THKm!B8V5fBLrbQSN^t(nrK)j2nW}1{fWhGP@81hg zng%t)S2U_+dZuPHE2)JC4D*VWoeP5uCVF3Z#z>{I?`3I94;z`Q;Z$-eJU4I6WHbFe zy?tRbX&K#fTKo!llNp{%&V|*hMn=!lFp8iXRyaL{kZD+R+$nqJ=IL$_V4<_VrFtsw zejSL+9+Da7Dq-Gr48jk@x1NZTwu37}>upCCrH_11 z;RK17?SnA4C$}ksMU72`l1=Y(LbPX|%u3}&)rYp#-=E#G^)~SiUe4|P3dDKU+5cf) zRlc<4eKo!$M(8fMB;=&c@L@7FKd;b6`c0K6cTAG!WeHR`d#okZNrUMVOrSt z61#AAy?Ep;m?}nD^4|0n-M(ArK0H_S_-{p)A_Y&-_5?RP2VlG4?pkwq0ixhJWP1)3 zJV$KLkqu8zwZUjRuwx3kunI|SM>sYBikof?=4CVvY}AhH;#=f5V9436Fx;jn;jFEY z%Wo-ffZP@?A1CBpICV|D=BUqm7A2?|c}FFfuSt2yQYz?r>F>&6Q0oZr_Ef00zq7t= zxB}_;4u55}{e@jLYR$-t_sh;I5DRV0$1EDUW`L_~Ng$BS7dzxe+t&;(_ns=A`)UYa zS;O=04xSw^(j!k(xcS9PG`;`D6O~Z9Cg(+6()Mh%k9@ ze0*%2IaAr`X{eX7ZcOE-nWtQh)Qpxkn1USvc0$yRN1Tzds5&~xoFzWYITD?~wesfJ zWMn`ci86U2dSN`uc265nWOI}nnNqP$85y2inUpXL9f~;0!CV7_(ZP$+k;oA9O=m6D z$YgWVGpepx8f)S#vYA9uH!^X9HBStWjYls|M%C!>_#iAU4L~aAi5i262}vfQM&JeI z!q2Zz@I5MAZ(>cs4k#EbWpgy#Li+R=nE5+S` zd&1r0#ZdR{f#tC~V=EWzz#)Elj~(bK1p4hj|7Qb#9sA4JgJ1qL5P6JZRbhrdfBV6% zzfC@P`{Ay?Pp%&Q*+U?DXETH^-#kJ(4y{am{O+Q3%eUmaC)i5cV<>>9mQH=Ludp|4 z?+vfH!&~|*_)glslN-L%poxP2pzS}n?(h0kDjYsrz;!Zn#`7$02 z!NeV_#*wO2^M>tvW8HUZRXN4q3j$zCjD-By{bGDV_uHtd>8zehA?#7rU+1(`8PlMu zdN!`A6x(bjMaCk7ytCwO48_98WDFRy)cIh5Q;Z2FCsJ9>qWB=@Ew{yS=yFvRp3R#g zeD+UDQRKyAIAI1e-+}478{`{Nl$A||93K!0$A;}=!`~1|?p}#(;^$%XIewmdoO1W3 z|A5?fZ*t|>r=it@{r0OzHwkQfzV9i1HirdKKD{D;OW?ybz%Pn~nwZm?pM#%Z6fItQ zil6t>Rlfu%#yj)wXs#)?E3CPcAb1K&mwxn7>{6JF+0x|t;wh3RJ$~n(Na=oT1-@6# zlr(;h4#5(2VPXN@bO?g*?HM8*{0}+)B{}>h>HCVDwaM9M&XdCFdzYUR_;5D=2Z8oX AeEaAz@AxaTAIz*9 zf^z5~5{W{^3H640Md1%Y;?hb;piv?YaN!mdTB@FynO!>}9yKh%fk4_LRgLp7v+#8Hsg#(J$F02r^&^c*YL! zOr#trNqqL~)RdgJ{I+wbdK%-x#?Qcio^f za69Nu56AMDetW&PvO3xz+)qCJpS$+i$TgN07p~1OjC_6N{_=;5BUfvzeB3zo*4OS_ zPrOztubf6&-{S7qTx|qw=m9%}ls>P^`O$_RM2eU3ly-I(a4)-K+UhR&656>2sHkl6 z-eRqBCTpf+o}|;38L}Kf@qh&NR_4sbq7j6oCoj194n79)XmKyI4Ic3jx8aZQKnTqT z1o1FvaF9?S&Zpp%DULDv7-NnxlVi-(7&9}*l+H7q;x=$b@7o6b*M>Vz=V9y+Y=KIq zUV-ESU#yr+rGp3&R&bnN(2E_1h%kvEj7XCRy@;p{5jqed9TC|Q@j{l5WDioN5=2p4 zQCOBD+?JQKqT{r%OR3{faqRNthp#rRb&3eJHeBKcbIqxxBjbeM3o3abap3yMahT>fe&`Lb zz=q>|F>rCRLUMd7%hvDLZ_9|8nM&B=iZ~9hTA6R4qBn05QDq`pNSb%V!c}fw?ttH_ zwO^~t&#KFR15+(MsUM5!r?r2@Bq{Rx@L0WaiD^y#GfAY9^<~pSNM6n}8j>tO!Sq(d ze<|r!(GN^T!N8|U+&UVx`l;r!d6-}}NV;D%k!0e{lo5Tzj80ShSW-%~8`Jw?*KMYZ z>@$t_do(3PZ!&EVx38y!>{ubh46$s(;n*hFf1Qw3K g)g$nRv>fo~EorYDfh+&yCSd95?Ay-)pXIgx0T~H`oB#j- diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc deleted file mode 100644 index ac91d154b19ac476cdce9ca653b7a6ef3b2b0512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38663 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc deleted file mode 100644 index ec4f95a47e06d4c00a1c34d4bd0985f3425074e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6405 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc deleted file mode 100644 index dd58ecdfb3d915552c4663b66bcb92c92a2d7fcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4513 zcmbUlZA=^4@$K4c)?iozCgvjn6G9Rv7hJw_*IaTW2Q(iI&|q_|tgBYWyMT$krf-*P zKu#2$A{C@uL#kFJ(y2%Pv_$ET+^?oTDy9EU>K`_wwYws^NWK2xA1X-BqA|Ml47C^LnKym zB-xZB>M(I<(wX9-oQZQuSE?*pmg1wl*>@$~sq$#KiI*iSQl6;C#Q9`psw!H=5SE-J zlKTdc%4N@ehqY!@n5zhSHn9_A3~o$Gq?Jv^>eYuYoDUBqRE;LaXEh+4QDVtCHK77$ zO@CTSD3f6=rpZIG_*6oXgRJ4nqvo*T`5sM=+e|R07UlJ)6-~aP6^Yt2G@H~C@6Ks* z|5S{IWeumv6ed*S1Tj1$4vh>9UW{8BTdgzS*}ewIPrzt0i82z2vXXm&OfV9A!xMGn zaR=Z|nUfgVHNi^G8_xUr$ZQ9XJl&d zqL@$;nkZ6~PjO+x9XCBdR8tfcHtM7zPZ4A2D)Ta>ZlrnR)~OeU4UWpHtleV`rz$5W z47Vu8lQC5lMU{mKf$Lw<(3mPyHFP;fV@k*PR7^|6LIbjTSxe7^KqoZ~D}<)xWHSBZ zG)+n&S@|H8OpJ$S=CrA_(%sS76;czLd~7BbzZ{#C)zD00CM13!D^i+<;^1kLtcBF+ zggRroTgS{Ct%0TIO)s_1vcul?At0#VhUUxbWP`6HBi4>on!_@T+0nKs&_dGAXf?l2Fh1KFCPu{XU~c~gK5W%+$Nzc0(T z>3rLt`F7d_EIW3FzG`|qN?0bKJA6xF8qc`|!o<>;HT5(+cuL?Uq7qBV_ZV6a>?#Tm zSZbqg^Zp{Wi}|~d*$2&a@=U1B3I}xIKvw9~h0Zm;^HrUJ(b5^syiDepAUkaE7h*Fp z1swGrp)D|8w79`1W6I<#IMxn_u?LSMH(m=|y}?}0;Kw1vi4aZW#ak}}Cev6S!pgfD z>pFXZdVPo3N zVLO>G9|o7Y0J1$h$FVnE2tqGu67B;Xvjkui?_UXI*!y@Q01z1QI8B&FXD$HLvwWW5->IQ7fIb)!T{Z!QkBgeGSLA`0A;Go%|Gm7>(&x>=-LDU z!L!=`DzD@?34=g8@G5N@gH#FZBE^~E=HVnI(nvDg{k%6aD7V-%^RoVTxy7=Un45k7 zhn@`V-7yaa9{gLy-XANO8 zt%-En5IPqJf-W;1QM`x-lQ5iU z8OT`qn#f#&M@>XfMa8NqV1kvodZ9lr6lE^d>;w#|Tae$blbld{>)PVAH6ggh2cd<2 zRtW0Q6?)hBUTDAY2UhCW{YSP*qx<{J;@O2W3tFzJ<&$^rzLRb0(VKc6MAn;5EL_Y9 zO&@2nEuDHx=VPHW=k+aD+^)!aTXk=1&i7`{SD*E@>%MkCmWOT+<$QI|-CT9ea}Q}b znr-gXn>&}BKd&&nb$K~mdP~=1p=+c0NVd6KZ|+9wUkg-RWgS+r^*E(Bomy||TjF!I zzB|m%j^~2MmIjtbZjY>-(R~Na#e=#pnDuq&zK&e|-cN+P!YZ?R?w)70YOVgwhxN}L zY~7wM7pZHoc(T53-PiqK;CCaRjy(FoUwp&Qa0A6M0xQ)kmwr{ZTCcZuJ~;D``E>B% zIlX6Kt$y&)m0hHrdwA(l_3y_XUHYv0k7H{+-~9{(zqi$kcHMf5G#^|Uzx)1z^OmqE z++lRS@mYm%>%`)TkN0L9LV82!aYe{H9jm_R(S@ET!f~*3*4w6g+t$79tIq7$* zR+^_Rt5iatVsj7)DQLdDL0+&NSNEcd<4 zYHrbs0j~JjXT1b#tSD&4*_8Fa0rTBxaF`HOGXdlS{Pav*(XLpJL?JbvFW{}rLm_cP z4uDY=-k258F}0xk5yMA^X`Zk6lh#4KL&GqJ&ja-+G+PdaVP3pNn1;WT<4;M~=j7N^ Za_A}Peo9)OyZRX>v{rrS1wq6V_8;*>uO|Qi diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc deleted file mode 100644 index 3c2bfc4d4458a5fd489f84cdb099c72100c18229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12287 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 CmthP5 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc deleted file mode 100644 index 40b0918445d01b1a2edcd6eb80a8b0bf43a142a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9997 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 Xze4A~L}UMSk8|M%!>vEEQie znGG{ZhD4DMy_MyEmTTY1tr~Xf&Y*kpgT5)C znrl0SSSXk)A2eF9RXI`~a025(c&Q?tcr4*q$3j~ODpoEcngGH|xM{UM2-V1m@k~rr zV3h8PDi-K>VNY0iX@tG8!9yu58?EGvX(_Z}V=M>sr1zBVut!V6_6OZXKhGtO^L(+9 z=Pgm+j-1`j%s_w&z*KWy=x_U-p&f*G)YzO8 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py deleted file mode 100644 index 87d9f972..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py +++ /dev/null @@ -1,386 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 -# fmt: off -BIG5_CHAR_TO_FREQ_ORDER = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 -) -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py deleted file mode 100644 index ef09c60e..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import Big5DistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "Big5" - - @property - def language(self) -> str: - return "Chinese" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py deleted file mode 100644 index 176cb996..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py +++ /dev/null @@ -1,261 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Tuple, Union - -from .big5freq import ( - BIG5_CHAR_TO_FREQ_ORDER, - BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO, -) -from .euckrfreq import ( - EUCKR_CHAR_TO_FREQ_ORDER, - EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO, -) -from .euctwfreq import ( - EUCTW_CHAR_TO_FREQ_ORDER, - EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO, -) -from .gb2312freq import ( - GB2312_CHAR_TO_FREQ_ORDER, - GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO, -) -from .jisfreq import ( - JIS_CHAR_TO_FREQ_ORDER, - JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO, -) -from .johabfreq import JOHAB_TO_EUCKR_ORDER_TABLE - - -class CharDistributionAnalysis: - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self) -> None: - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order: Tuple[int, ...] = tuple() - self._table_size = 0 # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self.typical_distribution_ratio = 0.0 - self._done = False - self._total_chars = 0 - self._freq_chars = 0 - self.reset() - - def reset(self) -> None: - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - self._total_chars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._freq_chars = 0 - - def feed(self, char: Union[bytes, bytearray], char_len: int) -> None: - """feed a character with known length""" - if char_len == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(char) - else: - order = -1 - if order >= 0: - self._total_chars += 1 - # order is valid - if order < self._table_size: - if 512 > self._char_to_freq_order[order]: - self._freq_chars += 1 - - def get_confidence(self) -> float: - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: - return self.SURE_NO - - if self._total_chars != self._freq_chars: - r = self._freq_chars / ( - (self._total_chars - self._freq_chars) * self.typical_distribution_ratio - ) - if r < self.SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return self.SURE_YES - - def got_enough_data(self) -> bool: - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._total_chars > self.ENOUGH_DATA_THRESHOLD - - def get_order(self, _: Union[bytes, bytearray]) -> int: - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER - self._table_size = EUCTW_TABLE_SIZE - self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER - self._table_size = EUCKR_TABLE_SIZE - self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 - return -1 - - -class JOHABDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER - self._table_size = EUCKR_TABLE_SIZE - self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - first_char = byte_str[0] - if 0x88 <= first_char < 0xD4: - code = first_char * 256 + byte_str[1] - return JOHAB_TO_EUCKR_ORDER_TABLE.get(code, -1) - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER - self._table_size = GB2312_TABLE_SIZE - self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER - self._table_size = BIG5_TABLE_SIZE - self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - return 157 * (first_char - 0xA4) + second_char - 0x40 - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if 0x81 <= first_char <= 0x9F: - order = 188 * (first_char - 0x81) - elif 0xE0 <= first_char <= 0xEF: - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self) -> None: - super().__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str: Union[bytes, bytearray]) -> int: - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = byte_str[0] - if char >= 0xA0: - return 94 * (char - 0xA1) + byte_str[1] - 0xA1 - return -1 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py deleted file mode 100644 index 6def56b4..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Optional, Union - -from .charsetprober import CharSetProber -from .enums import LanguageFilter, ProbingState - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers: List[CharSetProber] = [] - self._best_guess_prober: Optional[CharSetProber] = None - - def reset(self) -> None: - super().reset() - self._active_num = 0 - for prober in self.probers: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self) -> Optional[str]: - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.charset_name - - @property - def language(self) -> Optional[str]: - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.language - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for prober in self.probers: - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - self._state = ProbingState.FOUND_IT - return self.state - if state == ProbingState.NOT_ME: - prober.active = False - self._active_num -= 1 - if self._active_num <= 0: - self._state = ProbingState.NOT_ME - return self.state - return self.state - - def get_confidence(self) -> float: - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - if state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober.active: - self.logger.debug("%s not active", prober.charset_name) - continue - conf = prober.get_confidence() - self.logger.debug( - "%s %s confidence = %s", prober.charset_name, prober.language, conf - ) - if best_conf < conf: - best_conf = conf - self._best_guess_prober = prober - if not self._best_guess_prober: - return 0.0 - return best_conf diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py deleted file mode 100644 index a103ca11..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py +++ /dev/null @@ -1,147 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging -import re -from typing import Optional, Union - -from .enums import LanguageFilter, ProbingState - -INTERNATIONAL_WORDS_PATTERN = re.compile( - b"[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?" -) - - -class CharSetProber: - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - self._state = ProbingState.DETECTING - self.active = True - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self) -> None: - self._state = ProbingState.DETECTING - - @property - def charset_name(self) -> Optional[str]: - return None - - @property - def language(self) -> Optional[str]: - raise NotImplementedError - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - raise NotImplementedError - - @property - def state(self) -> ProbingState: - return self._state - - def get_confidence(self) -> float: - return 0.0 - - @staticmethod - def filter_high_byte_only(buf: Union[bytes, bytearray]) -> bytes: - buf = re.sub(b"([\x00-\x7F])+", b" ", buf) - return buf - - @staticmethod - def filter_international_words(buf: Union[bytes, bytearray]) -> bytearray: - """ - We define three types of bytes: - alphabet: english alphabets [a-zA-Z] - international: international characters [\x80-\xFF] - marker: everything else [^a-zA-Z\x80-\xFF] - The input buffer can be thought to contain a series of words delimited - by markers. This function works to filter all words that contain at - least one international character. All contiguous sequences of markers - are replaced by a single space ascii character. - This filter applies to all scripts which do not use English characters. - """ - filtered = bytearray() - - # This regex expression filters out only words that have at-least one - # international character. The word may include one marker character at - # the end. - words = INTERNATIONAL_WORDS_PATTERN.findall(buf) - - for word in words: - filtered.extend(word[:-1]) - - # If the last character in the word is a marker, replace it with a - # space as markers shouldn't affect our analysis (they are used - # similarly across all languages and may thus have similar - # frequencies). - last_char = word[-1:] - if not last_char.isalpha() and last_char < b"\x80": - last_char = b" " - filtered.extend(last_char) - - return filtered - - @staticmethod - def remove_xml_tags(buf: Union[bytes, bytearray]) -> bytes: - """ - Returns a copy of ``buf`` that retains only the sequences of English - alphabet and high byte characters that are not between <> characters. - This filter can be applied to all scripts which contain both English - characters and extended ASCII characters, but is currently only used by - ``Latin1Prober``. - """ - filtered = bytearray() - in_tag = False - prev = 0 - buf = memoryview(buf).cast("c") - - for curr, buf_char in enumerate(buf): - # Check if we're coming out of or entering an XML tag - - # https://github.com/python/typeshed/issues/8182 - if buf_char == b">": # type: ignore[comparison-overlap] - prev = curr + 1 - in_tag = False - # https://github.com/python/typeshed/issues/8182 - elif buf_char == b"<": # type: ignore[comparison-overlap] - if curr > prev and not in_tag: - # Keep everything after last non-extended-ASCII, - # non-alphabetic character - filtered.extend(buf[prev:curr]) - # Output a space to delimit stretch we kept - filtered.extend(b" ") - in_tag = True - - # If we're not in a tag... - if not in_tag: - # Keep everything after last non-extended-ASCII, non-alphabetic - # character - filtered.extend(buf[prev:]) - - return filtered diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 96649d840b264b39141f0a904d9f5620f9829fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmZ8bu?@m75VQ$M2q}Y5kQdM*Dry=;Z8`BntQgy}O;9Fb24-Oh3MN32C{kg!ob-Qp z|5w~I&u1j!@cNz-ztj3hKaQ6>>ByY!AHr-Y3aP;UrG~97rlr;~M!w!8Dj0GD% zMso!7&-6`mz`m*nzCqWmk_ut$dDnu$n8ZezH#Vb`^y#6VyhmRzJP3~I$4N-HgQ z+1aHO5;W=nDJmldEMFoOL4XuJ^hY}6m_rZgsfS*qq=4zIix>!c$c>Ja9CGS=ORh*M zHqa5c^Y`Y>n|a@S@9CfMxI&;zeED7JuQ5Wt!j4~{@0G1}s8)zZ@zX6rs*6(>c|c z!-@_A>&&91>E?{BD6hYxmMaF!2zoLO45%#yCb9*n-4d2L60M?sFNc2U=VAUv9RRZ*^%sA>6!fHPINwE)Vr z5vn_#BkOP`-K7xe?$}L)HR_(h1_X zcz;9qkZ3`_4{Z_J5=wnYK9WEZ=jD$A6C@QIn95(sgAdi1u}fR(+9o(G#8r4t^S z=puucitA__P&+2ua1Kum9`(fqP6=<@BY?7{F>X@!>#Dw>8q9R;OFg!|zzjMyHEmhO z)RZTh5;)SN8}=`*9>~#p@&}LARl3i-9?jvS<;<=cPDJNAcrrE>v9+Z<1*^mn@rTj475LmG+b2n6Xd`>&U*WO4mz(_u zz9Et{up~a|JG{F8{ogE!&2Z#_d{16-?#G@+V-L>0fA(=K*@}WtD@G*wcW=D=#(P(r z@x+6-@4bC@{BbDJ>^rbLx7jzm5gu-a;!AU%hX$Ji2bT{n^VL%y4{Z*OYz(G1(icBn z_{`Y6G_i4Ua-;9oM)+1UF|hQDj5@WC!8lmFH2<90FiZnGx1QYaJp4%6q;I zVJ)I5>(R9ik-ktarp2{{C)pwF7fSX)Xiqu`-xwgc!1};0{YihWTQ|tgZ3P;ExqbLo|C?~N8QIUa zx_pkQM-PvRSJ+u|(n;*Kmvg+)v@;1=f@1~gR1AroO4dRk*86{t4X&V5pD zfKR)^%PG+nf%z(~h{tdx6Aog#p^k7pl1_ILnfl8&APmC|n?`MSkc54}Ev5!3AhoIv zw(|fFZ62oRw4s{wZFJ&!^%)2mooj$omuStZ@^*rmp#UK0(nS@n3-5LW zjp#KXoyK7WTq|OR0EX{`v1_TM8wMXhk^&Jgak=vnZeW+YF;&wFFzdYzH;fpVM7IS2 zsIKHCwXQr}EtMGO7y(_y(}PQFj?dPWbz60unk!Y%o30FNK-LRQ-GJ)KZTF-^j(p(C zo)+$f1=|%$Hoj`aK1X74#j>iK{2VlM@Utl}KSZ|yk~sJ%esVK@@@ee)wj?IxyW=f| zNYO{)p-u5nGu+pVUw;xm@F;$4Gk$E<`67O@nMgiK?q3;vIQS?zyqO%{=s(el66x?Z zktMm6=vlk38UJas??@};&5AJFt2x#T4>aTFQ6S<8NFV?)b7$*)t5-i6{M-3Y(;L}0 zTR~4G03tGp4Lph--HaYxo%|wt;_lefc=AF1Uj7>rmy{);2~qgmy>s_-PaqBlg2^M> zVRCSACI2x0ZB&jYwi6_hcoG|G_9vG|SI#~>`|(fybm0#dKGXg&|M&UrU?86OHYi4v zXZt`IAHs_Z7YcZF@DD|hXJBA_JS89iLWP266$=HPfL!bN^s-_|&t=ae+3Y`<7q7 zcc~SG_ERO^lAwmmO$@X`*b0*)$6F`|>*T~z@!i{7QRqDz6V3?A(mSi->csCOn|&u* g1p0s0wy Optional[str]: - """ - Return a string describing the probable encoding of a file or - list of strings. - - :param lines: The lines to get the encoding of. - :type lines: Iterable of bytes - :param name: Name of file or collection of lines - :type name: str - :param should_rename_legacy: Should we rename legacy encodings to - their more modern equivalents? - :type should_rename_legacy: ``bool`` - """ - u = UniversalDetector(should_rename_legacy=should_rename_legacy) - for line in lines: - line = bytearray(line) - u.feed(line) - # shortcut out of the loop to save reading further - particularly useful if we read a BOM. - if u.done: - break - u.close() - result = u.result - if minimal: - return result["encoding"] - if result["encoding"]: - return f'{name}: {result["encoding"]} with confidence {result["confidence"]}' - return f"{name}: no result" - - -def main(argv: Optional[List[str]] = None) -> None: - """ - Handles command line arguments and gets things started. - - :param argv: List of arguments, as if specified on the command-line. - If None, ``sys.argv[1:]`` is used instead. - :type argv: list of str - """ - # Get command line arguments - parser = argparse.ArgumentParser( - description=( - "Takes one or more file paths and reports their detected encodings" - ) - ) - parser.add_argument( - "input", - help="File whose encoding we would like to determine. (default: stdin)", - type=argparse.FileType("rb"), - nargs="*", - default=[sys.stdin.buffer], - ) - parser.add_argument( - "--minimal", - help="Print only the encoding to standard output", - action="store_true", - ) - parser.add_argument( - "-l", - "--legacy", - help="Rename legacy encodings to more modern ones.", - action="store_true", - ) - parser.add_argument( - "--version", action="version", version=f"%(prog)s {__version__}" - ) - args = parser.parse_args(argv) - - for f in args.input: - if f.isatty(): - print( - "You are running chardetect interactively. Press " - "CTRL-D twice at the start of a blank line to signal the " - "end of your input. If you want help, run chardetect " - "--help\n", - file=sys.stderr, - ) - print( - description_of( - f, f.name, minimal=args.minimal, should_rename_legacy=args.legacy - ) - ) - - -if __name__ == "__main__": - main() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py deleted file mode 100644 index 8ed4a877..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py +++ /dev/null @@ -1,90 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging - -from .codingstatemachinedict import CodingStateMachineDict -from .enums import MachineState - - -class CodingStateMachine: - """ - A state machine to verify a byte sequence for a particular encoding. For - each byte the detector receives, it will feed that byte to every active - state machine available, one byte at a time. The state machine changes its - state based on its previous state and the byte it receives. There are 3 - states in a state machine that are of interest to an auto-detector: - - START state: This is the state to start with, or a legal byte sequence - (i.e. a valid code point) for character has been identified. - - ME state: This indicates that the state machine identified a byte sequence - that is specific to the charset it is designed for and that - there is no other possible encoding which can contain this byte - sequence. This will to lead to an immediate positive answer for - the detector. - - ERROR state: This indicates the state machine identified an illegal byte - sequence for that encoding. This will lead to an immediate - negative answer for this encoding. Detector will exclude this - encoding from consideration from here on. - """ - - def __init__(self, sm: CodingStateMachineDict) -> None: - self._model = sm - self._curr_byte_pos = 0 - self._curr_char_len = 0 - self._curr_state = MachineState.START - self.active = True - self.logger = logging.getLogger(__name__) - self.reset() - - def reset(self) -> None: - self._curr_state = MachineState.START - - def next_state(self, c: int) -> int: - # for each byte we get its class - # if it is first byte, we also get byte length - byte_class = self._model["class_table"][c] - if self._curr_state == MachineState.START: - self._curr_byte_pos = 0 - self._curr_char_len = self._model["char_len_table"][byte_class] - # from byte's class and state_table, we get its next state - curr_state = self._curr_state * self._model["class_factor"] + byte_class - self._curr_state = self._model["state_table"][curr_state] - self._curr_byte_pos += 1 - return self._curr_state - - def get_current_charlen(self) -> int: - return self._curr_char_len - - def get_coding_state_machine(self) -> str: - return self._model["name"] - - @property - def language(self) -> str: - return self._model["language"] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py deleted file mode 100644 index 7a3c4c7e..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py +++ /dev/null @@ -1,19 +0,0 @@ -from typing import TYPE_CHECKING, Tuple - -if TYPE_CHECKING: - # TypedDict was introduced in Python 3.8. - # - # TODO: Remove the else block and TYPE_CHECKING check when dropping support - # for Python 3.7. - from typing import TypedDict - - class CodingStateMachineDict(TypedDict, total=False): - class_table: Tuple[int, ...] - class_factor: int - state_table: Tuple[int, ...] - char_len_table: Tuple[int, ...] - name: str - language: str # Optional key - -else: - CodingStateMachineDict = dict diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py deleted file mode 100644 index fa7307ed..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py +++ /dev/null @@ -1,49 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import CP949_SM_MODEL - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(CP949_SM_MODEL) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "CP949" - - @property - def language(self) -> str: - return "Korean" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py deleted file mode 100644 index 5e3e1982..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -All of the Enums that are used throughout the chardet package. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -from enum import Enum, Flag - - -class InputState: - """ - This enum represents the different states a universal detector can be in. - """ - - PURE_ASCII = 0 - ESC_ASCII = 1 - HIGH_BYTE = 2 - - -class LanguageFilter(Flag): - """ - This enum represents the different language filters we can apply to a - ``UniversalDetector``. - """ - - NONE = 0x00 - CHINESE_SIMPLIFIED = 0x01 - CHINESE_TRADITIONAL = 0x02 - JAPANESE = 0x04 - KOREAN = 0x08 - NON_CJK = 0x10 - ALL = 0x1F - CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL - CJK = CHINESE | JAPANESE | KOREAN - - -class ProbingState(Enum): - """ - This enum represents the different states a prober can be in. - """ - - DETECTING = 0 - FOUND_IT = 1 - NOT_ME = 2 - - -class MachineState: - """ - This enum represents the different states a state machine can be in. - """ - - START = 0 - ERROR = 1 - ITS_ME = 2 - - -class SequenceLikelihood: - """ - This enum represents the likelihood of a character following the previous one. - """ - - NEGATIVE = 0 - UNLIKELY = 1 - LIKELY = 2 - POSITIVE = 3 - - @classmethod - def get_num_categories(cls) -> int: - """:returns: The number of likelihood categories in the enum.""" - return 4 - - -class CharacterCategory: - """ - This enum represents the different categories language models for - ``SingleByteCharsetProber`` put characters into. - - Anything less than CONTROL is considered a letter. - """ - - UNDEFINED = 255 - LINE_BREAK = 254 - SYMBOL = 253 - DIGIT = 252 - CONTROL = 251 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py deleted file mode 100644 index fd713830..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py +++ /dev/null @@ -1,102 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Optional, Union - -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, MachineState, ProbingState -from .escsm import ( - HZ_SM_MODEL, - ISO2022CN_SM_MODEL, - ISO2022JP_SM_MODEL, - ISO2022KR_SM_MODEL, -) - - -class EscCharSetProber(CharSetProber): - """ - This CharSetProber uses a "code scheme" approach for detecting encodings, - whereby easily recognizable escape or shift sequences are relied on to - identify these encodings. - """ - - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self.coding_sm = [] - if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: - self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) - self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) - if self.lang_filter & LanguageFilter.JAPANESE: - self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) - if self.lang_filter & LanguageFilter.KOREAN: - self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) - self.active_sm_count = 0 - self._detected_charset: Optional[str] = None - self._detected_language: Optional[str] = None - self._state = ProbingState.DETECTING - self.reset() - - def reset(self) -> None: - super().reset() - for coding_sm in self.coding_sm: - coding_sm.active = True - coding_sm.reset() - self.active_sm_count = len(self.coding_sm) - self._detected_charset = None - self._detected_language = None - - @property - def charset_name(self) -> Optional[str]: - return self._detected_charset - - @property - def language(self) -> Optional[str]: - return self._detected_language - - def get_confidence(self) -> float: - return 0.99 if self._detected_charset else 0.00 - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for c in byte_str: - for coding_sm in self.coding_sm: - if not coding_sm.active: - continue - coding_state = coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - coding_sm.active = False - self.active_sm_count -= 1 - if self.active_sm_count <= 0: - self._state = ProbingState.NOT_ME - return self.state - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - self._detected_charset = coding_sm.get_coding_state_machine() - self._detected_language = coding_sm.language - return self.state - - return self.state diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py deleted file mode 100644 index 11d4adf7..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py +++ /dev/null @@ -1,261 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .codingstatemachinedict import CodingStateMachineDict -from .enums import MachineState - -# fmt: off -HZ_CLS = ( - 1, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 4, 0, 5, 2, 0, # 78 - 7f - 1, 1, 1, 1, 1, 1, 1, 1, # 80 - 87 - 1, 1, 1, 1, 1, 1, 1, 1, # 88 - 8f - 1, 1, 1, 1, 1, 1, 1, 1, # 90 - 97 - 1, 1, 1, 1, 1, 1, 1, 1, # 98 - 9f - 1, 1, 1, 1, 1, 1, 1, 1, # a0 - a7 - 1, 1, 1, 1, 1, 1, 1, 1, # a8 - af - 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 - 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf - 1, 1, 1, 1, 1, 1, 1, 1, # c0 - c7 - 1, 1, 1, 1, 1, 1, 1, 1, # c8 - cf - 1, 1, 1, 1, 1, 1, 1, 1, # d0 - d7 - 1, 1, 1, 1, 1, 1, 1, 1, # d8 - df - 1, 1, 1, 1, 1, 1, 1, 1, # e0 - e7 - 1, 1, 1, 1, 1, 1, 1, 1, # e8 - ef - 1, 1, 1, 1, 1, 1, 1, 1, # f0 - f7 - 1, 1, 1, 1, 1, 1, 1, 1, # f8 - ff -) - -HZ_ST = ( -MachineState.START, MachineState.ERROR, 3, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 -MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f -MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.START, MachineState.START, 4, MachineState.ERROR, # 10-17 - 5, MachineState.ERROR, 6, MachineState.ERROR, 5, 5, 4, MachineState.ERROR, # 18-1f - 4, MachineState.ERROR, 4, 4, 4, MachineState.ERROR, 4, MachineState.ERROR, # 20-27 - 4, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 28-2f -) -# fmt: on - -HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -HZ_SM_MODEL: CodingStateMachineDict = { - "class_table": HZ_CLS, - "class_factor": 6, - "state_table": HZ_ST, - "char_len_table": HZ_CHAR_LEN_TABLE, - "name": "HZ-GB-2312", - "language": "Chinese", -} - -# fmt: off -ISO2022CN_CLS = ( - 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 3, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 4, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 - 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f - 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 - 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff -) - -ISO2022CN_ST = ( - MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 - MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f - MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 - MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, # 18-1f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 20-27 - 5, 6, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 28-2f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 30-37 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, # 38-3f -) -# fmt: on - -ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CN_SM_MODEL: CodingStateMachineDict = { - "class_table": ISO2022CN_CLS, - "class_factor": 9, - "state_table": ISO2022CN_ST, - "char_len_table": ISO2022CN_CHAR_LEN_TABLE, - "name": "ISO-2022-CN", - "language": "Chinese", -} - -# fmt: off -ISO2022JP_CLS = ( - 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 2, 2, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 7, 0, 0, 0, # 20 - 27 - 3, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 6, 0, 4, 0, 8, 0, 0, 0, # 40 - 47 - 0, 9, 5, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 - 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f - 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 - 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff -) - -ISO2022JP_ST = ( - MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 - MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 - MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, # 18-1f - MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 20-27 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 6, MachineState.ITS_ME, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, # 28-2f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, # 30-37 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 38-3f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, MachineState.START, # 40-47 -) -# fmt: on - -ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JP_SM_MODEL: CodingStateMachineDict = { - "class_table": ISO2022JP_CLS, - "class_factor": 10, - "state_table": ISO2022JP_ST, - "char_len_table": ISO2022JP_CHAR_LEN_TABLE, - "name": "ISO-2022-JP", - "language": "Japanese", -} - -# fmt: off -ISO2022KR_CLS = ( - 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 3, 0, 0, 0, # 20 - 27 - 0, 4, 0, 0, 0, 0, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 5, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 - 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f - 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 - 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff -) - -ISO2022KR_ST = ( - MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f - MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 10-17 - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 18-1f - MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 20-27 -) -# fmt: on - -ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -ISO2022KR_SM_MODEL: CodingStateMachineDict = { - "class_table": ISO2022KR_CLS, - "class_factor": 6, - "state_table": ISO2022KR_ST, - "char_len_table": ISO2022KR_CHAR_LEN_TABLE, - "name": "ISO-2022-KR", - "language": "Korean", -} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py deleted file mode 100644 index 39487f40..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py +++ /dev/null @@ -1,102 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Union - -from .chardistribution import EUCJPDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .enums import MachineState, ProbingState -from .jpcntx import EUCJPContextAnalysis -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import EUCJP_SM_MODEL - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) - self.distribution_analyzer = EUCJPDistributionAnalysis() - self.context_analyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self) -> None: - super().reset() - self.context_analyzer.reset() - - @property - def charset_name(self) -> str: - return "EUC-JP" - - @property - def language(self) -> str: - return "Japanese" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - assert self.coding_sm is not None - assert self.distribution_analyzer is not None - - for i, byte in enumerate(byte_str): - # PY3K: byte_str is a byte array, so byte is an int, not a byte - coding_state = self.coding_sm.next_state(byte) - if coding_state == MachineState.ERROR: - self.logger.debug( - "%s %s prober hit error at byte %s", - self.charset_name, - self.language, - i, - ) - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte - self.context_analyzer.feed(self._last_char, char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if self.context_analyzer.got_enough_data() and ( - self.get_confidence() > self.SHORTCUT_THRESHOLD - ): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - assert self.distribution_analyzer is not None - - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py deleted file mode 100644 index 7dc3b103..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py +++ /dev/null @@ -1,196 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -# fmt: off -EUCKR_CHAR_TO_FREQ_ORDER = ( - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -) -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py deleted file mode 100644 index 1fc5de04..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "EUC-KR" - - @property - def language(self) -> str: - return "Korean" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py deleted file mode 100644 index 4900ccc1..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py +++ /dev/null @@ -1,388 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table -EUCTW_TABLE_SIZE = 5376 - -# fmt: off -EUCTW_CHAR_TO_FREQ_ORDER = ( - 1, 1800, 1506, 255, 1431, 198, 9, 82, 6, 7310, 177, 202, 3615, 1256, 2808, 110, # 2742 - 3735, 33, 3241, 261, 76, 44, 2113, 16, 2931, 2184, 1176, 659, 3868, 26, 3404, 2643, # 2758 - 1198, 3869, 3313, 4060, 410, 2211, 302, 590, 361, 1963, 8, 204, 58, 4296, 7311, 1931, # 2774 - 63, 7312, 7313, 317, 1614, 75, 222, 159, 4061, 2412, 1480, 7314, 3500, 3068, 224, 2809, # 2790 - 3616, 3, 10, 3870, 1471, 29, 2774, 1135, 2852, 1939, 873, 130, 3242, 1123, 312, 7315, # 2806 - 4297, 2051, 507, 252, 682, 7316, 142, 1914, 124, 206, 2932, 34, 3501, 3173, 64, 604, # 2822 - 7317, 2494, 1976, 1977, 155, 1990, 645, 641, 1606, 7318, 3405, 337, 72, 406, 7319, 80, # 2838 - 630, 238, 3174, 1509, 263, 939, 1092, 2644, 756, 1440, 1094, 3406, 449, 69, 2969, 591, # 2854 - 179, 2095, 471, 115, 2034, 1843, 60, 50, 2970, 134, 806, 1868, 734, 2035, 3407, 180, # 2870 - 995, 1607, 156, 537, 2893, 688, 7320, 319, 1305, 779, 2144, 514, 2374, 298, 4298, 359, # 2886 - 2495, 90, 2707, 1338, 663, 11, 906, 1099, 2545, 20, 2436, 182, 532, 1716, 7321, 732, # 2902 - 1376, 4062, 1311, 1420, 3175, 25, 2312, 1056, 113, 399, 382, 1949, 242, 3408, 2467, 529, # 2918 - 3243, 475, 1447, 3617, 7322, 117, 21, 656, 810, 1297, 2295, 2329, 3502, 7323, 126, 4063, # 2934 - 706, 456, 150, 613, 4299, 71, 1118, 2036, 4064, 145, 3069, 85, 835, 486, 2114, 1246, # 2950 - 1426, 428, 727, 1285, 1015, 800, 106, 623, 303, 1281, 7324, 2127, 2354, 347, 3736, 221, # 2966 - 3503, 3110, 7325, 1955, 1153, 4065, 83, 296, 1199, 3070, 192, 624, 93, 7326, 822, 1897, # 2982 - 2810, 3111, 795, 2064, 991, 1554, 1542, 1592, 27, 43, 2853, 859, 139, 1456, 860, 4300, # 2998 - 437, 712, 3871, 164, 2392, 3112, 695, 211, 3017, 2096, 195, 3872, 1608, 3504, 3505, 3618, # 3014 - 3873, 234, 811, 2971, 2097, 3874, 2229, 1441, 3506, 1615, 2375, 668, 2076, 1638, 305, 228, # 3030 - 1664, 4301, 467, 415, 7327, 262, 2098, 1593, 239, 108, 300, 200, 1033, 512, 1247, 2077, # 3046 - 7328, 7329, 2173, 3176, 3619, 2673, 593, 845, 1062, 3244, 88, 1723, 2037, 3875, 1950, 212, # 3062 - 266, 152, 149, 468, 1898, 4066, 4302, 77, 187, 7330, 3018, 37, 5, 2972, 7331, 3876, # 3078 - 7332, 7333, 39, 2517, 4303, 2894, 3177, 2078, 55, 148, 74, 4304, 545, 483, 1474, 1029, # 3094 - 1665, 217, 1869, 1531, 3113, 1104, 2645, 4067, 24, 172, 3507, 900, 3877, 3508, 3509, 4305, # 3110 - 32, 1408, 2811, 1312, 329, 487, 2355, 2247, 2708, 784, 2674, 4, 3019, 3314, 1427, 1788, # 3126 - 188, 109, 499, 7334, 3620, 1717, 1789, 888, 1217, 3020, 4306, 7335, 3510, 7336, 3315, 1520, # 3142 - 3621, 3878, 196, 1034, 775, 7337, 7338, 929, 1815, 249, 439, 38, 7339, 1063, 7340, 794, # 3158 - 3879, 1435, 2296, 46, 178, 3245, 2065, 7341, 2376, 7342, 214, 1709, 4307, 804, 35, 707, # 3174 - 324, 3622, 1601, 2546, 140, 459, 4068, 7343, 7344, 1365, 839, 272, 978, 2257, 2572, 3409, # 3190 - 2128, 1363, 3623, 1423, 697, 100, 3071, 48, 70, 1231, 495, 3114, 2193, 7345, 1294, 7346, # 3206 - 2079, 462, 586, 1042, 3246, 853, 256, 988, 185, 2377, 3410, 1698, 434, 1084, 7347, 3411, # 3222 - 314, 2615, 2775, 4308, 2330, 2331, 569, 2280, 637, 1816, 2518, 757, 1162, 1878, 1616, 3412, # 3238 - 287, 1577, 2115, 768, 4309, 1671, 2854, 3511, 2519, 1321, 3737, 909, 2413, 7348, 4069, 933, # 3254 - 3738, 7349, 2052, 2356, 1222, 4310, 765, 2414, 1322, 786, 4311, 7350, 1919, 1462, 1677, 2895, # 3270 - 1699, 7351, 4312, 1424, 2437, 3115, 3624, 2590, 3316, 1774, 1940, 3413, 3880, 4070, 309, 1369, # 3286 - 1130, 2812, 364, 2230, 1653, 1299, 3881, 3512, 3882, 3883, 2646, 525, 1085, 3021, 902, 2000, # 3302 - 1475, 964, 4313, 421, 1844, 1415, 1057, 2281, 940, 1364, 3116, 376, 4314, 4315, 1381, 7, # 3318 - 2520, 983, 2378, 336, 1710, 2675, 1845, 321, 3414, 559, 1131, 3022, 2742, 1808, 1132, 1313, # 3334 - 265, 1481, 1857, 7352, 352, 1203, 2813, 3247, 167, 1089, 420, 2814, 776, 792, 1724, 3513, # 3350 - 4071, 2438, 3248, 7353, 4072, 7354, 446, 229, 333, 2743, 901, 3739, 1200, 1557, 4316, 2647, # 3366 - 1920, 395, 2744, 2676, 3740, 4073, 1835, 125, 916, 3178, 2616, 4317, 7355, 7356, 3741, 7357, # 3382 - 7358, 7359, 4318, 3117, 3625, 1133, 2547, 1757, 3415, 1510, 2313, 1409, 3514, 7360, 2145, 438, # 3398 - 2591, 2896, 2379, 3317, 1068, 958, 3023, 461, 311, 2855, 2677, 4074, 1915, 3179, 4075, 1978, # 3414 - 383, 750, 2745, 2617, 4076, 274, 539, 385, 1278, 1442, 7361, 1154, 1964, 384, 561, 210, # 3430 - 98, 1295, 2548, 3515, 7362, 1711, 2415, 1482, 3416, 3884, 2897, 1257, 129, 7363, 3742, 642, # 3446 - 523, 2776, 2777, 2648, 7364, 141, 2231, 1333, 68, 176, 441, 876, 907, 4077, 603, 2592, # 3462 - 710, 171, 3417, 404, 549, 18, 3118, 2393, 1410, 3626, 1666, 7365, 3516, 4319, 2898, 4320, # 3478 - 7366, 2973, 368, 7367, 146, 366, 99, 871, 3627, 1543, 748, 807, 1586, 1185, 22, 2258, # 3494 - 379, 3743, 3180, 7368, 3181, 505, 1941, 2618, 1991, 1382, 2314, 7369, 380, 2357, 218, 702, # 3510 - 1817, 1248, 3418, 3024, 3517, 3318, 3249, 7370, 2974, 3628, 930, 3250, 3744, 7371, 59, 7372, # 3526 - 585, 601, 4078, 497, 3419, 1112, 1314, 4321, 1801, 7373, 1223, 1472, 2174, 7374, 749, 1836, # 3542 - 690, 1899, 3745, 1772, 3885, 1476, 429, 1043, 1790, 2232, 2116, 917, 4079, 447, 1086, 1629, # 3558 - 7375, 556, 7376, 7377, 2020, 1654, 844, 1090, 105, 550, 966, 1758, 2815, 1008, 1782, 686, # 3574 - 1095, 7378, 2282, 793, 1602, 7379, 3518, 2593, 4322, 4080, 2933, 2297, 4323, 3746, 980, 2496, # 3590 - 544, 353, 527, 4324, 908, 2678, 2899, 7380, 381, 2619, 1942, 1348, 7381, 1341, 1252, 560, # 3606 - 3072, 7382, 3420, 2856, 7383, 2053, 973, 886, 2080, 143, 4325, 7384, 7385, 157, 3886, 496, # 3622 - 4081, 57, 840, 540, 2038, 4326, 4327, 3421, 2117, 1445, 970, 2259, 1748, 1965, 2081, 4082, # 3638 - 3119, 1234, 1775, 3251, 2816, 3629, 773, 1206, 2129, 1066, 2039, 1326, 3887, 1738, 1725, 4083, # 3654 - 279, 3120, 51, 1544, 2594, 423, 1578, 2130, 2066, 173, 4328, 1879, 7386, 7387, 1583, 264, # 3670 - 610, 3630, 4329, 2439, 280, 154, 7388, 7389, 7390, 1739, 338, 1282, 3073, 693, 2857, 1411, # 3686 - 1074, 3747, 2440, 7391, 4330, 7392, 7393, 1240, 952, 2394, 7394, 2900, 1538, 2679, 685, 1483, # 3702 - 4084, 2468, 1436, 953, 4085, 2054, 4331, 671, 2395, 79, 4086, 2441, 3252, 608, 567, 2680, # 3718 - 3422, 4087, 4088, 1691, 393, 1261, 1791, 2396, 7395, 4332, 7396, 7397, 7398, 7399, 1383, 1672, # 3734 - 3748, 3182, 1464, 522, 1119, 661, 1150, 216, 675, 4333, 3888, 1432, 3519, 609, 4334, 2681, # 3750 - 2397, 7400, 7401, 7402, 4089, 3025, 0, 7403, 2469, 315, 231, 2442, 301, 3319, 4335, 2380, # 3766 - 7404, 233, 4090, 3631, 1818, 4336, 4337, 7405, 96, 1776, 1315, 2082, 7406, 257, 7407, 1809, # 3782 - 3632, 2709, 1139, 1819, 4091, 2021, 1124, 2163, 2778, 1777, 2649, 7408, 3074, 363, 1655, 3183, # 3798 - 7409, 2975, 7410, 7411, 7412, 3889, 1567, 3890, 718, 103, 3184, 849, 1443, 341, 3320, 2934, # 3814 - 1484, 7413, 1712, 127, 67, 339, 4092, 2398, 679, 1412, 821, 7414, 7415, 834, 738, 351, # 3830 - 2976, 2146, 846, 235, 1497, 1880, 418, 1992, 3749, 2710, 186, 1100, 2147, 2746, 3520, 1545, # 3846 - 1355, 2935, 2858, 1377, 583, 3891, 4093, 2573, 2977, 7416, 1298, 3633, 1078, 2549, 3634, 2358, # 3862 - 78, 3750, 3751, 267, 1289, 2099, 2001, 1594, 4094, 348, 369, 1274, 2194, 2175, 1837, 4338, # 3878 - 1820, 2817, 3635, 2747, 2283, 2002, 4339, 2936, 2748, 144, 3321, 882, 4340, 3892, 2749, 3423, # 3894 - 4341, 2901, 7417, 4095, 1726, 320, 7418, 3893, 3026, 788, 2978, 7419, 2818, 1773, 1327, 2859, # 3910 - 3894, 2819, 7420, 1306, 4342, 2003, 1700, 3752, 3521, 2359, 2650, 787, 2022, 506, 824, 3636, # 3926 - 534, 323, 4343, 1044, 3322, 2023, 1900, 946, 3424, 7421, 1778, 1500, 1678, 7422, 1881, 4344, # 3942 - 165, 243, 4345, 3637, 2521, 123, 683, 4096, 764, 4346, 36, 3895, 1792, 589, 2902, 816, # 3958 - 626, 1667, 3027, 2233, 1639, 1555, 1622, 3753, 3896, 7423, 3897, 2860, 1370, 1228, 1932, 891, # 3974 - 2083, 2903, 304, 4097, 7424, 292, 2979, 2711, 3522, 691, 2100, 4098, 1115, 4347, 118, 662, # 3990 - 7425, 611, 1156, 854, 2381, 1316, 2861, 2, 386, 515, 2904, 7426, 7427, 3253, 868, 2234, # 4006 - 1486, 855, 2651, 785, 2212, 3028, 7428, 1040, 3185, 3523, 7429, 3121, 448, 7430, 1525, 7431, # 4022 - 2164, 4348, 7432, 3754, 7433, 4099, 2820, 3524, 3122, 503, 818, 3898, 3123, 1568, 814, 676, # 4038 - 1444, 306, 1749, 7434, 3755, 1416, 1030, 197, 1428, 805, 2821, 1501, 4349, 7435, 7436, 7437, # 4054 - 1993, 7438, 4350, 7439, 7440, 2195, 13, 2779, 3638, 2980, 3124, 1229, 1916, 7441, 3756, 2131, # 4070 - 7442, 4100, 4351, 2399, 3525, 7443, 2213, 1511, 1727, 1120, 7444, 7445, 646, 3757, 2443, 307, # 4086 - 7446, 7447, 1595, 3186, 7448, 7449, 7450, 3639, 1113, 1356, 3899, 1465, 2522, 2523, 7451, 519, # 4102 - 7452, 128, 2132, 92, 2284, 1979, 7453, 3900, 1512, 342, 3125, 2196, 7454, 2780, 2214, 1980, # 4118 - 3323, 7455, 290, 1656, 1317, 789, 827, 2360, 7456, 3758, 4352, 562, 581, 3901, 7457, 401, # 4134 - 4353, 2248, 94, 4354, 1399, 2781, 7458, 1463, 2024, 4355, 3187, 1943, 7459, 828, 1105, 4101, # 4150 - 1262, 1394, 7460, 4102, 605, 4356, 7461, 1783, 2862, 7462, 2822, 819, 2101, 578, 2197, 2937, # 4166 - 7463, 1502, 436, 3254, 4103, 3255, 2823, 3902, 2905, 3425, 3426, 7464, 2712, 2315, 7465, 7466, # 4182 - 2332, 2067, 23, 4357, 193, 826, 3759, 2102, 699, 1630, 4104, 3075, 390, 1793, 1064, 3526, # 4198 - 7467, 1579, 3076, 3077, 1400, 7468, 4105, 1838, 1640, 2863, 7469, 4358, 4359, 137, 4106, 598, # 4214 - 3078, 1966, 780, 104, 974, 2938, 7470, 278, 899, 253, 402, 572, 504, 493, 1339, 7471, # 4230 - 3903, 1275, 4360, 2574, 2550, 7472, 3640, 3029, 3079, 2249, 565, 1334, 2713, 863, 41, 7473, # 4246 - 7474, 4361, 7475, 1657, 2333, 19, 463, 2750, 4107, 606, 7476, 2981, 3256, 1087, 2084, 1323, # 4262 - 2652, 2982, 7477, 1631, 1623, 1750, 4108, 2682, 7478, 2864, 791, 2714, 2653, 2334, 232, 2416, # 4278 - 7479, 2983, 1498, 7480, 2654, 2620, 755, 1366, 3641, 3257, 3126, 2025, 1609, 119, 1917, 3427, # 4294 - 862, 1026, 4109, 7481, 3904, 3760, 4362, 3905, 4363, 2260, 1951, 2470, 7482, 1125, 817, 4110, # 4310 - 4111, 3906, 1513, 1766, 2040, 1487, 4112, 3030, 3258, 2824, 3761, 3127, 7483, 7484, 1507, 7485, # 4326 - 2683, 733, 40, 1632, 1106, 2865, 345, 4113, 841, 2524, 230, 4364, 2984, 1846, 3259, 3428, # 4342 - 7486, 1263, 986, 3429, 7487, 735, 879, 254, 1137, 857, 622, 1300, 1180, 1388, 1562, 3907, # 4358 - 3908, 2939, 967, 2751, 2655, 1349, 592, 2133, 1692, 3324, 2985, 1994, 4114, 1679, 3909, 1901, # 4374 - 2185, 7488, 739, 3642, 2715, 1296, 1290, 7489, 4115, 2198, 2199, 1921, 1563, 2595, 2551, 1870, # 4390 - 2752, 2986, 7490, 435, 7491, 343, 1108, 596, 17, 1751, 4365, 2235, 3430, 3643, 7492, 4366, # 4406 - 294, 3527, 2940, 1693, 477, 979, 281, 2041, 3528, 643, 2042, 3644, 2621, 2782, 2261, 1031, # 4422 - 2335, 2134, 2298, 3529, 4367, 367, 1249, 2552, 7493, 3530, 7494, 4368, 1283, 3325, 2004, 240, # 4438 - 1762, 3326, 4369, 4370, 836, 1069, 3128, 474, 7495, 2148, 2525, 268, 3531, 7496, 3188, 1521, # 4454 - 1284, 7497, 1658, 1546, 4116, 7498, 3532, 3533, 7499, 4117, 3327, 2684, 1685, 4118, 961, 1673, # 4470 - 2622, 190, 2005, 2200, 3762, 4371, 4372, 7500, 570, 2497, 3645, 1490, 7501, 4373, 2623, 3260, # 4486 - 1956, 4374, 584, 1514, 396, 1045, 1944, 7502, 4375, 1967, 2444, 7503, 7504, 4376, 3910, 619, # 4502 - 7505, 3129, 3261, 215, 2006, 2783, 2553, 3189, 4377, 3190, 4378, 763, 4119, 3763, 4379, 7506, # 4518 - 7507, 1957, 1767, 2941, 3328, 3646, 1174, 452, 1477, 4380, 3329, 3130, 7508, 2825, 1253, 2382, # 4534 - 2186, 1091, 2285, 4120, 492, 7509, 638, 1169, 1824, 2135, 1752, 3911, 648, 926, 1021, 1324, # 4550 - 4381, 520, 4382, 997, 847, 1007, 892, 4383, 3764, 2262, 1871, 3647, 7510, 2400, 1784, 4384, # 4566 - 1952, 2942, 3080, 3191, 1728, 4121, 2043, 3648, 4385, 2007, 1701, 3131, 1551, 30, 2263, 4122, # 4582 - 7511, 2026, 4386, 3534, 7512, 501, 7513, 4123, 594, 3431, 2165, 1821, 3535, 3432, 3536, 3192, # 4598 - 829, 2826, 4124, 7514, 1680, 3132, 1225, 4125, 7515, 3262, 4387, 4126, 3133, 2336, 7516, 4388, # 4614 - 4127, 7517, 3912, 3913, 7518, 1847, 2383, 2596, 3330, 7519, 4389, 374, 3914, 652, 4128, 4129, # 4630 - 375, 1140, 798, 7520, 7521, 7522, 2361, 4390, 2264, 546, 1659, 138, 3031, 2445, 4391, 7523, # 4646 - 2250, 612, 1848, 910, 796, 3765, 1740, 1371, 825, 3766, 3767, 7524, 2906, 2554, 7525, 692, # 4662 - 444, 3032, 2624, 801, 4392, 4130, 7526, 1491, 244, 1053, 3033, 4131, 4132, 340, 7527, 3915, # 4678 - 1041, 2987, 293, 1168, 87, 1357, 7528, 1539, 959, 7529, 2236, 721, 694, 4133, 3768, 219, # 4694 - 1478, 644, 1417, 3331, 2656, 1413, 1401, 1335, 1389, 3916, 7530, 7531, 2988, 2362, 3134, 1825, # 4710 - 730, 1515, 184, 2827, 66, 4393, 7532, 1660, 2943, 246, 3332, 378, 1457, 226, 3433, 975, # 4726 - 3917, 2944, 1264, 3537, 674, 696, 7533, 163, 7534, 1141, 2417, 2166, 713, 3538, 3333, 4394, # 4742 - 3918, 7535, 7536, 1186, 15, 7537, 1079, 1070, 7538, 1522, 3193, 3539, 276, 1050, 2716, 758, # 4758 - 1126, 653, 2945, 3263, 7539, 2337, 889, 3540, 3919, 3081, 2989, 903, 1250, 4395, 3920, 3434, # 4774 - 3541, 1342, 1681, 1718, 766, 3264, 286, 89, 2946, 3649, 7540, 1713, 7541, 2597, 3334, 2990, # 4790 - 7542, 2947, 2215, 3194, 2866, 7543, 4396, 2498, 2526, 181, 387, 1075, 3921, 731, 2187, 3335, # 4806 - 7544, 3265, 310, 313, 3435, 2299, 770, 4134, 54, 3034, 189, 4397, 3082, 3769, 3922, 7545, # 4822 - 1230, 1617, 1849, 355, 3542, 4135, 4398, 3336, 111, 4136, 3650, 1350, 3135, 3436, 3035, 4137, # 4838 - 2149, 3266, 3543, 7546, 2784, 3923, 3924, 2991, 722, 2008, 7547, 1071, 247, 1207, 2338, 2471, # 4854 - 1378, 4399, 2009, 864, 1437, 1214, 4400, 373, 3770, 1142, 2216, 667, 4401, 442, 2753, 2555, # 4870 - 3771, 3925, 1968, 4138, 3267, 1839, 837, 170, 1107, 934, 1336, 1882, 7548, 7549, 2118, 4139, # 4886 - 2828, 743, 1569, 7550, 4402, 4140, 582, 2384, 1418, 3437, 7551, 1802, 7552, 357, 1395, 1729, # 4902 - 3651, 3268, 2418, 1564, 2237, 7553, 3083, 3772, 1633, 4403, 1114, 2085, 4141, 1532, 7554, 482, # 4918 - 2446, 4404, 7555, 7556, 1492, 833, 1466, 7557, 2717, 3544, 1641, 2829, 7558, 1526, 1272, 3652, # 4934 - 4142, 1686, 1794, 416, 2556, 1902, 1953, 1803, 7559, 3773, 2785, 3774, 1159, 2316, 7560, 2867, # 4950 - 4405, 1610, 1584, 3036, 2419, 2754, 443, 3269, 1163, 3136, 7561, 7562, 3926, 7563, 4143, 2499, # 4966 - 3037, 4406, 3927, 3137, 2103, 1647, 3545, 2010, 1872, 4144, 7564, 4145, 431, 3438, 7565, 250, # 4982 - 97, 81, 4146, 7566, 1648, 1850, 1558, 160, 848, 7567, 866, 740, 1694, 7568, 2201, 2830, # 4998 - 3195, 4147, 4407, 3653, 1687, 950, 2472, 426, 469, 3196, 3654, 3655, 3928, 7569, 7570, 1188, # 5014 - 424, 1995, 861, 3546, 4148, 3775, 2202, 2685, 168, 1235, 3547, 4149, 7571, 2086, 1674, 4408, # 5030 - 3337, 3270, 220, 2557, 1009, 7572, 3776, 670, 2992, 332, 1208, 717, 7573, 7574, 3548, 2447, # 5046 - 3929, 3338, 7575, 513, 7576, 1209, 2868, 3339, 3138, 4409, 1080, 7577, 7578, 7579, 7580, 2527, # 5062 - 3656, 3549, 815, 1587, 3930, 3931, 7581, 3550, 3439, 3777, 1254, 4410, 1328, 3038, 1390, 3932, # 5078 - 1741, 3933, 3778, 3934, 7582, 236, 3779, 2448, 3271, 7583, 7584, 3657, 3780, 1273, 3781, 4411, # 5094 - 7585, 308, 7586, 4412, 245, 4413, 1851, 2473, 1307, 2575, 430, 715, 2136, 2449, 7587, 270, # 5110 - 199, 2869, 3935, 7588, 3551, 2718, 1753, 761, 1754, 725, 1661, 1840, 4414, 3440, 3658, 7589, # 5126 - 7590, 587, 14, 3272, 227, 2598, 326, 480, 2265, 943, 2755, 3552, 291, 650, 1883, 7591, # 5142 - 1702, 1226, 102, 1547, 62, 3441, 904, 4415, 3442, 1164, 4150, 7592, 7593, 1224, 1548, 2756, # 5158 - 391, 498, 1493, 7594, 1386, 1419, 7595, 2055, 1177, 4416, 813, 880, 1081, 2363, 566, 1145, # 5174 - 4417, 2286, 1001, 1035, 2558, 2599, 2238, 394, 1286, 7596, 7597, 2068, 7598, 86, 1494, 1730, # 5190 - 3936, 491, 1588, 745, 897, 2948, 843, 3340, 3937, 2757, 2870, 3273, 1768, 998, 2217, 2069, # 5206 - 397, 1826, 1195, 1969, 3659, 2993, 3341, 284, 7599, 3782, 2500, 2137, 2119, 1903, 7600, 3938, # 5222 - 2150, 3939, 4151, 1036, 3443, 1904, 114, 2559, 4152, 209, 1527, 7601, 7602, 2949, 2831, 2625, # 5238 - 2385, 2719, 3139, 812, 2560, 7603, 3274, 7604, 1559, 737, 1884, 3660, 1210, 885, 28, 2686, # 5254 - 3553, 3783, 7605, 4153, 1004, 1779, 4418, 7606, 346, 1981, 2218, 2687, 4419, 3784, 1742, 797, # 5270 - 1642, 3940, 1933, 1072, 1384, 2151, 896, 3941, 3275, 3661, 3197, 2871, 3554, 7607, 2561, 1958, # 5286 - 4420, 2450, 1785, 7608, 7609, 7610, 3942, 4154, 1005, 1308, 3662, 4155, 2720, 4421, 4422, 1528, # 5302 - 2600, 161, 1178, 4156, 1982, 987, 4423, 1101, 4157, 631, 3943, 1157, 3198, 2420, 1343, 1241, # 5318 - 1016, 2239, 2562, 372, 877, 2339, 2501, 1160, 555, 1934, 911, 3944, 7611, 466, 1170, 169, # 5334 - 1051, 2907, 2688, 3663, 2474, 2994, 1182, 2011, 2563, 1251, 2626, 7612, 992, 2340, 3444, 1540, # 5350 - 2721, 1201, 2070, 2401, 1996, 2475, 7613, 4424, 528, 1922, 2188, 1503, 1873, 1570, 2364, 3342, # 5366 - 3276, 7614, 557, 1073, 7615, 1827, 3445, 2087, 2266, 3140, 3039, 3084, 767, 3085, 2786, 4425, # 5382 - 1006, 4158, 4426, 2341, 1267, 2176, 3664, 3199, 778, 3945, 3200, 2722, 1597, 2657, 7616, 4427, # 5398 - 7617, 3446, 7618, 7619, 7620, 3277, 2689, 1433, 3278, 131, 95, 1504, 3946, 723, 4159, 3141, # 5414 - 1841, 3555, 2758, 2189, 3947, 2027, 2104, 3665, 7621, 2995, 3948, 1218, 7622, 3343, 3201, 3949, # 5430 - 4160, 2576, 248, 1634, 3785, 912, 7623, 2832, 3666, 3040, 3786, 654, 53, 7624, 2996, 7625, # 5446 - 1688, 4428, 777, 3447, 1032, 3950, 1425, 7626, 191, 820, 2120, 2833, 971, 4429, 931, 3202, # 5462 - 135, 664, 783, 3787, 1997, 772, 2908, 1935, 3951, 3788, 4430, 2909, 3203, 282, 2723, 640, # 5478 - 1372, 3448, 1127, 922, 325, 3344, 7627, 7628, 711, 2044, 7629, 7630, 3952, 2219, 2787, 1936, # 5494 - 3953, 3345, 2220, 2251, 3789, 2300, 7631, 4431, 3790, 1258, 3279, 3954, 3204, 2138, 2950, 3955, # 5510 - 3956, 7632, 2221, 258, 3205, 4432, 101, 1227, 7633, 3280, 1755, 7634, 1391, 3281, 7635, 2910, # 5526 - 2056, 893, 7636, 7637, 7638, 1402, 4161, 2342, 7639, 7640, 3206, 3556, 7641, 7642, 878, 1325, # 5542 - 1780, 2788, 4433, 259, 1385, 2577, 744, 1183, 2267, 4434, 7643, 3957, 2502, 7644, 684, 1024, # 5558 - 4162, 7645, 472, 3557, 3449, 1165, 3282, 3958, 3959, 322, 2152, 881, 455, 1695, 1152, 1340, # 5574 - 660, 554, 2153, 4435, 1058, 4436, 4163, 830, 1065, 3346, 3960, 4437, 1923, 7646, 1703, 1918, # 5590 - 7647, 932, 2268, 122, 7648, 4438, 947, 677, 7649, 3791, 2627, 297, 1905, 1924, 2269, 4439, # 5606 - 2317, 3283, 7650, 7651, 4164, 7652, 4165, 84, 4166, 112, 989, 7653, 547, 1059, 3961, 701, # 5622 - 3558, 1019, 7654, 4167, 7655, 3450, 942, 639, 457, 2301, 2451, 993, 2951, 407, 851, 494, # 5638 - 4440, 3347, 927, 7656, 1237, 7657, 2421, 3348, 573, 4168, 680, 921, 2911, 1279, 1874, 285, # 5654 - 790, 1448, 1983, 719, 2167, 7658, 7659, 4441, 3962, 3963, 1649, 7660, 1541, 563, 7661, 1077, # 5670 - 7662, 3349, 3041, 3451, 511, 2997, 3964, 3965, 3667, 3966, 1268, 2564, 3350, 3207, 4442, 4443, # 5686 - 7663, 535, 1048, 1276, 1189, 2912, 2028, 3142, 1438, 1373, 2834, 2952, 1134, 2012, 7664, 4169, # 5702 - 1238, 2578, 3086, 1259, 7665, 700, 7666, 2953, 3143, 3668, 4170, 7667, 4171, 1146, 1875, 1906, # 5718 - 4444, 2601, 3967, 781, 2422, 132, 1589, 203, 147, 273, 2789, 2402, 898, 1786, 2154, 3968, # 5734 - 3969, 7668, 3792, 2790, 7669, 7670, 4445, 4446, 7671, 3208, 7672, 1635, 3793, 965, 7673, 1804, # 5750 - 2690, 1516, 3559, 1121, 1082, 1329, 3284, 3970, 1449, 3794, 65, 1128, 2835, 2913, 2759, 1590, # 5766 - 3795, 7674, 7675, 12, 2658, 45, 976, 2579, 3144, 4447, 517, 2528, 1013, 1037, 3209, 7676, # 5782 - 3796, 2836, 7677, 3797, 7678, 3452, 7679, 2602, 614, 1998, 2318, 3798, 3087, 2724, 2628, 7680, # 5798 - 2580, 4172, 599, 1269, 7681, 1810, 3669, 7682, 2691, 3088, 759, 1060, 489, 1805, 3351, 3285, # 5814 - 1358, 7683, 7684, 2386, 1387, 1215, 2629, 2252, 490, 7685, 7686, 4173, 1759, 2387, 2343, 7687, # 5830 - 4448, 3799, 1907, 3971, 2630, 1806, 3210, 4449, 3453, 3286, 2760, 2344, 874, 7688, 7689, 3454, # 5846 - 3670, 1858, 91, 2914, 3671, 3042, 3800, 4450, 7690, 3145, 3972, 2659, 7691, 3455, 1202, 1403, # 5862 - 3801, 2954, 2529, 1517, 2503, 4451, 3456, 2504, 7692, 4452, 7693, 2692, 1885, 1495, 1731, 3973, # 5878 - 2365, 4453, 7694, 2029, 7695, 7696, 3974, 2693, 1216, 237, 2581, 4174, 2319, 3975, 3802, 4454, # 5894 - 4455, 2694, 3560, 3457, 445, 4456, 7697, 7698, 7699, 7700, 2761, 61, 3976, 3672, 1822, 3977, # 5910 - 7701, 687, 2045, 935, 925, 405, 2660, 703, 1096, 1859, 2725, 4457, 3978, 1876, 1367, 2695, # 5926 - 3352, 918, 2105, 1781, 2476, 334, 3287, 1611, 1093, 4458, 564, 3146, 3458, 3673, 3353, 945, # 5942 - 2631, 2057, 4459, 7702, 1925, 872, 4175, 7703, 3459, 2696, 3089, 349, 4176, 3674, 3979, 4460, # 5958 - 3803, 4177, 3675, 2155, 3980, 4461, 4462, 4178, 4463, 2403, 2046, 782, 3981, 400, 251, 4179, # 5974 - 1624, 7704, 7705, 277, 3676, 299, 1265, 476, 1191, 3804, 2121, 4180, 4181, 1109, 205, 7706, # 5990 - 2582, 1000, 2156, 3561, 1860, 7707, 7708, 7709, 4464, 7710, 4465, 2565, 107, 2477, 2157, 3982, # 6006 - 3460, 3147, 7711, 1533, 541, 1301, 158, 753, 4182, 2872, 3562, 7712, 1696, 370, 1088, 4183, # 6022 - 4466, 3563, 579, 327, 440, 162, 2240, 269, 1937, 1374, 3461, 968, 3043, 56, 1396, 3090, # 6038 - 2106, 3288, 3354, 7713, 1926, 2158, 4467, 2998, 7714, 3564, 7715, 7716, 3677, 4468, 2478, 7717, # 6054 - 2791, 7718, 1650, 4469, 7719, 2603, 7720, 7721, 3983, 2661, 3355, 1149, 3356, 3984, 3805, 3985, # 6070 - 7722, 1076, 49, 7723, 951, 3211, 3289, 3290, 450, 2837, 920, 7724, 1811, 2792, 2366, 4184, # 6086 - 1908, 1138, 2367, 3806, 3462, 7725, 3212, 4470, 1909, 1147, 1518, 2423, 4471, 3807, 7726, 4472, # 6102 - 2388, 2604, 260, 1795, 3213, 7727, 7728, 3808, 3291, 708, 7729, 3565, 1704, 7730, 3566, 1351, # 6118 - 1618, 3357, 2999, 1886, 944, 4185, 3358, 4186, 3044, 3359, 4187, 7731, 3678, 422, 413, 1714, # 6134 - 3292, 500, 2058, 2345, 4188, 2479, 7732, 1344, 1910, 954, 7733, 1668, 7734, 7735, 3986, 2404, # 6150 - 4189, 3567, 3809, 4190, 7736, 2302, 1318, 2505, 3091, 133, 3092, 2873, 4473, 629, 31, 2838, # 6166 - 2697, 3810, 4474, 850, 949, 4475, 3987, 2955, 1732, 2088, 4191, 1496, 1852, 7737, 3988, 620, # 6182 - 3214, 981, 1242, 3679, 3360, 1619, 3680, 1643, 3293, 2139, 2452, 1970, 1719, 3463, 2168, 7738, # 6198 - 3215, 7739, 7740, 3361, 1828, 7741, 1277, 4476, 1565, 2047, 7742, 1636, 3568, 3093, 7743, 869, # 6214 - 2839, 655, 3811, 3812, 3094, 3989, 3000, 3813, 1310, 3569, 4477, 7744, 7745, 7746, 1733, 558, # 6230 - 4478, 3681, 335, 1549, 3045, 1756, 4192, 3682, 1945, 3464, 1829, 1291, 1192, 470, 2726, 2107, # 6246 - 2793, 913, 1054, 3990, 7747, 1027, 7748, 3046, 3991, 4479, 982, 2662, 3362, 3148, 3465, 3216, # 6262 - 3217, 1946, 2794, 7749, 571, 4480, 7750, 1830, 7751, 3570, 2583, 1523, 2424, 7752, 2089, 984, # 6278 - 4481, 3683, 1959, 7753, 3684, 852, 923, 2795, 3466, 3685, 969, 1519, 999, 2048, 2320, 1705, # 6294 - 7754, 3095, 615, 1662, 151, 597, 3992, 2405, 2321, 1049, 275, 4482, 3686, 4193, 568, 3687, # 6310 - 3571, 2480, 4194, 3688, 7755, 2425, 2270, 409, 3218, 7756, 1566, 2874, 3467, 1002, 769, 2840, # 6326 - 194, 2090, 3149, 3689, 2222, 3294, 4195, 628, 1505, 7757, 7758, 1763, 2177, 3001, 3993, 521, # 6342 - 1161, 2584, 1787, 2203, 2406, 4483, 3994, 1625, 4196, 4197, 412, 42, 3096, 464, 7759, 2632, # 6358 - 4484, 3363, 1760, 1571, 2875, 3468, 2530, 1219, 2204, 3814, 2633, 2140, 2368, 4485, 4486, 3295, # 6374 - 1651, 3364, 3572, 7760, 7761, 3573, 2481, 3469, 7762, 3690, 7763, 7764, 2271, 2091, 460, 7765, # 6390 - 4487, 7766, 3002, 962, 588, 3574, 289, 3219, 2634, 1116, 52, 7767, 3047, 1796, 7768, 7769, # 6406 - 7770, 1467, 7771, 1598, 1143, 3691, 4198, 1984, 1734, 1067, 4488, 1280, 3365, 465, 4489, 1572, # 6422 - 510, 7772, 1927, 2241, 1812, 1644, 3575, 7773, 4490, 3692, 7774, 7775, 2663, 1573, 1534, 7776, # 6438 - 7777, 4199, 536, 1807, 1761, 3470, 3815, 3150, 2635, 7778, 7779, 7780, 4491, 3471, 2915, 1911, # 6454 - 2796, 7781, 3296, 1122, 377, 3220, 7782, 360, 7783, 7784, 4200, 1529, 551, 7785, 2059, 3693, # 6470 - 1769, 2426, 7786, 2916, 4201, 3297, 3097, 2322, 2108, 2030, 4492, 1404, 136, 1468, 1479, 672, # 6486 - 1171, 3221, 2303, 271, 3151, 7787, 2762, 7788, 2049, 678, 2727, 865, 1947, 4493, 7789, 2013, # 6502 - 3995, 2956, 7790, 2728, 2223, 1397, 3048, 3694, 4494, 4495, 1735, 2917, 3366, 3576, 7791, 3816, # 6518 - 509, 2841, 2453, 2876, 3817, 7792, 7793, 3152, 3153, 4496, 4202, 2531, 4497, 2304, 1166, 1010, # 6534 - 552, 681, 1887, 7794, 7795, 2957, 2958, 3996, 1287, 1596, 1861, 3154, 358, 453, 736, 175, # 6550 - 478, 1117, 905, 1167, 1097, 7796, 1853, 1530, 7797, 1706, 7798, 2178, 3472, 2287, 3695, 3473, # 6566 - 3577, 4203, 2092, 4204, 7799, 3367, 1193, 2482, 4205, 1458, 2190, 2205, 1862, 1888, 1421, 3298, # 6582 - 2918, 3049, 2179, 3474, 595, 2122, 7800, 3997, 7801, 7802, 4206, 1707, 2636, 223, 3696, 1359, # 6598 - 751, 3098, 183, 3475, 7803, 2797, 3003, 419, 2369, 633, 704, 3818, 2389, 241, 7804, 7805, # 6614 - 7806, 838, 3004, 3697, 2272, 2763, 2454, 3819, 1938, 2050, 3998, 1309, 3099, 2242, 1181, 7807, # 6630 - 1136, 2206, 3820, 2370, 1446, 4207, 2305, 4498, 7808, 7809, 4208, 1055, 2605, 484, 3698, 7810, # 6646 - 3999, 625, 4209, 2273, 3368, 1499, 4210, 4000, 7811, 4001, 4211, 3222, 2274, 2275, 3476, 7812, # 6662 - 7813, 2764, 808, 2606, 3699, 3369, 4002, 4212, 3100, 2532, 526, 3370, 3821, 4213, 955, 7814, # 6678 - 1620, 4214, 2637, 2427, 7815, 1429, 3700, 1669, 1831, 994, 928, 7816, 3578, 1260, 7817, 7818, # 6694 - 7819, 1948, 2288, 741, 2919, 1626, 4215, 2729, 2455, 867, 1184, 362, 3371, 1392, 7820, 7821, # 6710 - 4003, 4216, 1770, 1736, 3223, 2920, 4499, 4500, 1928, 2698, 1459, 1158, 7822, 3050, 3372, 2877, # 6726 - 1292, 1929, 2506, 2842, 3701, 1985, 1187, 2071, 2014, 2607, 4217, 7823, 2566, 2507, 2169, 3702, # 6742 - 2483, 3299, 7824, 3703, 4501, 7825, 7826, 666, 1003, 3005, 1022, 3579, 4218, 7827, 4502, 1813, # 6758 - 2253, 574, 3822, 1603, 295, 1535, 705, 3823, 4219, 283, 858, 417, 7828, 7829, 3224, 4503, # 6774 - 4504, 3051, 1220, 1889, 1046, 2276, 2456, 4004, 1393, 1599, 689, 2567, 388, 4220, 7830, 2484, # 6790 - 802, 7831, 2798, 3824, 2060, 1405, 2254, 7832, 4505, 3825, 2109, 1052, 1345, 3225, 1585, 7833, # 6806 - 809, 7834, 7835, 7836, 575, 2730, 3477, 956, 1552, 1469, 1144, 2323, 7837, 2324, 1560, 2457, # 6822 - 3580, 3226, 4005, 616, 2207, 3155, 2180, 2289, 7838, 1832, 7839, 3478, 4506, 7840, 1319, 3704, # 6838 - 3705, 1211, 3581, 1023, 3227, 1293, 2799, 7841, 7842, 7843, 3826, 607, 2306, 3827, 762, 2878, # 6854 - 1439, 4221, 1360, 7844, 1485, 3052, 7845, 4507, 1038, 4222, 1450, 2061, 2638, 4223, 1379, 4508, # 6870 - 2585, 7846, 7847, 4224, 1352, 1414, 2325, 2921, 1172, 7848, 7849, 3828, 3829, 7850, 1797, 1451, # 6886 - 7851, 7852, 7853, 7854, 2922, 4006, 4007, 2485, 2346, 411, 4008, 4009, 3582, 3300, 3101, 4509, # 6902 - 1561, 2664, 1452, 4010, 1375, 7855, 7856, 47, 2959, 316, 7857, 1406, 1591, 2923, 3156, 7858, # 6918 - 1025, 2141, 3102, 3157, 354, 2731, 884, 2224, 4225, 2407, 508, 3706, 726, 3583, 996, 2428, # 6934 - 3584, 729, 7859, 392, 2191, 1453, 4011, 4510, 3707, 7860, 7861, 2458, 3585, 2608, 1675, 2800, # 6950 - 919, 2347, 2960, 2348, 1270, 4511, 4012, 73, 7862, 7863, 647, 7864, 3228, 2843, 2255, 1550, # 6966 - 1346, 3006, 7865, 1332, 883, 3479, 7866, 7867, 7868, 7869, 3301, 2765, 7870, 1212, 831, 1347, # 6982 - 4226, 4512, 2326, 3830, 1863, 3053, 720, 3831, 4513, 4514, 3832, 7871, 4227, 7872, 7873, 4515, # 6998 - 7874, 7875, 1798, 4516, 3708, 2609, 4517, 3586, 1645, 2371, 7876, 7877, 2924, 669, 2208, 2665, # 7014 - 2429, 7878, 2879, 7879, 7880, 1028, 3229, 7881, 4228, 2408, 7882, 2256, 1353, 7883, 7884, 4518, # 7030 - 3158, 518, 7885, 4013, 7886, 4229, 1960, 7887, 2142, 4230, 7888, 7889, 3007, 2349, 2350, 3833, # 7046 - 516, 1833, 1454, 4014, 2699, 4231, 4519, 2225, 2610, 1971, 1129, 3587, 7890, 2766, 7891, 2961, # 7062 - 1422, 577, 1470, 3008, 1524, 3373, 7892, 7893, 432, 4232, 3054, 3480, 7894, 2586, 1455, 2508, # 7078 - 2226, 1972, 1175, 7895, 1020, 2732, 4015, 3481, 4520, 7896, 2733, 7897, 1743, 1361, 3055, 3482, # 7094 - 2639, 4016, 4233, 4521, 2290, 895, 924, 4234, 2170, 331, 2243, 3056, 166, 1627, 3057, 1098, # 7110 - 7898, 1232, 2880, 2227, 3374, 4522, 657, 403, 1196, 2372, 542, 3709, 3375, 1600, 4235, 3483, # 7126 - 7899, 4523, 2767, 3230, 576, 530, 1362, 7900, 4524, 2533, 2666, 3710, 4017, 7901, 842, 3834, # 7142 - 7902, 2801, 2031, 1014, 4018, 213, 2700, 3376, 665, 621, 4236, 7903, 3711, 2925, 2430, 7904, # 7158 - 2431, 3302, 3588, 3377, 7905, 4237, 2534, 4238, 4525, 3589, 1682, 4239, 3484, 1380, 7906, 724, # 7174 - 2277, 600, 1670, 7907, 1337, 1233, 4526, 3103, 2244, 7908, 1621, 4527, 7909, 651, 4240, 7910, # 7190 - 1612, 4241, 2611, 7911, 2844, 7912, 2734, 2307, 3058, 7913, 716, 2459, 3059, 174, 1255, 2701, # 7206 - 4019, 3590, 548, 1320, 1398, 728, 4020, 1574, 7914, 1890, 1197, 3060, 4021, 7915, 3061, 3062, # 7222 - 3712, 3591, 3713, 747, 7916, 635, 4242, 4528, 7917, 7918, 7919, 4243, 7920, 7921, 4529, 7922, # 7238 - 3378, 4530, 2432, 451, 7923, 3714, 2535, 2072, 4244, 2735, 4245, 4022, 7924, 1764, 4531, 7925, # 7254 - 4246, 350, 7926, 2278, 2390, 2486, 7927, 4247, 4023, 2245, 1434, 4024, 488, 4532, 458, 4248, # 7270 - 4025, 3715, 771, 1330, 2391, 3835, 2568, 3159, 2159, 2409, 1553, 2667, 3160, 4249, 7928, 2487, # 7286 - 2881, 2612, 1720, 2702, 4250, 3379, 4533, 7929, 2536, 4251, 7930, 3231, 4252, 2768, 7931, 2015, # 7302 - 2736, 7932, 1155, 1017, 3716, 3836, 7933, 3303, 2308, 201, 1864, 4253, 1430, 7934, 4026, 7935, # 7318 - 7936, 7937, 7938, 7939, 4254, 1604, 7940, 414, 1865, 371, 2587, 4534, 4535, 3485, 2016, 3104, # 7334 - 4536, 1708, 960, 4255, 887, 389, 2171, 1536, 1663, 1721, 7941, 2228, 4027, 2351, 2926, 1580, # 7350 - 7942, 7943, 7944, 1744, 7945, 2537, 4537, 4538, 7946, 4539, 7947, 2073, 7948, 7949, 3592, 3380, # 7366 - 2882, 4256, 7950, 4257, 2640, 3381, 2802, 673, 2703, 2460, 709, 3486, 4028, 3593, 4258, 7951, # 7382 - 1148, 502, 634, 7952, 7953, 1204, 4540, 3594, 1575, 4541, 2613, 3717, 7954, 3718, 3105, 948, # 7398 - 3232, 121, 1745, 3837, 1110, 7955, 4259, 3063, 2509, 3009, 4029, 3719, 1151, 1771, 3838, 1488, # 7414 - 4030, 1986, 7956, 2433, 3487, 7957, 7958, 2093, 7959, 4260, 3839, 1213, 1407, 2803, 531, 2737, # 7430 - 2538, 3233, 1011, 1537, 7960, 2769, 4261, 3106, 1061, 7961, 3720, 3721, 1866, 2883, 7962, 2017, # 7446 - 120, 4262, 4263, 2062, 3595, 3234, 2309, 3840, 2668, 3382, 1954, 4542, 7963, 7964, 3488, 1047, # 7462 - 2704, 1266, 7965, 1368, 4543, 2845, 649, 3383, 3841, 2539, 2738, 1102, 2846, 2669, 7966, 7967, # 7478 - 1999, 7968, 1111, 3596, 2962, 7969, 2488, 3842, 3597, 2804, 1854, 3384, 3722, 7970, 7971, 3385, # 7494 - 2410, 2884, 3304, 3235, 3598, 7972, 2569, 7973, 3599, 2805, 4031, 1460, 856, 7974, 3600, 7975, # 7510 - 2885, 2963, 7976, 2886, 3843, 7977, 4264, 632, 2510, 875, 3844, 1697, 3845, 2291, 7978, 7979, # 7526 - 4544, 3010, 1239, 580, 4545, 4265, 7980, 914, 936, 2074, 1190, 4032, 1039, 2123, 7981, 7982, # 7542 - 7983, 3386, 1473, 7984, 1354, 4266, 3846, 7985, 2172, 3064, 4033, 915, 3305, 4267, 4268, 3306, # 7558 - 1605, 1834, 7986, 2739, 398, 3601, 4269, 3847, 4034, 328, 1912, 2847, 4035, 3848, 1331, 4270, # 7574 - 3011, 937, 4271, 7987, 3602, 4036, 4037, 3387, 2160, 4546, 3388, 524, 742, 538, 3065, 1012, # 7590 - 7988, 7989, 3849, 2461, 7990, 658, 1103, 225, 3850, 7991, 7992, 4547, 7993, 4548, 7994, 3236, # 7606 - 1243, 7995, 4038, 963, 2246, 4549, 7996, 2705, 3603, 3161, 7997, 7998, 2588, 2327, 7999, 4550, # 7622 - 8000, 8001, 8002, 3489, 3307, 957, 3389, 2540, 2032, 1930, 2927, 2462, 870, 2018, 3604, 1746, # 7638 - 2770, 2771, 2434, 2463, 8003, 3851, 8004, 3723, 3107, 3724, 3490, 3390, 3725, 8005, 1179, 3066, # 7654 - 8006, 3162, 2373, 4272, 3726, 2541, 3163, 3108, 2740, 4039, 8007, 3391, 1556, 2542, 2292, 977, # 7670 - 2887, 2033, 4040, 1205, 3392, 8008, 1765, 3393, 3164, 2124, 1271, 1689, 714, 4551, 3491, 8009, # 7686 - 2328, 3852, 533, 4273, 3605, 2181, 617, 8010, 2464, 3308, 3492, 2310, 8011, 8012, 3165, 8013, # 7702 - 8014, 3853, 1987, 618, 427, 2641, 3493, 3394, 8015, 8016, 1244, 1690, 8017, 2806, 4274, 4552, # 7718 - 8018, 3494, 8019, 8020, 2279, 1576, 473, 3606, 4275, 3395, 972, 8021, 3607, 8022, 3067, 8023, # 7734 - 8024, 4553, 4554, 8025, 3727, 4041, 4042, 8026, 153, 4555, 356, 8027, 1891, 2888, 4276, 2143, # 7750 - 408, 803, 2352, 8028, 3854, 8029, 4277, 1646, 2570, 2511, 4556, 4557, 3855, 8030, 3856, 4278, # 7766 - 8031, 2411, 3396, 752, 8032, 8033, 1961, 2964, 8034, 746, 3012, 2465, 8035, 4279, 3728, 698, # 7782 - 4558, 1892, 4280, 3608, 2543, 4559, 3609, 3857, 8036, 3166, 3397, 8037, 1823, 1302, 4043, 2706, # 7798 - 3858, 1973, 4281, 8038, 4282, 3167, 823, 1303, 1288, 1236, 2848, 3495, 4044, 3398, 774, 3859, # 7814 - 8039, 1581, 4560, 1304, 2849, 3860, 4561, 8040, 2435, 2161, 1083, 3237, 4283, 4045, 4284, 344, # 7830 - 1173, 288, 2311, 454, 1683, 8041, 8042, 1461, 4562, 4046, 2589, 8043, 8044, 4563, 985, 894, # 7846 - 8045, 3399, 3168, 8046, 1913, 2928, 3729, 1988, 8047, 2110, 1974, 8048, 4047, 8049, 2571, 1194, # 7862 - 425, 8050, 4564, 3169, 1245, 3730, 4285, 8051, 8052, 2850, 8053, 636, 4565, 1855, 3861, 760, # 7878 - 1799, 8054, 4286, 2209, 1508, 4566, 4048, 1893, 1684, 2293, 8055, 8056, 8057, 4287, 4288, 2210, # 7894 - 479, 8058, 8059, 832, 8060, 4049, 2489, 8061, 2965, 2490, 3731, 990, 3109, 627, 1814, 2642, # 7910 - 4289, 1582, 4290, 2125, 2111, 3496, 4567, 8062, 799, 4291, 3170, 8063, 4568, 2112, 1737, 3013, # 7926 - 1018, 543, 754, 4292, 3309, 1676, 4569, 4570, 4050, 8064, 1489, 8065, 3497, 8066, 2614, 2889, # 7942 - 4051, 8067, 8068, 2966, 8069, 8070, 8071, 8072, 3171, 4571, 4572, 2182, 1722, 8073, 3238, 3239, # 7958 - 1842, 3610, 1715, 481, 365, 1975, 1856, 8074, 8075, 1962, 2491, 4573, 8076, 2126, 3611, 3240, # 7974 - 433, 1894, 2063, 2075, 8077, 602, 2741, 8078, 8079, 8080, 8081, 8082, 3014, 1628, 3400, 8083, # 7990 - 3172, 4574, 4052, 2890, 4575, 2512, 8084, 2544, 2772, 8085, 8086, 8087, 3310, 4576, 2891, 8088, # 8006 - 4577, 8089, 2851, 4578, 4579, 1221, 2967, 4053, 2513, 8090, 8091, 8092, 1867, 1989, 8093, 8094, # 8022 - 8095, 1895, 8096, 8097, 4580, 1896, 4054, 318, 8098, 2094, 4055, 4293, 8099, 8100, 485, 8101, # 8038 - 938, 3862, 553, 2670, 116, 8102, 3863, 3612, 8103, 3498, 2671, 2773, 3401, 3311, 2807, 8104, # 8054 - 3613, 2929, 4056, 1747, 2930, 2968, 8105, 8106, 207, 8107, 8108, 2672, 4581, 2514, 8109, 3015, # 8070 - 890, 3614, 3864, 8110, 1877, 3732, 3402, 8111, 2183, 2353, 3403, 1652, 8112, 8113, 8114, 941, # 8086 - 2294, 208, 3499, 4057, 2019, 330, 4294, 3865, 2892, 2492, 3733, 4295, 8115, 8116, 8117, 8118, # 8102 -) -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py deleted file mode 100644 index a37ab189..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCTWDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import EUCTW_SM_MODEL - - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "EUC-TW" - - @property - def language(self) -> str: - return "Taiwan" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py deleted file mode 100644 index b32bfc74..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py +++ /dev/null @@ -1,284 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -# fmt: off -GB2312_CHAR_TO_FREQ_ORDER = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 -) -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py deleted file mode 100644 index d423e731..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import GB2312DistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import GB2312_SM_MODEL - - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "GB2312" - - @property - def language(self) -> str: - return "Chinese" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py deleted file mode 100644 index 785d0057..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py +++ /dev/null @@ -1,316 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Optional, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState -from .sbcharsetprober import SingleByteCharSetProber - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - - -class HebrewProber(CharSetProber): - SPACE = 0x20 - # windows-1255 / ISO-8859-8 code points of interest - FINAL_KAF = 0xEA - NORMAL_KAF = 0xEB - FINAL_MEM = 0xED - NORMAL_MEM = 0xEE - FINAL_NUN = 0xEF - NORMAL_NUN = 0xF0 - FINAL_PE = 0xF3 - NORMAL_PE = 0xF4 - FINAL_TSADI = 0xF5 - NORMAL_TSADI = 0xF6 - - # Minimum Visual vs Logical final letter score difference. - # If the difference is below this, don't rely solely on the final letter score - # distance. - MIN_FINAL_CHAR_DISTANCE = 5 - - # Minimum Visual vs Logical model score difference. - # If the difference is below this, don't rely at all on the model score - # distance. - MIN_MODEL_DISTANCE = 0.01 - - VISUAL_HEBREW_NAME = "ISO-8859-8" - LOGICAL_HEBREW_NAME = "windows-1255" - - def __init__(self) -> None: - super().__init__() - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - self._prev = self.SPACE - self._before_prev = self.SPACE - self._logical_prober: Optional[SingleByteCharSetProber] = None - self._visual_prober: Optional[SingleByteCharSetProber] = None - self.reset() - - def reset(self) -> None: - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._prev = self.SPACE - self._before_prev = self.SPACE - # These probers are owned by the group prober. - - def set_model_probers( - self, - logical_prober: SingleByteCharSetProber, - visual_prober: SingleByteCharSetProber, - ) -> None: - self._logical_prober = logical_prober - self._visual_prober = visual_prober - - def is_final(self, c: int) -> bool: - return c in [ - self.FINAL_KAF, - self.FINAL_MEM, - self.FINAL_NUN, - self.FINAL_PE, - self.FINAL_TSADI, - ] - - def is_non_final(self, c: int) -> bool: - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return c in [self.NORMAL_KAF, self.NORMAL_MEM, self.NORMAL_NUN, self.NORMAL_PE] - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.state == ProbingState.NOT_ME: - # Both model probers say it's not them. No reason to continue. - return ProbingState.NOT_ME - - byte_str = self.filter_high_byte_only(byte_str) - - for cur in byte_str: - if cur == self.SPACE: - # We stand on a space - a word just ended - if self._before_prev != self.SPACE: - # next-to-last char was not a space so self._prev is not a - # 1 letter word - if self.is_final(self._prev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._final_char_logical_score += 1 - elif self.is_non_final(self._prev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._final_char_visual_score += 1 - else: - # Not standing on a space - if ( - (self._before_prev == self.SPACE) - and (self.is_final(self._prev)) - and (cur != self.SPACE) - ): - # case (3) [-2:space][-1:final letter][cur:not space] - self._final_char_visual_score += 1 - self._before_prev = self._prev - self._prev = cur - - # Forever detecting, till the end or until both model probers return - # ProbingState.NOT_ME (handled above) - return ProbingState.DETECTING - - @property - def charset_name(self) -> str: - assert self._logical_prober is not None - assert self._visual_prober is not None - - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._final_char_logical_score - self._final_char_visual_score - if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = ( - self._logical_prober.get_confidence() - self._visual_prober.get_confidence() - ) - if modelsub > self.MIN_MODEL_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if modelsub < -self.MIN_MODEL_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return self.VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return self.LOGICAL_HEBREW_NAME - - @property - def language(self) -> str: - return "Hebrew" - - @property - def state(self) -> ProbingState: - assert self._logical_prober is not None - assert self._visual_prober is not None - - # Remain active as long as any of the model probers are active. - if (self._logical_prober.state == ProbingState.NOT_ME) and ( - self._visual_prober.state == ProbingState.NOT_ME - ): - return ProbingState.NOT_ME - return ProbingState.DETECTING diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py deleted file mode 100644 index 3293576e..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py +++ /dev/null @@ -1,325 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -# fmt: off -JIS_CHAR_TO_FREQ_ORDER = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -) -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py deleted file mode 100644 index c1296999..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py +++ /dev/null @@ -1,2382 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# The frequency data itself is the same as euc-kr. -# This is just a mapping table to euc-kr. - -JOHAB_TO_EUCKR_ORDER_TABLE = { - 0x8861: 0, - 0x8862: 1, - 0x8865: 2, - 0x8868: 3, - 0x8869: 4, - 0x886A: 5, - 0x886B: 6, - 0x8871: 7, - 0x8873: 8, - 0x8874: 9, - 0x8875: 10, - 0x8876: 11, - 0x8877: 12, - 0x8878: 13, - 0x8879: 14, - 0x887B: 15, - 0x887C: 16, - 0x887D: 17, - 0x8881: 18, - 0x8882: 19, - 0x8885: 20, - 0x8889: 21, - 0x8891: 22, - 0x8893: 23, - 0x8895: 24, - 0x8896: 25, - 0x8897: 26, - 0x88A1: 27, - 0x88A2: 28, - 0x88A5: 29, - 0x88A9: 30, - 0x88B5: 31, - 0x88B7: 32, - 0x88C1: 33, - 0x88C5: 34, - 0x88C9: 35, - 0x88E1: 36, - 0x88E2: 37, - 0x88E5: 38, - 0x88E8: 39, - 0x88E9: 40, - 0x88EB: 41, - 0x88F1: 42, - 0x88F3: 43, - 0x88F5: 44, - 0x88F6: 45, - 0x88F7: 46, - 0x88F8: 47, - 0x88FB: 48, - 0x88FC: 49, - 0x88FD: 50, - 0x8941: 51, - 0x8945: 52, - 0x8949: 53, - 0x8951: 54, - 0x8953: 55, - 0x8955: 56, - 0x8956: 57, - 0x8957: 58, - 0x8961: 59, - 0x8962: 60, - 0x8963: 61, - 0x8965: 62, - 0x8968: 63, - 0x8969: 64, - 0x8971: 65, - 0x8973: 66, - 0x8975: 67, - 0x8976: 68, - 0x8977: 69, - 0x897B: 70, - 0x8981: 71, - 0x8985: 72, - 0x8989: 73, - 0x8993: 74, - 0x8995: 75, - 0x89A1: 76, - 0x89A2: 77, - 0x89A5: 78, - 0x89A8: 79, - 0x89A9: 80, - 0x89AB: 81, - 0x89AD: 82, - 0x89B0: 83, - 0x89B1: 84, - 0x89B3: 85, - 0x89B5: 86, - 0x89B7: 87, - 0x89B8: 88, - 0x89C1: 89, - 0x89C2: 90, - 0x89C5: 91, - 0x89C9: 92, - 0x89CB: 93, - 0x89D1: 94, - 0x89D3: 95, - 0x89D5: 96, - 0x89D7: 97, - 0x89E1: 98, - 0x89E5: 99, - 0x89E9: 100, - 0x89F3: 101, - 0x89F6: 102, - 0x89F7: 103, - 0x8A41: 104, - 0x8A42: 105, - 0x8A45: 106, - 0x8A49: 107, - 0x8A51: 108, - 0x8A53: 109, - 0x8A55: 110, - 0x8A57: 111, - 0x8A61: 112, - 0x8A65: 113, - 0x8A69: 114, - 0x8A73: 115, - 0x8A75: 116, - 0x8A81: 117, - 0x8A82: 118, - 0x8A85: 119, - 0x8A88: 120, - 0x8A89: 121, - 0x8A8A: 122, - 0x8A8B: 123, - 0x8A90: 124, - 0x8A91: 125, - 0x8A93: 126, - 0x8A95: 127, - 0x8A97: 128, - 0x8A98: 129, - 0x8AA1: 130, - 0x8AA2: 131, - 0x8AA5: 132, - 0x8AA9: 133, - 0x8AB6: 134, - 0x8AB7: 135, - 0x8AC1: 136, - 0x8AD5: 137, - 0x8AE1: 138, - 0x8AE2: 139, - 0x8AE5: 140, - 0x8AE9: 141, - 0x8AF1: 142, - 0x8AF3: 143, - 0x8AF5: 144, - 0x8B41: 145, - 0x8B45: 146, - 0x8B49: 147, - 0x8B61: 148, - 0x8B62: 149, - 0x8B65: 150, - 0x8B68: 151, - 0x8B69: 152, - 0x8B6A: 153, - 0x8B71: 154, - 0x8B73: 155, - 0x8B75: 156, - 0x8B77: 157, - 0x8B81: 158, - 0x8BA1: 159, - 0x8BA2: 160, - 0x8BA5: 161, - 0x8BA8: 162, - 0x8BA9: 163, - 0x8BAB: 164, - 0x8BB1: 165, - 0x8BB3: 166, - 0x8BB5: 167, - 0x8BB7: 168, - 0x8BB8: 169, - 0x8BBC: 170, - 0x8C61: 171, - 0x8C62: 172, - 0x8C63: 173, - 0x8C65: 174, - 0x8C69: 175, - 0x8C6B: 176, - 0x8C71: 177, - 0x8C73: 178, - 0x8C75: 179, - 0x8C76: 180, - 0x8C77: 181, - 0x8C7B: 182, - 0x8C81: 183, - 0x8C82: 184, - 0x8C85: 185, - 0x8C89: 186, - 0x8C91: 187, - 0x8C93: 188, - 0x8C95: 189, - 0x8C96: 190, - 0x8C97: 191, - 0x8CA1: 192, - 0x8CA2: 193, - 0x8CA9: 194, - 0x8CE1: 195, - 0x8CE2: 196, - 0x8CE3: 197, - 0x8CE5: 198, - 0x8CE9: 199, - 0x8CF1: 200, - 0x8CF3: 201, - 0x8CF5: 202, - 0x8CF6: 203, - 0x8CF7: 204, - 0x8D41: 205, - 0x8D42: 206, - 0x8D45: 207, - 0x8D51: 208, - 0x8D55: 209, - 0x8D57: 210, - 0x8D61: 211, - 0x8D65: 212, - 0x8D69: 213, - 0x8D75: 214, - 0x8D76: 215, - 0x8D7B: 216, - 0x8D81: 217, - 0x8DA1: 218, - 0x8DA2: 219, - 0x8DA5: 220, - 0x8DA7: 221, - 0x8DA9: 222, - 0x8DB1: 223, - 0x8DB3: 224, - 0x8DB5: 225, - 0x8DB7: 226, - 0x8DB8: 227, - 0x8DB9: 228, - 0x8DC1: 229, - 0x8DC2: 230, - 0x8DC9: 231, - 0x8DD6: 232, - 0x8DD7: 233, - 0x8DE1: 234, - 0x8DE2: 235, - 0x8DF7: 236, - 0x8E41: 237, - 0x8E45: 238, - 0x8E49: 239, - 0x8E51: 240, - 0x8E53: 241, - 0x8E57: 242, - 0x8E61: 243, - 0x8E81: 244, - 0x8E82: 245, - 0x8E85: 246, - 0x8E89: 247, - 0x8E90: 248, - 0x8E91: 249, - 0x8E93: 250, - 0x8E95: 251, - 0x8E97: 252, - 0x8E98: 253, - 0x8EA1: 254, - 0x8EA9: 255, - 0x8EB6: 256, - 0x8EB7: 257, - 0x8EC1: 258, - 0x8EC2: 259, - 0x8EC5: 260, - 0x8EC9: 261, - 0x8ED1: 262, - 0x8ED3: 263, - 0x8ED6: 264, - 0x8EE1: 265, - 0x8EE5: 266, - 0x8EE9: 267, - 0x8EF1: 268, - 0x8EF3: 269, - 0x8F41: 270, - 0x8F61: 271, - 0x8F62: 272, - 0x8F65: 273, - 0x8F67: 274, - 0x8F69: 275, - 0x8F6B: 276, - 0x8F70: 277, - 0x8F71: 278, - 0x8F73: 279, - 0x8F75: 280, - 0x8F77: 281, - 0x8F7B: 282, - 0x8FA1: 283, - 0x8FA2: 284, - 0x8FA5: 285, - 0x8FA9: 286, - 0x8FB1: 287, - 0x8FB3: 288, - 0x8FB5: 289, - 0x8FB7: 290, - 0x9061: 291, - 0x9062: 292, - 0x9063: 293, - 0x9065: 294, - 0x9068: 295, - 0x9069: 296, - 0x906A: 297, - 0x906B: 298, - 0x9071: 299, - 0x9073: 300, - 0x9075: 301, - 0x9076: 302, - 0x9077: 303, - 0x9078: 304, - 0x9079: 305, - 0x907B: 306, - 0x907D: 307, - 0x9081: 308, - 0x9082: 309, - 0x9085: 310, - 0x9089: 311, - 0x9091: 312, - 0x9093: 313, - 0x9095: 314, - 0x9096: 315, - 0x9097: 316, - 0x90A1: 317, - 0x90A2: 318, - 0x90A5: 319, - 0x90A9: 320, - 0x90B1: 321, - 0x90B7: 322, - 0x90E1: 323, - 0x90E2: 324, - 0x90E4: 325, - 0x90E5: 326, - 0x90E9: 327, - 0x90EB: 328, - 0x90EC: 329, - 0x90F1: 330, - 0x90F3: 331, - 0x90F5: 332, - 0x90F6: 333, - 0x90F7: 334, - 0x90FD: 335, - 0x9141: 336, - 0x9142: 337, - 0x9145: 338, - 0x9149: 339, - 0x9151: 340, - 0x9153: 341, - 0x9155: 342, - 0x9156: 343, - 0x9157: 344, - 0x9161: 345, - 0x9162: 346, - 0x9165: 347, - 0x9169: 348, - 0x9171: 349, - 0x9173: 350, - 0x9176: 351, - 0x9177: 352, - 0x917A: 353, - 0x9181: 354, - 0x9185: 355, - 0x91A1: 356, - 0x91A2: 357, - 0x91A5: 358, - 0x91A9: 359, - 0x91AB: 360, - 0x91B1: 361, - 0x91B3: 362, - 0x91B5: 363, - 0x91B7: 364, - 0x91BC: 365, - 0x91BD: 366, - 0x91C1: 367, - 0x91C5: 368, - 0x91C9: 369, - 0x91D6: 370, - 0x9241: 371, - 0x9245: 372, - 0x9249: 373, - 0x9251: 374, - 0x9253: 375, - 0x9255: 376, - 0x9261: 377, - 0x9262: 378, - 0x9265: 379, - 0x9269: 380, - 0x9273: 381, - 0x9275: 382, - 0x9277: 383, - 0x9281: 384, - 0x9282: 385, - 0x9285: 386, - 0x9288: 387, - 0x9289: 388, - 0x9291: 389, - 0x9293: 390, - 0x9295: 391, - 0x9297: 392, - 0x92A1: 393, - 0x92B6: 394, - 0x92C1: 395, - 0x92E1: 396, - 0x92E5: 397, - 0x92E9: 398, - 0x92F1: 399, - 0x92F3: 400, - 0x9341: 401, - 0x9342: 402, - 0x9349: 403, - 0x9351: 404, - 0x9353: 405, - 0x9357: 406, - 0x9361: 407, - 0x9362: 408, - 0x9365: 409, - 0x9369: 410, - 0x936A: 411, - 0x936B: 412, - 0x9371: 413, - 0x9373: 414, - 0x9375: 415, - 0x9377: 416, - 0x9378: 417, - 0x937C: 418, - 0x9381: 419, - 0x9385: 420, - 0x9389: 421, - 0x93A1: 422, - 0x93A2: 423, - 0x93A5: 424, - 0x93A9: 425, - 0x93AB: 426, - 0x93B1: 427, - 0x93B3: 428, - 0x93B5: 429, - 0x93B7: 430, - 0x93BC: 431, - 0x9461: 432, - 0x9462: 433, - 0x9463: 434, - 0x9465: 435, - 0x9468: 436, - 0x9469: 437, - 0x946A: 438, - 0x946B: 439, - 0x946C: 440, - 0x9470: 441, - 0x9471: 442, - 0x9473: 443, - 0x9475: 444, - 0x9476: 445, - 0x9477: 446, - 0x9478: 447, - 0x9479: 448, - 0x947D: 449, - 0x9481: 450, - 0x9482: 451, - 0x9485: 452, - 0x9489: 453, - 0x9491: 454, - 0x9493: 455, - 0x9495: 456, - 0x9496: 457, - 0x9497: 458, - 0x94A1: 459, - 0x94E1: 460, - 0x94E2: 461, - 0x94E3: 462, - 0x94E5: 463, - 0x94E8: 464, - 0x94E9: 465, - 0x94EB: 466, - 0x94EC: 467, - 0x94F1: 468, - 0x94F3: 469, - 0x94F5: 470, - 0x94F7: 471, - 0x94F9: 472, - 0x94FC: 473, - 0x9541: 474, - 0x9542: 475, - 0x9545: 476, - 0x9549: 477, - 0x9551: 478, - 0x9553: 479, - 0x9555: 480, - 0x9556: 481, - 0x9557: 482, - 0x9561: 483, - 0x9565: 484, - 0x9569: 485, - 0x9576: 486, - 0x9577: 487, - 0x9581: 488, - 0x9585: 489, - 0x95A1: 490, - 0x95A2: 491, - 0x95A5: 492, - 0x95A8: 493, - 0x95A9: 494, - 0x95AB: 495, - 0x95AD: 496, - 0x95B1: 497, - 0x95B3: 498, - 0x95B5: 499, - 0x95B7: 500, - 0x95B9: 501, - 0x95BB: 502, - 0x95C1: 503, - 0x95C5: 504, - 0x95C9: 505, - 0x95E1: 506, - 0x95F6: 507, - 0x9641: 508, - 0x9645: 509, - 0x9649: 510, - 0x9651: 511, - 0x9653: 512, - 0x9655: 513, - 0x9661: 514, - 0x9681: 515, - 0x9682: 516, - 0x9685: 517, - 0x9689: 518, - 0x9691: 519, - 0x9693: 520, - 0x9695: 521, - 0x9697: 522, - 0x96A1: 523, - 0x96B6: 524, - 0x96C1: 525, - 0x96D7: 526, - 0x96E1: 527, - 0x96E5: 528, - 0x96E9: 529, - 0x96F3: 530, - 0x96F5: 531, - 0x96F7: 532, - 0x9741: 533, - 0x9745: 534, - 0x9749: 535, - 0x9751: 536, - 0x9757: 537, - 0x9761: 538, - 0x9762: 539, - 0x9765: 540, - 0x9768: 541, - 0x9769: 542, - 0x976B: 543, - 0x9771: 544, - 0x9773: 545, - 0x9775: 546, - 0x9777: 547, - 0x9781: 548, - 0x97A1: 549, - 0x97A2: 550, - 0x97A5: 551, - 0x97A8: 552, - 0x97A9: 553, - 0x97B1: 554, - 0x97B3: 555, - 0x97B5: 556, - 0x97B6: 557, - 0x97B7: 558, - 0x97B8: 559, - 0x9861: 560, - 0x9862: 561, - 0x9865: 562, - 0x9869: 563, - 0x9871: 564, - 0x9873: 565, - 0x9875: 566, - 0x9876: 567, - 0x9877: 568, - 0x987D: 569, - 0x9881: 570, - 0x9882: 571, - 0x9885: 572, - 0x9889: 573, - 0x9891: 574, - 0x9893: 575, - 0x9895: 576, - 0x9896: 577, - 0x9897: 578, - 0x98E1: 579, - 0x98E2: 580, - 0x98E5: 581, - 0x98E9: 582, - 0x98EB: 583, - 0x98EC: 584, - 0x98F1: 585, - 0x98F3: 586, - 0x98F5: 587, - 0x98F6: 588, - 0x98F7: 589, - 0x98FD: 590, - 0x9941: 591, - 0x9942: 592, - 0x9945: 593, - 0x9949: 594, - 0x9951: 595, - 0x9953: 596, - 0x9955: 597, - 0x9956: 598, - 0x9957: 599, - 0x9961: 600, - 0x9976: 601, - 0x99A1: 602, - 0x99A2: 603, - 0x99A5: 604, - 0x99A9: 605, - 0x99B7: 606, - 0x99C1: 607, - 0x99C9: 608, - 0x99E1: 609, - 0x9A41: 610, - 0x9A45: 611, - 0x9A81: 612, - 0x9A82: 613, - 0x9A85: 614, - 0x9A89: 615, - 0x9A90: 616, - 0x9A91: 617, - 0x9A97: 618, - 0x9AC1: 619, - 0x9AE1: 620, - 0x9AE5: 621, - 0x9AE9: 622, - 0x9AF1: 623, - 0x9AF3: 624, - 0x9AF7: 625, - 0x9B61: 626, - 0x9B62: 627, - 0x9B65: 628, - 0x9B68: 629, - 0x9B69: 630, - 0x9B71: 631, - 0x9B73: 632, - 0x9B75: 633, - 0x9B81: 634, - 0x9B85: 635, - 0x9B89: 636, - 0x9B91: 637, - 0x9B93: 638, - 0x9BA1: 639, - 0x9BA5: 640, - 0x9BA9: 641, - 0x9BB1: 642, - 0x9BB3: 643, - 0x9BB5: 644, - 0x9BB7: 645, - 0x9C61: 646, - 0x9C62: 647, - 0x9C65: 648, - 0x9C69: 649, - 0x9C71: 650, - 0x9C73: 651, - 0x9C75: 652, - 0x9C76: 653, - 0x9C77: 654, - 0x9C78: 655, - 0x9C7C: 656, - 0x9C7D: 657, - 0x9C81: 658, - 0x9C82: 659, - 0x9C85: 660, - 0x9C89: 661, - 0x9C91: 662, - 0x9C93: 663, - 0x9C95: 664, - 0x9C96: 665, - 0x9C97: 666, - 0x9CA1: 667, - 0x9CA2: 668, - 0x9CA5: 669, - 0x9CB5: 670, - 0x9CB7: 671, - 0x9CE1: 672, - 0x9CE2: 673, - 0x9CE5: 674, - 0x9CE9: 675, - 0x9CF1: 676, - 0x9CF3: 677, - 0x9CF5: 678, - 0x9CF6: 679, - 0x9CF7: 680, - 0x9CFD: 681, - 0x9D41: 682, - 0x9D42: 683, - 0x9D45: 684, - 0x9D49: 685, - 0x9D51: 686, - 0x9D53: 687, - 0x9D55: 688, - 0x9D57: 689, - 0x9D61: 690, - 0x9D62: 691, - 0x9D65: 692, - 0x9D69: 693, - 0x9D71: 694, - 0x9D73: 695, - 0x9D75: 696, - 0x9D76: 697, - 0x9D77: 698, - 0x9D81: 699, - 0x9D85: 700, - 0x9D93: 701, - 0x9D95: 702, - 0x9DA1: 703, - 0x9DA2: 704, - 0x9DA5: 705, - 0x9DA9: 706, - 0x9DB1: 707, - 0x9DB3: 708, - 0x9DB5: 709, - 0x9DB7: 710, - 0x9DC1: 711, - 0x9DC5: 712, - 0x9DD7: 713, - 0x9DF6: 714, - 0x9E41: 715, - 0x9E45: 716, - 0x9E49: 717, - 0x9E51: 718, - 0x9E53: 719, - 0x9E55: 720, - 0x9E57: 721, - 0x9E61: 722, - 0x9E65: 723, - 0x9E69: 724, - 0x9E73: 725, - 0x9E75: 726, - 0x9E77: 727, - 0x9E81: 728, - 0x9E82: 729, - 0x9E85: 730, - 0x9E89: 731, - 0x9E91: 732, - 0x9E93: 733, - 0x9E95: 734, - 0x9E97: 735, - 0x9EA1: 736, - 0x9EB6: 737, - 0x9EC1: 738, - 0x9EE1: 739, - 0x9EE2: 740, - 0x9EE5: 741, - 0x9EE9: 742, - 0x9EF1: 743, - 0x9EF5: 744, - 0x9EF7: 745, - 0x9F41: 746, - 0x9F42: 747, - 0x9F45: 748, - 0x9F49: 749, - 0x9F51: 750, - 0x9F53: 751, - 0x9F55: 752, - 0x9F57: 753, - 0x9F61: 754, - 0x9F62: 755, - 0x9F65: 756, - 0x9F69: 757, - 0x9F71: 758, - 0x9F73: 759, - 0x9F75: 760, - 0x9F77: 761, - 0x9F78: 762, - 0x9F7B: 763, - 0x9F7C: 764, - 0x9FA1: 765, - 0x9FA2: 766, - 0x9FA5: 767, - 0x9FA9: 768, - 0x9FB1: 769, - 0x9FB3: 770, - 0x9FB5: 771, - 0x9FB7: 772, - 0xA061: 773, - 0xA062: 774, - 0xA065: 775, - 0xA067: 776, - 0xA068: 777, - 0xA069: 778, - 0xA06A: 779, - 0xA06B: 780, - 0xA071: 781, - 0xA073: 782, - 0xA075: 783, - 0xA077: 784, - 0xA078: 785, - 0xA07B: 786, - 0xA07D: 787, - 0xA081: 788, - 0xA082: 789, - 0xA085: 790, - 0xA089: 791, - 0xA091: 792, - 0xA093: 793, - 0xA095: 794, - 0xA096: 795, - 0xA097: 796, - 0xA098: 797, - 0xA0A1: 798, - 0xA0A2: 799, - 0xA0A9: 800, - 0xA0B7: 801, - 0xA0E1: 802, - 0xA0E2: 803, - 0xA0E5: 804, - 0xA0E9: 805, - 0xA0EB: 806, - 0xA0F1: 807, - 0xA0F3: 808, - 0xA0F5: 809, - 0xA0F7: 810, - 0xA0F8: 811, - 0xA0FD: 812, - 0xA141: 813, - 0xA142: 814, - 0xA145: 815, - 0xA149: 816, - 0xA151: 817, - 0xA153: 818, - 0xA155: 819, - 0xA156: 820, - 0xA157: 821, - 0xA161: 822, - 0xA162: 823, - 0xA165: 824, - 0xA169: 825, - 0xA175: 826, - 0xA176: 827, - 0xA177: 828, - 0xA179: 829, - 0xA181: 830, - 0xA1A1: 831, - 0xA1A2: 832, - 0xA1A4: 833, - 0xA1A5: 834, - 0xA1A9: 835, - 0xA1AB: 836, - 0xA1B1: 837, - 0xA1B3: 838, - 0xA1B5: 839, - 0xA1B7: 840, - 0xA1C1: 841, - 0xA1C5: 842, - 0xA1D6: 843, - 0xA1D7: 844, - 0xA241: 845, - 0xA245: 846, - 0xA249: 847, - 0xA253: 848, - 0xA255: 849, - 0xA257: 850, - 0xA261: 851, - 0xA265: 852, - 0xA269: 853, - 0xA273: 854, - 0xA275: 855, - 0xA281: 856, - 0xA282: 857, - 0xA283: 858, - 0xA285: 859, - 0xA288: 860, - 0xA289: 861, - 0xA28A: 862, - 0xA28B: 863, - 0xA291: 864, - 0xA293: 865, - 0xA295: 866, - 0xA297: 867, - 0xA29B: 868, - 0xA29D: 869, - 0xA2A1: 870, - 0xA2A5: 871, - 0xA2A9: 872, - 0xA2B3: 873, - 0xA2B5: 874, - 0xA2C1: 875, - 0xA2E1: 876, - 0xA2E5: 877, - 0xA2E9: 878, - 0xA341: 879, - 0xA345: 880, - 0xA349: 881, - 0xA351: 882, - 0xA355: 883, - 0xA361: 884, - 0xA365: 885, - 0xA369: 886, - 0xA371: 887, - 0xA375: 888, - 0xA3A1: 889, - 0xA3A2: 890, - 0xA3A5: 891, - 0xA3A8: 892, - 0xA3A9: 893, - 0xA3AB: 894, - 0xA3B1: 895, - 0xA3B3: 896, - 0xA3B5: 897, - 0xA3B6: 898, - 0xA3B7: 899, - 0xA3B9: 900, - 0xA3BB: 901, - 0xA461: 902, - 0xA462: 903, - 0xA463: 904, - 0xA464: 905, - 0xA465: 906, - 0xA468: 907, - 0xA469: 908, - 0xA46A: 909, - 0xA46B: 910, - 0xA46C: 911, - 0xA471: 912, - 0xA473: 913, - 0xA475: 914, - 0xA477: 915, - 0xA47B: 916, - 0xA481: 917, - 0xA482: 918, - 0xA485: 919, - 0xA489: 920, - 0xA491: 921, - 0xA493: 922, - 0xA495: 923, - 0xA496: 924, - 0xA497: 925, - 0xA49B: 926, - 0xA4A1: 927, - 0xA4A2: 928, - 0xA4A5: 929, - 0xA4B3: 930, - 0xA4E1: 931, - 0xA4E2: 932, - 0xA4E5: 933, - 0xA4E8: 934, - 0xA4E9: 935, - 0xA4EB: 936, - 0xA4F1: 937, - 0xA4F3: 938, - 0xA4F5: 939, - 0xA4F7: 940, - 0xA4F8: 941, - 0xA541: 942, - 0xA542: 943, - 0xA545: 944, - 0xA548: 945, - 0xA549: 946, - 0xA551: 947, - 0xA553: 948, - 0xA555: 949, - 0xA556: 950, - 0xA557: 951, - 0xA561: 952, - 0xA562: 953, - 0xA565: 954, - 0xA569: 955, - 0xA573: 956, - 0xA575: 957, - 0xA576: 958, - 0xA577: 959, - 0xA57B: 960, - 0xA581: 961, - 0xA585: 962, - 0xA5A1: 963, - 0xA5A2: 964, - 0xA5A3: 965, - 0xA5A5: 966, - 0xA5A9: 967, - 0xA5B1: 968, - 0xA5B3: 969, - 0xA5B5: 970, - 0xA5B7: 971, - 0xA5C1: 972, - 0xA5C5: 973, - 0xA5D6: 974, - 0xA5E1: 975, - 0xA5F6: 976, - 0xA641: 977, - 0xA642: 978, - 0xA645: 979, - 0xA649: 980, - 0xA651: 981, - 0xA653: 982, - 0xA661: 983, - 0xA665: 984, - 0xA681: 985, - 0xA682: 986, - 0xA685: 987, - 0xA688: 988, - 0xA689: 989, - 0xA68A: 990, - 0xA68B: 991, - 0xA691: 992, - 0xA693: 993, - 0xA695: 994, - 0xA697: 995, - 0xA69B: 996, - 0xA69C: 997, - 0xA6A1: 998, - 0xA6A9: 999, - 0xA6B6: 1000, - 0xA6C1: 1001, - 0xA6E1: 1002, - 0xA6E2: 1003, - 0xA6E5: 1004, - 0xA6E9: 1005, - 0xA6F7: 1006, - 0xA741: 1007, - 0xA745: 1008, - 0xA749: 1009, - 0xA751: 1010, - 0xA755: 1011, - 0xA757: 1012, - 0xA761: 1013, - 0xA762: 1014, - 0xA765: 1015, - 0xA769: 1016, - 0xA771: 1017, - 0xA773: 1018, - 0xA775: 1019, - 0xA7A1: 1020, - 0xA7A2: 1021, - 0xA7A5: 1022, - 0xA7A9: 1023, - 0xA7AB: 1024, - 0xA7B1: 1025, - 0xA7B3: 1026, - 0xA7B5: 1027, - 0xA7B7: 1028, - 0xA7B8: 1029, - 0xA7B9: 1030, - 0xA861: 1031, - 0xA862: 1032, - 0xA865: 1033, - 0xA869: 1034, - 0xA86B: 1035, - 0xA871: 1036, - 0xA873: 1037, - 0xA875: 1038, - 0xA876: 1039, - 0xA877: 1040, - 0xA87D: 1041, - 0xA881: 1042, - 0xA882: 1043, - 0xA885: 1044, - 0xA889: 1045, - 0xA891: 1046, - 0xA893: 1047, - 0xA895: 1048, - 0xA896: 1049, - 0xA897: 1050, - 0xA8A1: 1051, - 0xA8A2: 1052, - 0xA8B1: 1053, - 0xA8E1: 1054, - 0xA8E2: 1055, - 0xA8E5: 1056, - 0xA8E8: 1057, - 0xA8E9: 1058, - 0xA8F1: 1059, - 0xA8F5: 1060, - 0xA8F6: 1061, - 0xA8F7: 1062, - 0xA941: 1063, - 0xA957: 1064, - 0xA961: 1065, - 0xA962: 1066, - 0xA971: 1067, - 0xA973: 1068, - 0xA975: 1069, - 0xA976: 1070, - 0xA977: 1071, - 0xA9A1: 1072, - 0xA9A2: 1073, - 0xA9A5: 1074, - 0xA9A9: 1075, - 0xA9B1: 1076, - 0xA9B3: 1077, - 0xA9B7: 1078, - 0xAA41: 1079, - 0xAA61: 1080, - 0xAA77: 1081, - 0xAA81: 1082, - 0xAA82: 1083, - 0xAA85: 1084, - 0xAA89: 1085, - 0xAA91: 1086, - 0xAA95: 1087, - 0xAA97: 1088, - 0xAB41: 1089, - 0xAB57: 1090, - 0xAB61: 1091, - 0xAB65: 1092, - 0xAB69: 1093, - 0xAB71: 1094, - 0xAB73: 1095, - 0xABA1: 1096, - 0xABA2: 1097, - 0xABA5: 1098, - 0xABA9: 1099, - 0xABB1: 1100, - 0xABB3: 1101, - 0xABB5: 1102, - 0xABB7: 1103, - 0xAC61: 1104, - 0xAC62: 1105, - 0xAC64: 1106, - 0xAC65: 1107, - 0xAC68: 1108, - 0xAC69: 1109, - 0xAC6A: 1110, - 0xAC6B: 1111, - 0xAC71: 1112, - 0xAC73: 1113, - 0xAC75: 1114, - 0xAC76: 1115, - 0xAC77: 1116, - 0xAC7B: 1117, - 0xAC81: 1118, - 0xAC82: 1119, - 0xAC85: 1120, - 0xAC89: 1121, - 0xAC91: 1122, - 0xAC93: 1123, - 0xAC95: 1124, - 0xAC96: 1125, - 0xAC97: 1126, - 0xACA1: 1127, - 0xACA2: 1128, - 0xACA5: 1129, - 0xACA9: 1130, - 0xACB1: 1131, - 0xACB3: 1132, - 0xACB5: 1133, - 0xACB7: 1134, - 0xACC1: 1135, - 0xACC5: 1136, - 0xACC9: 1137, - 0xACD1: 1138, - 0xACD7: 1139, - 0xACE1: 1140, - 0xACE2: 1141, - 0xACE3: 1142, - 0xACE4: 1143, - 0xACE5: 1144, - 0xACE8: 1145, - 0xACE9: 1146, - 0xACEB: 1147, - 0xACEC: 1148, - 0xACF1: 1149, - 0xACF3: 1150, - 0xACF5: 1151, - 0xACF6: 1152, - 0xACF7: 1153, - 0xACFC: 1154, - 0xAD41: 1155, - 0xAD42: 1156, - 0xAD45: 1157, - 0xAD49: 1158, - 0xAD51: 1159, - 0xAD53: 1160, - 0xAD55: 1161, - 0xAD56: 1162, - 0xAD57: 1163, - 0xAD61: 1164, - 0xAD62: 1165, - 0xAD65: 1166, - 0xAD69: 1167, - 0xAD71: 1168, - 0xAD73: 1169, - 0xAD75: 1170, - 0xAD76: 1171, - 0xAD77: 1172, - 0xAD81: 1173, - 0xAD85: 1174, - 0xAD89: 1175, - 0xAD97: 1176, - 0xADA1: 1177, - 0xADA2: 1178, - 0xADA3: 1179, - 0xADA5: 1180, - 0xADA9: 1181, - 0xADAB: 1182, - 0xADB1: 1183, - 0xADB3: 1184, - 0xADB5: 1185, - 0xADB7: 1186, - 0xADBB: 1187, - 0xADC1: 1188, - 0xADC2: 1189, - 0xADC5: 1190, - 0xADC9: 1191, - 0xADD7: 1192, - 0xADE1: 1193, - 0xADE5: 1194, - 0xADE9: 1195, - 0xADF1: 1196, - 0xADF5: 1197, - 0xADF6: 1198, - 0xAE41: 1199, - 0xAE45: 1200, - 0xAE49: 1201, - 0xAE51: 1202, - 0xAE53: 1203, - 0xAE55: 1204, - 0xAE61: 1205, - 0xAE62: 1206, - 0xAE65: 1207, - 0xAE69: 1208, - 0xAE71: 1209, - 0xAE73: 1210, - 0xAE75: 1211, - 0xAE77: 1212, - 0xAE81: 1213, - 0xAE82: 1214, - 0xAE85: 1215, - 0xAE88: 1216, - 0xAE89: 1217, - 0xAE91: 1218, - 0xAE93: 1219, - 0xAE95: 1220, - 0xAE97: 1221, - 0xAE99: 1222, - 0xAE9B: 1223, - 0xAE9C: 1224, - 0xAEA1: 1225, - 0xAEB6: 1226, - 0xAEC1: 1227, - 0xAEC2: 1228, - 0xAEC5: 1229, - 0xAEC9: 1230, - 0xAED1: 1231, - 0xAED7: 1232, - 0xAEE1: 1233, - 0xAEE2: 1234, - 0xAEE5: 1235, - 0xAEE9: 1236, - 0xAEF1: 1237, - 0xAEF3: 1238, - 0xAEF5: 1239, - 0xAEF7: 1240, - 0xAF41: 1241, - 0xAF42: 1242, - 0xAF49: 1243, - 0xAF51: 1244, - 0xAF55: 1245, - 0xAF57: 1246, - 0xAF61: 1247, - 0xAF62: 1248, - 0xAF65: 1249, - 0xAF69: 1250, - 0xAF6A: 1251, - 0xAF71: 1252, - 0xAF73: 1253, - 0xAF75: 1254, - 0xAF77: 1255, - 0xAFA1: 1256, - 0xAFA2: 1257, - 0xAFA5: 1258, - 0xAFA8: 1259, - 0xAFA9: 1260, - 0xAFB0: 1261, - 0xAFB1: 1262, - 0xAFB3: 1263, - 0xAFB5: 1264, - 0xAFB7: 1265, - 0xAFBC: 1266, - 0xB061: 1267, - 0xB062: 1268, - 0xB064: 1269, - 0xB065: 1270, - 0xB069: 1271, - 0xB071: 1272, - 0xB073: 1273, - 0xB076: 1274, - 0xB077: 1275, - 0xB07D: 1276, - 0xB081: 1277, - 0xB082: 1278, - 0xB085: 1279, - 0xB089: 1280, - 0xB091: 1281, - 0xB093: 1282, - 0xB096: 1283, - 0xB097: 1284, - 0xB0B7: 1285, - 0xB0E1: 1286, - 0xB0E2: 1287, - 0xB0E5: 1288, - 0xB0E9: 1289, - 0xB0EB: 1290, - 0xB0F1: 1291, - 0xB0F3: 1292, - 0xB0F6: 1293, - 0xB0F7: 1294, - 0xB141: 1295, - 0xB145: 1296, - 0xB149: 1297, - 0xB185: 1298, - 0xB1A1: 1299, - 0xB1A2: 1300, - 0xB1A5: 1301, - 0xB1A8: 1302, - 0xB1A9: 1303, - 0xB1AB: 1304, - 0xB1B1: 1305, - 0xB1B3: 1306, - 0xB1B7: 1307, - 0xB1C1: 1308, - 0xB1C2: 1309, - 0xB1C5: 1310, - 0xB1D6: 1311, - 0xB1E1: 1312, - 0xB1F6: 1313, - 0xB241: 1314, - 0xB245: 1315, - 0xB249: 1316, - 0xB251: 1317, - 0xB253: 1318, - 0xB261: 1319, - 0xB281: 1320, - 0xB282: 1321, - 0xB285: 1322, - 0xB289: 1323, - 0xB291: 1324, - 0xB293: 1325, - 0xB297: 1326, - 0xB2A1: 1327, - 0xB2B6: 1328, - 0xB2C1: 1329, - 0xB2E1: 1330, - 0xB2E5: 1331, - 0xB357: 1332, - 0xB361: 1333, - 0xB362: 1334, - 0xB365: 1335, - 0xB369: 1336, - 0xB36B: 1337, - 0xB370: 1338, - 0xB371: 1339, - 0xB373: 1340, - 0xB381: 1341, - 0xB385: 1342, - 0xB389: 1343, - 0xB391: 1344, - 0xB3A1: 1345, - 0xB3A2: 1346, - 0xB3A5: 1347, - 0xB3A9: 1348, - 0xB3B1: 1349, - 0xB3B3: 1350, - 0xB3B5: 1351, - 0xB3B7: 1352, - 0xB461: 1353, - 0xB462: 1354, - 0xB465: 1355, - 0xB466: 1356, - 0xB467: 1357, - 0xB469: 1358, - 0xB46A: 1359, - 0xB46B: 1360, - 0xB470: 1361, - 0xB471: 1362, - 0xB473: 1363, - 0xB475: 1364, - 0xB476: 1365, - 0xB477: 1366, - 0xB47B: 1367, - 0xB47C: 1368, - 0xB481: 1369, - 0xB482: 1370, - 0xB485: 1371, - 0xB489: 1372, - 0xB491: 1373, - 0xB493: 1374, - 0xB495: 1375, - 0xB496: 1376, - 0xB497: 1377, - 0xB4A1: 1378, - 0xB4A2: 1379, - 0xB4A5: 1380, - 0xB4A9: 1381, - 0xB4AC: 1382, - 0xB4B1: 1383, - 0xB4B3: 1384, - 0xB4B5: 1385, - 0xB4B7: 1386, - 0xB4BB: 1387, - 0xB4BD: 1388, - 0xB4C1: 1389, - 0xB4C5: 1390, - 0xB4C9: 1391, - 0xB4D3: 1392, - 0xB4E1: 1393, - 0xB4E2: 1394, - 0xB4E5: 1395, - 0xB4E6: 1396, - 0xB4E8: 1397, - 0xB4E9: 1398, - 0xB4EA: 1399, - 0xB4EB: 1400, - 0xB4F1: 1401, - 0xB4F3: 1402, - 0xB4F4: 1403, - 0xB4F5: 1404, - 0xB4F6: 1405, - 0xB4F7: 1406, - 0xB4F8: 1407, - 0xB4FA: 1408, - 0xB4FC: 1409, - 0xB541: 1410, - 0xB542: 1411, - 0xB545: 1412, - 0xB549: 1413, - 0xB551: 1414, - 0xB553: 1415, - 0xB555: 1416, - 0xB557: 1417, - 0xB561: 1418, - 0xB562: 1419, - 0xB563: 1420, - 0xB565: 1421, - 0xB569: 1422, - 0xB56B: 1423, - 0xB56C: 1424, - 0xB571: 1425, - 0xB573: 1426, - 0xB574: 1427, - 0xB575: 1428, - 0xB576: 1429, - 0xB577: 1430, - 0xB57B: 1431, - 0xB57C: 1432, - 0xB57D: 1433, - 0xB581: 1434, - 0xB585: 1435, - 0xB589: 1436, - 0xB591: 1437, - 0xB593: 1438, - 0xB595: 1439, - 0xB596: 1440, - 0xB5A1: 1441, - 0xB5A2: 1442, - 0xB5A5: 1443, - 0xB5A9: 1444, - 0xB5AA: 1445, - 0xB5AB: 1446, - 0xB5AD: 1447, - 0xB5B0: 1448, - 0xB5B1: 1449, - 0xB5B3: 1450, - 0xB5B5: 1451, - 0xB5B7: 1452, - 0xB5B9: 1453, - 0xB5C1: 1454, - 0xB5C2: 1455, - 0xB5C5: 1456, - 0xB5C9: 1457, - 0xB5D1: 1458, - 0xB5D3: 1459, - 0xB5D5: 1460, - 0xB5D6: 1461, - 0xB5D7: 1462, - 0xB5E1: 1463, - 0xB5E2: 1464, - 0xB5E5: 1465, - 0xB5F1: 1466, - 0xB5F5: 1467, - 0xB5F7: 1468, - 0xB641: 1469, - 0xB642: 1470, - 0xB645: 1471, - 0xB649: 1472, - 0xB651: 1473, - 0xB653: 1474, - 0xB655: 1475, - 0xB657: 1476, - 0xB661: 1477, - 0xB662: 1478, - 0xB665: 1479, - 0xB669: 1480, - 0xB671: 1481, - 0xB673: 1482, - 0xB675: 1483, - 0xB677: 1484, - 0xB681: 1485, - 0xB682: 1486, - 0xB685: 1487, - 0xB689: 1488, - 0xB68A: 1489, - 0xB68B: 1490, - 0xB691: 1491, - 0xB693: 1492, - 0xB695: 1493, - 0xB697: 1494, - 0xB6A1: 1495, - 0xB6A2: 1496, - 0xB6A5: 1497, - 0xB6A9: 1498, - 0xB6B1: 1499, - 0xB6B3: 1500, - 0xB6B6: 1501, - 0xB6B7: 1502, - 0xB6C1: 1503, - 0xB6C2: 1504, - 0xB6C5: 1505, - 0xB6C9: 1506, - 0xB6D1: 1507, - 0xB6D3: 1508, - 0xB6D7: 1509, - 0xB6E1: 1510, - 0xB6E2: 1511, - 0xB6E5: 1512, - 0xB6E9: 1513, - 0xB6F1: 1514, - 0xB6F3: 1515, - 0xB6F5: 1516, - 0xB6F7: 1517, - 0xB741: 1518, - 0xB742: 1519, - 0xB745: 1520, - 0xB749: 1521, - 0xB751: 1522, - 0xB753: 1523, - 0xB755: 1524, - 0xB757: 1525, - 0xB759: 1526, - 0xB761: 1527, - 0xB762: 1528, - 0xB765: 1529, - 0xB769: 1530, - 0xB76F: 1531, - 0xB771: 1532, - 0xB773: 1533, - 0xB775: 1534, - 0xB777: 1535, - 0xB778: 1536, - 0xB779: 1537, - 0xB77A: 1538, - 0xB77B: 1539, - 0xB77C: 1540, - 0xB77D: 1541, - 0xB781: 1542, - 0xB785: 1543, - 0xB789: 1544, - 0xB791: 1545, - 0xB795: 1546, - 0xB7A1: 1547, - 0xB7A2: 1548, - 0xB7A5: 1549, - 0xB7A9: 1550, - 0xB7AA: 1551, - 0xB7AB: 1552, - 0xB7B0: 1553, - 0xB7B1: 1554, - 0xB7B3: 1555, - 0xB7B5: 1556, - 0xB7B6: 1557, - 0xB7B7: 1558, - 0xB7B8: 1559, - 0xB7BC: 1560, - 0xB861: 1561, - 0xB862: 1562, - 0xB865: 1563, - 0xB867: 1564, - 0xB868: 1565, - 0xB869: 1566, - 0xB86B: 1567, - 0xB871: 1568, - 0xB873: 1569, - 0xB875: 1570, - 0xB876: 1571, - 0xB877: 1572, - 0xB878: 1573, - 0xB881: 1574, - 0xB882: 1575, - 0xB885: 1576, - 0xB889: 1577, - 0xB891: 1578, - 0xB893: 1579, - 0xB895: 1580, - 0xB896: 1581, - 0xB897: 1582, - 0xB8A1: 1583, - 0xB8A2: 1584, - 0xB8A5: 1585, - 0xB8A7: 1586, - 0xB8A9: 1587, - 0xB8B1: 1588, - 0xB8B7: 1589, - 0xB8C1: 1590, - 0xB8C5: 1591, - 0xB8C9: 1592, - 0xB8E1: 1593, - 0xB8E2: 1594, - 0xB8E5: 1595, - 0xB8E9: 1596, - 0xB8EB: 1597, - 0xB8F1: 1598, - 0xB8F3: 1599, - 0xB8F5: 1600, - 0xB8F7: 1601, - 0xB8F8: 1602, - 0xB941: 1603, - 0xB942: 1604, - 0xB945: 1605, - 0xB949: 1606, - 0xB951: 1607, - 0xB953: 1608, - 0xB955: 1609, - 0xB957: 1610, - 0xB961: 1611, - 0xB965: 1612, - 0xB969: 1613, - 0xB971: 1614, - 0xB973: 1615, - 0xB976: 1616, - 0xB977: 1617, - 0xB981: 1618, - 0xB9A1: 1619, - 0xB9A2: 1620, - 0xB9A5: 1621, - 0xB9A9: 1622, - 0xB9AB: 1623, - 0xB9B1: 1624, - 0xB9B3: 1625, - 0xB9B5: 1626, - 0xB9B7: 1627, - 0xB9B8: 1628, - 0xB9B9: 1629, - 0xB9BD: 1630, - 0xB9C1: 1631, - 0xB9C2: 1632, - 0xB9C9: 1633, - 0xB9D3: 1634, - 0xB9D5: 1635, - 0xB9D7: 1636, - 0xB9E1: 1637, - 0xB9F6: 1638, - 0xB9F7: 1639, - 0xBA41: 1640, - 0xBA45: 1641, - 0xBA49: 1642, - 0xBA51: 1643, - 0xBA53: 1644, - 0xBA55: 1645, - 0xBA57: 1646, - 0xBA61: 1647, - 0xBA62: 1648, - 0xBA65: 1649, - 0xBA77: 1650, - 0xBA81: 1651, - 0xBA82: 1652, - 0xBA85: 1653, - 0xBA89: 1654, - 0xBA8A: 1655, - 0xBA8B: 1656, - 0xBA91: 1657, - 0xBA93: 1658, - 0xBA95: 1659, - 0xBA97: 1660, - 0xBAA1: 1661, - 0xBAB6: 1662, - 0xBAC1: 1663, - 0xBAE1: 1664, - 0xBAE2: 1665, - 0xBAE5: 1666, - 0xBAE9: 1667, - 0xBAF1: 1668, - 0xBAF3: 1669, - 0xBAF5: 1670, - 0xBB41: 1671, - 0xBB45: 1672, - 0xBB49: 1673, - 0xBB51: 1674, - 0xBB61: 1675, - 0xBB62: 1676, - 0xBB65: 1677, - 0xBB69: 1678, - 0xBB71: 1679, - 0xBB73: 1680, - 0xBB75: 1681, - 0xBB77: 1682, - 0xBBA1: 1683, - 0xBBA2: 1684, - 0xBBA5: 1685, - 0xBBA8: 1686, - 0xBBA9: 1687, - 0xBBAB: 1688, - 0xBBB1: 1689, - 0xBBB3: 1690, - 0xBBB5: 1691, - 0xBBB7: 1692, - 0xBBB8: 1693, - 0xBBBB: 1694, - 0xBBBC: 1695, - 0xBC61: 1696, - 0xBC62: 1697, - 0xBC65: 1698, - 0xBC67: 1699, - 0xBC69: 1700, - 0xBC6C: 1701, - 0xBC71: 1702, - 0xBC73: 1703, - 0xBC75: 1704, - 0xBC76: 1705, - 0xBC77: 1706, - 0xBC81: 1707, - 0xBC82: 1708, - 0xBC85: 1709, - 0xBC89: 1710, - 0xBC91: 1711, - 0xBC93: 1712, - 0xBC95: 1713, - 0xBC96: 1714, - 0xBC97: 1715, - 0xBCA1: 1716, - 0xBCA5: 1717, - 0xBCB7: 1718, - 0xBCE1: 1719, - 0xBCE2: 1720, - 0xBCE5: 1721, - 0xBCE9: 1722, - 0xBCF1: 1723, - 0xBCF3: 1724, - 0xBCF5: 1725, - 0xBCF6: 1726, - 0xBCF7: 1727, - 0xBD41: 1728, - 0xBD57: 1729, - 0xBD61: 1730, - 0xBD76: 1731, - 0xBDA1: 1732, - 0xBDA2: 1733, - 0xBDA5: 1734, - 0xBDA9: 1735, - 0xBDB1: 1736, - 0xBDB3: 1737, - 0xBDB5: 1738, - 0xBDB7: 1739, - 0xBDB9: 1740, - 0xBDC1: 1741, - 0xBDC2: 1742, - 0xBDC9: 1743, - 0xBDD6: 1744, - 0xBDE1: 1745, - 0xBDF6: 1746, - 0xBE41: 1747, - 0xBE45: 1748, - 0xBE49: 1749, - 0xBE51: 1750, - 0xBE53: 1751, - 0xBE77: 1752, - 0xBE81: 1753, - 0xBE82: 1754, - 0xBE85: 1755, - 0xBE89: 1756, - 0xBE91: 1757, - 0xBE93: 1758, - 0xBE97: 1759, - 0xBEA1: 1760, - 0xBEB6: 1761, - 0xBEB7: 1762, - 0xBEE1: 1763, - 0xBF41: 1764, - 0xBF61: 1765, - 0xBF71: 1766, - 0xBF75: 1767, - 0xBF77: 1768, - 0xBFA1: 1769, - 0xBFA2: 1770, - 0xBFA5: 1771, - 0xBFA9: 1772, - 0xBFB1: 1773, - 0xBFB3: 1774, - 0xBFB7: 1775, - 0xBFB8: 1776, - 0xBFBD: 1777, - 0xC061: 1778, - 0xC062: 1779, - 0xC065: 1780, - 0xC067: 1781, - 0xC069: 1782, - 0xC071: 1783, - 0xC073: 1784, - 0xC075: 1785, - 0xC076: 1786, - 0xC077: 1787, - 0xC078: 1788, - 0xC081: 1789, - 0xC082: 1790, - 0xC085: 1791, - 0xC089: 1792, - 0xC091: 1793, - 0xC093: 1794, - 0xC095: 1795, - 0xC096: 1796, - 0xC097: 1797, - 0xC0A1: 1798, - 0xC0A5: 1799, - 0xC0A7: 1800, - 0xC0A9: 1801, - 0xC0B1: 1802, - 0xC0B7: 1803, - 0xC0E1: 1804, - 0xC0E2: 1805, - 0xC0E5: 1806, - 0xC0E9: 1807, - 0xC0F1: 1808, - 0xC0F3: 1809, - 0xC0F5: 1810, - 0xC0F6: 1811, - 0xC0F7: 1812, - 0xC141: 1813, - 0xC142: 1814, - 0xC145: 1815, - 0xC149: 1816, - 0xC151: 1817, - 0xC153: 1818, - 0xC155: 1819, - 0xC157: 1820, - 0xC161: 1821, - 0xC165: 1822, - 0xC176: 1823, - 0xC181: 1824, - 0xC185: 1825, - 0xC197: 1826, - 0xC1A1: 1827, - 0xC1A2: 1828, - 0xC1A5: 1829, - 0xC1A9: 1830, - 0xC1B1: 1831, - 0xC1B3: 1832, - 0xC1B5: 1833, - 0xC1B7: 1834, - 0xC1C1: 1835, - 0xC1C5: 1836, - 0xC1C9: 1837, - 0xC1D7: 1838, - 0xC241: 1839, - 0xC245: 1840, - 0xC249: 1841, - 0xC251: 1842, - 0xC253: 1843, - 0xC255: 1844, - 0xC257: 1845, - 0xC261: 1846, - 0xC271: 1847, - 0xC281: 1848, - 0xC282: 1849, - 0xC285: 1850, - 0xC289: 1851, - 0xC291: 1852, - 0xC293: 1853, - 0xC295: 1854, - 0xC297: 1855, - 0xC2A1: 1856, - 0xC2B6: 1857, - 0xC2C1: 1858, - 0xC2C5: 1859, - 0xC2E1: 1860, - 0xC2E5: 1861, - 0xC2E9: 1862, - 0xC2F1: 1863, - 0xC2F3: 1864, - 0xC2F5: 1865, - 0xC2F7: 1866, - 0xC341: 1867, - 0xC345: 1868, - 0xC349: 1869, - 0xC351: 1870, - 0xC357: 1871, - 0xC361: 1872, - 0xC362: 1873, - 0xC365: 1874, - 0xC369: 1875, - 0xC371: 1876, - 0xC373: 1877, - 0xC375: 1878, - 0xC377: 1879, - 0xC3A1: 1880, - 0xC3A2: 1881, - 0xC3A5: 1882, - 0xC3A8: 1883, - 0xC3A9: 1884, - 0xC3AA: 1885, - 0xC3B1: 1886, - 0xC3B3: 1887, - 0xC3B5: 1888, - 0xC3B7: 1889, - 0xC461: 1890, - 0xC462: 1891, - 0xC465: 1892, - 0xC469: 1893, - 0xC471: 1894, - 0xC473: 1895, - 0xC475: 1896, - 0xC477: 1897, - 0xC481: 1898, - 0xC482: 1899, - 0xC485: 1900, - 0xC489: 1901, - 0xC491: 1902, - 0xC493: 1903, - 0xC495: 1904, - 0xC496: 1905, - 0xC497: 1906, - 0xC4A1: 1907, - 0xC4A2: 1908, - 0xC4B7: 1909, - 0xC4E1: 1910, - 0xC4E2: 1911, - 0xC4E5: 1912, - 0xC4E8: 1913, - 0xC4E9: 1914, - 0xC4F1: 1915, - 0xC4F3: 1916, - 0xC4F5: 1917, - 0xC4F6: 1918, - 0xC4F7: 1919, - 0xC541: 1920, - 0xC542: 1921, - 0xC545: 1922, - 0xC549: 1923, - 0xC551: 1924, - 0xC553: 1925, - 0xC555: 1926, - 0xC557: 1927, - 0xC561: 1928, - 0xC565: 1929, - 0xC569: 1930, - 0xC571: 1931, - 0xC573: 1932, - 0xC575: 1933, - 0xC576: 1934, - 0xC577: 1935, - 0xC581: 1936, - 0xC5A1: 1937, - 0xC5A2: 1938, - 0xC5A5: 1939, - 0xC5A9: 1940, - 0xC5B1: 1941, - 0xC5B3: 1942, - 0xC5B5: 1943, - 0xC5B7: 1944, - 0xC5C1: 1945, - 0xC5C2: 1946, - 0xC5C5: 1947, - 0xC5C9: 1948, - 0xC5D1: 1949, - 0xC5D7: 1950, - 0xC5E1: 1951, - 0xC5F7: 1952, - 0xC641: 1953, - 0xC649: 1954, - 0xC661: 1955, - 0xC681: 1956, - 0xC682: 1957, - 0xC685: 1958, - 0xC689: 1959, - 0xC691: 1960, - 0xC693: 1961, - 0xC695: 1962, - 0xC697: 1963, - 0xC6A1: 1964, - 0xC6A5: 1965, - 0xC6A9: 1966, - 0xC6B7: 1967, - 0xC6C1: 1968, - 0xC6D7: 1969, - 0xC6E1: 1970, - 0xC6E2: 1971, - 0xC6E5: 1972, - 0xC6E9: 1973, - 0xC6F1: 1974, - 0xC6F3: 1975, - 0xC6F5: 1976, - 0xC6F7: 1977, - 0xC741: 1978, - 0xC745: 1979, - 0xC749: 1980, - 0xC751: 1981, - 0xC761: 1982, - 0xC762: 1983, - 0xC765: 1984, - 0xC769: 1985, - 0xC771: 1986, - 0xC773: 1987, - 0xC777: 1988, - 0xC7A1: 1989, - 0xC7A2: 1990, - 0xC7A5: 1991, - 0xC7A9: 1992, - 0xC7B1: 1993, - 0xC7B3: 1994, - 0xC7B5: 1995, - 0xC7B7: 1996, - 0xC861: 1997, - 0xC862: 1998, - 0xC865: 1999, - 0xC869: 2000, - 0xC86A: 2001, - 0xC871: 2002, - 0xC873: 2003, - 0xC875: 2004, - 0xC876: 2005, - 0xC877: 2006, - 0xC881: 2007, - 0xC882: 2008, - 0xC885: 2009, - 0xC889: 2010, - 0xC891: 2011, - 0xC893: 2012, - 0xC895: 2013, - 0xC896: 2014, - 0xC897: 2015, - 0xC8A1: 2016, - 0xC8B7: 2017, - 0xC8E1: 2018, - 0xC8E2: 2019, - 0xC8E5: 2020, - 0xC8E9: 2021, - 0xC8EB: 2022, - 0xC8F1: 2023, - 0xC8F3: 2024, - 0xC8F5: 2025, - 0xC8F6: 2026, - 0xC8F7: 2027, - 0xC941: 2028, - 0xC942: 2029, - 0xC945: 2030, - 0xC949: 2031, - 0xC951: 2032, - 0xC953: 2033, - 0xC955: 2034, - 0xC957: 2035, - 0xC961: 2036, - 0xC965: 2037, - 0xC976: 2038, - 0xC981: 2039, - 0xC985: 2040, - 0xC9A1: 2041, - 0xC9A2: 2042, - 0xC9A5: 2043, - 0xC9A9: 2044, - 0xC9B1: 2045, - 0xC9B3: 2046, - 0xC9B5: 2047, - 0xC9B7: 2048, - 0xC9BC: 2049, - 0xC9C1: 2050, - 0xC9C5: 2051, - 0xC9E1: 2052, - 0xCA41: 2053, - 0xCA45: 2054, - 0xCA55: 2055, - 0xCA57: 2056, - 0xCA61: 2057, - 0xCA81: 2058, - 0xCA82: 2059, - 0xCA85: 2060, - 0xCA89: 2061, - 0xCA91: 2062, - 0xCA93: 2063, - 0xCA95: 2064, - 0xCA97: 2065, - 0xCAA1: 2066, - 0xCAB6: 2067, - 0xCAC1: 2068, - 0xCAE1: 2069, - 0xCAE2: 2070, - 0xCAE5: 2071, - 0xCAE9: 2072, - 0xCAF1: 2073, - 0xCAF3: 2074, - 0xCAF7: 2075, - 0xCB41: 2076, - 0xCB45: 2077, - 0xCB49: 2078, - 0xCB51: 2079, - 0xCB57: 2080, - 0xCB61: 2081, - 0xCB62: 2082, - 0xCB65: 2083, - 0xCB68: 2084, - 0xCB69: 2085, - 0xCB6B: 2086, - 0xCB71: 2087, - 0xCB73: 2088, - 0xCB75: 2089, - 0xCB81: 2090, - 0xCB85: 2091, - 0xCB89: 2092, - 0xCB91: 2093, - 0xCB93: 2094, - 0xCBA1: 2095, - 0xCBA2: 2096, - 0xCBA5: 2097, - 0xCBA9: 2098, - 0xCBB1: 2099, - 0xCBB3: 2100, - 0xCBB5: 2101, - 0xCBB7: 2102, - 0xCC61: 2103, - 0xCC62: 2104, - 0xCC63: 2105, - 0xCC65: 2106, - 0xCC69: 2107, - 0xCC6B: 2108, - 0xCC71: 2109, - 0xCC73: 2110, - 0xCC75: 2111, - 0xCC76: 2112, - 0xCC77: 2113, - 0xCC7B: 2114, - 0xCC81: 2115, - 0xCC82: 2116, - 0xCC85: 2117, - 0xCC89: 2118, - 0xCC91: 2119, - 0xCC93: 2120, - 0xCC95: 2121, - 0xCC96: 2122, - 0xCC97: 2123, - 0xCCA1: 2124, - 0xCCA2: 2125, - 0xCCE1: 2126, - 0xCCE2: 2127, - 0xCCE5: 2128, - 0xCCE9: 2129, - 0xCCF1: 2130, - 0xCCF3: 2131, - 0xCCF5: 2132, - 0xCCF6: 2133, - 0xCCF7: 2134, - 0xCD41: 2135, - 0xCD42: 2136, - 0xCD45: 2137, - 0xCD49: 2138, - 0xCD51: 2139, - 0xCD53: 2140, - 0xCD55: 2141, - 0xCD57: 2142, - 0xCD61: 2143, - 0xCD65: 2144, - 0xCD69: 2145, - 0xCD71: 2146, - 0xCD73: 2147, - 0xCD76: 2148, - 0xCD77: 2149, - 0xCD81: 2150, - 0xCD89: 2151, - 0xCD93: 2152, - 0xCD95: 2153, - 0xCDA1: 2154, - 0xCDA2: 2155, - 0xCDA5: 2156, - 0xCDA9: 2157, - 0xCDB1: 2158, - 0xCDB3: 2159, - 0xCDB5: 2160, - 0xCDB7: 2161, - 0xCDC1: 2162, - 0xCDD7: 2163, - 0xCE41: 2164, - 0xCE45: 2165, - 0xCE61: 2166, - 0xCE65: 2167, - 0xCE69: 2168, - 0xCE73: 2169, - 0xCE75: 2170, - 0xCE81: 2171, - 0xCE82: 2172, - 0xCE85: 2173, - 0xCE88: 2174, - 0xCE89: 2175, - 0xCE8B: 2176, - 0xCE91: 2177, - 0xCE93: 2178, - 0xCE95: 2179, - 0xCE97: 2180, - 0xCEA1: 2181, - 0xCEB7: 2182, - 0xCEE1: 2183, - 0xCEE5: 2184, - 0xCEE9: 2185, - 0xCEF1: 2186, - 0xCEF5: 2187, - 0xCF41: 2188, - 0xCF45: 2189, - 0xCF49: 2190, - 0xCF51: 2191, - 0xCF55: 2192, - 0xCF57: 2193, - 0xCF61: 2194, - 0xCF65: 2195, - 0xCF69: 2196, - 0xCF71: 2197, - 0xCF73: 2198, - 0xCF75: 2199, - 0xCFA1: 2200, - 0xCFA2: 2201, - 0xCFA5: 2202, - 0xCFA9: 2203, - 0xCFB1: 2204, - 0xCFB3: 2205, - 0xCFB5: 2206, - 0xCFB7: 2207, - 0xD061: 2208, - 0xD062: 2209, - 0xD065: 2210, - 0xD069: 2211, - 0xD06E: 2212, - 0xD071: 2213, - 0xD073: 2214, - 0xD075: 2215, - 0xD077: 2216, - 0xD081: 2217, - 0xD082: 2218, - 0xD085: 2219, - 0xD089: 2220, - 0xD091: 2221, - 0xD093: 2222, - 0xD095: 2223, - 0xD096: 2224, - 0xD097: 2225, - 0xD0A1: 2226, - 0xD0B7: 2227, - 0xD0E1: 2228, - 0xD0E2: 2229, - 0xD0E5: 2230, - 0xD0E9: 2231, - 0xD0EB: 2232, - 0xD0F1: 2233, - 0xD0F3: 2234, - 0xD0F5: 2235, - 0xD0F7: 2236, - 0xD141: 2237, - 0xD142: 2238, - 0xD145: 2239, - 0xD149: 2240, - 0xD151: 2241, - 0xD153: 2242, - 0xD155: 2243, - 0xD157: 2244, - 0xD161: 2245, - 0xD162: 2246, - 0xD165: 2247, - 0xD169: 2248, - 0xD171: 2249, - 0xD173: 2250, - 0xD175: 2251, - 0xD176: 2252, - 0xD177: 2253, - 0xD181: 2254, - 0xD185: 2255, - 0xD189: 2256, - 0xD193: 2257, - 0xD1A1: 2258, - 0xD1A2: 2259, - 0xD1A5: 2260, - 0xD1A9: 2261, - 0xD1AE: 2262, - 0xD1B1: 2263, - 0xD1B3: 2264, - 0xD1B5: 2265, - 0xD1B7: 2266, - 0xD1BB: 2267, - 0xD1C1: 2268, - 0xD1C2: 2269, - 0xD1C5: 2270, - 0xD1C9: 2271, - 0xD1D5: 2272, - 0xD1D7: 2273, - 0xD1E1: 2274, - 0xD1E2: 2275, - 0xD1E5: 2276, - 0xD1F5: 2277, - 0xD1F7: 2278, - 0xD241: 2279, - 0xD242: 2280, - 0xD245: 2281, - 0xD249: 2282, - 0xD253: 2283, - 0xD255: 2284, - 0xD257: 2285, - 0xD261: 2286, - 0xD265: 2287, - 0xD269: 2288, - 0xD273: 2289, - 0xD275: 2290, - 0xD281: 2291, - 0xD282: 2292, - 0xD285: 2293, - 0xD289: 2294, - 0xD28E: 2295, - 0xD291: 2296, - 0xD295: 2297, - 0xD297: 2298, - 0xD2A1: 2299, - 0xD2A5: 2300, - 0xD2A9: 2301, - 0xD2B1: 2302, - 0xD2B7: 2303, - 0xD2C1: 2304, - 0xD2C2: 2305, - 0xD2C5: 2306, - 0xD2C9: 2307, - 0xD2D7: 2308, - 0xD2E1: 2309, - 0xD2E2: 2310, - 0xD2E5: 2311, - 0xD2E9: 2312, - 0xD2F1: 2313, - 0xD2F3: 2314, - 0xD2F5: 2315, - 0xD2F7: 2316, - 0xD341: 2317, - 0xD342: 2318, - 0xD345: 2319, - 0xD349: 2320, - 0xD351: 2321, - 0xD355: 2322, - 0xD357: 2323, - 0xD361: 2324, - 0xD362: 2325, - 0xD365: 2326, - 0xD367: 2327, - 0xD368: 2328, - 0xD369: 2329, - 0xD36A: 2330, - 0xD371: 2331, - 0xD373: 2332, - 0xD375: 2333, - 0xD377: 2334, - 0xD37B: 2335, - 0xD381: 2336, - 0xD385: 2337, - 0xD389: 2338, - 0xD391: 2339, - 0xD393: 2340, - 0xD397: 2341, - 0xD3A1: 2342, - 0xD3A2: 2343, - 0xD3A5: 2344, - 0xD3A9: 2345, - 0xD3B1: 2346, - 0xD3B3: 2347, - 0xD3B5: 2348, - 0xD3B7: 2349, -} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py deleted file mode 100644 index d7364ba6..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import JOHABDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import JOHAB_SM_MODEL - - -class JOHABProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(JOHAB_SM_MODEL) - self.distribution_analyzer = JOHABDistributionAnalysis() - self.reset() - - @property - def charset_name(self) -> str: - return "Johab" - - @property - def language(self) -> str: - return "Korean" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py deleted file mode 100644 index 2f53bdda..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py +++ /dev/null @@ -1,238 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Tuple, Union - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -# fmt: off -jp2_char_context = ( - (0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), - (2, 4, 0, 4, 0, 3, 0, 4, 0, 3, 4, 4, 4, 2, 4, 3, 3, 4, 3, 2, 3, 3, 4, 2, 3, 3, 3, 2, 4, 1, 4, 3, 3, 1, 5, 4, 3, 4, 3, 4, 3, 5, 3, 0, 3, 5, 4, 2, 0, 3, 1, 0, 3, 3, 0, 3, 3, 0, 1, 1, 0, 4, 3, 0, 3, 3, 0, 4, 0, 2, 0, 3, 5, 5, 5, 5, 4, 0, 4, 1, 0, 3, 4), - (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2), - (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 4, 4, 3, 5, 3, 5, 1, 5, 3, 4, 3, 4, 4, 3, 4, 3, 3, 4, 3, 5, 4, 4, 3, 5, 5, 3, 5, 5, 5, 3, 5, 5, 3, 4, 5, 5, 3, 1, 3, 2, 0, 3, 4, 0, 4, 2, 0, 4, 2, 1, 5, 3, 2, 3, 5, 0, 4, 0, 2, 0, 5, 4, 4, 5, 4, 5, 0, 4, 0, 0, 4, 4), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 5, 4, 3, 3, 3, 3, 4, 3, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 4, 4, 4, 4, 5, 3, 4, 4, 3, 4, 5, 5, 4, 5, 5, 1, 4, 5, 4, 3, 0, 3, 3, 1, 3, 3, 0, 4, 4, 0, 3, 3, 1, 5, 3, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 0, 4, 1, 1, 3, 4), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 4, 0, 3, 0, 3, 0, 4, 0, 3, 4, 4, 3, 2, 2, 1, 2, 1, 3, 1, 3, 3, 3, 3, 3, 4, 3, 1, 3, 3, 5, 3, 3, 0, 4, 3, 0, 5, 4, 3, 3, 5, 4, 4, 3, 4, 4, 5, 0, 1, 2, 0, 1, 2, 0, 2, 2, 0, 1, 0, 0, 5, 2, 2, 1, 4, 0, 3, 0, 1, 0, 4, 4, 3, 5, 4, 3, 0, 2, 1, 0, 4, 3), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 3, 0, 5, 0, 4, 0, 2, 1, 4, 4, 2, 4, 1, 4, 2, 4, 2, 4, 3, 3, 3, 4, 3, 3, 3, 3, 1, 4, 2, 3, 3, 3, 1, 4, 4, 1, 1, 1, 4, 3, 3, 2, 0, 2, 4, 3, 2, 0, 3, 3, 0, 3, 1, 1, 0, 0, 0, 3, 3, 0, 4, 2, 2, 3, 4, 0, 4, 0, 3, 0, 4, 4, 5, 3, 4, 4, 0, 3, 0, 0, 1, 4), - (1, 4, 0, 4, 0, 4, 0, 4, 0, 3, 5, 4, 4, 3, 4, 3, 5, 4, 3, 3, 4, 3, 5, 4, 4, 4, 4, 3, 4, 2, 4, 3, 3, 1, 5, 4, 3, 2, 4, 5, 4, 5, 5, 4, 4, 5, 4, 4, 0, 3, 2, 2, 3, 3, 0, 4, 3, 1, 3, 2, 1, 4, 3, 3, 4, 5, 0, 3, 0, 2, 0, 4, 5, 5, 4, 5, 4, 0, 4, 0, 0, 5, 4), - (0, 5, 0, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 3, 4, 0, 4, 4, 4, 3, 4, 3, 4, 3, 3, 1, 4, 2, 4, 3, 4, 0, 5, 4, 1, 4, 5, 4, 4, 5, 3, 2, 4, 3, 4, 3, 2, 4, 1, 3, 3, 3, 2, 3, 2, 0, 4, 3, 3, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 4, 3, 0, 4, 1, 0, 1, 3), - (0, 3, 1, 4, 0, 3, 0, 2, 0, 3, 4, 4, 3, 1, 4, 2, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 3, 2, 3, 1, 5, 4, 4, 1, 4, 4, 3, 5, 4, 4, 3, 5, 5, 4, 3, 4, 4, 3, 1, 2, 3, 1, 2, 2, 0, 3, 2, 0, 3, 1, 0, 5, 3, 3, 3, 4, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 2, 0, 3, 3, 2, 4, 3), - (0, 2, 0, 3, 0, 1, 0, 1, 0, 0, 3, 2, 0, 0, 2, 0, 1, 0, 2, 1, 3, 3, 3, 1, 2, 3, 1, 0, 1, 0, 4, 2, 1, 1, 3, 3, 0, 4, 3, 3, 1, 4, 3, 3, 0, 3, 3, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 4, 1, 0, 2, 3, 2, 2, 2, 1, 3, 3, 3, 4, 4, 3, 2, 0, 3, 1, 0, 3, 3), - (0, 4, 0, 4, 0, 3, 0, 3, 0, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 4, 2, 4, 3, 4, 3, 3, 2, 4, 3, 4, 5, 4, 1, 4, 5, 3, 5, 4, 5, 3, 5, 4, 0, 3, 5, 5, 3, 1, 3, 3, 2, 2, 3, 0, 3, 4, 1, 3, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 5, 3, 0, 4, 1, 0, 3, 4), - (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 0, 3, 0, 3, 0, 3, 0, 1, 3, 1, 0, 3, 1, 3, 3, 3, 1, 3, 3, 3, 0, 1, 3, 1, 3, 4, 0, 0, 3, 1, 1, 0, 3, 2, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 3, 3, 2, 0, 3, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 3, 0, 3, 0, 0, 2, 3), - (2, 3, 0, 3, 0, 2, 0, 1, 0, 3, 3, 4, 3, 1, 3, 1, 1, 1, 3, 1, 4, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 4, 3, 1, 4, 3, 2, 5, 5, 4, 4, 4, 4, 3, 3, 4, 4, 4, 0, 2, 1, 1, 3, 2, 0, 1, 2, 0, 0, 1, 0, 4, 1, 3, 3, 3, 0, 3, 0, 1, 0, 4, 4, 4, 5, 5, 3, 0, 2, 0, 0, 4, 4), - (0, 2, 0, 1, 0, 3, 1, 3, 0, 2, 3, 3, 3, 0, 3, 1, 0, 0, 3, 0, 3, 2, 3, 1, 3, 2, 1, 1, 0, 0, 4, 2, 1, 0, 2, 3, 1, 4, 3, 2, 0, 4, 4, 3, 1, 3, 1, 3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 1, 1, 2, 0, 3, 0, 0, 0, 3, 4, 2, 4, 3, 2, 0, 1, 0, 0, 3, 3), - (0, 1, 0, 4, 0, 5, 0, 4, 0, 2, 4, 4, 2, 3, 3, 2, 3, 3, 5, 3, 3, 3, 4, 3, 4, 2, 3, 0, 4, 3, 3, 3, 4, 1, 4, 3, 2, 1, 5, 5, 3, 4, 5, 1, 3, 5, 4, 2, 0, 3, 3, 0, 1, 3, 0, 4, 2, 0, 1, 3, 1, 4, 3, 3, 3, 3, 0, 3, 0, 1, 0, 3, 4, 4, 4, 5, 5, 0, 3, 0, 1, 4, 5), - (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 3, 1, 3, 0, 4, 0, 1, 1, 3, 0, 3, 4, 3, 2, 3, 1, 0, 3, 3, 2, 3, 1, 3, 0, 2, 3, 0, 2, 1, 4, 1, 2, 2, 0, 0, 3, 3, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 2, 0, 3, 2, 1, 3, 3, 0, 2, 0, 2, 0, 0, 3, 3, 1, 2, 4, 0, 3, 0, 2, 2, 3), - (2, 4, 0, 5, 0, 4, 0, 4, 0, 2, 4, 4, 4, 3, 4, 3, 3, 3, 1, 2, 4, 3, 4, 3, 4, 4, 5, 0, 3, 3, 3, 3, 2, 0, 4, 3, 1, 4, 3, 4, 1, 4, 4, 3, 3, 4, 4, 3, 1, 2, 3, 0, 4, 2, 0, 4, 1, 0, 3, 3, 0, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 3, 5, 3, 4, 5, 2, 0, 3, 0, 0, 4, 5), - (0, 3, 0, 4, 0, 1, 0, 1, 0, 1, 3, 2, 2, 1, 3, 0, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 1, 0, 0, 0, 4, 0, 3, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 3, 1, 0, 3, 0, 0, 0, 1, 4, 4, 4, 3, 0, 0, 4, 0, 0, 1, 4), - (1, 4, 1, 5, 0, 3, 0, 3, 0, 4, 5, 4, 4, 3, 5, 3, 3, 4, 4, 3, 4, 1, 3, 3, 3, 3, 2, 1, 4, 1, 5, 4, 3, 1, 4, 4, 3, 5, 4, 4, 3, 5, 4, 3, 3, 4, 4, 4, 0, 3, 3, 1, 2, 3, 0, 3, 1, 0, 3, 3, 0, 5, 4, 4, 4, 4, 4, 4, 3, 3, 5, 4, 4, 3, 3, 5, 4, 0, 3, 2, 0, 4, 4), - (0, 2, 0, 3, 0, 1, 0, 0, 0, 1, 3, 3, 3, 2, 4, 1, 3, 0, 3, 1, 3, 0, 2, 2, 1, 1, 0, 0, 2, 0, 4, 3, 1, 0, 4, 3, 0, 4, 4, 4, 1, 4, 3, 1, 1, 3, 3, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 2, 0, 0, 4, 3, 2, 4, 3, 5, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 0, 2, 1, 0, 3, 3), - (0, 2, 0, 4, 0, 3, 0, 2, 0, 2, 5, 5, 3, 4, 4, 4, 4, 1, 4, 3, 3, 0, 4, 3, 4, 3, 1, 3, 3, 2, 4, 3, 0, 3, 4, 3, 0, 3, 4, 4, 2, 4, 4, 0, 4, 5, 3, 3, 2, 2, 1, 1, 1, 2, 0, 1, 5, 0, 3, 3, 2, 4, 3, 3, 3, 4, 0, 3, 0, 2, 0, 4, 4, 3, 5, 5, 0, 0, 3, 0, 2, 3, 3), - (0, 3, 0, 4, 0, 3, 0, 1, 0, 3, 4, 3, 3, 1, 3, 3, 3, 0, 3, 1, 3, 0, 4, 3, 3, 1, 1, 0, 3, 0, 3, 3, 0, 0, 4, 4, 0, 1, 5, 4, 3, 3, 5, 0, 3, 3, 4, 3, 0, 2, 0, 1, 1, 1, 0, 1, 3, 0, 1, 2, 1, 3, 3, 2, 3, 3, 0, 3, 0, 1, 0, 1, 3, 3, 4, 4, 1, 0, 1, 2, 2, 1, 3), - (0, 1, 0, 4, 0, 4, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 1, 0, 3, 0, 3, 3, 4, 3, 2, 4, 2, 0, 1, 0, 4, 3, 2, 0, 4, 3, 0, 5, 3, 3, 2, 4, 4, 4, 3, 3, 3, 4, 0, 1, 3, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 4, 2, 3, 3, 3, 0, 3, 0, 0, 0, 4, 4, 4, 5, 3, 2, 0, 3, 3, 0, 3, 5), - (0, 2, 0, 3, 0, 0, 0, 3, 0, 1, 3, 0, 2, 0, 0, 0, 1, 0, 3, 1, 1, 3, 3, 0, 0, 3, 0, 0, 3, 0, 2, 3, 1, 0, 3, 1, 0, 3, 3, 2, 0, 4, 2, 2, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 0, 1, 3, 1, 2, 0, 0, 0, 1, 0, 0, 1, 4), - (0, 3, 0, 3, 0, 5, 0, 1, 0, 2, 4, 3, 1, 3, 3, 2, 1, 1, 5, 2, 1, 0, 5, 1, 2, 0, 0, 0, 3, 3, 2, 2, 3, 2, 4, 3, 0, 0, 3, 3, 1, 3, 3, 0, 2, 5, 3, 4, 0, 3, 3, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 2, 2, 3, 3, 3, 0, 2, 0, 1, 0, 3, 4, 4, 2, 5, 4, 0, 3, 0, 0, 3, 5), - (0, 3, 0, 3, 0, 3, 0, 1, 0, 3, 3, 3, 3, 0, 3, 0, 2, 0, 2, 1, 1, 0, 2, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 0, 3, 2, 0, 0, 3, 3, 1, 2, 3, 1, 0, 3, 3, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 3, 1, 2, 3, 0, 3, 0, 1, 0, 3, 2, 1, 0, 4, 3, 0, 1, 1, 0, 3, 3), - (0, 4, 0, 5, 0, 3, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 4, 3, 5, 3, 3, 2, 5, 3, 4, 4, 4, 3, 4, 3, 4, 5, 5, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 3, 4, 5, 5, 4, 2, 3, 4, 2, 3, 4, 0, 3, 3, 1, 4, 3, 2, 4, 3, 3, 5, 5, 0, 3, 0, 3, 0, 5, 5, 5, 5, 4, 4, 0, 4, 0, 1, 4, 4), - (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 5, 4, 4, 2, 3, 2, 5, 1, 3, 2, 5, 1, 4, 2, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 5, 4, 1, 3, 3, 5, 3, 4, 4, 0, 4, 4, 3, 1, 1, 3, 1, 0, 2, 3, 0, 2, 3, 0, 3, 0, 0, 4, 3, 1, 3, 4, 0, 3, 0, 2, 0, 4, 4, 4, 3, 4, 5, 0, 4, 0, 0, 3, 4), - (0, 3, 0, 3, 0, 3, 1, 2, 0, 3, 4, 4, 3, 3, 3, 0, 2, 2, 4, 3, 3, 1, 3, 3, 3, 1, 1, 0, 3, 1, 4, 3, 2, 3, 4, 4, 2, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 3, 1, 3, 3, 1, 3, 3, 0, 4, 1, 0, 2, 2, 1, 4, 3, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 3, 3, 0, 4, 0, 3, 2, 2, 4, 4), - (0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 1, 1, 3, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 3, 4, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1), - (0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 4, 1, 4, 0, 3, 0, 4, 0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 1, 5, 1, 4, 0, 0, 3, 0, 5, 0, 5, 2, 0, 1, 0, 0, 0, 2, 1, 4, 0, 1, 3, 0, 0, 3, 0, 0, 3, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), - (1, 4, 0, 5, 0, 3, 0, 2, 0, 3, 5, 4, 4, 3, 4, 3, 5, 3, 4, 3, 3, 0, 4, 3, 3, 3, 3, 3, 3, 2, 4, 4, 3, 1, 3, 4, 4, 5, 4, 4, 3, 4, 4, 1, 3, 5, 4, 3, 3, 3, 1, 2, 2, 3, 3, 1, 3, 1, 3, 3, 3, 5, 3, 3, 4, 5, 0, 3, 0, 3, 0, 3, 4, 3, 4, 4, 3, 0, 3, 0, 2, 4, 3), - (0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 4, 0, 4, 1, 4, 2, 4, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 1, 1, 1, 0, 3, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 3, 2, 0, 2, 2, 0, 1, 0, 0, 0, 2, 3, 2, 3, 3, 0, 0, 0, 0, 2, 1, 0), - (0, 5, 1, 5, 0, 3, 0, 3, 0, 5, 4, 4, 5, 1, 5, 3, 3, 0, 4, 3, 4, 3, 5, 3, 4, 3, 3, 2, 4, 3, 4, 3, 3, 0, 3, 3, 1, 4, 4, 3, 4, 4, 4, 3, 4, 5, 5, 3, 2, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 2, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 5, 3, 3, 0, 3, 4, 0, 4, 3), - (0, 5, 0, 5, 0, 3, 0, 2, 0, 4, 4, 3, 5, 2, 4, 3, 3, 3, 4, 4, 4, 3, 5, 3, 5, 3, 3, 1, 4, 0, 4, 3, 3, 0, 3, 3, 0, 4, 4, 4, 4, 5, 4, 3, 3, 5, 5, 3, 2, 3, 1, 2, 3, 2, 0, 1, 0, 0, 3, 2, 2, 4, 4, 3, 1, 5, 0, 4, 0, 3, 0, 4, 3, 1, 3, 2, 1, 0, 3, 3, 0, 3, 3), - (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 5, 5, 3, 4, 3, 3, 2, 5, 4, 4, 3, 5, 3, 5, 3, 4, 0, 4, 3, 4, 4, 3, 2, 4, 4, 3, 4, 5, 4, 4, 5, 5, 0, 3, 5, 5, 4, 1, 3, 3, 2, 3, 3, 1, 3, 1, 0, 4, 3, 1, 4, 4, 3, 4, 5, 0, 4, 0, 2, 0, 4, 3, 4, 4, 3, 3, 0, 4, 0, 0, 5, 5), - (0, 4, 0, 4, 0, 5, 0, 1, 1, 3, 3, 4, 4, 3, 4, 1, 3, 0, 5, 1, 3, 0, 3, 1, 3, 1, 1, 0, 3, 0, 3, 3, 4, 0, 4, 3, 0, 4, 4, 4, 3, 4, 4, 0, 3, 5, 4, 1, 0, 3, 0, 0, 2, 3, 0, 3, 1, 0, 3, 1, 0, 3, 2, 1, 3, 5, 0, 3, 0, 1, 0, 3, 2, 3, 3, 4, 4, 0, 2, 2, 0, 4, 4), - (2, 4, 0, 5, 0, 4, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 5, 3, 5, 3, 5, 2, 5, 3, 4, 3, 3, 4, 3, 4, 5, 3, 2, 1, 5, 4, 3, 2, 3, 4, 5, 3, 4, 1, 2, 5, 4, 3, 0, 3, 3, 0, 3, 2, 0, 2, 3, 0, 4, 1, 0, 3, 4, 3, 3, 5, 0, 3, 0, 1, 0, 4, 5, 5, 5, 4, 3, 0, 4, 2, 0, 3, 5), - (0, 5, 0, 4, 0, 4, 0, 2, 0, 5, 4, 3, 4, 3, 4, 3, 3, 3, 4, 3, 4, 2, 5, 3, 5, 3, 4, 1, 4, 3, 4, 4, 4, 0, 3, 5, 0, 4, 4, 4, 4, 5, 3, 1, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 0, 3, 3, 2, 4, 3, 3, 3, 5, 3, 4, 1, 3, 3, 5, 3, 2, 0, 0, 0, 0, 4, 3, 1, 3, 3), - (0, 1, 0, 3, 0, 3, 0, 1, 0, 1, 3, 3, 3, 2, 3, 3, 3, 0, 3, 0, 0, 0, 3, 1, 3, 0, 0, 0, 2, 2, 2, 3, 0, 0, 3, 2, 0, 1, 2, 4, 1, 3, 3, 0, 0, 3, 3, 3, 0, 1, 0, 0, 2, 1, 0, 0, 3, 0, 3, 1, 0, 3, 0, 0, 1, 3, 0, 2, 0, 1, 0, 3, 3, 1, 3, 3, 0, 0, 1, 1, 0, 3, 3), - (0, 2, 0, 3, 0, 2, 1, 4, 0, 2, 2, 3, 1, 1, 3, 1, 1, 0, 2, 0, 3, 1, 2, 3, 1, 3, 0, 0, 1, 0, 4, 3, 2, 3, 3, 3, 1, 4, 2, 3, 3, 3, 3, 1, 0, 3, 1, 4, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 0, 3, 1, 3, 2, 2, 0, 1, 0, 0, 0, 2, 3, 3, 3, 1, 0, 0, 0, 0, 0, 2, 3), - (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 5, 5, 3, 3, 4, 3, 3, 1, 5, 4, 4, 2, 4, 4, 4, 3, 4, 2, 4, 3, 5, 5, 4, 3, 3, 4, 3, 3, 5, 5, 4, 5, 5, 1, 3, 4, 5, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 1, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 5, 3, 3, 1, 4, 3, 0, 4, 0, 1, 5, 3), - (0, 5, 0, 5, 0, 4, 0, 2, 0, 4, 4, 3, 4, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 4, 4, 5, 3, 3, 5, 2, 4, 4, 4, 3, 4, 4, 3, 3, 4, 4, 5, 5, 3, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 3, 1, 2, 2, 1, 4, 3, 3, 5, 4, 4, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 4, 4, 1, 0, 4, 2, 0, 2, 4), - (0, 4, 0, 4, 0, 3, 0, 1, 0, 3, 5, 2, 3, 0, 3, 0, 2, 1, 4, 2, 3, 3, 4, 1, 4, 3, 3, 2, 4, 1, 3, 3, 3, 0, 3, 3, 0, 0, 3, 3, 3, 5, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 3, 1, 2, 2, 3, 0, 3, 0, 2, 0, 4, 4, 3, 3, 4, 1, 0, 3, 0, 0, 2, 4), - (0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 3, 1, 3, 0, 3, 2, 0, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 2, 0, 0, 0, 0, 0, 0, 2), - (0, 2, 1, 3, 0, 2, 0, 2, 0, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 4, 2, 2, 1, 2, 1, 4, 0, 4, 3, 1, 3, 3, 3, 2, 4, 3, 5, 4, 3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 4, 2, 0, 2, 3, 0, 3, 3, 0, 3, 3, 4, 2, 3, 1, 4, 0, 1, 2, 0, 2, 3), - (0, 3, 0, 3, 0, 1, 0, 3, 0, 2, 3, 3, 3, 0, 3, 1, 2, 0, 3, 3, 2, 3, 3, 2, 3, 2, 3, 1, 3, 0, 4, 3, 2, 0, 3, 3, 1, 4, 3, 3, 2, 3, 4, 3, 1, 3, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 4, 1, 1, 0, 3, 0, 3, 1, 0, 2, 3, 3, 3, 3, 3, 1, 0, 0, 2, 0, 3, 3), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3), - (0, 2, 0, 3, 1, 3, 0, 3, 0, 2, 3, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1, 3, 0, 2, 3, 1, 1, 4, 3, 3, 2, 3, 3, 1, 2, 2, 4, 1, 3, 3, 0, 1, 4, 2, 3, 0, 1, 3, 0, 3, 0, 0, 1, 3, 0, 2, 0, 0, 3, 3, 2, 1, 3, 0, 3, 0, 2, 0, 3, 4, 4, 4, 3, 1, 0, 3, 0, 0, 3, 3), - (0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 3, 2, 2, 1, 3, 0, 1, 1, 3, 0, 3, 2, 3, 1, 2, 0, 2, 0, 1, 1, 3, 3, 3, 0, 3, 3, 1, 1, 2, 3, 2, 3, 3, 1, 2, 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 2, 1, 2, 1, 3, 0, 3, 0, 0, 0, 3, 4, 4, 4, 3, 2, 0, 2, 0, 0, 2, 4), - (0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 3), - (0, 3, 0, 3, 0, 2, 0, 3, 0, 3, 3, 3, 2, 3, 2, 2, 2, 0, 3, 1, 3, 3, 3, 2, 3, 3, 0, 0, 3, 0, 3, 2, 2, 0, 2, 3, 1, 4, 3, 4, 3, 3, 2, 3, 1, 5, 4, 4, 0, 3, 1, 2, 1, 3, 0, 3, 1, 1, 2, 0, 2, 3, 1, 3, 1, 3, 0, 3, 0, 1, 0, 3, 3, 4, 4, 2, 1, 0, 2, 1, 0, 2, 4), - (0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 4, 2, 5, 1, 4, 0, 2, 0, 2, 1, 3, 1, 4, 0, 2, 1, 0, 0, 2, 1, 4, 1, 1, 0, 3, 3, 0, 5, 1, 3, 2, 3, 3, 1, 0, 3, 2, 3, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 1, 0, 3, 0, 2, 0, 1, 0, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 2, 3), - (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3), - (0, 1, 0, 3, 0, 4, 0, 3, 0, 2, 4, 3, 1, 0, 3, 2, 2, 1, 3, 1, 2, 2, 3, 1, 1, 1, 2, 1, 3, 0, 1, 2, 0, 1, 3, 2, 1, 3, 0, 5, 5, 1, 0, 0, 1, 3, 2, 1, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 3, 4, 0, 1, 1, 1, 3, 2, 0, 2, 0, 1, 0, 2, 3, 3, 1, 2, 3, 0, 1, 0, 1, 0, 4), - (0, 0, 0, 1, 0, 3, 0, 3, 0, 2, 2, 1, 0, 0, 4, 0, 3, 0, 3, 1, 3, 0, 3, 0, 3, 0, 1, 0, 3, 0, 3, 1, 3, 0, 3, 3, 0, 0, 1, 2, 1, 1, 1, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 0, 0, 2, 0, 0, 0, 0, 2, 3, 3, 3, 3, 0, 0, 0, 0, 1, 4), - (0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 1, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 2, 3, 0, 0, 2, 2, 3, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 2, 3), - (2, 4, 0, 5, 0, 5, 0, 4, 0, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 2, 3, 0, 5, 5, 4, 1, 5, 4, 3, 1, 5, 4, 3, 4, 4, 3, 3, 4, 3, 3, 0, 3, 2, 0, 2, 3, 0, 3, 0, 0, 3, 3, 0, 5, 3, 2, 3, 3, 0, 3, 0, 3, 0, 3, 4, 5, 4, 5, 3, 0, 4, 3, 0, 3, 4), - (0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 3, 4, 3, 2, 3, 2, 3, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 1, 0, 2, 0, 0, 1, 1, 0, 2, 0, 0, 3, 1, 0, 5, 3, 2, 1, 3, 0, 3, 0, 1, 2, 4, 3, 2, 4, 3, 3, 0, 3, 2, 0, 4, 4), - (0, 3, 0, 3, 0, 1, 0, 0, 0, 1, 4, 3, 3, 2, 3, 1, 3, 1, 4, 2, 3, 2, 4, 2, 3, 4, 3, 0, 2, 2, 3, 3, 3, 0, 3, 3, 3, 0, 3, 4, 1, 3, 3, 0, 3, 4, 3, 3, 0, 1, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 0, 3, 1, 2, 1, 3, 0, 4, 0, 1, 0, 4, 3, 3, 4, 3, 3, 0, 2, 0, 0, 3, 3), - (0, 3, 0, 4, 0, 1, 0, 3, 0, 3, 4, 3, 3, 0, 3, 3, 3, 1, 3, 1, 3, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 3, 3, 1, 3, 3, 2, 5, 4, 3, 3, 4, 5, 3, 2, 5, 3, 4, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 4, 2, 2, 1, 3, 0, 3, 0, 2, 0, 4, 4, 3, 5, 3, 2, 0, 1, 1, 0, 3, 4), - (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 4, 3, 3, 2, 3, 3, 3, 1, 4, 3, 4, 1, 5, 3, 4, 3, 4, 0, 4, 2, 4, 3, 4, 1, 5, 4, 0, 4, 4, 4, 4, 5, 4, 1, 3, 5, 4, 2, 1, 4, 1, 1, 3, 2, 0, 3, 1, 0, 3, 2, 1, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 3, 3, 3, 0, 4, 2, 0, 3, 4), - (1, 4, 0, 4, 0, 3, 0, 1, 0, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 1, 0, 3, 2, 2, 1, 2, 0, 3, 1, 2, 1, 2, 0, 3, 2, 0, 2, 2, 3, 3, 4, 3, 0, 3, 3, 1, 2, 0, 1, 1, 3, 1, 2, 0, 0, 3, 0, 1, 1, 0, 3, 2, 2, 3, 3, 0, 3, 0, 0, 0, 2, 3, 3, 4, 3, 3, 0, 1, 0, 0, 1, 4), - (0, 4, 0, 4, 0, 4, 0, 0, 0, 3, 4, 4, 3, 1, 4, 2, 3, 2, 3, 3, 3, 1, 4, 3, 4, 0, 3, 0, 4, 2, 3, 3, 2, 2, 5, 4, 2, 1, 3, 4, 3, 4, 3, 1, 3, 3, 4, 2, 0, 2, 1, 0, 3, 3, 0, 0, 2, 0, 3, 1, 0, 4, 4, 3, 4, 3, 0, 4, 0, 1, 0, 2, 4, 4, 4, 4, 4, 0, 3, 2, 0, 3, 3), - (0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2), - (0, 2, 0, 3, 0, 4, 0, 4, 0, 1, 3, 3, 3, 0, 4, 0, 2, 1, 2, 1, 1, 1, 2, 0, 3, 1, 1, 0, 1, 0, 3, 1, 0, 0, 3, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 2, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 0, 3, 0, 0, 0, 0, 1, 0, 0, 3, 3, 4, 3, 1, 0, 1, 0, 3, 0, 2), - (0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 1, 0, 2, 0, 3, 1, 0, 1, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 2, 3, 0, 1, 4, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 3), - (0, 2, 0, 5, 0, 5, 0, 1, 0, 2, 4, 3, 3, 2, 5, 1, 3, 2, 3, 3, 3, 0, 4, 1, 2, 0, 3, 0, 4, 0, 2, 2, 1, 1, 5, 3, 0, 0, 1, 4, 2, 3, 2, 0, 3, 3, 3, 2, 0, 2, 4, 1, 1, 2, 0, 1, 1, 0, 3, 1, 0, 1, 3, 1, 2, 3, 0, 2, 0, 0, 0, 1, 3, 5, 4, 4, 4, 0, 3, 0, 0, 1, 3), - (0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 5, 4, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 3, 4, 5, 4, 2, 4, 2, 3, 4, 3, 1, 4, 4, 1, 3, 5, 4, 4, 5, 5, 4, 4, 5, 5, 5, 2, 3, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 4, 4, 4, 0, 3, 0, 4, 0, 3, 3, 4, 4, 5, 0, 0, 4, 3, 0, 4, 5), - (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 4, 4, 4, 3, 3, 2, 4, 3, 4, 3, 4, 3, 5, 3, 4, 3, 2, 1, 4, 2, 4, 4, 3, 1, 3, 4, 2, 4, 5, 5, 3, 4, 5, 4, 1, 5, 4, 3, 0, 3, 2, 2, 3, 2, 1, 3, 1, 0, 3, 3, 3, 5, 3, 3, 3, 5, 4, 4, 2, 3, 3, 4, 3, 3, 3, 2, 1, 0, 3, 2, 1, 4, 3), - (0, 4, 0, 5, 0, 4, 0, 3, 0, 3, 5, 5, 3, 2, 4, 3, 4, 0, 5, 4, 4, 1, 4, 4, 4, 3, 3, 3, 4, 3, 5, 5, 2, 3, 3, 4, 1, 2, 5, 5, 3, 5, 5, 2, 3, 5, 5, 4, 0, 3, 2, 0, 3, 3, 1, 1, 5, 1, 4, 1, 0, 4, 3, 2, 3, 5, 0, 4, 0, 3, 0, 5, 4, 3, 4, 3, 0, 0, 4, 1, 0, 4, 4), - (1, 3, 0, 4, 0, 2, 0, 2, 0, 2, 5, 5, 3, 3, 3, 3, 3, 0, 4, 2, 3, 4, 4, 4, 3, 4, 0, 0, 3, 4, 5, 4, 3, 3, 3, 3, 2, 5, 5, 4, 5, 5, 5, 4, 3, 5, 5, 5, 1, 3, 1, 0, 1, 0, 0, 3, 2, 0, 4, 2, 0, 5, 2, 3, 2, 4, 1, 3, 0, 3, 0, 4, 5, 4, 5, 4, 3, 0, 4, 2, 0, 5, 4), - (0, 3, 0, 4, 0, 5, 0, 3, 0, 3, 4, 4, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 4, 3, 3, 2, 2, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 0, 4, 4, 3, 4, 4, 1, 1, 4, 4, 2, 0, 3, 1, 0, 1, 1, 0, 4, 1, 0, 2, 3, 1, 3, 3, 1, 3, 4, 0, 3, 0, 1, 0, 3, 1, 3, 0, 0, 1, 0, 2, 0, 0, 4, 4), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - (0, 3, 0, 3, 0, 2, 0, 3, 0, 1, 5, 4, 3, 3, 3, 1, 4, 2, 1, 2, 3, 4, 4, 2, 4, 4, 5, 0, 3, 1, 4, 3, 4, 0, 4, 3, 3, 3, 2, 3, 2, 5, 3, 4, 3, 2, 2, 3, 0, 0, 3, 0, 2, 1, 0, 1, 2, 0, 0, 0, 0, 2, 1, 1, 3, 1, 0, 2, 0, 4, 0, 3, 4, 4, 4, 5, 2, 0, 2, 0, 0, 1, 3), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 4, 2, 1, 1, 0, 1, 0, 3, 2, 0, 0, 3, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 4, 0, 4, 2, 1, 0, 0, 0, 0, 0, 1), - (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 2, 1, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2), - (0, 4, 0, 4, 0, 4, 0, 3, 0, 4, 4, 3, 4, 2, 4, 3, 2, 0, 4, 4, 4, 3, 5, 3, 5, 3, 3, 2, 4, 2, 4, 3, 4, 3, 1, 4, 0, 2, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 4, 1, 3, 4, 3, 2, 1, 2, 1, 3, 3, 3, 4, 4, 3, 3, 5, 0, 4, 0, 3, 0, 4, 3, 3, 3, 2, 1, 0, 3, 0, 0, 3, 3), - (0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 5, 5, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 3, 5, 3, 3, 1, 3, 2, 4, 5, 5, 5, 5, 4, 3, 4, 5, 5, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 4, 3, 2, 2, 1, 2, 0, 3, 0, 0, 4, 1), -) -# fmt: on - - -class JapaneseContextAnalysis: - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self) -> None: - self._total_rel = 0 - self._rel_sample: List[int] = [] - self._need_to_skip_char_num = 0 - self._last_char_order = -1 - self._done = False - self.reset() - - def reset(self) -> None: - self._total_rel = 0 # total sequence received - # category counters, each integer counts sequence in its category - self._rel_sample = [0] * self.NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._need_to_skip_char_num = 0 - self._last_char_order = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - - def feed(self, byte_str: Union[bytes, bytearray], num_bytes: int) -> None: - if self._done: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._need_to_skip_char_num - while i < num_bytes: - order, char_len = self.get_order(byte_str[i : i + 2]) - i += char_len - if i > num_bytes: - self._need_to_skip_char_num = i - num_bytes - self._last_char_order = -1 - else: - if (order != -1) and (self._last_char_order != -1): - self._total_rel += 1 - if self._total_rel > self.MAX_REL_THRESHOLD: - self._done = True - break - self._rel_sample[ - jp2_char_context[self._last_char_order][order] - ] += 1 - self._last_char_order = order - - def got_enough_data(self) -> bool: - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self) -> float: - # This is just one way to calculate confidence. It works well for me. - if self._total_rel > self.MINIMUM_DATA_THRESHOLD: - return (self._total_rel - self._rel_sample[0]) / self._total_rel - return self.DONT_KNOW - - def get_order(self, _: Union[bytes, bytearray]) -> Tuple[int, int]: - return -1, 1 - - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self) -> None: - super().__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self) -> str: - return self._charset_name - - def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): - char_len = 2 - if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self._charset_name = "CP932" - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, char_len - - return -1, char_len - - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]: - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - char_len = 2 - elif first_char == 0x8F: - char_len = 3 - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, char_len - - return -1, char_len diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py deleted file mode 100644 index 99466821..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,4649 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -BULGARIAN_LANG_MODEL = { - 63: { # 'e' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 1, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 45: { # '\xad' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 1, # 'М' - 36: 0, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 31: { # 'А' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 1, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 1, # 'О' - 30: 2, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 2, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 0, # 'и' - 26: 2, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 1, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 32: { # 'Б' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 2, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 1, # 'Щ' - 61: 2, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 1, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 35: { # 'В' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 2, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 2, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 43: { # 'Г' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 1, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 37: { # 'Д' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 2, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 44: { # 'Е' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Х' - 53: 2, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 0, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 1, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 55: { # 'Ж' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 47: { # 'З' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 40: { # 'И' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 2, # 'М' - 36: 2, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 2, # 'Я' - 1: 1, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 3, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 0, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 59: { # 'Й' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 33: { # 'К' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 46: { # 'Л' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 2, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 38: { # 'М' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 36: { # 'Н' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 2, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 1, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 2, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 41: { # 'О' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 2, # 'М' - 36: 2, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 0, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 2, # 'ч' - 27: 0, # 'ш' - 24: 2, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 30: { # 'П' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 2, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 39: { # 'Р' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 2, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 1, # 'с' - 5: 0, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 28: { # 'С' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 3, # 'А' - 32: 2, # 'Б' - 35: 2, # 'В' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 34: { # 'Т' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 2, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 51: { # 'У' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 2, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 2, # 'с' - 5: 1, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 48: { # 'Ф' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 49: { # 'Х' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 53: { # 'Ц' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 50: { # 'Ч' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 54: { # 'Ш' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 1, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 57: { # 'Щ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 1, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 61: { # 'Ъ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Х' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 60: { # 'Ю' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 1, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 0, # 'е' - 23: 2, # 'ж' - 15: 1, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 56: { # 'Я' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 1, # 'В' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 1, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 1: { # 'а' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 18: { # 'б' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 0, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 2, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 3, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 9: { # 'в' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 1, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 0, # 'в' - 20: 2, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 20: { # 'г' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 11: { # 'д' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 1, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 3: { # 'е' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 2, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 23: { # 'ж' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 15: { # 'з' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 2: { # 'и' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 1, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 26: { # 'й' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 12: { # 'к' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 1, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 3, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 10: { # 'л' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 1, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 3, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 14: { # 'м' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 1, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 1, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 6: { # 'н' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 2, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 3, # 'ф' - 25: 2, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 4: { # 'о' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 2, # 'у' - 29: 3, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 13: { # 'п' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 7: { # 'р' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 1, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 3, # 'х' - 22: 3, # 'ц' - 21: 2, # 'ч' - 27: 3, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 1, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 8: { # 'с' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 2, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 5: { # 'т' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 3, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ъ' - 52: 2, # 'ь' - 42: 2, # 'ю' - 16: 3, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 19: { # 'у' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 2, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 2, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 2, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 29: { # 'ф' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 2, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 2, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 25: { # 'х' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'р' - 8: 1, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 1, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 22: { # 'ц' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'р' - 8: 1, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 0, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 21: { # 'ч' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'р' - 8: 0, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 27: { # 'ш' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 2, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 1, # 'т' - 19: 2, # 'у' - 29: 1, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ъ' - 52: 1, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 24: { # 'щ' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 1, # 'р' - 8: 0, # 'с' - 5: 2, # 'т' - 19: 3, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 1, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 2, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 17: { # 'ъ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 1, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 2, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 3, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 2, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 52: { # 'ь' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 1, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 1, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 1, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 42: { # 'ю' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 1, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 1, # 'е' - 23: 2, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 1, # 'о' - 13: 1, # 'п' - 7: 2, # 'р' - 8: 2, # 'с' - 5: 2, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 1, # 'х' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 16: { # 'я' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 1, # 'о' - 13: 2, # 'п' - 7: 2, # 'р' - 8: 3, # 'с' - 5: 3, # 'т' - 19: 1, # 'у' - 29: 1, # 'ф' - 25: 3, # 'х' - 22: 2, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 2, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 1, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 58: { # 'є' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, - 62: { # '№' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'А' - 32: 0, # 'Б' - 35: 0, # 'В' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Н' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Х' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'р' - 8: 0, # 'с' - 5: 0, # 'т' - 19: 0, # 'у' - 29: 0, # 'ф' - 25: 0, # 'х' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ъ' - 52: 0, # 'ь' - 42: 0, # 'ю' - 16: 0, # 'я' - 58: 0, # 'є' - 62: 0, # '№' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 77, # 'A' - 66: 90, # 'B' - 67: 99, # 'C' - 68: 100, # 'D' - 69: 72, # 'E' - 70: 109, # 'F' - 71: 107, # 'G' - 72: 101, # 'H' - 73: 79, # 'I' - 74: 185, # 'J' - 75: 81, # 'K' - 76: 102, # 'L' - 77: 76, # 'M' - 78: 94, # 'N' - 79: 82, # 'O' - 80: 110, # 'P' - 81: 186, # 'Q' - 82: 108, # 'R' - 83: 91, # 'S' - 84: 74, # 'T' - 85: 119, # 'U' - 86: 84, # 'V' - 87: 96, # 'W' - 88: 111, # 'X' - 89: 187, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 65, # 'a' - 98: 69, # 'b' - 99: 70, # 'c' - 100: 66, # 'd' - 101: 63, # 'e' - 102: 68, # 'f' - 103: 112, # 'g' - 104: 103, # 'h' - 105: 92, # 'i' - 106: 194, # 'j' - 107: 104, # 'k' - 108: 95, # 'l' - 109: 86, # 'm' - 110: 87, # 'n' - 111: 71, # 'o' - 112: 116, # 'p' - 113: 195, # 'q' - 114: 85, # 'r' - 115: 93, # 's' - 116: 97, # 't' - 117: 113, # 'u' - 118: 196, # 'v' - 119: 197, # 'w' - 120: 198, # 'x' - 121: 199, # 'y' - 122: 200, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 194, # '\x80' - 129: 195, # '\x81' - 130: 196, # '\x82' - 131: 197, # '\x83' - 132: 198, # '\x84' - 133: 199, # '\x85' - 134: 200, # '\x86' - 135: 201, # '\x87' - 136: 202, # '\x88' - 137: 203, # '\x89' - 138: 204, # '\x8a' - 139: 205, # '\x8b' - 140: 206, # '\x8c' - 141: 207, # '\x8d' - 142: 208, # '\x8e' - 143: 209, # '\x8f' - 144: 210, # '\x90' - 145: 211, # '\x91' - 146: 212, # '\x92' - 147: 213, # '\x93' - 148: 214, # '\x94' - 149: 215, # '\x95' - 150: 216, # '\x96' - 151: 217, # '\x97' - 152: 218, # '\x98' - 153: 219, # '\x99' - 154: 220, # '\x9a' - 155: 221, # '\x9b' - 156: 222, # '\x9c' - 157: 223, # '\x9d' - 158: 224, # '\x9e' - 159: 225, # '\x9f' - 160: 81, # '\xa0' - 161: 226, # 'Ё' - 162: 227, # 'Ђ' - 163: 228, # 'Ѓ' - 164: 229, # 'Є' - 165: 230, # 'Ѕ' - 166: 105, # 'І' - 167: 231, # 'Ї' - 168: 232, # 'Ј' - 169: 233, # 'Љ' - 170: 234, # 'Њ' - 171: 235, # 'Ћ' - 172: 236, # 'Ќ' - 173: 45, # '\xad' - 174: 237, # 'Ў' - 175: 238, # 'Џ' - 176: 31, # 'А' - 177: 32, # 'Б' - 178: 35, # 'В' - 179: 43, # 'Г' - 180: 37, # 'Д' - 181: 44, # 'Е' - 182: 55, # 'Ж' - 183: 47, # 'З' - 184: 40, # 'И' - 185: 59, # 'Й' - 186: 33, # 'К' - 187: 46, # 'Л' - 188: 38, # 'М' - 189: 36, # 'Н' - 190: 41, # 'О' - 191: 30, # 'П' - 192: 39, # 'Р' - 193: 28, # 'С' - 194: 34, # 'Т' - 195: 51, # 'У' - 196: 48, # 'Ф' - 197: 49, # 'Х' - 198: 53, # 'Ц' - 199: 50, # 'Ч' - 200: 54, # 'Ш' - 201: 57, # 'Щ' - 202: 61, # 'Ъ' - 203: 239, # 'Ы' - 204: 67, # 'Ь' - 205: 240, # 'Э' - 206: 60, # 'Ю' - 207: 56, # 'Я' - 208: 1, # 'а' - 209: 18, # 'б' - 210: 9, # 'в' - 211: 20, # 'г' - 212: 11, # 'д' - 213: 3, # 'е' - 214: 23, # 'ж' - 215: 15, # 'з' - 216: 2, # 'и' - 217: 26, # 'й' - 218: 12, # 'к' - 219: 10, # 'л' - 220: 14, # 'м' - 221: 6, # 'н' - 222: 4, # 'о' - 223: 13, # 'п' - 224: 7, # 'р' - 225: 8, # 'с' - 226: 5, # 'т' - 227: 19, # 'у' - 228: 29, # 'ф' - 229: 25, # 'х' - 230: 22, # 'ц' - 231: 21, # 'ч' - 232: 27, # 'ш' - 233: 24, # 'щ' - 234: 17, # 'ъ' - 235: 75, # 'ы' - 236: 52, # 'ь' - 237: 241, # 'э' - 238: 42, # 'ю' - 239: 16, # 'я' - 240: 62, # '№' - 241: 242, # 'ё' - 242: 243, # 'ђ' - 243: 244, # 'ѓ' - 244: 58, # 'є' - 245: 245, # 'ѕ' - 246: 98, # 'і' - 247: 246, # 'ї' - 248: 247, # 'ј' - 249: 248, # 'љ' - 250: 249, # 'њ' - 251: 250, # 'ћ' - 252: 251, # 'ќ' - 253: 91, # '§' - 254: 252, # 'ў' - 255: 253, # 'џ' -} - -ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-5", - language="Bulgarian", - char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER, - language_model=BULGARIAN_LANG_MODEL, - typical_positive_ratio=0.969392, - keep_ascii_letters=False, - alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", -) - -WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 77, # 'A' - 66: 90, # 'B' - 67: 99, # 'C' - 68: 100, # 'D' - 69: 72, # 'E' - 70: 109, # 'F' - 71: 107, # 'G' - 72: 101, # 'H' - 73: 79, # 'I' - 74: 185, # 'J' - 75: 81, # 'K' - 76: 102, # 'L' - 77: 76, # 'M' - 78: 94, # 'N' - 79: 82, # 'O' - 80: 110, # 'P' - 81: 186, # 'Q' - 82: 108, # 'R' - 83: 91, # 'S' - 84: 74, # 'T' - 85: 119, # 'U' - 86: 84, # 'V' - 87: 96, # 'W' - 88: 111, # 'X' - 89: 187, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 65, # 'a' - 98: 69, # 'b' - 99: 70, # 'c' - 100: 66, # 'd' - 101: 63, # 'e' - 102: 68, # 'f' - 103: 112, # 'g' - 104: 103, # 'h' - 105: 92, # 'i' - 106: 194, # 'j' - 107: 104, # 'k' - 108: 95, # 'l' - 109: 86, # 'm' - 110: 87, # 'n' - 111: 71, # 'o' - 112: 116, # 'p' - 113: 195, # 'q' - 114: 85, # 'r' - 115: 93, # 's' - 116: 97, # 't' - 117: 113, # 'u' - 118: 196, # 'v' - 119: 197, # 'w' - 120: 198, # 'x' - 121: 199, # 'y' - 122: 200, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 206, # 'Ђ' - 129: 207, # 'Ѓ' - 130: 208, # '‚' - 131: 209, # 'ѓ' - 132: 210, # '„' - 133: 211, # '…' - 134: 212, # '†' - 135: 213, # '‡' - 136: 120, # '€' - 137: 214, # '‰' - 138: 215, # 'Љ' - 139: 216, # '‹' - 140: 217, # 'Њ' - 141: 218, # 'Ќ' - 142: 219, # 'Ћ' - 143: 220, # 'Џ' - 144: 221, # 'ђ' - 145: 78, # '‘' - 146: 64, # '’' - 147: 83, # '“' - 148: 121, # '”' - 149: 98, # '•' - 150: 117, # '–' - 151: 105, # '—' - 152: 222, # None - 153: 223, # '™' - 154: 224, # 'љ' - 155: 225, # '›' - 156: 226, # 'њ' - 157: 227, # 'ќ' - 158: 228, # 'ћ' - 159: 229, # 'џ' - 160: 88, # '\xa0' - 161: 230, # 'Ў' - 162: 231, # 'ў' - 163: 232, # 'Ј' - 164: 233, # '¤' - 165: 122, # 'Ґ' - 166: 89, # '¦' - 167: 106, # '§' - 168: 234, # 'Ё' - 169: 235, # '©' - 170: 236, # 'Є' - 171: 237, # '«' - 172: 238, # '¬' - 173: 45, # '\xad' - 174: 239, # '®' - 175: 240, # 'Ї' - 176: 73, # '°' - 177: 80, # '±' - 178: 118, # 'І' - 179: 114, # 'і' - 180: 241, # 'ґ' - 181: 242, # 'µ' - 182: 243, # '¶' - 183: 244, # '·' - 184: 245, # 'ё' - 185: 62, # '№' - 186: 58, # 'є' - 187: 246, # '»' - 188: 247, # 'ј' - 189: 248, # 'Ѕ' - 190: 249, # 'ѕ' - 191: 250, # 'ї' - 192: 31, # 'А' - 193: 32, # 'Б' - 194: 35, # 'В' - 195: 43, # 'Г' - 196: 37, # 'Д' - 197: 44, # 'Е' - 198: 55, # 'Ж' - 199: 47, # 'З' - 200: 40, # 'И' - 201: 59, # 'Й' - 202: 33, # 'К' - 203: 46, # 'Л' - 204: 38, # 'М' - 205: 36, # 'Н' - 206: 41, # 'О' - 207: 30, # 'П' - 208: 39, # 'Р' - 209: 28, # 'С' - 210: 34, # 'Т' - 211: 51, # 'У' - 212: 48, # 'Ф' - 213: 49, # 'Х' - 214: 53, # 'Ц' - 215: 50, # 'Ч' - 216: 54, # 'Ш' - 217: 57, # 'Щ' - 218: 61, # 'Ъ' - 219: 251, # 'Ы' - 220: 67, # 'Ь' - 221: 252, # 'Э' - 222: 60, # 'Ю' - 223: 56, # 'Я' - 224: 1, # 'а' - 225: 18, # 'б' - 226: 9, # 'в' - 227: 20, # 'г' - 228: 11, # 'д' - 229: 3, # 'е' - 230: 23, # 'ж' - 231: 15, # 'з' - 232: 2, # 'и' - 233: 26, # 'й' - 234: 12, # 'к' - 235: 10, # 'л' - 236: 14, # 'м' - 237: 6, # 'н' - 238: 4, # 'о' - 239: 13, # 'п' - 240: 7, # 'р' - 241: 8, # 'с' - 242: 5, # 'т' - 243: 19, # 'у' - 244: 29, # 'ф' - 245: 25, # 'х' - 246: 22, # 'ц' - 247: 21, # 'ч' - 248: 27, # 'ш' - 249: 24, # 'щ' - 250: 17, # 'ъ' - 251: 75, # 'ы' - 252: 52, # 'ь' - 253: 253, # 'э' - 254: 42, # 'ю' - 255: 16, # 'я' -} - -WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel( - charset_name="windows-1251", - language="Bulgarian", - char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER, - language_model=BULGARIAN_LANG_MODEL, - typical_positive_ratio=0.969392, - keep_ascii_letters=False, - alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", -) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py deleted file mode 100644 index cfb8639e..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py +++ /dev/null @@ -1,4397 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -GREEK_LANG_MODEL = { - 60: { # 'e' - 60: 2, # 'e' - 55: 1, # 'o' - 58: 2, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 55: { # 'o' - 60: 0, # 'e' - 55: 2, # 'o' - 58: 2, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 1, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 58: { # 't' - 60: 2, # 'e' - 55: 1, # 'o' - 58: 1, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 1, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 36: { # '·' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 61: { # 'Ά' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 1, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 1, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 46: { # 'Έ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 2, # 'β' - 20: 2, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 1, # 'σ' - 2: 2, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 54: { # 'Ό' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 31: { # 'Α' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 2, # 'Β' - 43: 2, # 'Γ' - 41: 1, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 2, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 1, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 2, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 2, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 1, # 'θ' - 5: 0, # 'ι' - 11: 2, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 2, # 'ς' - 7: 2, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 51: { # 'Β' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 1, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 43: { # 'Γ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 1, # 'Α' - 51: 0, # 'Β' - 43: 2, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 1, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 41: { # 'Δ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 1, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 34: { # 'Ε' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 2, # 'Γ' - 41: 2, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 1, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 2, # 'Χ' - 57: 2, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 1, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 1, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 2, # 'τ' - 12: 2, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 1, # 'ύ' - 27: 0, # 'ώ' - }, - 40: { # 'Η' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 1, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 2, # 'Θ' - 47: 0, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 52: { # 'Θ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 1, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 47: { # 'Ι' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 1, # 'Β' - 43: 1, # 'Γ' - 41: 2, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 2, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 1, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 1, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 44: { # 'Κ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 1, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 1, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 53: { # 'Λ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 2, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 2, # 'Σ' - 33: 0, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 1, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 38: { # 'Μ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 2, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 2, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 49: { # 'Ν' - 60: 2, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 1, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 1, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 59: { # 'Ξ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 39: { # 'Ο' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 1, # 'Β' - 43: 2, # 'Γ' - 41: 2, # 'Δ' - 34: 2, # 'Ε' - 40: 1, # 'Η' - 52: 2, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 2, # 'Φ' - 50: 2, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 2, # 'υ' - 28: 1, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 35: { # 'Π' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 2, # 'Λ' - 38: 1, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 1, # 'έ' - 22: 1, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 3, # 'ώ' - }, - 48: { # 'Ρ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 1, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 1, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 1, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 37: { # 'Σ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Υ' - 56: 0, # 'Φ' - 50: 2, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 2, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 2, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 2, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 33: { # 'Τ' - 60: 0, # 'e' - 55: 1, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 2, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 1, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 2, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 3, # 'ώ' - }, - 45: { # 'Υ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 2, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 2, # 'Η' - 52: 2, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 1, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 56: { # 'Φ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 1, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 1, # 'ύ' - 27: 1, # 'ώ' - }, - 50: { # 'Χ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 1, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 1, # 'Ν' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 1, # 'Ω' - 17: 2, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 57: { # 'Ω' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 1, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 2, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 2, # 'ρ' - 14: 2, # 'ς' - 7: 2, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 17: { # 'ά' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 3, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 3, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 18: { # 'έ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 3, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 22: { # 'ή' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 15: { # 'ί' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 3, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 1, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 1: { # 'α' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 2, # 'ε' - 32: 3, # 'ζ' - 13: 1, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 0, # 'ώ' - }, - 29: { # 'β' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 2, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 3, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 20: { # 'γ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 3, # 'ώ' - }, - 21: { # 'δ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 3: { # 'ε' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 2, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 2, # 'ε' - 32: 2, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ό' - 26: 3, # 'ύ' - 27: 2, # 'ώ' - }, - 32: { # 'ζ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 1, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 2, # 'ώ' - }, - 13: { # 'η' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 25: { # 'θ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 1, # 'λ' - 10: 3, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 5: { # 'ι' - 60: 0, # 'e' - 55: 1, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 0, # 'ύ' - 27: 3, # 'ώ' - }, - 11: { # 'κ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 2, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 16: { # 'λ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 1, # 'β' - 20: 2, # 'γ' - 21: 1, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 10: { # 'μ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 2, # 'υ' - 28: 3, # 'φ' - 23: 0, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 6: { # 'ν' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 1, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 30: { # 'ξ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 2, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ό' - 26: 3, # 'ύ' - 27: 1, # 'ώ' - }, - 4: { # 'ο' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 2, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 1, # 'ό' - 26: 3, # 'ύ' - 27: 2, # 'ώ' - }, - 9: { # 'π' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 3, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 2, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 3, # 'ώ' - }, - 8: { # 'ρ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 1, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 3, # 'ο' - 9: 2, # 'π' - 8: 2, # 'ρ' - 14: 0, # 'ς' - 7: 2, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 14: { # 'ς' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 0, # 'τ' - 12: 0, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 7: { # 'σ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 2, # 'ώ' - }, - 2: { # 'τ' - 60: 0, # 'e' - 55: 2, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 12: { # 'υ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 2, # 'ε' - 32: 2, # 'ζ' - 13: 2, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ό' - 26: 0, # 'ύ' - 27: 2, # 'ώ' - }, - 28: { # 'φ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 1, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 2, # 'ύ' - 27: 2, # 'ώ' - }, - 23: { # 'χ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'π' - 8: 3, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 3, # 'τ' - 12: 3, # 'υ' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ό' - 26: 3, # 'ύ' - 27: 3, # 'ώ' - }, - 42: { # 'ψ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 1, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'π' - 8: 0, # 'ρ' - 14: 0, # 'ς' - 7: 0, # 'σ' - 2: 2, # 'τ' - 12: 1, # 'υ' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 24: { # 'ω' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 1, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 19: { # 'ό' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 1, # 'ε' - 32: 2, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 1, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 26: { # 'ύ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 2, # 'β' - 20: 2, # 'γ' - 21: 1, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, - 27: { # 'ώ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'Ό' - 31: 0, # 'Α' - 51: 0, # 'Β' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Ν' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Υ' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 1, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 1, # 'η' - 25: 2, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 1, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'π' - 8: 3, # 'ρ' - 14: 3, # 'ς' - 7: 3, # 'σ' - 2: 3, # 'τ' - 12: 0, # 'υ' - 28: 1, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ό' - 26: 0, # 'ύ' - 27: 0, # 'ώ' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -WINDOWS_1253_GREEK_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 82, # 'A' - 66: 100, # 'B' - 67: 104, # 'C' - 68: 94, # 'D' - 69: 98, # 'E' - 70: 101, # 'F' - 71: 116, # 'G' - 72: 102, # 'H' - 73: 111, # 'I' - 74: 187, # 'J' - 75: 117, # 'K' - 76: 92, # 'L' - 77: 88, # 'M' - 78: 113, # 'N' - 79: 85, # 'O' - 80: 79, # 'P' - 81: 118, # 'Q' - 82: 105, # 'R' - 83: 83, # 'S' - 84: 67, # 'T' - 85: 114, # 'U' - 86: 119, # 'V' - 87: 95, # 'W' - 88: 99, # 'X' - 89: 109, # 'Y' - 90: 188, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 72, # 'a' - 98: 70, # 'b' - 99: 80, # 'c' - 100: 81, # 'd' - 101: 60, # 'e' - 102: 96, # 'f' - 103: 93, # 'g' - 104: 89, # 'h' - 105: 68, # 'i' - 106: 120, # 'j' - 107: 97, # 'k' - 108: 77, # 'l' - 109: 86, # 'm' - 110: 69, # 'n' - 111: 55, # 'o' - 112: 78, # 'p' - 113: 115, # 'q' - 114: 65, # 'r' - 115: 66, # 's' - 116: 58, # 't' - 117: 76, # 'u' - 118: 106, # 'v' - 119: 103, # 'w' - 120: 87, # 'x' - 121: 107, # 'y' - 122: 112, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 255, # '€' - 129: 255, # None - 130: 255, # '‚' - 131: 255, # 'ƒ' - 132: 255, # '„' - 133: 255, # '…' - 134: 255, # '†' - 135: 255, # '‡' - 136: 255, # None - 137: 255, # '‰' - 138: 255, # None - 139: 255, # '‹' - 140: 255, # None - 141: 255, # None - 142: 255, # None - 143: 255, # None - 144: 255, # None - 145: 255, # '‘' - 146: 255, # '’' - 147: 255, # '“' - 148: 255, # '”' - 149: 255, # '•' - 150: 255, # '–' - 151: 255, # '—' - 152: 255, # None - 153: 255, # '™' - 154: 255, # None - 155: 255, # '›' - 156: 255, # None - 157: 255, # None - 158: 255, # None - 159: 255, # None - 160: 253, # '\xa0' - 161: 233, # '΅' - 162: 61, # 'Ά' - 163: 253, # '£' - 164: 253, # '¤' - 165: 253, # '¥' - 166: 253, # '¦' - 167: 253, # '§' - 168: 253, # '¨' - 169: 253, # '©' - 170: 253, # None - 171: 253, # '«' - 172: 253, # '¬' - 173: 74, # '\xad' - 174: 253, # '®' - 175: 253, # '―' - 176: 253, # '°' - 177: 253, # '±' - 178: 253, # '²' - 179: 253, # '³' - 180: 247, # '΄' - 181: 253, # 'µ' - 182: 253, # '¶' - 183: 36, # '·' - 184: 46, # 'Έ' - 185: 71, # 'Ή' - 186: 73, # 'Ί' - 187: 253, # '»' - 188: 54, # 'Ό' - 189: 253, # '½' - 190: 108, # 'Ύ' - 191: 123, # 'Ώ' - 192: 110, # 'ΐ' - 193: 31, # 'Α' - 194: 51, # 'Β' - 195: 43, # 'Γ' - 196: 41, # 'Δ' - 197: 34, # 'Ε' - 198: 91, # 'Ζ' - 199: 40, # 'Η' - 200: 52, # 'Θ' - 201: 47, # 'Ι' - 202: 44, # 'Κ' - 203: 53, # 'Λ' - 204: 38, # 'Μ' - 205: 49, # 'Ν' - 206: 59, # 'Ξ' - 207: 39, # 'Ο' - 208: 35, # 'Π' - 209: 48, # 'Ρ' - 210: 250, # None - 211: 37, # 'Σ' - 212: 33, # 'Τ' - 213: 45, # 'Υ' - 214: 56, # 'Φ' - 215: 50, # 'Χ' - 216: 84, # 'Ψ' - 217: 57, # 'Ω' - 218: 120, # 'Ϊ' - 219: 121, # 'Ϋ' - 220: 17, # 'ά' - 221: 18, # 'έ' - 222: 22, # 'ή' - 223: 15, # 'ί' - 224: 124, # 'ΰ' - 225: 1, # 'α' - 226: 29, # 'β' - 227: 20, # 'γ' - 228: 21, # 'δ' - 229: 3, # 'ε' - 230: 32, # 'ζ' - 231: 13, # 'η' - 232: 25, # 'θ' - 233: 5, # 'ι' - 234: 11, # 'κ' - 235: 16, # 'λ' - 236: 10, # 'μ' - 237: 6, # 'ν' - 238: 30, # 'ξ' - 239: 4, # 'ο' - 240: 9, # 'π' - 241: 8, # 'ρ' - 242: 14, # 'ς' - 243: 7, # 'σ' - 244: 2, # 'τ' - 245: 12, # 'υ' - 246: 28, # 'φ' - 247: 23, # 'χ' - 248: 42, # 'ψ' - 249: 24, # 'ω' - 250: 64, # 'ϊ' - 251: 75, # 'ϋ' - 252: 19, # 'ό' - 253: 26, # 'ύ' - 254: 27, # 'ώ' - 255: 253, # None -} - -WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel( - charset_name="windows-1253", - language="Greek", - char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER, - language_model=GREEK_LANG_MODEL, - typical_positive_ratio=0.982851, - keep_ascii_letters=False, - alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", -) - -ISO_8859_7_GREEK_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 82, # 'A' - 66: 100, # 'B' - 67: 104, # 'C' - 68: 94, # 'D' - 69: 98, # 'E' - 70: 101, # 'F' - 71: 116, # 'G' - 72: 102, # 'H' - 73: 111, # 'I' - 74: 187, # 'J' - 75: 117, # 'K' - 76: 92, # 'L' - 77: 88, # 'M' - 78: 113, # 'N' - 79: 85, # 'O' - 80: 79, # 'P' - 81: 118, # 'Q' - 82: 105, # 'R' - 83: 83, # 'S' - 84: 67, # 'T' - 85: 114, # 'U' - 86: 119, # 'V' - 87: 95, # 'W' - 88: 99, # 'X' - 89: 109, # 'Y' - 90: 188, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 72, # 'a' - 98: 70, # 'b' - 99: 80, # 'c' - 100: 81, # 'd' - 101: 60, # 'e' - 102: 96, # 'f' - 103: 93, # 'g' - 104: 89, # 'h' - 105: 68, # 'i' - 106: 120, # 'j' - 107: 97, # 'k' - 108: 77, # 'l' - 109: 86, # 'm' - 110: 69, # 'n' - 111: 55, # 'o' - 112: 78, # 'p' - 113: 115, # 'q' - 114: 65, # 'r' - 115: 66, # 's' - 116: 58, # 't' - 117: 76, # 'u' - 118: 106, # 'v' - 119: 103, # 'w' - 120: 87, # 'x' - 121: 107, # 'y' - 122: 112, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 255, # '\x80' - 129: 255, # '\x81' - 130: 255, # '\x82' - 131: 255, # '\x83' - 132: 255, # '\x84' - 133: 255, # '\x85' - 134: 255, # '\x86' - 135: 255, # '\x87' - 136: 255, # '\x88' - 137: 255, # '\x89' - 138: 255, # '\x8a' - 139: 255, # '\x8b' - 140: 255, # '\x8c' - 141: 255, # '\x8d' - 142: 255, # '\x8e' - 143: 255, # '\x8f' - 144: 255, # '\x90' - 145: 255, # '\x91' - 146: 255, # '\x92' - 147: 255, # '\x93' - 148: 255, # '\x94' - 149: 255, # '\x95' - 150: 255, # '\x96' - 151: 255, # '\x97' - 152: 255, # '\x98' - 153: 255, # '\x99' - 154: 255, # '\x9a' - 155: 255, # '\x9b' - 156: 255, # '\x9c' - 157: 255, # '\x9d' - 158: 255, # '\x9e' - 159: 255, # '\x9f' - 160: 253, # '\xa0' - 161: 233, # '‘' - 162: 90, # '’' - 163: 253, # '£' - 164: 253, # '€' - 165: 253, # '₯' - 166: 253, # '¦' - 167: 253, # '§' - 168: 253, # '¨' - 169: 253, # '©' - 170: 253, # 'ͺ' - 171: 253, # '«' - 172: 253, # '¬' - 173: 74, # '\xad' - 174: 253, # None - 175: 253, # '―' - 176: 253, # '°' - 177: 253, # '±' - 178: 253, # '²' - 179: 253, # '³' - 180: 247, # '΄' - 181: 248, # '΅' - 182: 61, # 'Ά' - 183: 36, # '·' - 184: 46, # 'Έ' - 185: 71, # 'Ή' - 186: 73, # 'Ί' - 187: 253, # '»' - 188: 54, # 'Ό' - 189: 253, # '½' - 190: 108, # 'Ύ' - 191: 123, # 'Ώ' - 192: 110, # 'ΐ' - 193: 31, # 'Α' - 194: 51, # 'Β' - 195: 43, # 'Γ' - 196: 41, # 'Δ' - 197: 34, # 'Ε' - 198: 91, # 'Ζ' - 199: 40, # 'Η' - 200: 52, # 'Θ' - 201: 47, # 'Ι' - 202: 44, # 'Κ' - 203: 53, # 'Λ' - 204: 38, # 'Μ' - 205: 49, # 'Ν' - 206: 59, # 'Ξ' - 207: 39, # 'Ο' - 208: 35, # 'Π' - 209: 48, # 'Ρ' - 210: 250, # None - 211: 37, # 'Σ' - 212: 33, # 'Τ' - 213: 45, # 'Υ' - 214: 56, # 'Φ' - 215: 50, # 'Χ' - 216: 84, # 'Ψ' - 217: 57, # 'Ω' - 218: 120, # 'Ϊ' - 219: 121, # 'Ϋ' - 220: 17, # 'ά' - 221: 18, # 'έ' - 222: 22, # 'ή' - 223: 15, # 'ί' - 224: 124, # 'ΰ' - 225: 1, # 'α' - 226: 29, # 'β' - 227: 20, # 'γ' - 228: 21, # 'δ' - 229: 3, # 'ε' - 230: 32, # 'ζ' - 231: 13, # 'η' - 232: 25, # 'θ' - 233: 5, # 'ι' - 234: 11, # 'κ' - 235: 16, # 'λ' - 236: 10, # 'μ' - 237: 6, # 'ν' - 238: 30, # 'ξ' - 239: 4, # 'ο' - 240: 9, # 'π' - 241: 8, # 'ρ' - 242: 14, # 'ς' - 243: 7, # 'σ' - 244: 2, # 'τ' - 245: 12, # 'υ' - 246: 28, # 'φ' - 247: 23, # 'χ' - 248: 42, # 'ψ' - 249: 24, # 'ω' - 250: 64, # 'ϊ' - 251: 75, # 'ϋ' - 252: 19, # 'ό' - 253: 26, # 'ύ' - 254: 27, # 'ώ' - 255: 253, # None -} - -ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-7", - language="Greek", - char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER, - language_model=GREEK_LANG_MODEL, - typical_positive_ratio=0.982851, - keep_ascii_letters=False, - alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", -) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py deleted file mode 100644 index 56d29758..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py +++ /dev/null @@ -1,4380 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -HEBREW_LANG_MODEL = { - 50: { # 'a' - 50: 0, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 2, # 'l' - 54: 2, # 'n' - 49: 0, # 'o' - 51: 2, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 1, # 'ק' - 7: 0, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 60: { # 'c' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 61: { # 'd' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 0, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 42: { # 'e' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 2, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 2, # 'l' - 54: 2, # 'n' - 49: 1, # 'o' - 51: 2, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 1, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 53: { # 'i' - 50: 1, # 'a' - 60: 2, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 0, # 'i' - 56: 1, # 'l' - 54: 2, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 56: { # 'l' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 2, # 'e' - 53: 2, # 'i' - 56: 2, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 54: { # 'n' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 49: { # 'o' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 2, # 'n' - 49: 1, # 'o' - 51: 2, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 51: { # 'r' - 50: 2, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 2, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 43: { # 's' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 2, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 2, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 44: { # 't' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 2, # 'e' - 53: 2, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 63: { # 'u' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 34: { # '\xa0' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 1, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 2, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 55: { # '´' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 2, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 1, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 48: { # '¼' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 39: { # '½' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 57: { # '¾' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 30: { # 'ְ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 2, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 1, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 2, # 'ע' - 26: 0, # 'ף' - 18: 2, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 59: { # 'ֱ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 1, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 0, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 41: { # 'ֲ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 0, # 'ם' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 33: { # 'ִ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 1, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 0, # 'ַ' - 29: 1, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 2, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 37: { # 'ֵ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 1, # 'ַ' - 29: 1, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 1, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 36: { # 'ֶ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 1, # 'ַ' - 29: 1, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 1, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 2, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 31: { # 'ַ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 1, # 'ֶ' - 31: 0, # 'ַ' - 29: 2, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 2, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 29: { # 'ָ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 1, # 'ַ' - 29: 2, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 2, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 35: { # 'ֹ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 2, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 2, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 62: { # 'ֻ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 2, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 1, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 28: { # 'ּ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 3, # 'ְ' - 59: 0, # 'ֱ' - 41: 1, # 'ֲ' - 33: 3, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 3, # 'ַ' - 29: 3, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 2, # 'ׁ' - 45: 1, # 'ׂ' - 9: 2, # 'א' - 8: 2, # 'ב' - 20: 1, # 'ג' - 16: 2, # 'ד' - 3: 1, # 'ה' - 2: 2, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 2, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 2, # 'ל' - 11: 1, # 'ם' - 6: 2, # 'מ' - 23: 1, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 38: { # 'ׁ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 2, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 45: { # 'ׂ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 2, # 'ֶ' - 31: 1, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 2, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 9: { # 'א' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 2, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 2, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 8: { # 'ב' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 3, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 1, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 20: { # 'ג' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 2, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 1, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 0, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 16: { # 'ד' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 1, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 3: { # 'ה' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 1, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 3, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 0, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 2: { # 'ו' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 3, # 'ֹ' - 62: 0, # 'ֻ' - 28: 3, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 3, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 24: { # 'ז' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 1, # 'ֲ' - 33: 1, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 2, # 'ב' - 20: 2, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 2, # 'ח' - 22: 1, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 2, # 'נ' - 19: 1, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 1, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 14: { # 'ח' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 1, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 2, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 1, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 22: { # 'ט' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 1, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 1, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 3, # 'ר' - 10: 2, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 1: { # 'י' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 3, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 25: { # 'ך' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 2, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 1, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 15: { # 'כ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 3, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 2, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 2, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 4: { # 'ל' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 3, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 11: { # 'ם' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 1, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 6: { # 'מ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 0, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 23: { # 'ן' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 1, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 12: { # 'נ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 19: { # 'ס' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 1, # 'ָ' - 35: 1, # 'ֹ' - 62: 2, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 1, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 3, # 'ף' - 18: 3, # 'פ' - 27: 0, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 1, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 13: { # 'ע' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 1, # 'ֱ' - 41: 2, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 1, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 2, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 2, # 'ע' - 26: 1, # 'ף' - 18: 2, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 26: { # 'ף' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 1, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 18: { # 'פ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 1, # 'ֵ' - 36: 2, # 'ֶ' - 31: 1, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 2, # 'ב' - 20: 3, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 2, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 2, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 27: { # 'ץ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 1, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 21: { # 'צ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 1, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 1, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 0, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 17: { # 'ק' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 1, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 2, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 1, # 'ך' - 15: 1, # 'כ' - 4: 3, # 'ל' - 11: 2, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 2, # 'ץ' - 21: 3, # 'צ' - 17: 2, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 7: { # 'ר' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 2, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 1, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 2, # 'ֹ' - 62: 1, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 3, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 3, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 3, # 'ץ' - 21: 3, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 10: { # 'ש' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 1, # 'ִ' - 37: 1, # 'ֵ' - 36: 1, # 'ֶ' - 31: 1, # 'ַ' - 29: 1, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 3, # 'ׁ' - 45: 2, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 3, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 3, # 'ט' - 1: 3, # 'י' - 25: 3, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 1, # '…' - }, - 5: { # 'ת' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 1, # '½' - 57: 0, # '¾' - 30: 2, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 2, # 'ִ' - 37: 2, # 'ֵ' - 36: 2, # 'ֶ' - 31: 2, # 'ַ' - 29: 2, # 'ָ' - 35: 1, # 'ֹ' - 62: 1, # 'ֻ' - 28: 2, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 3, # 'א' - 8: 3, # 'ב' - 20: 3, # 'ג' - 16: 2, # 'ד' - 3: 3, # 'ה' - 2: 3, # 'ו' - 24: 2, # 'ז' - 14: 3, # 'ח' - 22: 2, # 'ט' - 1: 3, # 'י' - 25: 2, # 'ך' - 15: 3, # 'כ' - 4: 3, # 'ל' - 11: 3, # 'ם' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # 'נ' - 19: 2, # 'ס' - 13: 3, # 'ע' - 26: 2, # 'ף' - 18: 3, # 'פ' - 27: 1, # 'ץ' - 21: 2, # 'צ' - 17: 3, # 'ק' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, - 32: { # '–' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 1, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 52: { # '’' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 1, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 47: { # '“' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 2, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 1, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 1, # 'ח' - 22: 1, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 1, # 'ס' - 13: 1, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 1, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 46: { # '”' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 1, # 'ב' - 20: 1, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 1, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 0, # '†' - 40: 0, # '…' - }, - 58: { # '†' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 0, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 0, # 'ה' - 2: 0, # 'ו' - 24: 0, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 0, # 'י' - 25: 0, # 'ך' - 15: 0, # 'כ' - 4: 0, # 'ל' - 11: 0, # 'ם' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 0, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # '”' - 58: 2, # '†' - 40: 0, # '…' - }, - 40: { # '…' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'ְ' - 59: 0, # 'ֱ' - 41: 0, # 'ֲ' - 33: 0, # 'ִ' - 37: 0, # 'ֵ' - 36: 0, # 'ֶ' - 31: 0, # 'ַ' - 29: 0, # 'ָ' - 35: 0, # 'ֹ' - 62: 0, # 'ֻ' - 28: 0, # 'ּ' - 38: 0, # 'ׁ' - 45: 0, # 'ׂ' - 9: 1, # 'א' - 8: 0, # 'ב' - 20: 0, # 'ג' - 16: 0, # 'ד' - 3: 1, # 'ה' - 2: 1, # 'ו' - 24: 1, # 'ז' - 14: 0, # 'ח' - 22: 0, # 'ט' - 1: 1, # 'י' - 25: 0, # 'ך' - 15: 1, # 'כ' - 4: 1, # 'ל' - 11: 0, # 'ם' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # 'נ' - 19: 0, # 'ס' - 13: 0, # 'ע' - 26: 0, # 'ף' - 18: 1, # 'פ' - 27: 0, # 'ץ' - 21: 0, # 'צ' - 17: 0, # 'ק' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # '”' - 58: 0, # '†' - 40: 2, # '…' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -WINDOWS_1255_HEBREW_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 69, # 'A' - 66: 91, # 'B' - 67: 79, # 'C' - 68: 80, # 'D' - 69: 92, # 'E' - 70: 89, # 'F' - 71: 97, # 'G' - 72: 90, # 'H' - 73: 68, # 'I' - 74: 111, # 'J' - 75: 112, # 'K' - 76: 82, # 'L' - 77: 73, # 'M' - 78: 95, # 'N' - 79: 85, # 'O' - 80: 78, # 'P' - 81: 121, # 'Q' - 82: 86, # 'R' - 83: 71, # 'S' - 84: 67, # 'T' - 85: 102, # 'U' - 86: 107, # 'V' - 87: 84, # 'W' - 88: 114, # 'X' - 89: 103, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 50, # 'a' - 98: 74, # 'b' - 99: 60, # 'c' - 100: 61, # 'd' - 101: 42, # 'e' - 102: 76, # 'f' - 103: 70, # 'g' - 104: 64, # 'h' - 105: 53, # 'i' - 106: 105, # 'j' - 107: 93, # 'k' - 108: 56, # 'l' - 109: 65, # 'm' - 110: 54, # 'n' - 111: 49, # 'o' - 112: 66, # 'p' - 113: 110, # 'q' - 114: 51, # 'r' - 115: 43, # 's' - 116: 44, # 't' - 117: 63, # 'u' - 118: 81, # 'v' - 119: 77, # 'w' - 120: 98, # 'x' - 121: 75, # 'y' - 122: 108, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 124, # '€' - 129: 202, # None - 130: 203, # '‚' - 131: 204, # 'ƒ' - 132: 205, # '„' - 133: 40, # '…' - 134: 58, # '†' - 135: 206, # '‡' - 136: 207, # 'ˆ' - 137: 208, # '‰' - 138: 209, # None - 139: 210, # '‹' - 140: 211, # None - 141: 212, # None - 142: 213, # None - 143: 214, # None - 144: 215, # None - 145: 83, # '‘' - 146: 52, # '’' - 147: 47, # '“' - 148: 46, # '”' - 149: 72, # '•' - 150: 32, # '–' - 151: 94, # '—' - 152: 216, # '˜' - 153: 113, # '™' - 154: 217, # None - 155: 109, # '›' - 156: 218, # None - 157: 219, # None - 158: 220, # None - 159: 221, # None - 160: 34, # '\xa0' - 161: 116, # '¡' - 162: 222, # '¢' - 163: 118, # '£' - 164: 100, # '₪' - 165: 223, # '¥' - 166: 224, # '¦' - 167: 117, # '§' - 168: 119, # '¨' - 169: 104, # '©' - 170: 125, # '×' - 171: 225, # '«' - 172: 226, # '¬' - 173: 87, # '\xad' - 174: 99, # '®' - 175: 227, # '¯' - 176: 106, # '°' - 177: 122, # '±' - 178: 123, # '²' - 179: 228, # '³' - 180: 55, # '´' - 181: 229, # 'µ' - 182: 230, # '¶' - 183: 101, # '·' - 184: 231, # '¸' - 185: 232, # '¹' - 186: 120, # '÷' - 187: 233, # '»' - 188: 48, # '¼' - 189: 39, # '½' - 190: 57, # '¾' - 191: 234, # '¿' - 192: 30, # 'ְ' - 193: 59, # 'ֱ' - 194: 41, # 'ֲ' - 195: 88, # 'ֳ' - 196: 33, # 'ִ' - 197: 37, # 'ֵ' - 198: 36, # 'ֶ' - 199: 31, # 'ַ' - 200: 29, # 'ָ' - 201: 35, # 'ֹ' - 202: 235, # None - 203: 62, # 'ֻ' - 204: 28, # 'ּ' - 205: 236, # 'ֽ' - 206: 126, # '־' - 207: 237, # 'ֿ' - 208: 238, # '׀' - 209: 38, # 'ׁ' - 210: 45, # 'ׂ' - 211: 239, # '׃' - 212: 240, # 'װ' - 213: 241, # 'ױ' - 214: 242, # 'ײ' - 215: 243, # '׳' - 216: 127, # '״' - 217: 244, # None - 218: 245, # None - 219: 246, # None - 220: 247, # None - 221: 248, # None - 222: 249, # None - 223: 250, # None - 224: 9, # 'א' - 225: 8, # 'ב' - 226: 20, # 'ג' - 227: 16, # 'ד' - 228: 3, # 'ה' - 229: 2, # 'ו' - 230: 24, # 'ז' - 231: 14, # 'ח' - 232: 22, # 'ט' - 233: 1, # 'י' - 234: 25, # 'ך' - 235: 15, # 'כ' - 236: 4, # 'ל' - 237: 11, # 'ם' - 238: 6, # 'מ' - 239: 23, # 'ן' - 240: 12, # 'נ' - 241: 19, # 'ס' - 242: 13, # 'ע' - 243: 26, # 'ף' - 244: 18, # 'פ' - 245: 27, # 'ץ' - 246: 21, # 'צ' - 247: 17, # 'ק' - 248: 7, # 'ר' - 249: 10, # 'ש' - 250: 5, # 'ת' - 251: 251, # None - 252: 252, # None - 253: 128, # '\u200e' - 254: 96, # '\u200f' - 255: 253, # None -} - -WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel( - charset_name="windows-1255", - language="Hebrew", - char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER, - language_model=HEBREW_LANG_MODEL, - typical_positive_ratio=0.984004, - keep_ascii_letters=False, - alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ", -) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py deleted file mode 100644 index 09a0d326..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py +++ /dev/null @@ -1,4649 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -HUNGARIAN_LANG_MODEL = { - 28: { # 'A' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 2, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 2, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 2, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 1, # 'Á' - 44: 0, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 40: { # 'B' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 3, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 54: { # 'C' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 3, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 45: { # 'D' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 32: { # 'E' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 2, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 50: { # 'F' - 28: 1, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 0, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 49: { # 'G' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 2, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 38: { # 'H' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 0, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 1, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 2, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 2, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 39: { # 'I' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 2, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 53: { # 'J' - 28: 2, # 'A' - 40: 0, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 0, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 36: { # 'K' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 2, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 41: { # 'L' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 34: { # 'M' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 3, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 1, # 'ű' - }, - 35: { # 'N' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 2, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 2, # 'Y' - 52: 1, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 47: { # 'O' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 2, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 1, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 46: { # 'P' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 3, # 'á' - 15: 2, # 'é' - 30: 0, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 0, # 'ű' - }, - 43: { # 'R' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 2, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 2, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 33: { # 'S' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 3, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 1, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 37: { # 'T' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 2, # 'Á' - 44: 2, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 57: { # 'U' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 48: { # 'V' - 28: 2, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 2, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 55: { # 'Y' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 2, # 'Z' - 2: 1, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 52: { # 'Z' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 1, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 2, # 'Á' - 44: 1, # 'É' - 61: 1, # 'Í' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 2: { # 'a' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 18: { # 'b' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 26: { # 'c' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 1, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 2, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 2, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 17: { # 'd' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 2, # 'k' - 6: 1, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 1: { # 'e' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 2, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 27: { # 'f' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 3, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 3, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 12: { # 'g' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 20: { # 'h' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 9: { # 'i' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 3, # 'ó' - 24: 1, # 'ö' - 31: 2, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 1, # 'ű' - }, - 22: { # 'j' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 1, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 1, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 7: { # 'k' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 1, # 'ú' - 29: 3, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 6: { # 'l' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 3, # 'ő' - 56: 1, # 'ű' - }, - 13: { # 'm' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 1, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 3, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 2, # 'ű' - }, - 4: { # 'n' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 1, # 'x' - 16: 3, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 8: { # 'o' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 23: { # 'p' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 10: { # 'r' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 2, # 'ű' - }, - 5: { # 's' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 3: { # 't' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 1, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 3, # 'ő' - 56: 2, # 'ű' - }, - 21: { # 'u' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 2, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 1, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 1, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 19: { # 'v' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 2, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 1, # 'ű' - }, - 62: { # 'x' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 16: { # 'y' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'ő' - 56: 2, # 'ű' - }, - 11: { # 'z' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'ő' - 56: 1, # 'ű' - }, - 51: { # 'Á' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 1, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 44: { # 'É' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 61: { # 'Í' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 0, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 58: { # 'Ó' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 2, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 1, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 59: { # 'Ö' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 60: { # 'Ú' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 2, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 63: { # 'Ü' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 14: { # 'á' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 15: { # 'é' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 30: { # 'í' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 25: { # 'ó' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 1, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 24: { # 'ö' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 0, # 'a' - 18: 3, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 31: { # 'ú' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 3, # 'j' - 7: 1, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 29: { # 'ü' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 0, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 42: { # 'ő' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, - 56: { # 'ű' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Á' - 44: 0, # 'É' - 61: 0, # 'Í' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'ő' - 56: 0, # 'ű' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 28, # 'A' - 66: 40, # 'B' - 67: 54, # 'C' - 68: 45, # 'D' - 69: 32, # 'E' - 70: 50, # 'F' - 71: 49, # 'G' - 72: 38, # 'H' - 73: 39, # 'I' - 74: 53, # 'J' - 75: 36, # 'K' - 76: 41, # 'L' - 77: 34, # 'M' - 78: 35, # 'N' - 79: 47, # 'O' - 80: 46, # 'P' - 81: 72, # 'Q' - 82: 43, # 'R' - 83: 33, # 'S' - 84: 37, # 'T' - 85: 57, # 'U' - 86: 48, # 'V' - 87: 64, # 'W' - 88: 68, # 'X' - 89: 55, # 'Y' - 90: 52, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 2, # 'a' - 98: 18, # 'b' - 99: 26, # 'c' - 100: 17, # 'd' - 101: 1, # 'e' - 102: 27, # 'f' - 103: 12, # 'g' - 104: 20, # 'h' - 105: 9, # 'i' - 106: 22, # 'j' - 107: 7, # 'k' - 108: 6, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 8, # 'o' - 112: 23, # 'p' - 113: 67, # 'q' - 114: 10, # 'r' - 115: 5, # 's' - 116: 3, # 't' - 117: 21, # 'u' - 118: 19, # 'v' - 119: 65, # 'w' - 120: 62, # 'x' - 121: 16, # 'y' - 122: 11, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 161, # '€' - 129: 162, # None - 130: 163, # '‚' - 131: 164, # None - 132: 165, # '„' - 133: 166, # '…' - 134: 167, # '†' - 135: 168, # '‡' - 136: 169, # None - 137: 170, # '‰' - 138: 171, # 'Š' - 139: 172, # '‹' - 140: 173, # 'Ś' - 141: 174, # 'Ť' - 142: 175, # 'Ž' - 143: 176, # 'Ź' - 144: 177, # None - 145: 178, # '‘' - 146: 179, # '’' - 147: 180, # '“' - 148: 78, # '”' - 149: 181, # '•' - 150: 69, # '–' - 151: 182, # '—' - 152: 183, # None - 153: 184, # '™' - 154: 185, # 'š' - 155: 186, # '›' - 156: 187, # 'ś' - 157: 188, # 'ť' - 158: 189, # 'ž' - 159: 190, # 'ź' - 160: 191, # '\xa0' - 161: 192, # 'ˇ' - 162: 193, # '˘' - 163: 194, # 'Ł' - 164: 195, # '¤' - 165: 196, # 'Ą' - 166: 197, # '¦' - 167: 76, # '§' - 168: 198, # '¨' - 169: 199, # '©' - 170: 200, # 'Ş' - 171: 201, # '«' - 172: 202, # '¬' - 173: 203, # '\xad' - 174: 204, # '®' - 175: 205, # 'Ż' - 176: 81, # '°' - 177: 206, # '±' - 178: 207, # '˛' - 179: 208, # 'ł' - 180: 209, # '´' - 181: 210, # 'µ' - 182: 211, # '¶' - 183: 212, # '·' - 184: 213, # '¸' - 185: 214, # 'ą' - 186: 215, # 'ş' - 187: 216, # '»' - 188: 217, # 'Ľ' - 189: 218, # '˝' - 190: 219, # 'ľ' - 191: 220, # 'ż' - 192: 221, # 'Ŕ' - 193: 51, # 'Á' - 194: 83, # 'Â' - 195: 222, # 'Ă' - 196: 80, # 'Ä' - 197: 223, # 'Ĺ' - 198: 224, # 'Ć' - 199: 225, # 'Ç' - 200: 226, # 'Č' - 201: 44, # 'É' - 202: 227, # 'Ę' - 203: 228, # 'Ë' - 204: 229, # 'Ě' - 205: 61, # 'Í' - 206: 230, # 'Î' - 207: 231, # 'Ď' - 208: 232, # 'Đ' - 209: 233, # 'Ń' - 210: 234, # 'Ň' - 211: 58, # 'Ó' - 212: 235, # 'Ô' - 213: 66, # 'Ő' - 214: 59, # 'Ö' - 215: 236, # '×' - 216: 237, # 'Ř' - 217: 238, # 'Ů' - 218: 60, # 'Ú' - 219: 70, # 'Ű' - 220: 63, # 'Ü' - 221: 239, # 'Ý' - 222: 240, # 'Ţ' - 223: 241, # 'ß' - 224: 84, # 'ŕ' - 225: 14, # 'á' - 226: 75, # 'â' - 227: 242, # 'ă' - 228: 71, # 'ä' - 229: 82, # 'ĺ' - 230: 243, # 'ć' - 231: 73, # 'ç' - 232: 244, # 'č' - 233: 15, # 'é' - 234: 85, # 'ę' - 235: 79, # 'ë' - 236: 86, # 'ě' - 237: 30, # 'í' - 238: 77, # 'î' - 239: 87, # 'ď' - 240: 245, # 'đ' - 241: 246, # 'ń' - 242: 247, # 'ň' - 243: 25, # 'ó' - 244: 74, # 'ô' - 245: 42, # 'ő' - 246: 24, # 'ö' - 247: 248, # '÷' - 248: 249, # 'ř' - 249: 250, # 'ů' - 250: 31, # 'ú' - 251: 56, # 'ű' - 252: 29, # 'ü' - 253: 251, # 'ý' - 254: 252, # 'ţ' - 255: 253, # '˙' -} - -WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel( - charset_name="windows-1250", - language="Hungarian", - char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER, - language_model=HUNGARIAN_LANG_MODEL, - typical_positive_ratio=0.947368, - keep_ascii_letters=True, - alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", -) - -ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 28, # 'A' - 66: 40, # 'B' - 67: 54, # 'C' - 68: 45, # 'D' - 69: 32, # 'E' - 70: 50, # 'F' - 71: 49, # 'G' - 72: 38, # 'H' - 73: 39, # 'I' - 74: 53, # 'J' - 75: 36, # 'K' - 76: 41, # 'L' - 77: 34, # 'M' - 78: 35, # 'N' - 79: 47, # 'O' - 80: 46, # 'P' - 81: 71, # 'Q' - 82: 43, # 'R' - 83: 33, # 'S' - 84: 37, # 'T' - 85: 57, # 'U' - 86: 48, # 'V' - 87: 64, # 'W' - 88: 68, # 'X' - 89: 55, # 'Y' - 90: 52, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 2, # 'a' - 98: 18, # 'b' - 99: 26, # 'c' - 100: 17, # 'd' - 101: 1, # 'e' - 102: 27, # 'f' - 103: 12, # 'g' - 104: 20, # 'h' - 105: 9, # 'i' - 106: 22, # 'j' - 107: 7, # 'k' - 108: 6, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 8, # 'o' - 112: 23, # 'p' - 113: 67, # 'q' - 114: 10, # 'r' - 115: 5, # 's' - 116: 3, # 't' - 117: 21, # 'u' - 118: 19, # 'v' - 119: 65, # 'w' - 120: 62, # 'x' - 121: 16, # 'y' - 122: 11, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 159, # '\x80' - 129: 160, # '\x81' - 130: 161, # '\x82' - 131: 162, # '\x83' - 132: 163, # '\x84' - 133: 164, # '\x85' - 134: 165, # '\x86' - 135: 166, # '\x87' - 136: 167, # '\x88' - 137: 168, # '\x89' - 138: 169, # '\x8a' - 139: 170, # '\x8b' - 140: 171, # '\x8c' - 141: 172, # '\x8d' - 142: 173, # '\x8e' - 143: 174, # '\x8f' - 144: 175, # '\x90' - 145: 176, # '\x91' - 146: 177, # '\x92' - 147: 178, # '\x93' - 148: 179, # '\x94' - 149: 180, # '\x95' - 150: 181, # '\x96' - 151: 182, # '\x97' - 152: 183, # '\x98' - 153: 184, # '\x99' - 154: 185, # '\x9a' - 155: 186, # '\x9b' - 156: 187, # '\x9c' - 157: 188, # '\x9d' - 158: 189, # '\x9e' - 159: 190, # '\x9f' - 160: 191, # '\xa0' - 161: 192, # 'Ą' - 162: 193, # '˘' - 163: 194, # 'Ł' - 164: 195, # '¤' - 165: 196, # 'Ľ' - 166: 197, # 'Ś' - 167: 75, # '§' - 168: 198, # '¨' - 169: 199, # 'Š' - 170: 200, # 'Ş' - 171: 201, # 'Ť' - 172: 202, # 'Ź' - 173: 203, # '\xad' - 174: 204, # 'Ž' - 175: 205, # 'Ż' - 176: 79, # '°' - 177: 206, # 'ą' - 178: 207, # '˛' - 179: 208, # 'ł' - 180: 209, # '´' - 181: 210, # 'ľ' - 182: 211, # 'ś' - 183: 212, # 'ˇ' - 184: 213, # '¸' - 185: 214, # 'š' - 186: 215, # 'ş' - 187: 216, # 'ť' - 188: 217, # 'ź' - 189: 218, # '˝' - 190: 219, # 'ž' - 191: 220, # 'ż' - 192: 221, # 'Ŕ' - 193: 51, # 'Á' - 194: 81, # 'Â' - 195: 222, # 'Ă' - 196: 78, # 'Ä' - 197: 223, # 'Ĺ' - 198: 224, # 'Ć' - 199: 225, # 'Ç' - 200: 226, # 'Č' - 201: 44, # 'É' - 202: 227, # 'Ę' - 203: 228, # 'Ë' - 204: 229, # 'Ě' - 205: 61, # 'Í' - 206: 230, # 'Î' - 207: 231, # 'Ď' - 208: 232, # 'Đ' - 209: 233, # 'Ń' - 210: 234, # 'Ň' - 211: 58, # 'Ó' - 212: 235, # 'Ô' - 213: 66, # 'Ő' - 214: 59, # 'Ö' - 215: 236, # '×' - 216: 237, # 'Ř' - 217: 238, # 'Ů' - 218: 60, # 'Ú' - 219: 69, # 'Ű' - 220: 63, # 'Ü' - 221: 239, # 'Ý' - 222: 240, # 'Ţ' - 223: 241, # 'ß' - 224: 82, # 'ŕ' - 225: 14, # 'á' - 226: 74, # 'â' - 227: 242, # 'ă' - 228: 70, # 'ä' - 229: 80, # 'ĺ' - 230: 243, # 'ć' - 231: 72, # 'ç' - 232: 244, # 'č' - 233: 15, # 'é' - 234: 83, # 'ę' - 235: 77, # 'ë' - 236: 84, # 'ě' - 237: 30, # 'í' - 238: 76, # 'î' - 239: 85, # 'ď' - 240: 245, # 'đ' - 241: 246, # 'ń' - 242: 247, # 'ň' - 243: 25, # 'ó' - 244: 73, # 'ô' - 245: 42, # 'ő' - 246: 24, # 'ö' - 247: 248, # '÷' - 248: 249, # 'ř' - 249: 250, # 'ů' - 250: 31, # 'ú' - 251: 56, # 'ű' - 252: 29, # 'ü' - 253: 251, # 'ý' - 254: 252, # 'ţ' - 255: 253, # '˙' -} - -ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-2", - language="Hungarian", - char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER, - language_model=HUNGARIAN_LANG_MODEL, - typical_positive_ratio=0.947368, - keep_ascii_letters=True, - alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", -) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py deleted file mode 100644 index 39a53889..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py +++ /dev/null @@ -1,5725 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -RUSSIAN_LANG_MODEL = { - 37: { # 'А' - 37: 0, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 44: { # 'Б' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 2, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 33: { # 'В' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 0, # 'ю' - 16: 1, # 'я' - }, - 46: { # 'Г' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 41: { # 'Д' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 3, # 'ж' - 20: 1, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 48: { # 'Е' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 2, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 1, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'р' - 7: 3, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 56: { # 'Ж' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 1, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 2, # 'ю' - 16: 0, # 'я' - }, - 51: { # 'З' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 1, # 'я' - }, - 42: { # 'И' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 2, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 60: { # 'Й' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 36: { # 'К' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 2, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 49: { # 'Л' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 0, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 2, # 'ю' - 16: 1, # 'я' - }, - 38: { # 'М' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 1, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 31: { # 'Н' - 37: 2, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 2, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 34: { # 'О' - 37: 0, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 2, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 2, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 35: { # 'П' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 1, # 'с' - 6: 1, # 'т' - 14: 2, # 'у' - 39: 1, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 2, # 'я' - }, - 45: { # 'Р' - 37: 2, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 2, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 2, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 2, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 2, # 'я' - }, - 32: { # 'С' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 2, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 40: { # 'Т' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 2, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 52: { # 'У' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 1, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 1, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 0, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 53: { # 'Ф' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 1, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 55: { # 'Х' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 58: { # 'Ц' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 50: { # 'Ч' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 57: { # 'Ш' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 63: { # 'Щ' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 62: { # 'Ы' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 61: { # 'Ь' - 37: 0, # 'А' - 44: 1, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 47: { # 'Э' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 59: { # 'Ю' - 37: 1, # 'А' - 44: 1, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 43: { # 'Я' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 1, # 'В' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Х' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 1, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'р' - 7: 1, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 3: { # 'а' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 21: { # 'б' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 2, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 10: { # 'в' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 19: { # 'г' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 13: { # 'д' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 3, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 2: { # 'е' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 24: { # 'ж' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 1, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 0, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 20: { # 'з' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 4: { # 'и' - 37: 1, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 23: { # 'й' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 2, # 'я' - }, - 11: { # 'к' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 3, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 1, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 8: { # 'л' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 3, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 1, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 1, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 12: { # 'м' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 5: { # 'н' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 2, # 'щ' - 54: 1, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 1: { # 'о' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 15: { # 'п' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 0, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 2, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 3, # 'я' - }, - 9: { # 'р' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 2, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 7: { # 'с' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 6: { # 'т' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 2, # 'щ' - 54: 2, # 'ъ' - 18: 3, # 'ы' - 17: 3, # 'ь' - 30: 2, # 'э' - 27: 2, # 'ю' - 16: 3, # 'я' - }, - 14: { # 'у' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 2, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 2, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 2, # 'э' - 27: 3, # 'ю' - 16: 2, # 'я' - }, - 39: { # 'ф' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 2, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 2, # 'ы' - 17: 1, # 'ь' - 30: 2, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 26: { # 'х' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 3, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 3, # 'р' - 7: 2, # 'с' - 6: 2, # 'т' - 14: 2, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ъ' - 18: 0, # 'ы' - 17: 1, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 28: { # 'ц' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'р' - 7: 0, # 'с' - 6: 1, # 'т' - 14: 3, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 1, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 3, # 'ы' - 17: 1, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 22: { # 'ч' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 3, # 'т' - 14: 3, # 'у' - 39: 1, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 3, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 25: { # 'ш' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 1, # 'с' - 6: 2, # 'т' - 14: 3, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 3, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 0, # 'я' - }, - 29: { # 'щ' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 2, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 2, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 2, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 0, # 'я' - }, - 54: { # 'ъ' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'р' - 7: 0, # 'с' - 6: 0, # 'т' - 14: 0, # 'у' - 39: 0, # 'ф' - 26: 0, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 1, # 'ю' - 16: 2, # 'я' - }, - 18: { # 'ы' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 1, # 'о' - 15: 3, # 'п' - 9: 3, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 0, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 0, # 'ю' - 16: 2, # 'я' - }, - 17: { # 'ь' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 0, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 1, # 'р' - 7: 3, # 'с' - 6: 2, # 'т' - 14: 0, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 3, # 'ю' - 16: 3, # 'я' - }, - 30: { # 'э' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 2, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 2, # 'ф' - 26: 1, # 'х' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 1, # 'ю' - 16: 1, # 'я' - }, - 27: { # 'ю' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 1, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 0, # 'у' - 39: 1, # 'ф' - 26: 2, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 1, # 'э' - 27: 2, # 'ю' - 16: 1, # 'я' - }, - 16: { # 'я' - 37: 0, # 'А' - 44: 0, # 'Б' - 33: 0, # 'В' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Н' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Х' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 2, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'р' - 7: 3, # 'с' - 6: 3, # 'т' - 14: 1, # 'у' - 39: 1, # 'ф' - 26: 3, # 'х' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ъ' - 18: 0, # 'ы' - 17: 0, # 'ь' - 30: 0, # 'э' - 27: 2, # 'ю' - 16: 2, # 'я' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -IBM866_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 37, # 'А' - 129: 44, # 'Б' - 130: 33, # 'В' - 131: 46, # 'Г' - 132: 41, # 'Д' - 133: 48, # 'Е' - 134: 56, # 'Ж' - 135: 51, # 'З' - 136: 42, # 'И' - 137: 60, # 'Й' - 138: 36, # 'К' - 139: 49, # 'Л' - 140: 38, # 'М' - 141: 31, # 'Н' - 142: 34, # 'О' - 143: 35, # 'П' - 144: 45, # 'Р' - 145: 32, # 'С' - 146: 40, # 'Т' - 147: 52, # 'У' - 148: 53, # 'Ф' - 149: 55, # 'Х' - 150: 58, # 'Ц' - 151: 50, # 'Ч' - 152: 57, # 'Ш' - 153: 63, # 'Щ' - 154: 70, # 'Ъ' - 155: 62, # 'Ы' - 156: 61, # 'Ь' - 157: 47, # 'Э' - 158: 59, # 'Ю' - 159: 43, # 'Я' - 160: 3, # 'а' - 161: 21, # 'б' - 162: 10, # 'в' - 163: 19, # 'г' - 164: 13, # 'д' - 165: 2, # 'е' - 166: 24, # 'ж' - 167: 20, # 'з' - 168: 4, # 'и' - 169: 23, # 'й' - 170: 11, # 'к' - 171: 8, # 'л' - 172: 12, # 'м' - 173: 5, # 'н' - 174: 1, # 'о' - 175: 15, # 'п' - 176: 191, # '░' - 177: 192, # '▒' - 178: 193, # '▓' - 179: 194, # '│' - 180: 195, # '┤' - 181: 196, # '╡' - 182: 197, # '╢' - 183: 198, # '╖' - 184: 199, # '╕' - 185: 200, # '╣' - 186: 201, # '║' - 187: 202, # '╗' - 188: 203, # '╝' - 189: 204, # '╜' - 190: 205, # '╛' - 191: 206, # '┐' - 192: 207, # '└' - 193: 208, # '┴' - 194: 209, # '┬' - 195: 210, # '├' - 196: 211, # '─' - 197: 212, # '┼' - 198: 213, # '╞' - 199: 214, # '╟' - 200: 215, # '╚' - 201: 216, # '╔' - 202: 217, # '╩' - 203: 218, # '╦' - 204: 219, # '╠' - 205: 220, # '═' - 206: 221, # '╬' - 207: 222, # '╧' - 208: 223, # '╨' - 209: 224, # '╤' - 210: 225, # '╥' - 211: 226, # '╙' - 212: 227, # '╘' - 213: 228, # '╒' - 214: 229, # '╓' - 215: 230, # '╫' - 216: 231, # '╪' - 217: 232, # '┘' - 218: 233, # '┌' - 219: 234, # '█' - 220: 235, # '▄' - 221: 236, # '▌' - 222: 237, # '▐' - 223: 238, # '▀' - 224: 9, # 'р' - 225: 7, # 'с' - 226: 6, # 'т' - 227: 14, # 'у' - 228: 39, # 'ф' - 229: 26, # 'х' - 230: 28, # 'ц' - 231: 22, # 'ч' - 232: 25, # 'ш' - 233: 29, # 'щ' - 234: 54, # 'ъ' - 235: 18, # 'ы' - 236: 17, # 'ь' - 237: 30, # 'э' - 238: 27, # 'ю' - 239: 16, # 'я' - 240: 239, # 'Ё' - 241: 68, # 'ё' - 242: 240, # 'Є' - 243: 241, # 'є' - 244: 242, # 'Ї' - 245: 243, # 'ї' - 246: 244, # 'Ў' - 247: 245, # 'ў' - 248: 246, # '°' - 249: 247, # '∙' - 250: 248, # '·' - 251: 249, # '√' - 252: 250, # '№' - 253: 251, # '¤' - 254: 252, # '■' - 255: 255, # '\xa0' -} - -IBM866_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="IBM866", - language="Russian", - char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # 'Ђ' - 129: 192, # 'Ѓ' - 130: 193, # '‚' - 131: 194, # 'ѓ' - 132: 195, # '„' - 133: 196, # '…' - 134: 197, # '†' - 135: 198, # '‡' - 136: 199, # '€' - 137: 200, # '‰' - 138: 201, # 'Љ' - 139: 202, # '‹' - 140: 203, # 'Њ' - 141: 204, # 'Ќ' - 142: 205, # 'Ћ' - 143: 206, # 'Џ' - 144: 207, # 'ђ' - 145: 208, # '‘' - 146: 209, # '’' - 147: 210, # '“' - 148: 211, # '”' - 149: 212, # '•' - 150: 213, # '–' - 151: 214, # '—' - 152: 215, # None - 153: 216, # '™' - 154: 217, # 'љ' - 155: 218, # '›' - 156: 219, # 'њ' - 157: 220, # 'ќ' - 158: 221, # 'ћ' - 159: 222, # 'џ' - 160: 223, # '\xa0' - 161: 224, # 'Ў' - 162: 225, # 'ў' - 163: 226, # 'Ј' - 164: 227, # '¤' - 165: 228, # 'Ґ' - 166: 229, # '¦' - 167: 230, # '§' - 168: 231, # 'Ё' - 169: 232, # '©' - 170: 233, # 'Є' - 171: 234, # '«' - 172: 235, # '¬' - 173: 236, # '\xad' - 174: 237, # '®' - 175: 238, # 'Ї' - 176: 239, # '°' - 177: 240, # '±' - 178: 241, # 'І' - 179: 242, # 'і' - 180: 243, # 'ґ' - 181: 244, # 'µ' - 182: 245, # '¶' - 183: 246, # '·' - 184: 68, # 'ё' - 185: 247, # '№' - 186: 248, # 'є' - 187: 249, # '»' - 188: 250, # 'ј' - 189: 251, # 'Ѕ' - 190: 252, # 'ѕ' - 191: 253, # 'ї' - 192: 37, # 'А' - 193: 44, # 'Б' - 194: 33, # 'В' - 195: 46, # 'Г' - 196: 41, # 'Д' - 197: 48, # 'Е' - 198: 56, # 'Ж' - 199: 51, # 'З' - 200: 42, # 'И' - 201: 60, # 'Й' - 202: 36, # 'К' - 203: 49, # 'Л' - 204: 38, # 'М' - 205: 31, # 'Н' - 206: 34, # 'О' - 207: 35, # 'П' - 208: 45, # 'Р' - 209: 32, # 'С' - 210: 40, # 'Т' - 211: 52, # 'У' - 212: 53, # 'Ф' - 213: 55, # 'Х' - 214: 58, # 'Ц' - 215: 50, # 'Ч' - 216: 57, # 'Ш' - 217: 63, # 'Щ' - 218: 70, # 'Ъ' - 219: 62, # 'Ы' - 220: 61, # 'Ь' - 221: 47, # 'Э' - 222: 59, # 'Ю' - 223: 43, # 'Я' - 224: 3, # 'а' - 225: 21, # 'б' - 226: 10, # 'в' - 227: 19, # 'г' - 228: 13, # 'д' - 229: 2, # 'е' - 230: 24, # 'ж' - 231: 20, # 'з' - 232: 4, # 'и' - 233: 23, # 'й' - 234: 11, # 'к' - 235: 8, # 'л' - 236: 12, # 'м' - 237: 5, # 'н' - 238: 1, # 'о' - 239: 15, # 'п' - 240: 9, # 'р' - 241: 7, # 'с' - 242: 6, # 'т' - 243: 14, # 'у' - 244: 39, # 'ф' - 245: 26, # 'х' - 246: 28, # 'ц' - 247: 22, # 'ч' - 248: 25, # 'ш' - 249: 29, # 'щ' - 250: 54, # 'ъ' - 251: 18, # 'ы' - 252: 17, # 'ь' - 253: 30, # 'э' - 254: 27, # 'ю' - 255: 16, # 'я' -} - -WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="windows-1251", - language="Russian", - char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -IBM855_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # 'ђ' - 129: 192, # 'Ђ' - 130: 193, # 'ѓ' - 131: 194, # 'Ѓ' - 132: 68, # 'ё' - 133: 195, # 'Ё' - 134: 196, # 'є' - 135: 197, # 'Є' - 136: 198, # 'ѕ' - 137: 199, # 'Ѕ' - 138: 200, # 'і' - 139: 201, # 'І' - 140: 202, # 'ї' - 141: 203, # 'Ї' - 142: 204, # 'ј' - 143: 205, # 'Ј' - 144: 206, # 'љ' - 145: 207, # 'Љ' - 146: 208, # 'њ' - 147: 209, # 'Њ' - 148: 210, # 'ћ' - 149: 211, # 'Ћ' - 150: 212, # 'ќ' - 151: 213, # 'Ќ' - 152: 214, # 'ў' - 153: 215, # 'Ў' - 154: 216, # 'џ' - 155: 217, # 'Џ' - 156: 27, # 'ю' - 157: 59, # 'Ю' - 158: 54, # 'ъ' - 159: 70, # 'Ъ' - 160: 3, # 'а' - 161: 37, # 'А' - 162: 21, # 'б' - 163: 44, # 'Б' - 164: 28, # 'ц' - 165: 58, # 'Ц' - 166: 13, # 'д' - 167: 41, # 'Д' - 168: 2, # 'е' - 169: 48, # 'Е' - 170: 39, # 'ф' - 171: 53, # 'Ф' - 172: 19, # 'г' - 173: 46, # 'Г' - 174: 218, # '«' - 175: 219, # '»' - 176: 220, # '░' - 177: 221, # '▒' - 178: 222, # '▓' - 179: 223, # '│' - 180: 224, # '┤' - 181: 26, # 'х' - 182: 55, # 'Х' - 183: 4, # 'и' - 184: 42, # 'И' - 185: 225, # '╣' - 186: 226, # '║' - 187: 227, # '╗' - 188: 228, # '╝' - 189: 23, # 'й' - 190: 60, # 'Й' - 191: 229, # '┐' - 192: 230, # '└' - 193: 231, # '┴' - 194: 232, # '┬' - 195: 233, # '├' - 196: 234, # '─' - 197: 235, # '┼' - 198: 11, # 'к' - 199: 36, # 'К' - 200: 236, # '╚' - 201: 237, # '╔' - 202: 238, # '╩' - 203: 239, # '╦' - 204: 240, # '╠' - 205: 241, # '═' - 206: 242, # '╬' - 207: 243, # '¤' - 208: 8, # 'л' - 209: 49, # 'Л' - 210: 12, # 'м' - 211: 38, # 'М' - 212: 5, # 'н' - 213: 31, # 'Н' - 214: 1, # 'о' - 215: 34, # 'О' - 216: 15, # 'п' - 217: 244, # '┘' - 218: 245, # '┌' - 219: 246, # '█' - 220: 247, # '▄' - 221: 35, # 'П' - 222: 16, # 'я' - 223: 248, # '▀' - 224: 43, # 'Я' - 225: 9, # 'р' - 226: 45, # 'Р' - 227: 7, # 'с' - 228: 32, # 'С' - 229: 6, # 'т' - 230: 40, # 'Т' - 231: 14, # 'у' - 232: 52, # 'У' - 233: 24, # 'ж' - 234: 56, # 'Ж' - 235: 10, # 'в' - 236: 33, # 'В' - 237: 17, # 'ь' - 238: 61, # 'Ь' - 239: 249, # '№' - 240: 250, # '\xad' - 241: 18, # 'ы' - 242: 62, # 'Ы' - 243: 20, # 'з' - 244: 51, # 'З' - 245: 25, # 'ш' - 246: 57, # 'Ш' - 247: 30, # 'э' - 248: 47, # 'Э' - 249: 29, # 'щ' - 250: 63, # 'Щ' - 251: 22, # 'ч' - 252: 50, # 'Ч' - 253: 251, # '§' - 254: 252, # '■' - 255: 255, # '\xa0' -} - -IBM855_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="IBM855", - language="Russian", - char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -KOI8_R_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # '─' - 129: 192, # '│' - 130: 193, # '┌' - 131: 194, # '┐' - 132: 195, # '└' - 133: 196, # '┘' - 134: 197, # '├' - 135: 198, # '┤' - 136: 199, # '┬' - 137: 200, # '┴' - 138: 201, # '┼' - 139: 202, # '▀' - 140: 203, # '▄' - 141: 204, # '█' - 142: 205, # '▌' - 143: 206, # '▐' - 144: 207, # '░' - 145: 208, # '▒' - 146: 209, # '▓' - 147: 210, # '⌠' - 148: 211, # '■' - 149: 212, # '∙' - 150: 213, # '√' - 151: 214, # '≈' - 152: 215, # '≤' - 153: 216, # '≥' - 154: 217, # '\xa0' - 155: 218, # '⌡' - 156: 219, # '°' - 157: 220, # '²' - 158: 221, # '·' - 159: 222, # '÷' - 160: 223, # '═' - 161: 224, # '║' - 162: 225, # '╒' - 163: 68, # 'ё' - 164: 226, # '╓' - 165: 227, # '╔' - 166: 228, # '╕' - 167: 229, # '╖' - 168: 230, # '╗' - 169: 231, # '╘' - 170: 232, # '╙' - 171: 233, # '╚' - 172: 234, # '╛' - 173: 235, # '╜' - 174: 236, # '╝' - 175: 237, # '╞' - 176: 238, # '╟' - 177: 239, # '╠' - 178: 240, # '╡' - 179: 241, # 'Ё' - 180: 242, # '╢' - 181: 243, # '╣' - 182: 244, # '╤' - 183: 245, # '╥' - 184: 246, # '╦' - 185: 247, # '╧' - 186: 248, # '╨' - 187: 249, # '╩' - 188: 250, # '╪' - 189: 251, # '╫' - 190: 252, # '╬' - 191: 253, # '©' - 192: 27, # 'ю' - 193: 3, # 'а' - 194: 21, # 'б' - 195: 28, # 'ц' - 196: 13, # 'д' - 197: 2, # 'е' - 198: 39, # 'ф' - 199: 19, # 'г' - 200: 26, # 'х' - 201: 4, # 'и' - 202: 23, # 'й' - 203: 11, # 'к' - 204: 8, # 'л' - 205: 12, # 'м' - 206: 5, # 'н' - 207: 1, # 'о' - 208: 15, # 'п' - 209: 16, # 'я' - 210: 9, # 'р' - 211: 7, # 'с' - 212: 6, # 'т' - 213: 14, # 'у' - 214: 24, # 'ж' - 215: 10, # 'в' - 216: 17, # 'ь' - 217: 18, # 'ы' - 218: 20, # 'з' - 219: 25, # 'ш' - 220: 30, # 'э' - 221: 29, # 'щ' - 222: 22, # 'ч' - 223: 54, # 'ъ' - 224: 59, # 'Ю' - 225: 37, # 'А' - 226: 44, # 'Б' - 227: 58, # 'Ц' - 228: 41, # 'Д' - 229: 48, # 'Е' - 230: 53, # 'Ф' - 231: 46, # 'Г' - 232: 55, # 'Х' - 233: 42, # 'И' - 234: 60, # 'Й' - 235: 36, # 'К' - 236: 49, # 'Л' - 237: 38, # 'М' - 238: 31, # 'Н' - 239: 34, # 'О' - 240: 35, # 'П' - 241: 43, # 'Я' - 242: 45, # 'Р' - 243: 32, # 'С' - 244: 40, # 'Т' - 245: 52, # 'У' - 246: 56, # 'Ж' - 247: 33, # 'В' - 248: 61, # 'Ь' - 249: 62, # 'Ы' - 250: 51, # 'З' - 251: 57, # 'Ш' - 252: 47, # 'Э' - 253: 63, # 'Щ' - 254: 50, # 'Ч' - 255: 70, # 'Ъ' -} - -KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="KOI8-R", - language="Russian", - char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 37, # 'А' - 129: 44, # 'Б' - 130: 33, # 'В' - 131: 46, # 'Г' - 132: 41, # 'Д' - 133: 48, # 'Е' - 134: 56, # 'Ж' - 135: 51, # 'З' - 136: 42, # 'И' - 137: 60, # 'Й' - 138: 36, # 'К' - 139: 49, # 'Л' - 140: 38, # 'М' - 141: 31, # 'Н' - 142: 34, # 'О' - 143: 35, # 'П' - 144: 45, # 'Р' - 145: 32, # 'С' - 146: 40, # 'Т' - 147: 52, # 'У' - 148: 53, # 'Ф' - 149: 55, # 'Х' - 150: 58, # 'Ц' - 151: 50, # 'Ч' - 152: 57, # 'Ш' - 153: 63, # 'Щ' - 154: 70, # 'Ъ' - 155: 62, # 'Ы' - 156: 61, # 'Ь' - 157: 47, # 'Э' - 158: 59, # 'Ю' - 159: 43, # 'Я' - 160: 191, # '†' - 161: 192, # '°' - 162: 193, # 'Ґ' - 163: 194, # '£' - 164: 195, # '§' - 165: 196, # '•' - 166: 197, # '¶' - 167: 198, # 'І' - 168: 199, # '®' - 169: 200, # '©' - 170: 201, # '™' - 171: 202, # 'Ђ' - 172: 203, # 'ђ' - 173: 204, # '≠' - 174: 205, # 'Ѓ' - 175: 206, # 'ѓ' - 176: 207, # '∞' - 177: 208, # '±' - 178: 209, # '≤' - 179: 210, # '≥' - 180: 211, # 'і' - 181: 212, # 'µ' - 182: 213, # 'ґ' - 183: 214, # 'Ј' - 184: 215, # 'Є' - 185: 216, # 'є' - 186: 217, # 'Ї' - 187: 218, # 'ї' - 188: 219, # 'Љ' - 189: 220, # 'љ' - 190: 221, # 'Њ' - 191: 222, # 'њ' - 192: 223, # 'ј' - 193: 224, # 'Ѕ' - 194: 225, # '¬' - 195: 226, # '√' - 196: 227, # 'ƒ' - 197: 228, # '≈' - 198: 229, # '∆' - 199: 230, # '«' - 200: 231, # '»' - 201: 232, # '…' - 202: 233, # '\xa0' - 203: 234, # 'Ћ' - 204: 235, # 'ћ' - 205: 236, # 'Ќ' - 206: 237, # 'ќ' - 207: 238, # 'ѕ' - 208: 239, # '–' - 209: 240, # '—' - 210: 241, # '“' - 211: 242, # '”' - 212: 243, # '‘' - 213: 244, # '’' - 214: 245, # '÷' - 215: 246, # '„' - 216: 247, # 'Ў' - 217: 248, # 'ў' - 218: 249, # 'Џ' - 219: 250, # 'џ' - 220: 251, # '№' - 221: 252, # 'Ё' - 222: 68, # 'ё' - 223: 16, # 'я' - 224: 3, # 'а' - 225: 21, # 'б' - 226: 10, # 'в' - 227: 19, # 'г' - 228: 13, # 'д' - 229: 2, # 'е' - 230: 24, # 'ж' - 231: 20, # 'з' - 232: 4, # 'и' - 233: 23, # 'й' - 234: 11, # 'к' - 235: 8, # 'л' - 236: 12, # 'м' - 237: 5, # 'н' - 238: 1, # 'о' - 239: 15, # 'п' - 240: 9, # 'р' - 241: 7, # 'с' - 242: 6, # 'т' - 243: 14, # 'у' - 244: 39, # 'ф' - 245: 26, # 'х' - 246: 28, # 'ц' - 247: 22, # 'ч' - 248: 25, # 'ш' - 249: 29, # 'щ' - 250: 54, # 'ъ' - 251: 18, # 'ы' - 252: 17, # 'ь' - 253: 30, # 'э' - 254: 27, # 'ю' - 255: 255, # '€' -} - -MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="MacCyrillic", - language="Russian", - char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) - -ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # '\x80' - 129: 192, # '\x81' - 130: 193, # '\x82' - 131: 194, # '\x83' - 132: 195, # '\x84' - 133: 196, # '\x85' - 134: 197, # '\x86' - 135: 198, # '\x87' - 136: 199, # '\x88' - 137: 200, # '\x89' - 138: 201, # '\x8a' - 139: 202, # '\x8b' - 140: 203, # '\x8c' - 141: 204, # '\x8d' - 142: 205, # '\x8e' - 143: 206, # '\x8f' - 144: 207, # '\x90' - 145: 208, # '\x91' - 146: 209, # '\x92' - 147: 210, # '\x93' - 148: 211, # '\x94' - 149: 212, # '\x95' - 150: 213, # '\x96' - 151: 214, # '\x97' - 152: 215, # '\x98' - 153: 216, # '\x99' - 154: 217, # '\x9a' - 155: 218, # '\x9b' - 156: 219, # '\x9c' - 157: 220, # '\x9d' - 158: 221, # '\x9e' - 159: 222, # '\x9f' - 160: 223, # '\xa0' - 161: 224, # 'Ё' - 162: 225, # 'Ђ' - 163: 226, # 'Ѓ' - 164: 227, # 'Є' - 165: 228, # 'Ѕ' - 166: 229, # 'І' - 167: 230, # 'Ї' - 168: 231, # 'Ј' - 169: 232, # 'Љ' - 170: 233, # 'Њ' - 171: 234, # 'Ћ' - 172: 235, # 'Ќ' - 173: 236, # '\xad' - 174: 237, # 'Ў' - 175: 238, # 'Џ' - 176: 37, # 'А' - 177: 44, # 'Б' - 178: 33, # 'В' - 179: 46, # 'Г' - 180: 41, # 'Д' - 181: 48, # 'Е' - 182: 56, # 'Ж' - 183: 51, # 'З' - 184: 42, # 'И' - 185: 60, # 'Й' - 186: 36, # 'К' - 187: 49, # 'Л' - 188: 38, # 'М' - 189: 31, # 'Н' - 190: 34, # 'О' - 191: 35, # 'П' - 192: 45, # 'Р' - 193: 32, # 'С' - 194: 40, # 'Т' - 195: 52, # 'У' - 196: 53, # 'Ф' - 197: 55, # 'Х' - 198: 58, # 'Ц' - 199: 50, # 'Ч' - 200: 57, # 'Ш' - 201: 63, # 'Щ' - 202: 70, # 'Ъ' - 203: 62, # 'Ы' - 204: 61, # 'Ь' - 205: 47, # 'Э' - 206: 59, # 'Ю' - 207: 43, # 'Я' - 208: 3, # 'а' - 209: 21, # 'б' - 210: 10, # 'в' - 211: 19, # 'г' - 212: 13, # 'д' - 213: 2, # 'е' - 214: 24, # 'ж' - 215: 20, # 'з' - 216: 4, # 'и' - 217: 23, # 'й' - 218: 11, # 'к' - 219: 8, # 'л' - 220: 12, # 'м' - 221: 5, # 'н' - 222: 1, # 'о' - 223: 15, # 'п' - 224: 9, # 'р' - 225: 7, # 'с' - 226: 6, # 'т' - 227: 14, # 'у' - 228: 39, # 'ф' - 229: 26, # 'х' - 230: 28, # 'ц' - 231: 22, # 'ч' - 232: 25, # 'ш' - 233: 29, # 'щ' - 234: 54, # 'ъ' - 235: 18, # 'ы' - 236: 17, # 'ь' - 237: 30, # 'э' - 238: 27, # 'ю' - 239: 16, # 'я' - 240: 239, # '№' - 241: 68, # 'ё' - 242: 240, # 'ђ' - 243: 241, # 'ѓ' - 244: 242, # 'є' - 245: 243, # 'ѕ' - 246: 244, # 'і' - 247: 245, # 'ї' - 248: 246, # 'ј' - 249: 247, # 'љ' - 250: 248, # 'њ' - 251: 249, # 'ћ' - 252: 250, # 'ќ' - 253: 251, # '§' - 254: 252, # 'ў' - 255: 255, # 'џ' -} - -ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-5", - language="Russian", - char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", -) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py deleted file mode 100644 index 489cad93..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py +++ /dev/null @@ -1,4380 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -THAI_LANG_MODEL = { - 5: { # 'ก' - 5: 2, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 3, # 'ฎ' - 57: 2, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 2, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 2, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 3, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 1, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 30: { # 'ข' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 0, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 2, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 2, # 'ี' - 40: 3, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 24: { # 'ค' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 2, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 3, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 8: { # 'ง' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 1, # 'ฉ' - 34: 2, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 2, # 'ศ' - 46: 1, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 3, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 26: { # 'จ' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 3, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 52: { # 'ฉ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 3, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 1, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 34: { # 'ช' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 1, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 51: { # 'ซ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 3, # 'ึ' - 27: 2, # 'ื' - 32: 1, # 'ุ' - 35: 1, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 1, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 47: { # 'ญ' - 5: 1, # 'ก' - 30: 1, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 3, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 2, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 58: { # 'ฎ' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 1, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 57: { # 'ฏ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 49: { # 'ฐ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 53: { # 'ฑ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 55: { # 'ฒ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 43: { # 'ณ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 3, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 3, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 3, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 20: { # 'ด' - 5: 2, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 2, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 1, # 'ึ' - 27: 2, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 2, # 'ๆ' - 37: 2, # '็' - 6: 1, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 19: { # 'ต' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 2, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 2, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 1, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 2, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 44: { # 'ถ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 3, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 14: { # 'ท' - 5: 1, # 'ก' - 30: 1, # 'ข' - 24: 3, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 3, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 1, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 3, # 'ศ' - 46: 1, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 48: { # 'ธ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 2, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 2, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 3: { # 'น' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 2, # 'ถ' - 14: 3, # 'ท' - 48: 3, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 1, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 3, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 3, # 'โ' - 29: 3, # 'ใ' - 33: 3, # 'ไ' - 50: 2, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 17: { # 'บ' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 1, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 2, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 2, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 25: { # 'ป' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 1, # 'ฎ' - 57: 3, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 1, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 2, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 1, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 39: { # 'ผ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 1, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 0, # 'ุ' - 35: 3, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 1, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 62: { # 'ฝ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 1, # 'ี' - 40: 2, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 1, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 31: { # 'พ' - 5: 1, # 'ก' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 2, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 1, # 'ึ' - 27: 3, # 'ื' - 32: 1, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 0, # '่' - 7: 1, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 54: { # 'ฟ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 45: { # 'ภ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 2, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 9: { # 'ม' - 5: 2, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 3, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 2, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 1, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 2, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 16: { # 'ย' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 2, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 1, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 2, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 2: { # 'ร' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 2, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 3, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 3, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 3, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 2, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 2, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 3, # 'เ' - 28: 3, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 61: { # 'ฤ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 2, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 15: { # 'ล' - 5: 2, # 'ก' - 30: 3, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 3, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 2, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 2, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 12: { # 'ว' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 2, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 42: { # 'ศ' - 5: 1, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 2, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 3, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 2, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'แ' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 46: { # 'ษ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 2, # 'ฎ' - 57: 1, # 'ฏ' - 49: 2, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 18: { # 'ส' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 3, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 2, # 'ภ' - 9: 3, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 0, # 'แ' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 1, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 21: { # 'ห' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 4: { # 'อ' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 63: { # 'ฯ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 22: { # 'ะ' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 1, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 10: { # 'ั' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 3, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 2, # 'ฐ' - 53: 0, # 'ฑ' - 55: 3, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 1: { # 'า' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 1, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 2, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'ฝ' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 3, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 3, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 36: { # 'ำ' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 23: { # 'ิ' - 5: 3, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 3, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 2, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 3, # 'ศ' - 46: 2, # 'ษ' - 18: 2, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 13: { # 'ี' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 40: { # 'ึ' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 3, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 27: { # 'ื' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 32: { # 'ุ' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 3, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 1, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 1, # 'ศ' - 46: 2, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 35: { # 'ู' - 5: 3, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'แ' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 11: { # 'เ' - 5: 3, # 'ก' - 30: 3, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 3, # 'ฉ' - 34: 3, # 'ช' - 51: 2, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 3, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 3, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 28: { # 'แ' - 5: 3, # 'ก' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 3, # 'ต' - 44: 2, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 3, # 'ผ' - 62: 0, # 'ฝ' - 31: 2, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 41: { # 'โ' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 1, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 29: { # 'ใ' - 5: 2, # 'ก' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 33: { # 'ไ' - 5: 1, # 'ก' - 30: 2, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 1, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 2, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 50: { # 'ๆ' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 37: { # '็' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 6: { # '่' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 1, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'ฝ' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 7: { # '้' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 38: { # '์' - 5: 2, # 'ก' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 1, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'แ' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 56: { # '๑' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 2, # '๑' - 59: 1, # '๒' - 60: 1, # '๕' - }, - 59: { # '๒' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 1, # '๑' - 59: 1, # '๒' - 60: 3, # '๕' - }, - 60: { # '๕' - 5: 0, # 'ก' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'ญ' - 58: 0, # 'ฎ' - 57: 0, # 'ฏ' - 49: 0, # 'ฐ' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'ฝ' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'แ' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 2, # '๑' - 59: 1, # '๒' - 60: 0, # '๕' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -TIS_620_THAI_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 182, # 'A' - 66: 106, # 'B' - 67: 107, # 'C' - 68: 100, # 'D' - 69: 183, # 'E' - 70: 184, # 'F' - 71: 185, # 'G' - 72: 101, # 'H' - 73: 94, # 'I' - 74: 186, # 'J' - 75: 187, # 'K' - 76: 108, # 'L' - 77: 109, # 'M' - 78: 110, # 'N' - 79: 111, # 'O' - 80: 188, # 'P' - 81: 189, # 'Q' - 82: 190, # 'R' - 83: 89, # 'S' - 84: 95, # 'T' - 85: 112, # 'U' - 86: 113, # 'V' - 87: 191, # 'W' - 88: 192, # 'X' - 89: 193, # 'Y' - 90: 194, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 64, # 'a' - 98: 72, # 'b' - 99: 73, # 'c' - 100: 114, # 'd' - 101: 74, # 'e' - 102: 115, # 'f' - 103: 116, # 'g' - 104: 102, # 'h' - 105: 81, # 'i' - 106: 201, # 'j' - 107: 117, # 'k' - 108: 90, # 'l' - 109: 103, # 'm' - 110: 78, # 'n' - 111: 82, # 'o' - 112: 96, # 'p' - 113: 202, # 'q' - 114: 91, # 'r' - 115: 79, # 's' - 116: 84, # 't' - 117: 104, # 'u' - 118: 105, # 'v' - 119: 97, # 'w' - 120: 98, # 'x' - 121: 92, # 'y' - 122: 203, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 209, # '\x80' - 129: 210, # '\x81' - 130: 211, # '\x82' - 131: 212, # '\x83' - 132: 213, # '\x84' - 133: 88, # '\x85' - 134: 214, # '\x86' - 135: 215, # '\x87' - 136: 216, # '\x88' - 137: 217, # '\x89' - 138: 218, # '\x8a' - 139: 219, # '\x8b' - 140: 220, # '\x8c' - 141: 118, # '\x8d' - 142: 221, # '\x8e' - 143: 222, # '\x8f' - 144: 223, # '\x90' - 145: 224, # '\x91' - 146: 99, # '\x92' - 147: 85, # '\x93' - 148: 83, # '\x94' - 149: 225, # '\x95' - 150: 226, # '\x96' - 151: 227, # '\x97' - 152: 228, # '\x98' - 153: 229, # '\x99' - 154: 230, # '\x9a' - 155: 231, # '\x9b' - 156: 232, # '\x9c' - 157: 233, # '\x9d' - 158: 234, # '\x9e' - 159: 235, # '\x9f' - 160: 236, # None - 161: 5, # 'ก' - 162: 30, # 'ข' - 163: 237, # 'ฃ' - 164: 24, # 'ค' - 165: 238, # 'ฅ' - 166: 75, # 'ฆ' - 167: 8, # 'ง' - 168: 26, # 'จ' - 169: 52, # 'ฉ' - 170: 34, # 'ช' - 171: 51, # 'ซ' - 172: 119, # 'ฌ' - 173: 47, # 'ญ' - 174: 58, # 'ฎ' - 175: 57, # 'ฏ' - 176: 49, # 'ฐ' - 177: 53, # 'ฑ' - 178: 55, # 'ฒ' - 179: 43, # 'ณ' - 180: 20, # 'ด' - 181: 19, # 'ต' - 182: 44, # 'ถ' - 183: 14, # 'ท' - 184: 48, # 'ธ' - 185: 3, # 'น' - 186: 17, # 'บ' - 187: 25, # 'ป' - 188: 39, # 'ผ' - 189: 62, # 'ฝ' - 190: 31, # 'พ' - 191: 54, # 'ฟ' - 192: 45, # 'ภ' - 193: 9, # 'ม' - 194: 16, # 'ย' - 195: 2, # 'ร' - 196: 61, # 'ฤ' - 197: 15, # 'ล' - 198: 239, # 'ฦ' - 199: 12, # 'ว' - 200: 42, # 'ศ' - 201: 46, # 'ษ' - 202: 18, # 'ส' - 203: 21, # 'ห' - 204: 76, # 'ฬ' - 205: 4, # 'อ' - 206: 66, # 'ฮ' - 207: 63, # 'ฯ' - 208: 22, # 'ะ' - 209: 10, # 'ั' - 210: 1, # 'า' - 211: 36, # 'ำ' - 212: 23, # 'ิ' - 213: 13, # 'ี' - 214: 40, # 'ึ' - 215: 27, # 'ื' - 216: 32, # 'ุ' - 217: 35, # 'ู' - 218: 86, # 'ฺ' - 219: 240, # None - 220: 241, # None - 221: 242, # None - 222: 243, # None - 223: 244, # '฿' - 224: 11, # 'เ' - 225: 28, # 'แ' - 226: 41, # 'โ' - 227: 29, # 'ใ' - 228: 33, # 'ไ' - 229: 245, # 'ๅ' - 230: 50, # 'ๆ' - 231: 37, # '็' - 232: 6, # '่' - 233: 7, # '้' - 234: 67, # '๊' - 235: 77, # '๋' - 236: 38, # '์' - 237: 93, # 'ํ' - 238: 246, # '๎' - 239: 247, # '๏' - 240: 68, # '๐' - 241: 56, # '๑' - 242: 59, # '๒' - 243: 65, # '๓' - 244: 69, # '๔' - 245: 60, # '๕' - 246: 70, # '๖' - 247: 80, # '๗' - 248: 71, # '๘' - 249: 87, # '๙' - 250: 248, # '๚' - 251: 249, # '๛' - 252: 250, # None - 253: 251, # None - 254: 252, # None - 255: 253, # None -} - -TIS_620_THAI_MODEL = SingleByteCharSetModel( - charset_name="TIS-620", - language="Thai", - char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER, - language_model=THAI_LANG_MODEL, - typical_positive_ratio=0.926386, - keep_ascii_letters=False, - alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛", -) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py deleted file mode 100644 index 291857c2..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py +++ /dev/null @@ -1,4380 +0,0 @@ -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -TURKISH_LANG_MODEL = { - 23: { # 'A' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 37: { # 'B' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 47: { # 'C' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 39: { # 'D' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 0, # 'ş' - }, - 29: { # 'E' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 52: { # 'F' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 1, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 2, # 'ş' - }, - 36: { # 'G' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 2, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 1, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 45: { # 'H' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 2, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 2, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 53: { # 'I' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 60: { # 'J' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 16: { # 'K' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 1, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 49: { # 'L' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 2, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 20: { # 'M' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 0, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 46: { # 'N' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 42: { # 'O' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 2, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 48: { # 'P' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 44: { # 'R' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, - 35: { # 'S' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 1, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 2, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 31: { # 'T' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 2, # 't' - 14: 2, # 'u' - 32: 1, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 51: { # 'U' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 38: { # 'V' - 23: 1, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 1, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 62: { # 'W' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 43: { # 'Y' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 0, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 1, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 56: { # 'Z' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 1: { # 'a' - 23: 3, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 1, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 21: { # 'b' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 3, # 'g' - 25: 1, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 2, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 28: { # 'c' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 2, # 'T' - 51: 2, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 3, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 1, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 1, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 2, # 'ş' - }, - 12: { # 'd' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 2: { # 'e' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 18: { # 'f' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 1, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 1, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 27: { # 'g' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 25: { # 'h' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 3: { # 'i' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 1, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 3, # 'g' - 25: 1, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 24: { # 'j' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 10: { # 'k' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 2, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 5: { # 'l' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 1, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 2, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 13: { # 'm' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 2, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 4: { # 'n' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 15: { # 'o' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 2, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ğ' - 41: 2, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Ş' - 19: 2, # 'ş' - }, - 26: { # 'p' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 7: { # 'r' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 1, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 8: { # 's' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 9: { # 't' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 14: { # 'u' - 23: 3, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 2, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 2, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 32: { # 'v' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 57: { # 'w' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 1, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 58: { # 'x' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 11: { # 'y' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 22: { # 'z' - 23: 2, # 'A' - 37: 2, # 'B' - 47: 1, # 'C' - 39: 2, # 'D' - 29: 3, # 'E' - 52: 1, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 2, # 'N' - 42: 2, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 3, # 'T' - 51: 2, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 1, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 2, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 1, # 'Ş' - 19: 2, # 'ş' - }, - 63: { # '·' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 54: { # 'Ç' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 3, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 50: { # 'Ö' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 2, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 1, # 'N' - 42: 2, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 1, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 1, # 's' - 9: 2, # 't' - 14: 0, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 1, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 55: { # 'Ü' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 59: { # 'â' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 0, # 'ş' - }, - 33: { # 'ç' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 0, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 61: { # 'î' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 1, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 34: { # 'ö' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 1, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 3, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ğ' - 41: 1, # 'İ' - 6: 1, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 17: { # 'ü' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 30: { # 'ğ' - 23: 0, # 'A' - 37: 2, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 2, # 'N' - 42: 2, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 3, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 2, # 'İ' - 6: 2, # 'ı' - 40: 2, # 'Ş' - 19: 1, # 'ş' - }, - 41: { # 'İ' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 2, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 1, # 'ş' - }, - 6: { # 'ı' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ğ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Ş' - 19: 0, # 'ş' - }, - 40: { # 'Ş' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 2, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 0, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 3, # 'f' - 27: 0, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 1, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 1, # 'ü' - 30: 2, # 'ğ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Ş' - 19: 2, # 'ş' - }, - 19: { # 'ş' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 2, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 1, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ğ' - 41: 1, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Ş' - 19: 1, # 'ş' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# Character Mapping Table(s): -ISO_8859_9_TURKISH_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 255, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 255, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 255, # ' ' - 33: 255, # '!' - 34: 255, # '"' - 35: 255, # '#' - 36: 255, # '$' - 37: 255, # '%' - 38: 255, # '&' - 39: 255, # "'" - 40: 255, # '(' - 41: 255, # ')' - 42: 255, # '*' - 43: 255, # '+' - 44: 255, # ',' - 45: 255, # '-' - 46: 255, # '.' - 47: 255, # '/' - 48: 255, # '0' - 49: 255, # '1' - 50: 255, # '2' - 51: 255, # '3' - 52: 255, # '4' - 53: 255, # '5' - 54: 255, # '6' - 55: 255, # '7' - 56: 255, # '8' - 57: 255, # '9' - 58: 255, # ':' - 59: 255, # ';' - 60: 255, # '<' - 61: 255, # '=' - 62: 255, # '>' - 63: 255, # '?' - 64: 255, # '@' - 65: 23, # 'A' - 66: 37, # 'B' - 67: 47, # 'C' - 68: 39, # 'D' - 69: 29, # 'E' - 70: 52, # 'F' - 71: 36, # 'G' - 72: 45, # 'H' - 73: 53, # 'I' - 74: 60, # 'J' - 75: 16, # 'K' - 76: 49, # 'L' - 77: 20, # 'M' - 78: 46, # 'N' - 79: 42, # 'O' - 80: 48, # 'P' - 81: 69, # 'Q' - 82: 44, # 'R' - 83: 35, # 'S' - 84: 31, # 'T' - 85: 51, # 'U' - 86: 38, # 'V' - 87: 62, # 'W' - 88: 65, # 'X' - 89: 43, # 'Y' - 90: 56, # 'Z' - 91: 255, # '[' - 92: 255, # '\\' - 93: 255, # ']' - 94: 255, # '^' - 95: 255, # '_' - 96: 255, # '`' - 97: 1, # 'a' - 98: 21, # 'b' - 99: 28, # 'c' - 100: 12, # 'd' - 101: 2, # 'e' - 102: 18, # 'f' - 103: 27, # 'g' - 104: 25, # 'h' - 105: 3, # 'i' - 106: 24, # 'j' - 107: 10, # 'k' - 108: 5, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 15, # 'o' - 112: 26, # 'p' - 113: 64, # 'q' - 114: 7, # 'r' - 115: 8, # 's' - 116: 9, # 't' - 117: 14, # 'u' - 118: 32, # 'v' - 119: 57, # 'w' - 120: 58, # 'x' - 121: 11, # 'y' - 122: 22, # 'z' - 123: 255, # '{' - 124: 255, # '|' - 125: 255, # '}' - 126: 255, # '~' - 127: 255, # '\x7f' - 128: 180, # '\x80' - 129: 179, # '\x81' - 130: 178, # '\x82' - 131: 177, # '\x83' - 132: 176, # '\x84' - 133: 175, # '\x85' - 134: 174, # '\x86' - 135: 173, # '\x87' - 136: 172, # '\x88' - 137: 171, # '\x89' - 138: 170, # '\x8a' - 139: 169, # '\x8b' - 140: 168, # '\x8c' - 141: 167, # '\x8d' - 142: 166, # '\x8e' - 143: 165, # '\x8f' - 144: 164, # '\x90' - 145: 163, # '\x91' - 146: 162, # '\x92' - 147: 161, # '\x93' - 148: 160, # '\x94' - 149: 159, # '\x95' - 150: 101, # '\x96' - 151: 158, # '\x97' - 152: 157, # '\x98' - 153: 156, # '\x99' - 154: 155, # '\x9a' - 155: 154, # '\x9b' - 156: 153, # '\x9c' - 157: 152, # '\x9d' - 158: 151, # '\x9e' - 159: 106, # '\x9f' - 160: 150, # '\xa0' - 161: 149, # '¡' - 162: 148, # '¢' - 163: 147, # '£' - 164: 146, # '¤' - 165: 145, # '¥' - 166: 144, # '¦' - 167: 100, # '§' - 168: 143, # '¨' - 169: 142, # '©' - 170: 141, # 'ª' - 171: 140, # '«' - 172: 139, # '¬' - 173: 138, # '\xad' - 174: 137, # '®' - 175: 136, # '¯' - 176: 94, # '°' - 177: 80, # '±' - 178: 93, # '²' - 179: 135, # '³' - 180: 105, # '´' - 181: 134, # 'µ' - 182: 133, # '¶' - 183: 63, # '·' - 184: 132, # '¸' - 185: 131, # '¹' - 186: 130, # 'º' - 187: 129, # '»' - 188: 128, # '¼' - 189: 127, # '½' - 190: 126, # '¾' - 191: 125, # '¿' - 192: 124, # 'À' - 193: 104, # 'Á' - 194: 73, # 'Â' - 195: 99, # 'Ã' - 196: 79, # 'Ä' - 197: 85, # 'Å' - 198: 123, # 'Æ' - 199: 54, # 'Ç' - 200: 122, # 'È' - 201: 98, # 'É' - 202: 92, # 'Ê' - 203: 121, # 'Ë' - 204: 120, # 'Ì' - 205: 91, # 'Í' - 206: 103, # 'Î' - 207: 119, # 'Ï' - 208: 68, # 'Ğ' - 209: 118, # 'Ñ' - 210: 117, # 'Ò' - 211: 97, # 'Ó' - 212: 116, # 'Ô' - 213: 115, # 'Õ' - 214: 50, # 'Ö' - 215: 90, # '×' - 216: 114, # 'Ø' - 217: 113, # 'Ù' - 218: 112, # 'Ú' - 219: 111, # 'Û' - 220: 55, # 'Ü' - 221: 41, # 'İ' - 222: 40, # 'Ş' - 223: 86, # 'ß' - 224: 89, # 'à' - 225: 70, # 'á' - 226: 59, # 'â' - 227: 78, # 'ã' - 228: 71, # 'ä' - 229: 82, # 'å' - 230: 88, # 'æ' - 231: 33, # 'ç' - 232: 77, # 'è' - 233: 66, # 'é' - 234: 84, # 'ê' - 235: 83, # 'ë' - 236: 110, # 'ì' - 237: 75, # 'í' - 238: 61, # 'î' - 239: 96, # 'ï' - 240: 30, # 'ğ' - 241: 67, # 'ñ' - 242: 109, # 'ò' - 243: 74, # 'ó' - 244: 87, # 'ô' - 245: 102, # 'õ' - 246: 34, # 'ö' - 247: 95, # '÷' - 248: 81, # 'ø' - 249: 108, # 'ù' - 250: 76, # 'ú' - 251: 72, # 'û' - 252: 17, # 'ü' - 253: 6, # 'ı' - 254: 19, # 'ş' - 255: 107, # 'ÿ' -} - -ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel( - charset_name="ISO-8859-9", - language="Turkish", - char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER, - language_model=TURKISH_LANG_MODEL, - typical_positive_ratio=0.97029, - keep_ascii_letters=True, - alphabet="ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş", -) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py deleted file mode 100644 index 59a01d91..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py +++ /dev/null @@ -1,147 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -# fmt: off -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) -# fmt: on - - -class Latin1Prober(CharSetProber): - def __init__(self) -> None: - super().__init__() - self._last_char_class = OTH - self._freq_counter: List[int] = [] - self.reset() - - def reset(self) -> None: - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - super().reset() - - @property - def charset_name(self) -> str: - return "ISO-8859-1" - - @property - def language(self) -> str: - return "" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - byte_str = self.remove_xml_tags(byte_str) - for c in byte_str: - char_class = Latin1_CharToClass[c] - freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self) -> float: - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - confidence = ( - 0.0 - if total < 0.01 - else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total - ) - confidence = max(confidence, 0.0) - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence *= 0.73 - return confidence diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py deleted file mode 100644 index 1425d10e..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py +++ /dev/null @@ -1,162 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This code was modified from latin1prober.py by Rob Speer . -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Rob Speer - adapt to MacRoman encoding -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import List, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -ODD = 8 # character that is unlikely to appear -CLASS_NUM = 9 # total classes - -# The change from Latin1 is that we explicitly look for extended characters -# that are infrequently-occurring symbols, and consider them to always be -# improbable. This should let MacRoman get out of the way of more likely -# encodings in most situations. - -# fmt: off -MacRoman_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - ACV, ACV, ACO, ACV, ACO, ACV, ACV, ASV, # 80 - 87 - ASV, ASV, ASV, ASV, ASV, ASO, ASV, ASV, # 88 - 8F - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASV, # 90 - 97 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, ASO, # A0 - A7 - OTH, OTH, ODD, ODD, OTH, OTH, ACV, ACV, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, ASV, ASV, # B8 - BF - OTH, OTH, ODD, OTH, ODD, OTH, OTH, OTH, # C0 - C7 - OTH, OTH, OTH, ACV, ACV, ACV, ACV, ASV, # C8 - CF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, ODD, # D0 - D7 - ASV, ACV, ODD, OTH, OTH, OTH, OTH, OTH, # D8 - DF - OTH, OTH, OTH, OTH, OTH, ACV, ACV, ACV, # E0 - E7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # E8 - EF - ODD, ACV, ACV, ACV, ACV, ASV, ODD, ODD, # F0 - F7 - ODD, ODD, ODD, ODD, ODD, ODD, ODD, ODD, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -MacRomanClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO ODD - 0, 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, 1, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, 1, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, 1, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, 1, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, 1, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, 1, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, 1, # ASO - 0, 1, 1, 1, 1, 1, 1, 1, 1, # ODD -) -# fmt: on - - -class MacRomanProber(CharSetProber): - def __init__(self) -> None: - super().__init__() - self._last_char_class = OTH - self._freq_counter: List[int] = [] - self.reset() - - def reset(self) -> None: - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - - # express the prior that MacRoman is a somewhat rare encoding; - # this can be done by starting out in a slightly improbable state - # that must be overcome - self._freq_counter[2] = 10 - - super().reset() - - @property - def charset_name(self) -> str: - return "MacRoman" - - @property - def language(self) -> str: - return "" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - byte_str = self.remove_xml_tags(byte_str) - for c in byte_str: - char_class = MacRoman_CharToClass[c] - freq = MacRomanClassModel[(self._last_char_class * CLASS_NUM) + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self) -> float: - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - confidence = ( - 0.0 - if total < 0.01 - else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total - ) - confidence = max(confidence, 0.0) - # lower the confidence of MacRoman so that other more accurate - # detector can take priority. - confidence *= 0.73 - return confidence diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py deleted file mode 100644 index 666307e8..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py +++ /dev/null @@ -1,95 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Optional, Union - -from .chardistribution import CharDistributionAnalysis -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, MachineState, ProbingState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self.distribution_analyzer: Optional[CharDistributionAnalysis] = None - self.coding_sm: Optional[CodingStateMachine] = None - self._last_char = bytearray(b"\0\0") - - def reset(self) -> None: - super().reset() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = bytearray(b"\0\0") - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - assert self.coding_sm is not None - assert self.distribution_analyzer is not None - - for i, byte in enumerate(byte_str): - coding_state = self.coding_sm.next_state(byte) - if coding_state == MachineState.ERROR: - self.logger.debug( - "%s %s prober hit error at byte %s", - self.charset_name, - self.language, - i, - ) - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if self.distribution_analyzer.got_enough_data() and ( - self.get_confidence() > self.SHORTCUT_THRESHOLD - ): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - assert self.distribution_analyzer is not None - return self.distribution_analyzer.get_confidence() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py deleted file mode 100644 index 6cb9cc7b..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,57 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .big5prober import Big5Prober -from .charsetgroupprober import CharSetGroupProber -from .cp949prober import CP949Prober -from .enums import LanguageFilter -from .eucjpprober import EUCJPProber -from .euckrprober import EUCKRProber -from .euctwprober import EUCTWProber -from .gb2312prober import GB2312Prober -from .johabprober import JOHABProber -from .sjisprober import SJISProber -from .utf8prober import UTF8Prober - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None: - super().__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber(), - JOHABProber(), - ] - self.reset() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py deleted file mode 100644 index 7bbe97e6..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py +++ /dev/null @@ -1,661 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .codingstatemachinedict import CodingStateMachineDict -from .enums import MachineState - -# BIG5 - -# fmt: off -BIG5_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as legal value - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f - 4, 4, 4, 4, 4, 4, 4, 4, # 80 - 87 - 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f - 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 - 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f - 4, 3, 3, 3, 3, 3, 3, 3, # a0 - a7 - 3, 3, 3, 3, 3, 3, 3, 3, # a8 - af - 3, 3, 3, 3, 3, 3, 3, 3, # b0 - b7 - 3, 3, 3, 3, 3, 3, 3, 3, # b8 - bf - 3, 3, 3, 3, 3, 3, 3, 3, # c0 - c7 - 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf - 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 - 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df - 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 - 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef - 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 - 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff -) - -BIG5_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 -) -# fmt: on - -BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) - -BIG5_SM_MODEL: CodingStateMachineDict = { - "class_table": BIG5_CLS, - "class_factor": 5, - "state_table": BIG5_ST, - "char_len_table": BIG5_CHAR_LEN_TABLE, - "name": "Big5", -} - -# CP949 -# fmt: off -CP949_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # 00 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, # 10 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 3f - 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 4f - 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 50 - 5f - 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, # 60 - 6f - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 70 - 7f - 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 80 - 8f - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 9f - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, # a0 - af - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, # b0 - bf - 7, 7, 7, 7, 7, 7, 9, 2, 2, 3, 2, 2, 2, 2, 2, 2, # c0 - cf - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # d0 - df - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # e0 - ef - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, # f0 - ff -) - -CP949_ST = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 -) -# fmt: on - -CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949_SM_MODEL: CodingStateMachineDict = { - "class_table": CP949_CLS, - "class_factor": 10, - "state_table": CP949_ST, - "char_len_table": CP949_CHAR_LEN_TABLE, - "name": "CP949", -} - -# EUC-JP -# fmt: off -EUCJP_CLS = ( - 4, 4, 4, 4, 4, 4, 4, 4, # 00 - 07 - 4, 4, 4, 4, 4, 4, 5, 5, # 08 - 0f - 4, 4, 4, 4, 4, 4, 4, 4, # 10 - 17 - 4, 4, 4, 5, 4, 4, 4, 4, # 18 - 1f - 4, 4, 4, 4, 4, 4, 4, 4, # 20 - 27 - 4, 4, 4, 4, 4, 4, 4, 4, # 28 - 2f - 4, 4, 4, 4, 4, 4, 4, 4, # 30 - 37 - 4, 4, 4, 4, 4, 4, 4, 4, # 38 - 3f - 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 47 - 4, 4, 4, 4, 4, 4, 4, 4, # 48 - 4f - 4, 4, 4, 4, 4, 4, 4, 4, # 50 - 57 - 4, 4, 4, 4, 4, 4, 4, 4, # 58 - 5f - 4, 4, 4, 4, 4, 4, 4, 4, # 60 - 67 - 4, 4, 4, 4, 4, 4, 4, 4, # 68 - 6f - 4, 4, 4, 4, 4, 4, 4, 4, # 70 - 77 - 4, 4, 4, 4, 4, 4, 4, 4, # 78 - 7f - 5, 5, 5, 5, 5, 5, 5, 5, # 80 - 87 - 5, 5, 5, 5, 5, 5, 1, 3, # 88 - 8f - 5, 5, 5, 5, 5, 5, 5, 5, # 90 - 97 - 5, 5, 5, 5, 5, 5, 5, 5, # 98 - 9f - 5, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 - 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef - 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 - 0, 0, 0, 0, 0, 0, 0, 5 # f8 - ff -) - -EUCJP_ST = ( - 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f - 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 -) -# fmt: on - -EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) - -EUCJP_SM_MODEL: CodingStateMachineDict = { - "class_table": EUCJP_CLS, - "class_factor": 6, - "state_table": EUCJP_ST, - "char_len_table": EUCJP_CHAR_LEN_TABLE, - "name": "EUC-JP", -} - -# EUC-KR -# fmt: off -EUCKR_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 - 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f - 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 - 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f - 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 - 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f - 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 - 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 3, 3, 3, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 3, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 - 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef - 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 - 2, 2, 2, 2, 2, 2, 2, 0 # f8 - ff -) - -EUCKR_ST = ( - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f -) -# fmt: on - -EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) - -EUCKR_SM_MODEL: CodingStateMachineDict = { - "class_table": EUCKR_CLS, - "class_factor": 4, - "state_table": EUCKR_ST, - "char_len_table": EUCKR_CHAR_LEN_TABLE, - "name": "EUC-KR", -} - -# JOHAB -# fmt: off -JOHAB_CLS = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,0,0, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,0,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,3,3,3,3,3,3,3, # 30 - 37 - 3,3,3,3,3,3,3,3, # 38 - 3f - 3,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,2, # 78 - 7f - 6,6,6,6,8,8,8,8, # 80 - 87 - 8,8,8,8,8,8,8,8, # 88 - 8f - 8,7,7,7,7,7,7,7, # 90 - 97 - 7,7,7,7,7,7,7,7, # 98 - 9f - 7,7,7,7,7,7,7,7, # a0 - a7 - 7,7,7,7,7,7,7,7, # a8 - af - 7,7,7,7,7,7,7,7, # b0 - b7 - 7,7,7,7,7,7,7,7, # b8 - bf - 7,7,7,7,7,7,7,7, # c0 - c7 - 7,7,7,7,7,7,7,7, # c8 - cf - 7,7,7,7,5,5,5,5, # d0 - d7 - 5,9,9,9,9,9,9,5, # d8 - df - 9,9,9,9,9,9,9,9, # e0 - e7 - 9,9,9,9,9,9,9,9, # e8 - ef - 9,9,9,9,9,9,9,9, # f0 - f7 - 9,9,5,5,5,5,5,0 # f8 - ff -) - -JOHAB_ST = ( -# cls = 0 1 2 3 4 5 6 7 8 9 - MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,3 ,3 ,4 , # MachineState.START - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME - MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR , # MachineState.ERROR - MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START , # 3 - MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START , # 4 -) -# fmt: on - -JOHAB_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 0, 0, 2, 2, 2) - -JOHAB_SM_MODEL: CodingStateMachineDict = { - "class_table": JOHAB_CLS, - "class_factor": 10, - "state_table": JOHAB_ST, - "char_len_table": JOHAB_CHAR_LEN_TABLE, - "name": "Johab", -} - -# EUC-TW -# fmt: off -EUCTW_CLS = ( - 2, 2, 2, 2, 2, 2, 2, 2, # 00 - 07 - 2, 2, 2, 2, 2, 2, 0, 0, # 08 - 0f - 2, 2, 2, 2, 2, 2, 2, 2, # 10 - 17 - 2, 2, 2, 0, 2, 2, 2, 2, # 18 - 1f - 2, 2, 2, 2, 2, 2, 2, 2, # 20 - 27 - 2, 2, 2, 2, 2, 2, 2, 2, # 28 - 2f - 2, 2, 2, 2, 2, 2, 2, 2, # 30 - 37 - 2, 2, 2, 2, 2, 2, 2, 2, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 2, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 6, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 3, 4, 4, 4, 4, 4, 4, # a0 - a7 - 5, 5, 1, 1, 1, 1, 1, 1, # a8 - af - 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 - 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf - 1, 1, 3, 1, 3, 3, 3, 3, # c0 - c7 - 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf - 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 - 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df - 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 - 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef - 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 - 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff -) - -EUCTW_ST = ( - MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 - MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 - MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) -# fmt: on - -EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) - -EUCTW_SM_MODEL: CodingStateMachineDict = { - "class_table": EUCTW_CLS, - "class_factor": 7, - "state_table": EUCTW_ST, - "char_len_table": EUCTW_CHAR_LEN_TABLE, - "name": "x-euc-tw", -} - -# GB2312 -# fmt: off -GB2312_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 3, 3, 3, 3, 3, 3, 3, 3, # 30 - 37 - 3, 3, 1, 1, 1, 1, 1, 1, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 4, # 78 - 7f - 5, 6, 6, 6, 6, 6, 6, 6, # 80 - 87 - 6, 6, 6, 6, 6, 6, 6, 6, # 88 - 8f - 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 97 - 6, 6, 6, 6, 6, 6, 6, 6, # 98 - 9f - 6, 6, 6, 6, 6, 6, 6, 6, # a0 - a7 - 6, 6, 6, 6, 6, 6, 6, 6, # a8 - af - 6, 6, 6, 6, 6, 6, 6, 6, # b0 - b7 - 6, 6, 6, 6, 6, 6, 6, 6, # b8 - bf - 6, 6, 6, 6, 6, 6, 6, 6, # c0 - c7 - 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf - 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 - 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df - 6, 6, 6, 6, 6, 6, 6, 6, # e0 - e7 - 6, 6, 6, 6, 6, 6, 6, 6, # e8 - ef - 6, 6, 6, 6, 6, 6, 6, 6, # f0 - f7 - 6, 6, 6, 6, 6, 6, 6, 0 # f8 - ff -) - -GB2312_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 - 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) -# fmt: on - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validating -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) - -GB2312_SM_MODEL: CodingStateMachineDict = { - "class_table": GB2312_CLS, - "class_factor": 7, - "state_table": GB2312_ST, - "char_len_table": GB2312_CHAR_LEN_TABLE, - "name": "GB2312", -} - -# Shift_JIS -# fmt: off -SJIS_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 - 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f - 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 - 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f - 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 - 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f - 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 - 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f - 3, 3, 3, 3, 3, 2, 2, 3, # 80 - 87 - 3, 3, 3, 3, 3, 3, 3, 3, # 88 - 8f - 3, 3, 3, 3, 3, 3, 3, 3, # 90 - 97 - 3, 3, 3, 3, 3, 3, 3, 3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 - 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af - 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 - 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf - 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 - 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf - 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 - 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df - 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 - 3, 3, 3, 3, 3, 4, 4, 4, # e8 - ef - 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 - 3, 3, 3, 3, 3, 0, 0, 0, # f8 - ff -) - -SJIS_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 -) -# fmt: on - -SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) - -SJIS_SM_MODEL: CodingStateMachineDict = { - "class_table": SJIS_CLS, - "class_factor": 6, - "state_table": SJIS_ST, - "char_len_table": SJIS_CHAR_LEN_TABLE, - "name": "Shift_JIS", -} - -# UCS2-BE -# fmt: off -UCS2BE_CLS = ( - 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 - 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af - 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 - 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf - 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 - 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf - 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 - 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df - 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 - 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef - 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 - 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff -) - -UCS2BE_ST = ( - 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 - 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 - 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f - 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) -# fmt: on - -UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) - -UCS2BE_SM_MODEL: CodingStateMachineDict = { - "class_table": UCS2BE_CLS, - "class_factor": 6, - "state_table": UCS2BE_ST, - "char_len_table": UCS2BE_CHAR_LEN_TABLE, - "name": "UTF-16BE", -} - -# UCS2-LE -# fmt: off -UCS2LE_CLS = ( - 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 - 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f - 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 - 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f - 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 - 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f - 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 - 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f - 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 - 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f - 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 - 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f - 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 - 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f - 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 - 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f - 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 - 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f - 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 - 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f - 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 - 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af - 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 - 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf - 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 - 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf - 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 - 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df - 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 - 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef - 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 - 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff -) - -UCS2LE_ST = ( - 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 - 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) -# fmt: on - -UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) - -UCS2LE_SM_MODEL: CodingStateMachineDict = { - "class_table": UCS2LE_CLS, - "class_factor": 6, - "state_table": UCS2LE_ST, - "char_len_table": UCS2LE_CHAR_LEN_TABLE, - "name": "UTF-16LE", -} - -# UTF-8 -# fmt: off -UTF8_CLS = ( - 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as a legal value - 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f - 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 - 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f - 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 - 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f - 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 - 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f - 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 - 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f - 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 - 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f - 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 - 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f - 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 - 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f - 2, 2, 2, 2, 3, 3, 3, 3, # 80 - 87 - 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f - 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 - 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f - 5, 5, 5, 5, 5, 5, 5, 5, # a0 - a7 - 5, 5, 5, 5, 5, 5, 5, 5, # a8 - af - 5, 5, 5, 5, 5, 5, 5, 5, # b0 - b7 - 5, 5, 5, 5, 5, 5, 5, 5, # b8 - bf - 0, 0, 6, 6, 6, 6, 6, 6, # c0 - c7 - 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf - 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 - 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df - 7, 8, 8, 8, 8, 8, 8, 8, # e0 - e7 - 8, 8, 8, 8, 8, 9, 8, 8, # e8 - ef - 10, 11, 11, 11, 11, 11, 11, 11, # f0 - f7 - 12, 13, 13, 13, 14, 15, 0, 0 # f8 - ff -) - -UTF8_ST = ( - MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f - MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f - MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f - MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f - MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af - MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf -) -# fmt: on - -UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8_SM_MODEL: CodingStateMachineDict = { - "class_table": UTF8_CLS, - "class_factor": 16, - "state_table": UTF8_ST, - "char_len_table": UTF8_CHAR_LEN_TABLE, - "name": "UTF-8", -} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ba8e65eca2b26cfe7e8e7308bf597c2c35f54749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmZ8bF%H5o3~VS!2&oTYpcb$qCT14I9J!65QPU(!LQ!AB8+Z$kVBiI)5(5+I%1QR! z**DxH%VtT$;rTfY{2JCj`fD|CVaG!#%^K;T?z d892{v_nmGUBQA=zZW5cYIDQcClriSgsDACMJ|h4C diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc deleted file mode 100644 index bef39b3debbe95346efa946acb54d37d5e0ec9f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9773 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 K08J^R=KUWp-y8J+ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py deleted file mode 100644 index eb40c5f0..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py +++ /dev/null @@ -1,352 +0,0 @@ -""" -Metadata about languages used by our model training code for our -SingleByteCharSetProbers. Could be used for other things in the future. - -This code is based on the language metadata from the uchardet project. -""" - -from string import ascii_letters -from typing import List, Optional - -# TODO: Add Ukrainian (KOI8-U) - - -class Language: - """Metadata about a language useful for training models - - :ivar name: The human name for the language, in English. - :type name: str - :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise, - or use another catalog as a last resort. - :type iso_code: str - :ivar use_ascii: Whether or not ASCII letters should be included in trained - models. - :type use_ascii: bool - :ivar charsets: The charsets we want to support and create data for. - :type charsets: list of str - :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is - `True`, you only need to add those not in the ASCII set. - :type alphabet: str - :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling - Wikipedia for training data. - :type wiki_start_pages: list of str - """ - - def __init__( - self, - name: Optional[str] = None, - iso_code: Optional[str] = None, - use_ascii: bool = True, - charsets: Optional[List[str]] = None, - alphabet: Optional[str] = None, - wiki_start_pages: Optional[List[str]] = None, - ) -> None: - super().__init__() - self.name = name - self.iso_code = iso_code - self.use_ascii = use_ascii - self.charsets = charsets - if self.use_ascii: - if alphabet: - alphabet += ascii_letters - else: - alphabet = ascii_letters - elif not alphabet: - raise ValueError("Must supply alphabet if use_ascii is False") - self.alphabet = "".join(sorted(set(alphabet))) if alphabet else None - self.wiki_start_pages = wiki_start_pages - - def __repr__(self) -> str: - param_str = ", ".join( - f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_") - ) - return f"{self.__class__.__name__}({param_str})" - - -LANGUAGES = { - "Arabic": Language( - name="Arabic", - iso_code="ar", - use_ascii=False, - # We only support encodings that use isolated - # forms, because the current recommendation is - # that the rendering system handles presentation - # forms. This means we purposefully skip IBM864. - charsets=["ISO-8859-6", "WINDOWS-1256", "CP720", "CP864"], - alphabet="ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّ", - wiki_start_pages=["الصفحة_الرئيسية"], - ), - "Belarusian": Language( - name="Belarusian", - iso_code="be", - use_ascii=False, - charsets=["ISO-8859-5", "WINDOWS-1251", "IBM866", "MacCyrillic"], - alphabet="АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШЫЬЭЮЯабвгдеёжзійклмнопрстуўфхцчшыьэюяʼ", - wiki_start_pages=["Галоўная_старонка"], - ), - "Bulgarian": Language( - name="Bulgarian", - iso_code="bg", - use_ascii=False, - charsets=["ISO-8859-5", "WINDOWS-1251", "IBM855"], - alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", - wiki_start_pages=["Начална_страница"], - ), - "Czech": Language( - name="Czech", - iso_code="cz", - use_ascii=True, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="áčďéěíňóřšťúůýžÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ", - wiki_start_pages=["Hlavní_strana"], - ), - "Danish": Language( - name="Danish", - iso_code="da", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="æøåÆØÅ", - wiki_start_pages=["Forside"], - ), - "German": Language( - name="German", - iso_code="de", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="äöüßẞÄÖÜ", - wiki_start_pages=["Wikipedia:Hauptseite"], - ), - "Greek": Language( - name="Greek", - iso_code="el", - use_ascii=False, - charsets=["ISO-8859-7", "WINDOWS-1253"], - alphabet="αβγδεζηθικλμνξοπρσςτυφχψωάέήίόύώΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎΏ", - wiki_start_pages=["Πύλη:Κύρια"], - ), - "English": Language( - name="English", - iso_code="en", - use_ascii=True, - charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], - wiki_start_pages=["Main_Page"], - ), - "Esperanto": Language( - name="Esperanto", - iso_code="eo", - # Q, W, X, and Y not used at all - use_ascii=False, - charsets=["ISO-8859-3"], - alphabet="abcĉdefgĝhĥijĵklmnoprsŝtuŭvzABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ", - wiki_start_pages=["Vikipedio:Ĉefpaĝo"], - ), - "Spanish": Language( - name="Spanish", - iso_code="es", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ñáéíóúüÑÁÉÍÓÚÜ", - wiki_start_pages=["Wikipedia:Portada"], - ), - "Estonian": Language( - name="Estonian", - iso_code="et", - use_ascii=False, - charsets=["ISO-8859-4", "ISO-8859-13", "WINDOWS-1257"], - # C, F, Š, Q, W, X, Y, Z, Ž are only for - # loanwords - alphabet="ABDEGHIJKLMNOPRSTUVÕÄÖÜabdeghijklmnoprstuvõäöü", - wiki_start_pages=["Esileht"], - ), - "Finnish": Language( - name="Finnish", - iso_code="fi", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ÅÄÖŠŽåäöšž", - wiki_start_pages=["Wikipedia:Etusivu"], - ), - "French": Language( - name="French", - iso_code="fr", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="œàâçèéîïùûêŒÀÂÇÈÉÎÏÙÛÊ", - wiki_start_pages=["Wikipédia:Accueil_principal", "Bœuf (animal)"], - ), - "Hebrew": Language( - name="Hebrew", - iso_code="he", - use_ascii=False, - charsets=["ISO-8859-8", "WINDOWS-1255"], - alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ", - wiki_start_pages=["עמוד_ראשי"], - ), - "Croatian": Language( - name="Croatian", - iso_code="hr", - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="abcčćdđefghijklmnoprsštuvzžABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽ", - wiki_start_pages=["Glavna_stranica"], - ), - "Hungarian": Language( - name="Hungarian", - iso_code="hu", - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="abcdefghijklmnoprstuvzáéíóöőúüűABCDEFGHIJKLMNOPRSTUVZÁÉÍÓÖŐÚÜŰ", - wiki_start_pages=["Kezdőlap"], - ), - "Italian": Language( - name="Italian", - iso_code="it", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ÀÈÉÌÒÓÙàèéìòóù", - wiki_start_pages=["Pagina_principale"], - ), - "Lithuanian": Language( - name="Lithuanian", - iso_code="lt", - use_ascii=False, - charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"], - # Q, W, and X not used at all - alphabet="AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽaąbcčdeęėfghiįyjklmnoprsštuųūvzž", - wiki_start_pages=["Pagrindinis_puslapis"], - ), - "Latvian": Language( - name="Latvian", - iso_code="lv", - use_ascii=False, - charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"], - # Q, W, X, Y are only for loanwords - alphabet="AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽaābcčdeēfgģhiījkķlļmnņoprsštuūvzž", - wiki_start_pages=["Sākumlapa"], - ), - "Macedonian": Language( - name="Macedonian", - iso_code="mk", - use_ascii=False, - charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"], - alphabet="АБВГДЃЕЖЗЅИЈКЛЉМНЊОПРСТЌУФХЦЧЏШабвгдѓежзѕијклљмнњопрстќуфхцчџш", - wiki_start_pages=["Главна_страница"], - ), - "Dutch": Language( - name="Dutch", - iso_code="nl", - use_ascii=True, - charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"], - wiki_start_pages=["Hoofdpagina"], - ), - "Polish": Language( - name="Polish", - iso_code="pl", - # Q and X are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻaąbcćdeęfghijklłmnńoóprsśtuwyzźż", - wiki_start_pages=["Wikipedia:Strona_główna"], - ), - "Portuguese": Language( - name="Portuguese", - iso_code="pt", - use_ascii=True, - charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"], - alphabet="ÁÂÃÀÇÉÊÍÓÔÕÚáâãàçéêíóôõú", - wiki_start_pages=["Wikipédia:Página_principal"], - ), - "Romanian": Language( - name="Romanian", - iso_code="ro", - use_ascii=True, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="ăâîșțĂÂÎȘȚ", - wiki_start_pages=["Pagina_principală"], - ), - "Russian": Language( - name="Russian", - iso_code="ru", - use_ascii=False, - charsets=[ - "ISO-8859-5", - "WINDOWS-1251", - "KOI8-R", - "MacCyrillic", - "IBM866", - "IBM855", - ], - alphabet="абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", - wiki_start_pages=["Заглавная_страница"], - ), - "Slovak": Language( - name="Slovak", - iso_code="sk", - use_ascii=True, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="áäčďéíĺľňóôŕšťúýžÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽ", - wiki_start_pages=["Hlavná_stránka"], - ), - "Slovene": Language( - name="Slovene", - iso_code="sl", - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=["ISO-8859-2", "WINDOWS-1250"], - alphabet="abcčdefghijklmnoprsštuvzžABCČDEFGHIJKLMNOPRSŠTUVZŽ", - wiki_start_pages=["Glavna_stran"], - ), - # Serbian can be written in both Latin and Cyrillic, but there's no - # simple way to get the Latin alphabet pages from Wikipedia through - # the API, so for now we just support Cyrillic. - "Serbian": Language( - name="Serbian", - iso_code="sr", - alphabet="АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШабвгдђежзијклљмнњопрстћуфхцчџш", - charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"], - wiki_start_pages=["Главна_страна"], - ), - "Thai": Language( - name="Thai", - iso_code="th", - use_ascii=False, - charsets=["ISO-8859-11", "TIS-620", "CP874"], - alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛", - wiki_start_pages=["หน้าหลัก"], - ), - "Turkish": Language( - name="Turkish", - iso_code="tr", - # Q, W, and X are not used by Turkish - use_ascii=False, - charsets=["ISO-8859-3", "ISO-8859-9", "WINDOWS-1254"], - alphabet="abcçdefgğhıijklmnoöprsştuüvyzâîûABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZÂÎÛ", - wiki_start_pages=["Ana_Sayfa"], - ), - "Vietnamese": Language( - name="Vietnamese", - iso_code="vi", - use_ascii=False, - # Windows-1258 is the only common 8-bit - # Vietnamese encoding supported by Python. - # From Wikipedia: - # For systems that lack support for Unicode, - # dozens of 8-bit Vietnamese code pages are - # available.[1] The most common are VISCII - # (TCVN 5712:1993), VPS, and Windows-1258.[3] - # Where ASCII is required, such as when - # ensuring readability in plain text e-mail, - # Vietnamese letters are often encoded - # according to Vietnamese Quoted-Readable - # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4] - # though usage of either variable-width - # scheme has declined dramatically following - # the adoption of Unicode on the World Wide - # Web. - charsets=["WINDOWS-1258"], - alphabet="aăâbcdđeêghiklmnoôơpqrstuưvxyAĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY", - wiki_start_pages=["Chữ_Quốc_ngữ"], - ), -} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py deleted file mode 100644 index 7d36e64c..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import TYPE_CHECKING, Optional - -if TYPE_CHECKING: - # TypedDict was introduced in Python 3.8. - # - # TODO: Remove the else block and TYPE_CHECKING check when dropping support - # for Python 3.7. - from typing import TypedDict - - class ResultDict(TypedDict): - encoding: Optional[str] - confidence: float - language: Optional[str] - -else: - ResultDict = dict diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py deleted file mode 100644 index 0ffbcdd2..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py +++ /dev/null @@ -1,162 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Dict, List, NamedTuple, Optional, Union - -from .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -class SingleByteCharSetModel(NamedTuple): - charset_name: str - language: str - char_to_order_map: Dict[int, int] - language_model: Dict[int, Dict[int, int]] - typical_positive_ratio: float - keep_ascii_letters: bool - alphabet: str - - -class SingleByteCharSetProber(CharSetProber): - SAMPLE_SIZE = 64 - SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 - POSITIVE_SHORTCUT_THRESHOLD = 0.95 - NEGATIVE_SHORTCUT_THRESHOLD = 0.05 - - def __init__( - self, - model: SingleByteCharSetModel, - is_reversed: bool = False, - name_prober: Optional[CharSetProber] = None, - ) -> None: - super().__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = is_reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = 255 - self._seq_counters: List[int] = [] - self._total_seqs = 0 - self._total_char = 0 - self._control_char = 0 - self._freq_char = 0 - self.reset() - - def reset(self) -> None: - super().reset() - # char order of last character - self._last_order = 255 - self._seq_counters = [0] * SequenceLikelihood.get_num_categories() - self._total_seqs = 0 - self._total_char = 0 - self._control_char = 0 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self) -> Optional[str]: - if self._name_prober: - return self._name_prober.charset_name - return self._model.charset_name - - @property - def language(self) -> Optional[str]: - if self._name_prober: - return self._name_prober.language - return self._model.language - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - # TODO: Make filter_international_words keep things in self.alphabet - if not self._model.keep_ascii_letters: - byte_str = self.filter_international_words(byte_str) - else: - byte_str = self.remove_xml_tags(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model.char_to_order_map - language_model = self._model.language_model - for char in byte_str: - order = char_to_order_map.get(char, CharacterCategory.UNDEFINED) - # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but - # CharacterCategory.SYMBOL is actually 253, so we use CONTROL - # to make it closer to the original intent. The only difference - # is whether or not we count digits and control characters for - # _total_char purposes. - if order < CharacterCategory.CONTROL: - self._total_char += 1 - if order < self.SAMPLE_SIZE: - self._freq_char += 1 - if self._last_order < self.SAMPLE_SIZE: - self._total_seqs += 1 - if not self._reversed: - lm_cat = language_model[self._last_order][order] - else: - lm_cat = language_model[order][self._last_order] - self._seq_counters[lm_cat] += 1 - self._last_order = order - - charset_name = self._model.charset_name - if self.state == ProbingState.DETECTING: - if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: - confidence = self.get_confidence() - if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: - self.logger.debug( - "%s confidence = %s, we have a winner", charset_name, confidence - ) - self._state = ProbingState.FOUND_IT - elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: - self.logger.debug( - "%s confidence = %s, below negative shortcut threshold %s", - charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD, - ) - self._state = ProbingState.NOT_ME - - return self.state - - def get_confidence(self) -> float: - r = 0.01 - if self._total_seqs > 0: - r = ( - ( - self._seq_counters[SequenceLikelihood.POSITIVE] - + 0.25 * self._seq_counters[SequenceLikelihood.LIKELY] - ) - / self._total_seqs - / self._model.typical_positive_ratio - ) - # The more control characters (proportionnaly to the size - # of the text), the less confident we become in the current - # charset. - r = r * (self._total_char - self._control_char) / self._total_char - r = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py deleted file mode 100644 index 890ae846..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,88 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .hebrewprober import HebrewProber -from .langbulgarianmodel import ISO_8859_5_BULGARIAN_MODEL, WINDOWS_1251_BULGARIAN_MODEL -from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL -from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL - -# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL, -# WINDOWS_1250_HUNGARIAN_MODEL) -from .langrussianmodel import ( - IBM855_RUSSIAN_MODEL, - IBM866_RUSSIAN_MODEL, - ISO_8859_5_RUSSIAN_MODEL, - KOI8_R_RUSSIAN_MODEL, - MACCYRILLIC_RUSSIAN_MODEL, - WINDOWS_1251_RUSSIAN_MODEL, -) -from .langthaimodel import TIS_620_THAI_MODEL -from .langturkishmodel import ISO_8859_9_TURKISH_MODEL -from .sbcharsetprober import SingleByteCharSetProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self) -> None: - super().__init__() - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber( - WINDOWS_1255_HEBREW_MODEL, is_reversed=False, name_prober=hebrew_prober - ) - # TODO: See if using ISO-8859-8 Hebrew model works better here, since - # it's actually the visual one - visual_hebrew_prober = SingleByteCharSetProber( - WINDOWS_1255_HEBREW_MODEL, is_reversed=True, name_prober=hebrew_prober - ) - hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) - # TODO: ORDER MATTERS HERE. I changed the order vs what was in master - # and several tests failed that did not before. Some thought - # should be put into the ordering, and we should consider making - # order not matter here, because that is very counter-intuitive. - self.probers = [ - SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL), - SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL), - SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL), - SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL), - SingleByteCharSetProber(IBM866_RUSSIAN_MODEL), - SingleByteCharSetProber(IBM855_RUSSIAN_MODEL), - SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL), - SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL), - SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL), - SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL), - # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL), - SingleByteCharSetProber(TIS_620_THAI_MODEL), - SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL), - hebrew_prober, - logical_hebrew_prober, - visual_hebrew_prober, - ] - self.reset() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py deleted file mode 100644 index 91df0779..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py +++ /dev/null @@ -1,105 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Union - -from .chardistribution import SJISDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .enums import MachineState, ProbingState -from .jpcntx import SJISContextAnalysis -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import SJIS_SM_MODEL - - -class SJISProber(MultiByteCharSetProber): - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) - self.distribution_analyzer = SJISDistributionAnalysis() - self.context_analyzer = SJISContextAnalysis() - self.reset() - - def reset(self) -> None: - super().reset() - self.context_analyzer.reset() - - @property - def charset_name(self) -> str: - return self.context_analyzer.charset_name - - @property - def language(self) -> str: - return "Japanese" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - assert self.coding_sm is not None - assert self.distribution_analyzer is not None - - for i, byte in enumerate(byte_str): - coding_state = self.coding_sm.next_state(byte) - if coding_state == MachineState.ERROR: - self.logger.debug( - "%s %s prober hit error at byte %s", - self.charset_name, - self.language, - i, - ) - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte - self.context_analyzer.feed( - self._last_char[2 - char_len :], char_len - ) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed( - byte_str[i + 1 - char_len : i + 3 - char_len], char_len - ) - self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if self.context_analyzer.got_enough_data() and ( - self.get_confidence() > self.SHORTCUT_THRESHOLD - ): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - assert self.distribution_analyzer is not None - - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py deleted file mode 100644 index 30c441dc..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py +++ /dev/null @@ -1,362 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### -""" -Module containing the UniversalDetector detector class, which is the primary -class a user of ``chardet`` should use. - -:author: Mark Pilgrim (initial port to Python) -:author: Shy Shalom (original C code) -:author: Dan Blanchard (major refactoring for 3.0) -:author: Ian Cordasco -""" - - -import codecs -import logging -import re -from typing import List, Optional, Union - -from .charsetgroupprober import CharSetGroupProber -from .charsetprober import CharSetProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .macromanprober import MacRomanProber -from .mbcsgroupprober import MBCSGroupProber -from .resultdict import ResultDict -from .sbcsgroupprober import SBCSGroupProber -from .utf1632prober import UTF1632Prober - - -class UniversalDetector: - """ - The ``UniversalDetector`` class underlies the ``chardet.detect`` function - and coordinates all of the different charset probers. - - To get a ``dict`` containing an encoding and its confidence, you can simply - run: - - .. code:: - - u = UniversalDetector() - u.feed(some_bytes) - u.close() - detected = u.result - - """ - - MINIMUM_THRESHOLD = 0.20 - HIGH_BYTE_DETECTOR = re.compile(b"[\x80-\xFF]") - ESC_DETECTOR = re.compile(b"(\033|~{)") - WIN_BYTE_DETECTOR = re.compile(b"[\x80-\x9F]") - ISO_WIN_MAP = { - "iso-8859-1": "Windows-1252", - "iso-8859-2": "Windows-1250", - "iso-8859-5": "Windows-1251", - "iso-8859-6": "Windows-1256", - "iso-8859-7": "Windows-1253", - "iso-8859-8": "Windows-1255", - "iso-8859-9": "Windows-1254", - "iso-8859-13": "Windows-1257", - } - # Based on https://encoding.spec.whatwg.org/#names-and-labels - # but altered to match Python names for encodings and remove mappings - # that break tests. - LEGACY_MAP = { - "ascii": "Windows-1252", - "iso-8859-1": "Windows-1252", - "tis-620": "ISO-8859-11", - "iso-8859-9": "Windows-1254", - "gb2312": "GB18030", - "euc-kr": "CP949", - "utf-16le": "UTF-16", - } - - def __init__( - self, - lang_filter: LanguageFilter = LanguageFilter.ALL, - should_rename_legacy: bool = False, - ) -> None: - self._esc_charset_prober: Optional[EscCharSetProber] = None - self._utf1632_prober: Optional[UTF1632Prober] = None - self._charset_probers: List[CharSetProber] = [] - self.result: ResultDict = { - "encoding": None, - "confidence": 0.0, - "language": None, - } - self.done = False - self._got_data = False - self._input_state = InputState.PURE_ASCII - self._last_char = b"" - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = False - self.should_rename_legacy = should_rename_legacy - self.reset() - - @property - def input_state(self) -> int: - return self._input_state - - @property - def has_win_bytes(self) -> bool: - return self._has_win_bytes - - @property - def charset_probers(self) -> List[CharSetProber]: - return self._charset_probers - - def reset(self) -> None: - """ - Reset the UniversalDetector and all of its probers back to their - initial states. This is called by ``__init__``, so you only need to - call this directly in between analyses of different documents. - """ - self.result = {"encoding": None, "confidence": 0.0, "language": None} - self.done = False - self._got_data = False - self._has_win_bytes = False - self._input_state = InputState.PURE_ASCII - self._last_char = b"" - if self._esc_charset_prober: - self._esc_charset_prober.reset() - if self._utf1632_prober: - self._utf1632_prober.reset() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str: Union[bytes, bytearray]) -> None: - """ - Takes a chunk of a document and feeds it through all of the relevant - charset probers. - - After calling ``feed``, you can check the value of the ``done`` - attribute to see if you need to continue feeding the - ``UniversalDetector`` more data, or if it has made a prediction - (in the ``result`` attribute). - - .. note:: - You should always call ``close`` when you're done feeding in your - document if ``done`` is not already ``True``. - """ - if self.done: - return - - if not byte_str: - return - - if not isinstance(byte_str, bytearray): - byte_str = bytearray(byte_str) - - # First check for known BOMs, since these are guaranteed to be correct - if not self._got_data: - # If the data starts with BOM, we know it is UTF - if byte_str.startswith(codecs.BOM_UTF8): - # EF BB BF UTF-8 with BOM - self.result = { - "encoding": "UTF-8-SIG", - "confidence": 1.0, - "language": "", - } - elif byte_str.startswith((codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE)): - # FF FE 00 00 UTF-32, little-endian BOM - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {"encoding": "UTF-32", "confidence": 1.0, "language": ""} - elif byte_str.startswith(b"\xFE\xFF\x00\x00"): - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - # TODO: This encoding is not supported by Python. Should remove? - "encoding": "X-ISO-10646-UCS-4-3412", - "confidence": 1.0, - "language": "", - } - elif byte_str.startswith(b"\x00\x00\xFF\xFE"): - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - # TODO: This encoding is not supported by Python. Should remove? - "encoding": "X-ISO-10646-UCS-4-2143", - "confidence": 1.0, - "language": "", - } - elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): - # FF FE UTF-16, little endian BOM - # FE FF UTF-16, big endian BOM - self.result = {"encoding": "UTF-16", "confidence": 1.0, "language": ""} - - self._got_data = True - if self.result["encoding"] is not None: - self.done = True - return - - # If none of those matched and we've only see ASCII so far, check - # for high bytes and escape sequences - if self._input_state == InputState.PURE_ASCII: - if self.HIGH_BYTE_DETECTOR.search(byte_str): - self._input_state = InputState.HIGH_BYTE - elif ( - self._input_state == InputState.PURE_ASCII - and self.ESC_DETECTOR.search(self._last_char + byte_str) - ): - self._input_state = InputState.ESC_ASCII - - self._last_char = byte_str[-1:] - - # next we will look to see if it is appears to be either a UTF-16 or - # UTF-32 encoding - if not self._utf1632_prober: - self._utf1632_prober = UTF1632Prober() - - if self._utf1632_prober.state == ProbingState.DETECTING: - if self._utf1632_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = { - "encoding": self._utf1632_prober.charset_name, - "confidence": self._utf1632_prober.get_confidence(), - "language": "", - } - self.done = True - return - - # If we've seen escape sequences, use the EscCharSetProber, which - # uses a simple state machine to check for known escape sequences in - # HZ and ISO-2022 encodings, since those are the only encodings that - # use such sequences. - if self._input_state == InputState.ESC_ASCII: - if not self._esc_charset_prober: - self._esc_charset_prober = EscCharSetProber(self.lang_filter) - if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = { - "encoding": self._esc_charset_prober.charset_name, - "confidence": self._esc_charset_prober.get_confidence(), - "language": self._esc_charset_prober.language, - } - self.done = True - # If we've seen high bytes (i.e., those with values greater than 127), - # we need to do more complicated checks using all our multi-byte and - # single-byte probers that are left. The single-byte probers - # use character bigram distributions to determine the encoding, whereas - # the multi-byte probers use a combination of character unigram and - # bigram distributions. - elif self._input_state == InputState.HIGH_BYTE: - if not self._charset_probers: - self._charset_probers = [MBCSGroupProber(self.lang_filter)] - # If we're checking non-CJK encodings, use single-byte prober - if self.lang_filter & LanguageFilter.NON_CJK: - self._charset_probers.append(SBCSGroupProber()) - self._charset_probers.append(Latin1Prober()) - self._charset_probers.append(MacRomanProber()) - for prober in self._charset_probers: - if prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = { - "encoding": prober.charset_name, - "confidence": prober.get_confidence(), - "language": prober.language, - } - self.done = True - break - if self.WIN_BYTE_DETECTOR.search(byte_str): - self._has_win_bytes = True - - def close(self) -> ResultDict: - """ - Stop analyzing the current document and come up with a final - prediction. - - :returns: The ``result`` attribute, a ``dict`` with the keys - `encoding`, `confidence`, and `language`. - """ - # Don't bother with checks if we're already done - if self.done: - return self.result - self.done = True - - if not self._got_data: - self.logger.debug("no data received!") - - # Default to ASCII if it is all we've seen so far - elif self._input_state == InputState.PURE_ASCII: - self.result = {"encoding": "ascii", "confidence": 1.0, "language": ""} - - # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD - elif self._input_state == InputState.HIGH_BYTE: - prober_confidence = None - max_prober_confidence = 0.0 - max_prober = None - for prober in self._charset_probers: - if not prober: - continue - prober_confidence = prober.get_confidence() - if prober_confidence > max_prober_confidence: - max_prober_confidence = prober_confidence - max_prober = prober - if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): - charset_name = max_prober.charset_name - assert charset_name is not None - lower_charset_name = charset_name.lower() - confidence = max_prober.get_confidence() - # Use Windows encoding name instead of ISO-8859 if we saw any - # extra Windows-specific bytes - if lower_charset_name.startswith("iso-8859"): - if self._has_win_bytes: - charset_name = self.ISO_WIN_MAP.get( - lower_charset_name, charset_name - ) - # Rename legacy encodings with superset encodings if asked - if self.should_rename_legacy: - charset_name = self.LEGACY_MAP.get( - (charset_name or "").lower(), charset_name - ) - self.result = { - "encoding": charset_name, - "confidence": confidence, - "language": max_prober.language, - } - - # Log all prober confidences if none met MINIMUM_THRESHOLD - if self.logger.getEffectiveLevel() <= logging.DEBUG: - if self.result["encoding"] is None: - self.logger.debug("no probers hit minimum threshold") - for group_prober in self._charset_probers: - if not group_prober: - continue - if isinstance(group_prober, CharSetGroupProber): - for prober in group_prober.probers: - self.logger.debug( - "%s %s confidence = %s", - prober.charset_name, - prober.language, - prober.get_confidence(), - ) - else: - self.logger.debug( - "%s %s confidence = %s", - group_prober.charset_name, - group_prober.language, - group_prober.get_confidence(), - ) - return self.result diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py deleted file mode 100644 index 6bdec63d..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# -# Contributor(s): -# Jason Zavaglia -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### -from typing import List, Union - -from .charsetprober import CharSetProber -from .enums import ProbingState - - -class UTF1632Prober(CharSetProber): - """ - This class simply looks for occurrences of zero bytes, and infers - whether the file is UTF16 or UTF32 (low-endian or big-endian) - For instance, files looking like ( \0 \0 \0 [nonzero] )+ - have a good probability to be UTF32BE. Files looking like ( \0 [nonzero] )+ - may be guessed to be UTF16BE, and inversely for little-endian varieties. - """ - - # how many logical characters to scan before feeling confident of prediction - MIN_CHARS_FOR_DETECTION = 20 - # a fixed constant ratio of expected zeros or non-zeros in modulo-position. - EXPECTED_RATIO = 0.94 - - def __init__(self) -> None: - super().__init__() - self.position = 0 - self.zeros_at_mod = [0] * 4 - self.nonzeros_at_mod = [0] * 4 - self._state = ProbingState.DETECTING - self.quad = [0, 0, 0, 0] - self.invalid_utf16be = False - self.invalid_utf16le = False - self.invalid_utf32be = False - self.invalid_utf32le = False - self.first_half_surrogate_pair_detected_16be = False - self.first_half_surrogate_pair_detected_16le = False - self.reset() - - def reset(self) -> None: - super().reset() - self.position = 0 - self.zeros_at_mod = [0] * 4 - self.nonzeros_at_mod = [0] * 4 - self._state = ProbingState.DETECTING - self.invalid_utf16be = False - self.invalid_utf16le = False - self.invalid_utf32be = False - self.invalid_utf32le = False - self.first_half_surrogate_pair_detected_16be = False - self.first_half_surrogate_pair_detected_16le = False - self.quad = [0, 0, 0, 0] - - @property - def charset_name(self) -> str: - if self.is_likely_utf32be(): - return "utf-32be" - if self.is_likely_utf32le(): - return "utf-32le" - if self.is_likely_utf16be(): - return "utf-16be" - if self.is_likely_utf16le(): - return "utf-16le" - # default to something valid - return "utf-16" - - @property - def language(self) -> str: - return "" - - def approx_32bit_chars(self) -> float: - return max(1.0, self.position / 4.0) - - def approx_16bit_chars(self) -> float: - return max(1.0, self.position / 2.0) - - def is_likely_utf32be(self) -> bool: - approx_chars = self.approx_32bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - self.zeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO - and self.nonzeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO - and not self.invalid_utf32be - ) - - def is_likely_utf32le(self) -> bool: - approx_chars = self.approx_32bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - self.nonzeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO - and self.zeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO - and not self.invalid_utf32le - ) - - def is_likely_utf16be(self) -> bool: - approx_chars = self.approx_16bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - (self.nonzeros_at_mod[1] + self.nonzeros_at_mod[3]) / approx_chars - > self.EXPECTED_RATIO - and (self.zeros_at_mod[0] + self.zeros_at_mod[2]) / approx_chars - > self.EXPECTED_RATIO - and not self.invalid_utf16be - ) - - def is_likely_utf16le(self) -> bool: - approx_chars = self.approx_16bit_chars() - return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( - (self.nonzeros_at_mod[0] + self.nonzeros_at_mod[2]) / approx_chars - > self.EXPECTED_RATIO - and (self.zeros_at_mod[1] + self.zeros_at_mod[3]) / approx_chars - > self.EXPECTED_RATIO - and not self.invalid_utf16le - ) - - def validate_utf32_characters(self, quad: List[int]) -> None: - """ - Validate if the quad of bytes is valid UTF-32. - - UTF-32 is valid in the range 0x00000000 - 0x0010FFFF - excluding 0x0000D800 - 0x0000DFFF - - https://en.wikipedia.org/wiki/UTF-32 - """ - if ( - quad[0] != 0 - or quad[1] > 0x10 - or (quad[0] == 0 and quad[1] == 0 and 0xD8 <= quad[2] <= 0xDF) - ): - self.invalid_utf32be = True - if ( - quad[3] != 0 - or quad[2] > 0x10 - or (quad[3] == 0 and quad[2] == 0 and 0xD8 <= quad[1] <= 0xDF) - ): - self.invalid_utf32le = True - - def validate_utf16_characters(self, pair: List[int]) -> None: - """ - Validate if the pair of bytes is valid UTF-16. - - UTF-16 is valid in the range 0x0000 - 0xFFFF excluding 0xD800 - 0xFFFF - with an exception for surrogate pairs, which must be in the range - 0xD800-0xDBFF followed by 0xDC00-0xDFFF - - https://en.wikipedia.org/wiki/UTF-16 - """ - if not self.first_half_surrogate_pair_detected_16be: - if 0xD8 <= pair[0] <= 0xDB: - self.first_half_surrogate_pair_detected_16be = True - elif 0xDC <= pair[0] <= 0xDF: - self.invalid_utf16be = True - else: - if 0xDC <= pair[0] <= 0xDF: - self.first_half_surrogate_pair_detected_16be = False - else: - self.invalid_utf16be = True - - if not self.first_half_surrogate_pair_detected_16le: - if 0xD8 <= pair[1] <= 0xDB: - self.first_half_surrogate_pair_detected_16le = True - elif 0xDC <= pair[1] <= 0xDF: - self.invalid_utf16le = True - else: - if 0xDC <= pair[1] <= 0xDF: - self.first_half_surrogate_pair_detected_16le = False - else: - self.invalid_utf16le = True - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for c in byte_str: - mod4 = self.position % 4 - self.quad[mod4] = c - if mod4 == 3: - self.validate_utf32_characters(self.quad) - self.validate_utf16_characters(self.quad[0:2]) - self.validate_utf16_characters(self.quad[2:4]) - if c == 0: - self.zeros_at_mod[mod4] += 1 - else: - self.nonzeros_at_mod[mod4] += 1 - self.position += 1 - return self.state - - @property - def state(self) -> ProbingState: - if self._state in {ProbingState.NOT_ME, ProbingState.FOUND_IT}: - # terminal, decided states - return self._state - if self.get_confidence() > 0.80: - self._state = ProbingState.FOUND_IT - elif self.position > 4 * 1024: - # if we get to 4kb into the file, and we can't conclude it's UTF, - # let's give up - self._state = ProbingState.NOT_ME - return self._state - - def get_confidence(self) -> float: - return ( - 0.85 - if ( - self.is_likely_utf16le() - or self.is_likely_utf16be() - or self.is_likely_utf32le() - or self.is_likely_utf32be() - ) - else 0.00 - ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py deleted file mode 100644 index d96354d9..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py +++ /dev/null @@ -1,82 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from typing import Union - -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import MachineState, ProbingState -from .mbcssm import UTF8_SM_MODEL - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self) -> None: - super().__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = 0 - self.reset() - - def reset(self) -> None: - super().reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self) -> str: - return "utf-8" - - @property - def language(self) -> str: - return "" - - def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState: - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - if coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - if coding_state == MachineState.START: - if self.coding_sm.get_current_charlen() >= 2: - self._num_mb_chars += 1 - - if self.state == ProbingState.DETECTING: - if self.get_confidence() > self.SHORTCUT_THRESHOLD: - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self) -> float: - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB**self._num_mb_chars - return 1.0 - unlike - return unlike diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/version.py b/env/lib/python3.12/site-packages/pip/_vendor/chardet/version.py deleted file mode 100644 index c5e9d85c..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -This module exists only to simplify retrieving the version number of chardet -from within setuptools and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "5.1.0" -VERSION = __version__.split(".") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py deleted file mode 100644 index 383101cd..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console -from .ansi import Fore, Back, Style, Cursor -from .ansitowin32 import AnsiToWin32 - -__version__ = '0.4.6' - diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 798b8149c1339d6250263114f8f16325eb9ce2b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510 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 Ja^1(d`WI1!Kt%um diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc deleted file mode 100644 index d27ef868849b7611ca99939d50ebf65741aab1c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16439 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 IKN;x%08}AeC;$Ke diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc deleted file mode 100644 index 1467af2a38e99301fd3e1064c3b56589cbe43ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3568 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc deleted file mode 100644 index 949fee3c2ffb4e851a8daa26f240d8f51fb47b28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9106 zcmd^FZ)_XKmER?IS4)Z#B~h{{>rdoZYD~)#>%VdA#J2uWvSOKvB{_-cIy_3diYZg1 zI=iwgmbyBDaYqMD69Xx10R`j_1uDVC#rFre7Pv!;ek#x}+R84~h3_thD-O^%!_plJ zf4cW(xl4-K#J=DT_u&TQo0&InW@q1f^P4wA{{Y6&lk2n zgu)%h#Yl|ACYTvE!m^Cyl(>X*hKq14<6s6DiNDE6g3RA{8oeR{<(2_gEaH|?t_!&C zBCaTv-((`L1fbku`VaJ&t9Gz#bJI9%MHc+vNLkC#B;(b|-rj)5Gv80rc zCt2f(l;YFzyX6ORhf%FIiM^jMf5-+L;k0k;N?d7;E6G>X*7KVCb^p(GVdi z0!22eV2{>kv%!msOqAf&7>OmjCa%QPcr4f_D_7OjY;YD@Qps2%ctuVmQu8U2kb-jZ zS}+lx2+l63S5nEtT?Y>ZmAEQ*&c-IM#@?5e;B0(07`-OLQ%P_#l}M4;Oe_eqP-QaH zHM>CY4JbhqD3w5NFpn$i)^>HQR~}ds4{QO4*~HnwJbCDN_|PP>%w)dx)&bz$VPw#x z#6%nt8*xgG2q!rsyu?KWiI0>?LPV6xA}&dcxEEXjw=TXDPxj)Rhyywk7m!UXZQ`Uh zIV3o%O#w+6kZ_<}7o*W+Y(|bob$2v6lal5VSoTDt-<^vk@-2MNPeI{4cMpWZW8Jzi9vT`Nen;m(WPFt&B0PiOgNVl@SWxx@xyfu) zdT)e~^zAJ5Vs!vXKadaljA5{&y`~I*vD4H77vQN@M%9IcOtrF!bK1NCBpeWk4{}nA zqz;HKgoj7YcMs`8&&c4w*)hG^$fG^*_5&ls7sGv|1%(Um)rwUl_3%|{fWUk0Zh@KS ziN@6#;wZFZ{%9FYTLeh4rD64et$~8If$~xntWXwgUM&fbmqA_zxhU00BIGW}U68va zH%OO5tsH6|$tQUruaIh`3dk!VuY}wyc|ocQG*hRSfxnD_-`X$38gRwpWjJk4n9kZD zs#Tsw_bN%|vYkeUD@hq9YW2u4)8!@2Pz5gPxg?omve=G3QIcR>bU2zoqRK26a*)84 zK@&)z^-B^+So4uss9DchU;u!q9|bB1!mqx2KvsKGNhOt#M<mqVv(I6p{4`v(2dT(FuT^A}*~8 zQ3btOue5}Xx)4po-@l@+vO1^8i75jC>FUEZ9#6*AXf$1wH+h%IL4Q^*0RfouH|PAv zHUIH{sQYEpFPhf<{W<@L<{!y&Kd9IcJ)czGs{B;Fvv_;)q1e9Byk|MG6v=WA#oar~ zEiW%$UAl_=#wTv3-k;?@E~g8?-pP{ip@LH?I+$KO;wUl7@;zg}CtBI<`c$OJ5FyQ0PFhM9IULb&y1wFMQw+%@< z5>#8jL5@MD^VedDIa$FMYi%_^zZ1#@ty$iVY~?r*&|2N@yBBVcgNL~{b~WDp?(OM& z-CA9HzW(Fu%imx6{@?j?2hVBndFhXTeTTb}z zP(dfW;Q@6)xil@Z8H7Yjy%`5-%P`kjyS1oVE71A5C9(!LS{HRg@IPAQb#|H?VRD`97SoK;w1L6)!LMVC$NQwCdfK@ObiuRz;yFgyZe7VM>8hkuQiwu}+I;J%pTWdU~d5(Rh z2`%h^Cs`&Ofy#etAu`i;=;hey^oF{ekGY!;L8zoFOwXoL z=Yd5ddDKl+_Kl5Nf3Efwt@f2{2(TPnyZkF0w)kz)d9l8A7YKdZDp)rV?Ki0J`L_d zBO`kKs1*Q?$=6jY(#vB8IfdQM&>qI2x5VjC{b`@2*}~p13JvBqnb+@~@a^z=ZCf_< zxO&%}rrS+f;Sc4tkLz~d`OfX{WcweB6*;k86Wi}it;mnWBVQ9~7}_ozvF!pa&_Uh~ zwt9AC902+@+JzXUg2J(-V=8GAeOQtfgk>BwK%+-jP`MjaKmw?{DrvrV4vy>OtrVQc z z`%dP3Lz-_WD?SkzSM?|EkKCWeZh1d;Z-`Yz6>ojkYv|f~V;IWvYz#Z8XR`~83S}eN zX*}<{rig8L3%+Zu4m<6a`Yt&K!+|eSRifjPAt1WH;I%vTYPv0YA9Y)*+nqkE`)CM5 z?NQKdqp4Y&#z`1W!B_>c!nao52nwz6eYF>VOB26!@7l`sN8<4>Z*quosOhcW1A!AN zP$Svul*>2)4@?nzopOLV)~V4FWip((0v7oUZ;KQTdJy5KQN1N8!(!W%V^Juwn01mY z2xqvAAhADlnAdNJI1qvNLkKCvr0F?D4V0CbkBmWgf*S<6faGl;AVlME_PWk46f8&3 zkb1Q-kStl|Qt*9YjbJhki4~KEK@HJ#ooUV;>>22#Tm%9u#SVjLeAA}++U~u*?mLhb zH=5h=oVc=Q>AjVAKaZ?Ne!ge*y|t#-*Te=2SB9b2f@gkH_j_^p%c}_Sh1&W7;PG>9 zZD2oiF_JBAJ$L;&oy~1+Z7*qKZ9Ke!H`&YEc@Z}a!EI@>yZOM8VO%?Dn{m-M z7X>_PUfl;CRAb+Bu`I)9gf#SD6q9e@DU?b#6nS)2>D=&?3RkxI{S!tIpzll2*ZB?l z^3WG?vw(RuUw&Q&F0?aZrtCgqE+n>CzSiIsQ@}`O8ZYchk{M&{9Lt({ebFrZC0(Hk zv*69Q#x)G9STOF2=ypb6Q)Hg8t#I0dgS>G&o4-V&0R_cnW3v;a`O$brq@OV2g*g zUA?)kkOrTY&~Lch*~{A5%ek{r4L&W=HL($n zW}hDX=(UZ8=3GOU*3gxGbEEmdTChiJ?zt7-sHpz*!bjte8(Nkdmm2R~SYg*2_M^nN zzozZLtuWo<{)jQzK26-Wvg?8GLGoAA55)_`yxPBS`RkVTgWbP6wKjVBq4-{YCV%u) z=REu2D7bR$!Ldi46Hj=?W85Q87RMMCI{wA~1v;A8al#(WD9YI&j~#Z|k6j~l-`7c4HLZFEl+N_Dqci~jq zMyGB(5`yG@xXy=288Uj&+8?Mc`Av`D4V9)Uml zv`T=6Dv^I}t5)FOVz;VV_>)^_*m^$7ZXIIzcH0#UCO}_}vk{J?FX4 z9Tzl3*agP|vzJk=?LkGyqG<~Mv*2Wzab|(F{;dFhH5PCg{w&PHKMWEH_zf?fjLpWQ z@DrX&f8WM#zYefK!|<;KVMe(& zN%Bf9ADo#@5tV8~H?G@sAvG~APpZa$2wLGS>B^%oUa~HqiLV>~U^qqo9OS_E#$gra zz_L#`j_v#>uI)cO3|qS`h-_8%+BO5(_AV#;5|$y`c8@yP_UzO)gZWm1t7hx|^yD(n jh`y(cgYDdQuzcqeCzPHk=*Axkhnc?>PdWdQJ>~o_0(qca diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py b/env/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py deleted file mode 100644 index 11ec695f..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -''' -This module generates ANSI character codes to printing colors to terminals. -See: http://en.wikipedia.org/wiki/ANSI_escape_code -''' - -CSI = '\033[' -OSC = '\033]' -BEL = '\a' - - -def code_to_chars(code): - return CSI + str(code) + 'm' - -def set_title(title): - return OSC + '2;' + title + BEL - -def clear_screen(mode=2): - return CSI + str(mode) + 'J' - -def clear_line(mode=2): - return CSI + str(mode) + 'K' - - -class AnsiCodes(object): - def __init__(self): - # the subclasses declare class attributes which are numbers. - # Upon instantiation we define instance attributes, which are the same - # as the class attributes but wrapped with the ANSI escape sequence - for name in dir(self): - if not name.startswith('_'): - value = getattr(self, name) - setattr(self, name, code_to_chars(value)) - - -class AnsiCursor(object): - def UP(self, n=1): - return CSI + str(n) + 'A' - def DOWN(self, n=1): - return CSI + str(n) + 'B' - def FORWARD(self, n=1): - return CSI + str(n) + 'C' - def BACK(self, n=1): - return CSI + str(n) + 'D' - def POS(self, x=1, y=1): - return CSI + str(y) + ';' + str(x) + 'H' - - -class AnsiFore(AnsiCodes): - BLACK = 30 - RED = 31 - GREEN = 32 - YELLOW = 33 - BLUE = 34 - MAGENTA = 35 - CYAN = 36 - WHITE = 37 - RESET = 39 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 90 - LIGHTRED_EX = 91 - LIGHTGREEN_EX = 92 - LIGHTYELLOW_EX = 93 - LIGHTBLUE_EX = 94 - LIGHTMAGENTA_EX = 95 - LIGHTCYAN_EX = 96 - LIGHTWHITE_EX = 97 - - -class AnsiBack(AnsiCodes): - BLACK = 40 - RED = 41 - GREEN = 42 - YELLOW = 43 - BLUE = 44 - MAGENTA = 45 - CYAN = 46 - WHITE = 47 - RESET = 49 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 100 - LIGHTRED_EX = 101 - LIGHTGREEN_EX = 102 - LIGHTYELLOW_EX = 103 - LIGHTBLUE_EX = 104 - LIGHTMAGENTA_EX = 105 - LIGHTCYAN_EX = 106 - LIGHTWHITE_EX = 107 - - -class AnsiStyle(AnsiCodes): - BRIGHT = 1 - DIM = 2 - NORMAL = 22 - RESET_ALL = 0 - -Fore = AnsiFore() -Back = AnsiBack() -Style = AnsiStyle() -Cursor = AnsiCursor() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py b/env/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py deleted file mode 100644 index abf209e6..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py +++ /dev/null @@ -1,277 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import re -import sys -import os - -from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL -from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle -from .win32 import windll, winapi_test - - -winterm = None -if windll is not None: - winterm = WinTerm() - - -class StreamWrapper(object): - ''' - Wraps a stream (such as stdout), acting as a transparent proxy for all - attribute access apart from method 'write()', which is delegated to our - Converter instance. - ''' - def __init__(self, wrapped, converter): - # double-underscore everything to prevent clashes with names of - # attributes on the wrapped stream object. - self.__wrapped = wrapped - self.__convertor = converter - - def __getattr__(self, name): - return getattr(self.__wrapped, name) - - def __enter__(self, *args, **kwargs): - # special method lookup bypasses __getattr__/__getattribute__, see - # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit - # thus, contextlib magic methods are not proxied via __getattr__ - return self.__wrapped.__enter__(*args, **kwargs) - - def __exit__(self, *args, **kwargs): - return self.__wrapped.__exit__(*args, **kwargs) - - def __setstate__(self, state): - self.__dict__ = state - - def __getstate__(self): - return self.__dict__ - - def write(self, text): - self.__convertor.write(text) - - def isatty(self): - stream = self.__wrapped - if 'PYCHARM_HOSTED' in os.environ: - if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): - return True - try: - stream_isatty = stream.isatty - except AttributeError: - return False - else: - return stream_isatty() - - @property - def closed(self): - stream = self.__wrapped - try: - return stream.closed - # AttributeError in the case that the stream doesn't support being closed - # ValueError for the case that the stream has already been detached when atexit runs - except (AttributeError, ValueError): - return True - - -class AnsiToWin32(object): - ''' - Implements a 'write()' method which, on Windows, will strip ANSI character - sequences from the text, and if outputting to a tty, will convert them into - win32 function calls. - ''' - ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer - ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command - - def __init__(self, wrapped, convert=None, strip=None, autoreset=False): - # The wrapped stream (normally sys.stdout or sys.stderr) - self.wrapped = wrapped - - # should we reset colors to defaults after every .write() - self.autoreset = autoreset - - # create the proxy wrapping our output stream - self.stream = StreamWrapper(wrapped, self) - - on_windows = os.name == 'nt' - # We test if the WinAPI works, because even if we are on Windows - # we may be using a terminal that doesn't support the WinAPI - # (e.g. Cygwin Terminal). In this case it's up to the terminal - # to support the ANSI codes. - conversion_supported = on_windows and winapi_test() - try: - fd = wrapped.fileno() - except Exception: - fd = -1 - system_has_native_ansi = not on_windows or enable_vt_processing(fd) - have_tty = not self.stream.closed and self.stream.isatty() - need_conversion = conversion_supported and not system_has_native_ansi - - # should we strip ANSI sequences from our output? - if strip is None: - strip = need_conversion or not have_tty - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = need_conversion and have_tty - self.convert = convert - - # dict of ansi codes to win32 functions and parameters - self.win32_calls = self.get_win32_calls() - - # are we wrapping stderr? - self.on_stderr = self.wrapped is sys.stderr - - def should_wrap(self): - ''' - True if this class is actually needed. If false, then the output - stream will not be affected, nor will win32 calls be issued, so - wrapping stdout is not actually required. This will generally be - False on non-Windows platforms, unless optional functionality like - autoreset has been requested using kwargs to init() - ''' - return self.convert or self.strip or self.autoreset - - def get_win32_calls(self): - if self.convert and winterm: - return { - AnsiStyle.RESET_ALL: (winterm.reset_all, ), - AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), - AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), - AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), - AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), - AnsiFore.RED: (winterm.fore, WinColor.RED), - AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), - AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), - AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), - AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), - AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), - AnsiFore.WHITE: (winterm.fore, WinColor.GREY), - AnsiFore.RESET: (winterm.fore, ), - AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), - AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), - AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), - AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), - AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), - AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), - AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), - AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), - AnsiBack.BLACK: (winterm.back, WinColor.BLACK), - AnsiBack.RED: (winterm.back, WinColor.RED), - AnsiBack.GREEN: (winterm.back, WinColor.GREEN), - AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), - AnsiBack.BLUE: (winterm.back, WinColor.BLUE), - AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), - AnsiBack.CYAN: (winterm.back, WinColor.CYAN), - AnsiBack.WHITE: (winterm.back, WinColor.GREY), - AnsiBack.RESET: (winterm.back, ), - AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), - AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), - AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), - AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), - AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), - AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), - AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), - AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), - } - return dict() - - def write(self, text): - if self.strip or self.convert: - self.write_and_convert(text) - else: - self.wrapped.write(text) - self.wrapped.flush() - if self.autoreset: - self.reset_all() - - - def reset_all(self): - if self.convert: - self.call_win32('m', (0,)) - elif not self.strip and not self.stream.closed: - self.wrapped.write(Style.RESET_ALL) - - - def write_and_convert(self, text): - ''' - Write the given text to our wrapped stream, stripping any ANSI - sequences from the text, and optionally converting them into win32 - calls. - ''' - cursor = 0 - text = self.convert_osc(text) - for match in self.ANSI_CSI_RE.finditer(text): - start, end = match.span() - self.write_plain_text(text, cursor, start) - self.convert_ansi(*match.groups()) - cursor = end - self.write_plain_text(text, cursor, len(text)) - - - def write_plain_text(self, text, start, end): - if start < end: - self.wrapped.write(text[start:end]) - self.wrapped.flush() - - - def convert_ansi(self, paramstring, command): - if self.convert: - params = self.extract_params(command, paramstring) - self.call_win32(command, params) - - - def extract_params(self, command, paramstring): - if command in 'Hf': - params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) - while len(params) < 2: - # defaults: - params = params + (1,) - else: - params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) - if len(params) == 0: - # defaults: - if command in 'JKm': - params = (0,) - elif command in 'ABCD': - params = (1,) - - return params - - - def call_win32(self, command, params): - if command == 'm': - for param in params: - if param in self.win32_calls: - func_args = self.win32_calls[param] - func = func_args[0] - args = func_args[1:] - kwargs = dict(on_stderr=self.on_stderr) - func(*args, **kwargs) - elif command in 'J': - winterm.erase_screen(params[0], on_stderr=self.on_stderr) - elif command in 'K': - winterm.erase_line(params[0], on_stderr=self.on_stderr) - elif command in 'Hf': # cursor position - absolute - winterm.set_cursor_position(params, on_stderr=self.on_stderr) - elif command in 'ABCD': # cursor position - relative - n = params[0] - # A - up, B - down, C - forward, D - back - x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] - winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) - - - def convert_osc(self, text): - for match in self.ANSI_OSC_RE.finditer(text): - start, end = match.span() - text = text[:start] + text[end:] - paramstring, command = match.groups() - if command == BEL: - if paramstring.count(";") == 1: - params = paramstring.split(";") - # 0 - change title and icon (we will only change title) - # 1 - change icon (we don't support this) - # 2 - change title - if params[0] in '02': - winterm.set_title(params[1]) - return text - - - def flush(self): - self.wrapped.flush() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py b/env/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py deleted file mode 100644 index d5fd4b71..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import atexit -import contextlib -import sys - -from .ansitowin32 import AnsiToWin32 - - -def _wipe_internal_state_for_tests(): - global orig_stdout, orig_stderr - orig_stdout = None - orig_stderr = None - - global wrapped_stdout, wrapped_stderr - wrapped_stdout = None - wrapped_stderr = None - - global atexit_done - atexit_done = False - - global fixed_windows_console - fixed_windows_console = False - - try: - # no-op if it wasn't registered - atexit.unregister(reset_all) - except AttributeError: - # python 2: no atexit.unregister. Oh well, we did our best. - pass - - -def reset_all(): - if AnsiToWin32 is not None: # Issue #74: objects might become None at exit - AnsiToWin32(orig_stdout).reset_all() - - -def init(autoreset=False, convert=None, strip=None, wrap=True): - - if not wrap and any([autoreset, convert, strip]): - raise ValueError('wrap=False conflicts with any other arg=True') - - global wrapped_stdout, wrapped_stderr - global orig_stdout, orig_stderr - - orig_stdout = sys.stdout - orig_stderr = sys.stderr - - if sys.stdout is None: - wrapped_stdout = None - else: - sys.stdout = wrapped_stdout = \ - wrap_stream(orig_stdout, convert, strip, autoreset, wrap) - if sys.stderr is None: - wrapped_stderr = None - else: - sys.stderr = wrapped_stderr = \ - wrap_stream(orig_stderr, convert, strip, autoreset, wrap) - - global atexit_done - if not atexit_done: - atexit.register(reset_all) - atexit_done = True - - -def deinit(): - if orig_stdout is not None: - sys.stdout = orig_stdout - if orig_stderr is not None: - sys.stderr = orig_stderr - - -def just_fix_windows_console(): - global fixed_windows_console - - if sys.platform != "win32": - return - if fixed_windows_console: - return - if wrapped_stdout is not None or wrapped_stderr is not None: - # Someone already ran init() and it did stuff, so we won't second-guess them - return - - # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the - # native ANSI support in the console as a side-effect. We only need to actually - # replace sys.stdout/stderr if we're in the old-style conversion mode. - new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False) - if new_stdout.convert: - sys.stdout = new_stdout - new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False) - if new_stderr.convert: - sys.stderr = new_stderr - - fixed_windows_console = True - -@contextlib.contextmanager -def colorama_text(*args, **kwargs): - init(*args, **kwargs) - try: - yield - finally: - deinit() - - -def reinit(): - if wrapped_stdout is not None: - sys.stdout = wrapped_stdout - if wrapped_stderr is not None: - sys.stderr = wrapped_stderr - - -def wrap_stream(stream, convert, strip, autoreset, wrap): - if wrap: - wrapper = AnsiToWin32(stream, - convert=convert, strip=strip, autoreset=autoreset) - if wrapper.should_wrap(): - stream = wrapper.stream - return stream - - -# Use this for initial setup as well, to reduce code duplication -_wipe_internal_state_for_tests() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py deleted file mode 100644 index 8c5661e9..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1857e4b38a5c1e0bec491e9d4239d6a4cfa6e19f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmZ9GJqp4=5QVe;fCxE=g&EXVtn36Ev0f%-G)vZZ0c2{>DhJz!lFcHU&B3ccQ;UZRPvpTW3$i9tu!93@c6dezyH*IX<`Q)SdK1Jmnto1Sx| z^CmSM`HG!M7y-fY4yCO4gn2cd>hGJ*1!PLd8QVvpvIGl=3Ob3pbm1CVB zT>|OWWsshXJK%8?780f~osWT`@Im52wtob%L_R08rLEw@V&|3$HHmu&nRVxDMZK28 z+DhKHhKqzE)DoF(JICea>mp~!BOwxSJ58Ep8PtxLcKFkIE#XLZCT%#Pm9ZSRW$Wg= zP3s^YGYm=}365kLi5nJ9y7T27brR5)I;T-B)pLDDv*VgNY*=%)nO4)#Vy3i&I%6af z=53QEbk#`RQWNp(YC2=jn5q7r-agfe+eUX9wo|)lSZX?+R%5q}lx|XW+Dw>KOKPeO z8(^s#>~0LJJ?V@iTZTQEUTDhiPY<)3U{=-%5Q}8fP3jsSEB>tFe=z)A%lGZyw*T7E z^~2n{GWbMksM4^Z3~mFGl2IVW_?G^(`!Gwy*@i<%%x+>q}b17amI#p=sR3W*Z?D(YfPbT6a4_}y z8t_$EMfcW#Z?7_bLk;+jD)`14@NZSYH`Rdetb*TD1OA;V_`NmY4_CoA7x5Vq*cVxl z{ZswNlT7t;)yGvoS3#~m;OYcd16+le3UPRd!$TY%;_wiMhd4aM;h}+KpvCcW24nO^ zJup>AK07va?xG`(hld?`WIP;>IPPoVv9ZfnA#WI)3_G4nLnGnH#E>JMyEYVY zQeWG0+sfd&(o^cI*3ZA}UzuH3dQ1EHmVGN9uPbV)uVcAmWno?EEA>_DS8a^EFGtsW z){lM1vc6-hFz=HkF(3N^SzllkW`3f~TfJ{r*4MQPvk#T^J(~3$U4{7%lzF?ezV206 z0nZHbbEw{zkG7$l+~w6>UfuCy+~w6GFTCPdRLl!^d3EReQ;k=HoEU?g7=xS`gPa(H zoEU?g7=xS`gPd1`z^iWmRPS-XGYtWlh6qeU2&N$h(-4Gdh{81TD}56tNil_|n8(n! zQFNj>hyrs9dI$w(3G@hxcTv2D0?zk@22kM1n;t{ag`yip4~oh&4&yyM-M^Ce${SS( z@;~FfsY=#jymzXSwHOoa=*xJoaLO&?vWt~`%6RXyb>&nU8#3P8(U*_5p@d$;dq2Tm z{P)k3kk3ky1<60fKeRqjVDu&fGXECvIO>SQqn8|aV@X-Oj%bLwNU zq^Zv*u-*`h;bjkRp?Ex_eiZmE(OwjIhw_N9Fzo7q!d)U^0uRF$_P$HDBuPHC)!>p3 zZq>KQp{=eKd2qW+l>0aiAvgiNw~NIBd)ZZoqs*t`Ha-`MR}fUfPLc*!JNzGm2|Q&_ z*o#ivyp6Yc><)_El2FWZDZ3rPV;!H@0M-Uk;9Uos@Jr=1U+x+DA^7mR${GQ&DGGw{ zjMP6RhyEgmv*hp} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc deleted file mode 100644 index 5025507a6af17f9fbfd73ca395f7ea059653ad99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18121 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


    yCS;OP7<;CTp z6L9Vj4Hqdn@Ct?c)XxF4;K8TxpnS|;s4fVfk@mrJ@+*824XRMVqCZ_WQ)TgYg%c3< zA;+WP{jj$dO&E14vi|7Jg`EnZk`7Z6diEtOm%i?Ko8h%Ga_V_1Q@`oFVjd(Hn*QOU z>GuyPs`}qU_o7dM=d!g|TmoC5=4=0k`l7Y>I3)ZYMNe7rD|0_!CFW0vfynvJR4E8 zt-pm9x{8&zD#&dBxW-f_b&PKV7`6O8jvI$BN4vsa`_{`dU@3Qx?|cZC6SvHoDZAsY zW8Fma%tZLIkj5T=3 zQ|=Ylj->pgP2cTrXN3M=6D_ZQx^a1`|Kk2>Pg|=0(*6tkGs3EA&sr@HJ!_ZWsGVH8 z2Ja)(XN9)3&<6AAJ(3ZQ!Uctrp!dR(*RH;n5!MxyWSctDO&ya>pa6Ey^5oO{KK!GM zu>D@s^0LV_KjEcCw<7dg68@|HjL@n*XB*qojqQ_-of)C)(P0{v^%1V^ECNO0yx3pa z-@^W^h3jv#c<2F7t>guCNShFBM$nG{H7)57f+GlCK@dPd4A>#eMG(jcP=l8K1i_yn z_#T44KyVeoj}Y8K@XrVc8=)bucrc#B90Gi|d;tJnV&k~3SqEjd-L=83p-HauGp^#U zt?kwulib!>#>B0iXDRb@G{UYK6Fkqs-L}>_p@Q2_&(+!B?%RC5mD@a5YvQ)f2`u*w zxDi*!Ip%sz+=e-!67R;X;5hf3gXh-G)tCWP3EWuR$}y3+ayoq!F`y&S64~yWR53%8UwDQ!8f}6TRw}rk0rsmR|R{sW)xveZ*6A z-!G~4zoc9b&8z8-asD9%KMxPlVV3T`eBvR6zcU9dlu1Y>KV@B?nfUMY&#;uK{`WI) z@D#sfj$-IlzcD>M!@=)=&IqK4#_?MxO|AI$b&us0Fq`k2eGSyr3g0?vqQU0#uoG)& PgzGAOTiA)sG{FA>Xso=_ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc deleted file mode 100644 index afc526db960c4e1f2aa9b6894da5947d9a7205a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11766 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc deleted file mode 100644 index b69823dcac5380a3fbf063a683fda155280bb140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4922 zcmd^D&2JmW6`$qql1p-F(URdx)>4t<4~14N(o$@{?15NoHx?~^ zb#`Tyf)n)M0uCG?EsDSatb>9WNCg>9|A3%?g`C<;7_y+dFkqlL6u!w)Py#yjy;<(^ z!<6hcJ+%Yq&6_vFx3lwm?>A5Tmry7`piMve=R0rs2>AvFP7~|O)_b7bCK}PW3`t_| z$#7Xu(v#(rJV!KM6EZ?pOo~}=(hFlz^JaWmDJfxoGe)jxR(#mNcUq<~h~SEg`F> zbB{e>2XkoJq`I1Yi>if!POV@fXQXHHZ>4i%qmMaUB3iyeadu9nSt~&GLPnj{Ql`bs*dX3*%joz2W#vSeGmkk7$r7Ckvl00lR{bqd67V!CtJ;fU67ThOl7U(X)d z(s{LMvdY05Q7@P+Z`x2zvl!(pufg8LK!1bVOR=9BIyGYRDphkMm*-S7t;QyFW8Tac zV(_L$9`+oY(=(a;VxDHSn4Y^9%cL*I3Pp1+pBo!FF&Z<{rhdGj&d#e>bR$+s7hnQ*8^%-%x^2P1`|C8dp&nu1-?9@vW?{)}D_zakHVy&vyi*;fu8 ztp<;mg2&6j*jGYq3+Biy3a2?oQa>V{Bsq;FJsJm5z-u0mg2sasH36ho6G8ekFGz_+ zioYmD{Z`;SI~v5j1pquZ2Ed;{X$HVK;CH#}9RV<%$R^jhwfY{No+BpYf!!QGCkaRX z6HkySO`!mhOb(F~#NZY^9JvHO(eg|F5?SPE7d$a4P#HQapc(+VIYSq8cJLHWe$`_M zhMsxH;sFl>qib-GcH?ph;YvYtF7-4HYQ!<_fhEQ{5P;gA@7fGEqBQwqS5LziYK|YLhb!aXOd>DChayoixGdf% z8c3>|PATj23+5`v;Ilc_PNOgbZ82@m{lvZ|mipU~YnnvxjVTZSpPfG*|EQZkcc(u~ zev&LJ@rrz+qp>E!@)`m01jV+2iGM4xH*ti&e?&}-w5Apk5+k}lgVG7dcR3U1S!*V( zPDEG7+$A~ZcZ8V8Gpu!@#daLp$4`^n2i-Qg?M`|kBRv~542TADv=4?YiPhhZ5hU2f zYk+H7)0d9!0$0+nr9EIF+dgFwpBTxNV_VOc$1x??DaGDJ?P88i@%-VZGL1cDDv; zwL_h;Yic%DJKh-O?)n=O?`_r`a&Ug@^vnkW*47%7U}A;B+Ri@ODdAb;4wP}AGi7`* z(AnNvKS@pDhObN;F~@?D-3iFFbO=N<`70eFP+RMk7oJMSvGhO-d7C|mcoN~dw+lU(}7Aj-ekG=^4duG;14R{Ghn>k z_1mty(!IX5{_^0-O88XG2fk|Pu*Sn9HVBBC2ZkGH+h#L$)t%oq&cM!Y$>U@EZFzi1 z{50{xc)xGmBZ0mikifj&FODA$t`GXqG9-@2{p&CL&^{)PpWT7FjzJ~5Q|LddWPZBP zcEYh!rE%2_Vt9>uYY)X8!`Mx>ox}J$J=48?ot?pL+IVKzv0lZ3y{-LM-uZc-k5y+| z`|i(gPxGhKx;0IMO%)pQmR$hsMGa5N&RUkRNayq@iX$l6vo_M6wawoEw56AJN!yl{ zad2+@0Yp>YPI6A+_Tzj0wP0C!rK-GIQeLep<0WOhtV~qo$wpEB^LxtLKsoaLYUH(2 z66?O zChJAxxswxq{!70&(e1ks4Omhtl~c2NDrE&yscc?b$e=E#QomSGGxiKs@GxIQ0iRn4 zJ%-{qiWrI$AXW**P+^rZ-H#dyq)r3jxIs1rK^)$c1u?!U^Wx}cfQKQ7_+~&9PjBrJ z#YxU~fj`7u;m4X(DjKE;swFMt(k8-3F?6Ybwx9~%Y|Q*3ezRd8MJPsxB`%ohjL}Z* zjK*1zu>Z-}9!JsDNfhqpx23c8A^eac{ow^{oCUGLa~$^#2|OZ){y|=OL}va7H6Z4d+ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index df64fbb194bb4140ca55a789845d80966f0a1920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2506 zcmds3&2Jk;6rb7k+H1#g)3~N6l+;mLf&+M!RuF^=lG{Q`DqKXuA-*gd@3wKf-Ze9u zrmhkxRIX43QripRUx)%yZ(O+K%%xR1M4KRxC=%QpIU*$Dz%~g(JWG+G`g8?E>IILt{dH+(r80_FxG-xz>L0KXODNvmh1fAAML97ZH z(T&1HLn}{CP8FMjn+u>p4PXi;R%u4aPcD;X>V~*sUgkJ9z3V6+bAxf^n#MFMJ3XU0 zB~3YR@N14;Q7X`5TbilN7^Z2@+04`x!@91RrD>&7b!Keqbav#F!b^_vT16{f153D4 zDOD8px?$-yQ;N1}Gp(#Cj=>$S%sM5LXDd}VT;iJJRB!gQj-K_AC>)C8RW6dXL&*jx zB)=STWmUDbvZ1POOjXOaK5L>LSJh8vHPi25aTv>F6x}GgP=uQTaUKCtBMpH{NBl9^ z{U6DW`zOxZ*0b>ao_`?EDvxjfSa{T%$@^Zi5SSpvZQh9wb0flGB5mhuh5 zo;}VW05Aw&;}Z}U2?d96K=aF0?A=!u=zPZrwdGhk`HC(*z>Tu8?ssH3dgrfmy2)sa85L728tQbF;e8*4 zkB@@zS?x_N4c{MLytvU+)(#)7ovV!p6|#Kzm=8d8dwi#XA#y9%n>+IVqMIE9yYMmb z8TB6)(1B1@Wyg`VJ-jBHyy7*K;7LS+Uxr}=ICKxe+51_aU{6^~y#RdXg9-^wrF{UZ z+xZ=K0v0I3*DCl*;ng+jAbd~OJA&Mx@avy!5Ubr+d`R@6Q#L$u52qd2pvn}uC^ZeVp14y0`%eGX=D1KJ+UzbRw zTAa~XnPp+_EAVjxgck_E48Bx5`}z21;|~uVe-uh@B>KLv7RNTC$$MjuqsKN0l@dSp zk31N9-2ax>SeLuEMF6+4=ZPG<8@m&Gm>hg0pV*cFsUy7Wb$aUG{1ohTE0cSJuEcZ0 z;&)Q6U;17KZ8g*f;A+2=8;Y(DMi3d6a;GD!N(Ass+>HhQ3n0ZZ^gvfA*$kg2&tp9r z{H*3>0DL&xJa~rg%M`ov89!gX!$x2*x&W_&sEd@+-^j_I$kBBYTPM-2ut1O8leY*| zTe3h?_ufQ3RhNm-vnhmVvLS+2N39c`{R8XW B;_Ltb diff --git a/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc deleted file mode 100644 index 009350b85b683f27f54e5b6d4855174423c6e9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6630 zcmeHMT}&I<6~6Ohdu$I5P54hrU^h|X)q(?TlT=wX0>V+@sXcYJ%|8SZAb#kY3ioDBRCsRy3ypF2| zjzw z4o!>kDl1x2FrsCqZWProXXW;(bj}2|W8Kv`T2g_n2OcOQb_>7`$~Q~uCawZ*u?jQG zN^buwJIiEnRYj3XxF^I6J422VZ*j9E6Losa^(>bW%U@1QVI7b#WY={*&;yv2e%T)D zs-0cRwc>&jY?H(TgX=mBu7{8WkqAKIVTx@lI@N8OG(9qDs)p6nubRDj&d@b=c$BJY zu4i&=Or-<4G2IfWYEIIebW_$QRf<2}ipqweQnT-!Nm;W3(wI(Fs77Qk-JoQkfiChE zZ>ZXs70!Y|gD$%|EdiUjsl}rX4Lti6C@+4HxC-oy#Dq-cT>HqlY^LSJCDoWP^?V`^ zBYIBO6630-=~Ft@l!ThQnb6WBiTt!VuIIYiJ313a+Em-}Ac1^CH4^!BJ|W#ybBazA z4t5goLro)5LXd=C?fGd-z{Wr>ZO+tynCMfIIO6mk0wIkNAU`C}j?}+*c1~D3-Zm$! z2*=jmyfhbH6<#k0udfK-d~&GnC)0EMnjo$U4F#d${hFUOJ!pFPy%piqetkzD9DOK% zBAniWU5LejfHT!peP=RFRig!DQuHZf)P*g~LH*fK|1rSC7wQZ^ohd`z{&J1Q{&GPM zz;t1b0u&3Fh7ZggGXQVu0@QSY@8?CmQoPJgdvo`d!pAT`3isC^yc8Z8efCz^8Hh_W zaI79_4?E|asc~B68l?SF+VRNa<6JzWdrE8WDdYCv1I~sUqAC@1dO+6pP$y&&GC04Yo)5L9=@Vp18siLyxbW7 zsAENFdsh4P`_ethp6@a1;*5{a|Kj4}#TDTK%v!BIS*Sg^ZQhz#eRptva9KR|M69_x zG(Ysg_-b=|p}GC>;X-p)LF{@SV8h>dE|B`;_w{@FHYxU9`>XL^>%Y_sV&CV$q@SU! z@C*H8;cvig_&SIKiG@33>?|iaNf;zr@P)3*F7_8jqVg9;BfCKKJmR#=wc~8;7+72G zcUrr|-0iW`f1Qt6cw;BH2>*3{1`{Zo^{(se4BnBuSZB~0DvA;;^8%9!4X(#w#`?dY ztfT*@cw!XoG8q@`C{FR*DEbhJ5|^U00VXzDjOGaIR=A-f)U}h#gM<3JqUtVNBN{JE-)Al!}1L z_yttR1xtJGn$s~E*IGc3QuzWoq;D4Mn~!>IW11}TC6|pBn~aBwJ{v`#s8bs`7LU1| z4Hepfoe0Qnp4d*G-hxRx(N|g&2D+9`o{jRoDZQcB&A2F9Q>L9!V>ZZHegrsO7{R%RwLRV>y_1SONPU zwAZ=OUhci3 z8C;dGBm6I<4G`9=K$eQ)xLwruW85LAV%tSA-@PRcm7Hs@PT#+g8PM z1@YWktbR4tT!=M4?W;e(XN%ePsYv z@-fLcV}*3hV8v(UfCU4&Kv}n zF$Lsh5%%znC7}T_wl4#-!FaVLNK#JDs*+?yBq^&alNz=~Nx~%u8IQ#o z(}pGFHQ9t5CkyY;rc6y^Ds7I_*KkrNl52qH(w*csKci^aK6L`TAL^K;v*ENA{%IK*8Jz@y3&b(NJ%}VXE+2S#dMouc2QJSl{3(ePl&~v4{Fnj4rKE>JVa6o z{|@jtXobM*;`5^YykNg36cbxpN#8-1-$l}j1m6-~2yYhg@-2D|K0$fJxDI54V;JT$ z5_w7z1(Mj{Ii~d~AOD9yn9c&}cpjt-6InR@oM63?;Rr9z&HRyT{1Y$y=&cR-Z2ITM k6i0+3e> 4) & 7 - self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) - - def reset_all(self, on_stderr=None): - self.set_attrs(self._default) - self.set_console(attrs=self._default) - self._light = 0 - - def fore(self, fore=None, light=False, on_stderr=False): - if fore is None: - fore = self._default_fore - self._fore = fore - # Emulate LIGHT_EX with BRIGHT Style - if light: - self._light |= WinStyle.BRIGHT - else: - self._light &= ~WinStyle.BRIGHT - self.set_console(on_stderr=on_stderr) - - def back(self, back=None, light=False, on_stderr=False): - if back is None: - back = self._default_back - self._back = back - # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style - if light: - self._light |= WinStyle.BRIGHT_BACKGROUND - else: - self._light &= ~WinStyle.BRIGHT_BACKGROUND - self.set_console(on_stderr=on_stderr) - - def style(self, style=None, on_stderr=False): - if style is None: - style = self._default_style - self._style = style - self.set_console(on_stderr=on_stderr) - - def set_console(self, attrs=None, on_stderr=False): - if attrs is None: - attrs = self.get_attrs() - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleTextAttribute(handle, attrs) - - def get_position(self, handle): - position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition - # Because Windows coordinates are 0-based, - # and win32.SetConsoleCursorPosition expects 1-based. - position.X += 1 - position.Y += 1 - return position - - def set_cursor_position(self, position=None, on_stderr=False): - if position is None: - # I'm not currently tracking the position, so there is no default. - # position = self.get_position() - return - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleCursorPosition(handle, position) - - def cursor_adjust(self, x, y, on_stderr=False): - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - position = self.get_position(handle) - adjusted_position = (position.Y + y, position.X + x) - win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) - - def erase_screen(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the screen. - # 1 should clear from the cursor to the beginning of the screen. - # 2 should clear the entire screen, and move cursor to (1,1) - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - # get the number of character cells in the current buffer - cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y - # get number of character cells before current cursor position - cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = cells_in_screen - cells_before_cursor - elif mode == 1: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_before_cursor - elif mode == 2: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_in_screen - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - if mode == 2: - # put the cursor where needed - win32.SetConsoleCursorPosition(handle, (1, 1)) - - def erase_line(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the line. - # 1 should clear from the cursor to the beginning of the line. - # 2 should clear the entire line. - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X - elif mode == 1: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwCursorPosition.X - elif mode == 2: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwSize.X - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - - def set_title(self, title): - win32.SetConsoleTitle(title) - - -def enable_vt_processing(fd): - if win32.windll is None or not win32.winapi_test(): - return False - - try: - handle = get_osfhandle(fd) - mode = win32.GetConsoleMode(handle) - win32.SetConsoleMode( - handle, - mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING, - ) - - mode = win32.GetConsoleMode(handle) - if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING: - return True - # Can get TypeError in testsuite where 'fd' is a Mock() - except (OSError, TypeError): - return False diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc index c5e2c6d7b93adc431b7ccc3f3ac5eb617ce6382c..ce172d0aa95529f4e9e5dabfed541b7f6d90e90a 100644 GIT binary patch delta 99 zcmZqYn$N{^nwOW00SIgv8PhlNL@|1F=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9boF%~id0NSr0 A(f|Me delta 75 zcmbQw)y~CpnwOW00SJQce@olQ6UAsypdVVCT2!o`omiBZr7%Q7~ReKr#5zNXV>0cd*j$%yRiw46XF^4wC9Nx43 zuKh!Y+1>Cn8$+O7{@(Vq7Wcyt9U&Ud4w#~Y9hl3#Ys9QfONTLBX|cE{8LE$O(mjA^ z_yX`Fx?7L&M_L5N$iL9H4UdHo;fKFs50|m~?PKfuk4ey9iWOsUaEt7!lU-HfLqpB* z!6RE_WL*#MdH=+pgLi#*W9xdQeQd)rrm~!U{WVq^26<7qvRGqb_2fC?eO8gpiMTU#VLwAlqc_`C&QqBvPi%30 zb*^ud>j!a_;jW%8>rv+&5&6=Kmo=<=AHEYhs*pW3O5#CWB;k0Kszc`dmu~*xwl|`X z$JR7e5=@DHF<%aSOZjhU>hj;`^Ek&M%)WL%+gX6C4yV{xOhfZ7fjOM;o!M`^dnNt@ zpc$0o<#HF8QLMgwlze$^RD7Bibe1hOJ9= zc`5_tf$LBH4=jj`!3T>I;J9c$sGJvQz|@KXCGYIc zxe&u7fffut@r+geG5@x1atWQ5v7PR)LiN@nk^lse5`{9o@_aQ?7`adNZZn+t?5eS1 zDO(gKR2bj3v)8&;k8aw7NChifG8fIFAW;vjdq#7F`TjZ$PSq?96%KWQj+=<&`g%Oo#C+@bz~GCfA~hGqDz}3ZI<) z!uIJ4;;?v863RXq delta 1002 zcmZ`&U2NM_7`5Xhu0u@XCQj_c&7bp2v?L{KrBy3ZwRG#BkXScfHX(V?G1kzQc!h#M z6p2YeJmB;Kv6o5lgerv>#N?qN!KCdCvO>j zSMnw&0fdg?fP=(>@Yqd3%Xg%BU=lTdv z<|RyzCHjb+%7btHSsYda!%6LT|2G7ghW?*CLY}N6?ZGMVRWyig!}>7#7b<}JvG2z3 z<2!>>JFY36*07G!6?w<(*qb4HwXx5?)Y6k_af}Qj_AQ~^MrDukJw07!VQa+V)bB5XMzV9 z%E1v)ddRRrOf$~ZF^2xvudk?1NTMu!y0+~r0(JJ%Q(v+>zGBBy+;SEH`aw`j&qV{d z)x$1^6(?z(i!^7HnV-4gZEm>36`?p4kxDwl-FQL4VZu~It6cujN(T<#^fJe~o}9`{ zCD{X}+rYK>V<3El6pnX2BQ1|KFUMt3$+W%kw)S{YM57^yAI90EStw72BvkhWn+Un97EBZIMS6O*q4@OM4S?QD>NvJR1 za+szzrXi2Y?o*6RtM(l#1zF88Wvp@Xf4Oi$__T>8YctX*nTBddO6K&*UMSYQs$6Z9 zP3y6mL&Bu$U!@NP1I{sJC-4u1j%v$0bnAYA7$ShdNz^J(-maCUQy z`FgY)m}?2&U-*H#_mVszzo`n!+c%zTgVrWD^u@TD#BgmEMv&O^2IbRgsg>CE7R)fT Iz0HjC9~u@>qW}N^ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc index 4794f15761f2bb0447112fe58b5d073a44d587c1..0f4a6851f19520e7603e2af0a5cf238902c9f34b 100644 GIT binary patch delta 2116 zcmY*aZA@F|6~1q-F)rA~-@e!OyN-wk&W`UoquHVE#u^o6@w{VPhz%R)2QcOcX zkYY-Ds|rOxm}=r&n&)wF1x6?b9w#awMVH|iS;=+ME16&lmKN%AP}svusx&a`LHY=O zzfiwFPL%y8mO`=e6d#i)5;=K`IeAH4p8v4#a6)H|=&T7{bwpPk*V#Odq=tqEQ3I-$ zyHz-kgU_MMY%=clmaFG#W@@~nQF%d<(tDbd3Nj_ZBq~;vQm4UuV*X(UNI<*w89c5i zf#&<*u~0Xn-HyKNeTTq~)Rh6>UMVd7&nzb$A4b zN?8T`L+@C_EEUiv)x?~8#tmPZ8=n~uoQbL#4=2CKmF4eFL>dGAQPSe!@65BBqhv*_n-y(kAdDRU2VHwWCF~x~RlnNfb*>0W zZ&9EuCN!p-X{UQ8d$^0kzrevoc+g!e|3Be(#?0#!Oz`v&XbVB zqEc?#9Rvk=Pe`WLCR9ZcRZ(1JVw;mPVyXjar8aYSUOK@CEUX&;ksu~22)LIC3f>xT zremZjcqC~wz0-5KCsh7H^}E%aEo!XuW}z2r%&>IAftHhoV-q$K6B|+nOri}7G)M@I zIZPsMa!{1}-2~)=Q?TdU(|DrL4lkcu!ckv1&erKrUW7EI3b3L^kSf6>ny`RG%~AHhL#VhkUelT=zROR4=H%;`kHP99Zq1WEKH$d9cf!SJaagz zFtP{I3iNY6!$(xq&=S?Qp!xeh9*`JY&%+Lm5ux9`}KQ3BlqdTUjZFc76qv&0I;PP!<=C^|U>o%PMZbSOcf&XQX-RV>RHyf#z z%D{w0UrHO&0{;EZNr^GI!_%rvHOI^_0Yg+)6qXjVeB^}*9TU+pAznYT z2mW*<0}!xly%>*c_Q99e^YP_80}QRV2{648nT56r;`eIsHNpU!?itVy8@a)I^E{w| zs{46WaRoE!VC}36xsOlk8D$T6^sls{bx>MY#j;gG!?vvuI`6aoZeRC>o+z>Rsy#}S zLihc=lNiZ7Ks-~c66GpE`Lli5mqar>5Ac-TWvnr6%T?Fq(SR$c57`&Kw^-Ti?F@i7 zn}e=JByfhu`MMx&_J!+0S$Y%0By+c^BT63nt!=>>aJ}Px%N=xGJ3D`NQDeJli(LOI z06;6e{54sChMYXeIy{CXsysA#$ZPPI`bvX}sHSvD$e^CuD(){|_w&KeVA}?*+u&nT z75Wzxh!O%iBA~saF@a%Ks+^;cM^A4!M94l7NmA8@41K{bH!ATpxfT{|mV=+e?#4&H*fkA|t3!i07^NA9h7WjrZS z%w^AHdmT#>JrY@I=D0@#_!DGxb?*IS* delta 2313 zcmYjTeQZeo} z8jvM3|HZg=MDs6O%^8$IB(#~yA1!J3D9E4lwx}E2Y zw*KS(&b{aS&b{ZIbIRE1$P|SGcvT#w+}Q!d;14{yLJo?4jmjC9(+l>rv1{GRhWgZ@g{1ldxfZ? z+Yw&i1GFsIRtP5pGmEe#SD}cSAW9M0LKz+uJfw<06NF;P)~*m)LI7P0EtdOcbaGwG z0}@pPP_!#e!aAN6P8O(MmRZ$vdV^}a$`JROpC{3I{1;o0lK6EgLc@5m$zDwYirx0b z?CP@+*%gb|trXxg3mS33-=IOeFxiU7cq1Hoo%0ZJWf_C=kwO zG(E6rDUEl`)X!Uj5h@K~ZASRqi?8%xn`+>XmB@wscxWty4~>tGjm8d2g}#VJweu$} zMN=&kEs~`w96Z^hWD|N@x=`h>dVZAV!6@TIeD0+aT66<{vfHysV!R5GOE*os7Fl!5 zHP2QmL=Mvw?}K8nR;CCY+Z1VE^wj)j-Sh#merB8GX}N80jia+8v-Vcp`f`;UEYdVk z(j>T1c*0N^&ig#Y5Jdr$&V}`izegFZ_>-5fYfvx#V6Ye;8e+@;AGQ~w7Rq7+lHiHx z)L6X9d{dYShr&!+3p4TJ&@)-6<;-xA<3t}sK)a&-i+Uki9;=?$mjQuxrPbACbr3fU zUn0?EeCL%4MuRQxM{SbR1zQy$kZHvS}vKW zy5^m_%XMOdRJJLa0|A?w@ziLLRP8?T9ZfeeuAEonQU95i<>(Ehr z^R*^gas^fh6Wxt)&hcAxW)qDGW}h72%CD+?8WKMd1fQ{r(O8pSjYoR=0hZAC?%*4)0=ZSD1`6+ z99n_14$engFgFz>0ma@aud$GOlEyh_=X4vB~ z@#9a8Jtc8v;mw)sam+>>dwYU>*EWwgigps_VxP!op`AE%rN}Lr>fuyu<4oIME#CO> zTL&*3ym(l$G(>{%wb(`onB&7+(lp58@2|9Ep>FZf!PC$!h{vuT&qmNo zZ}b>5In*=FkVC6leQY!S-i$6*V91F`!F$--jhs!deS&4DG~ket3Wc6mvd$T8rGcZ>fTo z%%G#_E`-BN4q7gDsucvYOH183s-R?NlwU5@Q%N3_S&SVw+;NhC;`i@d)SyzVzgG;s z*{2qa75na)Mgfy~#w2eJcQ5kR=(AJ36TOpt67RkcnB~1tbxg^aCW0c>e=Fo=&bGig z6Pz=)ZJsNKv_|_UC?y+AmLWg3q`{QrZBw}uxswcR00&xS%0B;srSsfKY=69DIxzFy zx%C~*TKz76W!FaGKNfDXNnt5fz0MMtm&(4Vz!D6EkwW`VLN zD0_5do^mEx)3{B2ZAiKe;XSD!rwU58Y74KdO0#M`_z$V|RC0|aMF_M9ucT^p7wqbb zhg~a;4w|*6ID)gt2GfF}Bw;9tIpgFlL)G#+FjlgGE*@LiNuoIZ$HQSN!9knLf`{|@ zbRh{S9!~Ehzj2fD98nbBA7M|9B=Q{ivqwLrW>;^L0WUxF?d3D*gB(!XP34iGfj2@}`Ky2WBAs>$@mK zZgUfdvkv2;$;V7uMX&HGE(p9KAvvFICfjU|4$tq*417wHQ%$QyuL!EH5WFERGv92c z*=&mm96%W%waLFsv-yE4F7hh=`Yr<$xFD#yxxy?@lJU&s=l*HTK;tHd23!Igq7~T1 z22^^1S8?;6z-8=`@{9}&4GbS77zBkoSZ@f6Pq&?D+re>LQhstnq%`wmQR&HxBOQ1d d#AH5jGDsPk7W0%uoWMF7u_#nX` zDBQt%Ls)#e?L^xSjvJElpBT6}H6|BCN^?9AmHx!Q#;Y;8FVaB>NPpl2%6t%GP}Kqo Tb4pCU9cjx9q&G`PakByd8jx!z diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc index 44b6b8870ee14a1ad37828119f6293794443aca5..6fd3ea5aa610d93eb40753c3fb34be34f2dd7926 100644 GIT binary patch delta 1388 zcmaKseN0nV6u{r>gId~G`uY0t`o$|y#iF$e%5Z|ZB8q?@QHUc;N@;XNKnvA4h965@ zo^c9zaKLm53)7+|U~XI#Nv3XdW@CSJl=8BY%tc4GEZZKL)4!JOQnDq>lD&WKJNKOP zJLjHr?(L3KpT;QqOQljy;BNy-?!8GXmTcucyV`=GHcw-N|8TI$@A0(;!p*^!_BKyR zV>sY%f4#NEQxov-4~8-}1^kV{<|Cf+a-RqPwECL-Eqhz5Laj}~Kszd35~kFbG5Rr`v^mronktXnKf88v|`4YA9d!( zo$J6?y8}COaIrRwot^VKBC`Nl>YQ>jlPpQ(@PzJm^~be$YVTFw-E-IRwP!2THH2u{ zqSik~UTXxQ;TAa$X9F%O&a8on0K!@4p-|%w6v@J?`&cT*ZiW`U12Z%P(*!>tmIUSMcq;;zcT!&_u_H zG%^>8PS!|<_dx&2W{PmFLbA6ba&iRS?5>g6F0g{hdRaA~nlZVfCU?XaGkGzI&AQAE zuqYQENyujS{d|Qz&J^+`0A42`0RTbyf zMQI!F>(1&=O&Ba7A8t7}q&5>qtEeUProJL564Z>KVtA!!CY%Lm`OtNV`?F*np2-L; z0}L;nmE7jhS6JQ zrni$X6=>ZI?TFHjX_}kI1Dg#eOcwa#*09sQ*b$?ZPkDzHjF!I6q`l3_m!7FyH1$|4 z=*dUFO0*2Qa3uwe4mWPW@_Z-!c&9;fr2=-2XH!J>YItLO9hKmmaA(}UjBsZDCL>HX zfphjt1-vF}P)*|KVik$+7q1MJ;OKCCuK}35&+^OvU6g;45haw85!8nMr88_nlr5NI z3#0179;uj$QRtP49a6Fn;K6oDuMI9eG{c_{ybFVf@;k!CzjrXjirJjn7Md4GOX&GD(TdLxwZX$g%1 z>ZVp>z7ft$mE$*oh3}^D;SCm)7AsVdy~y{ZgQOCcHSp-E+dx?JMEsyQ1`PwMh%0JZ t#c!Ks?4bVsIrYTs1l3$nMzEQpn=m-w=$wN}=*{rq9Og4D`etrz%3qwb)2{#k delta 1488 zcmZ{keN0nV6u{r*_2a$LNBde{+tNB9T_{!GDTtA;;w8AQc&u)85 zp+Yi?$@4`k1{dA)md3rM3GcELlO>cR?62F*tBMEQMObyzwHv4~ZKX!?q|R$_+0(U+ z?Z0llT63drr0$EF(e0x-@xX>o2A9@{vuOW1nONu|I=>54r2Yz;#k+SFa0v;@#_@T$ zcPC+iWW%nXSft=!qf?u3J`cW!vR!z0W3@q-4spiQ$&ee3ReJOy7FuO4AvRX9?C)XWY*R>(ZB3>dj zVI8adklw92m6#_lLt@lR{I;oJfFxig2GF+ybCDkNFgrp1` z$XIkZ1AU8|&$;Ah1qnioW~>`B%bXB=Mwr0R*IH!9PtF(e3CALOO|~HH`{;p&3Pd*? zFqABYdjH|&C45EuNtlQj5%>*&K;v?8dCJ)_aqm7 z=gLrF-qU8;m5Anq@qe50V3Qkmc2!gVJhJvv18esoI*O`jg{D4@Kf@IA^KfXSUVp9% zhDm-7-x|qhDSsJR#;G1JTwb{V7hap^0?u%Z!wt$aIu)3%RSkjwlV z$KuFFRhl=$xao^f^Kh1*lA$mheGw`iH5jOn^rwxVJ<8$KY?&rqg6}^nhNMeK*5jp` Fe*pY&+=T!D diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc index d65c9ee3b11077b53e30b1f722ac0a14aaabf321..0f1024ca884afafa898863a9d4b107f4a5d3beae 100644 GIT binary patch delta 591 zcmZ2p)>p=JnwOW00SIgv8PhlNgt2;b=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9a7u}ZKo?wGuq zGno0YgzRKCu2^OUNx98wTy@N{l0X|97(Vkbh)Q+1+~5)D_vrMP5Yp@Skr^nmnT;=j zMNtl@^-H|! zAkAN;bu2-mT*#uRx>LcrZIE?qUEYn^ZMrrd)nTsrp z8IyM_P7vByd0E_XW95pHIXnwOu1aWasGJ<5vn^A@EoY>YXRGc|3Prua@?qp1#z n7NyCux{{mUYo23bjGMeqN1OSYpyK3@I-1N3LQ0!ub-DNe7Iw;3 delta 572 zcmeAxTVBRj@V?s!;-$!Pk$Yv3~1QrEZpt=_fKN=V=iP^0v znNl>pd}8_Z+KIIbLavKzT@ym)xCx*={gb%SZzMY&c zt;KmmTKN+L6R#KJ$rj#AGlB@8F_6du-_06xh|l3Q9yM;`i9gC0;*R9Y=B{;F&0ja(zIcp==+I*nNxQ13{7=rAiepJ=5r>- YkXsP4Q#vB#;Su)m_SqPuE_VrT7D9@z`(&KEaZv#K-l zaDcVVFkHYm%WQH1TMA6Tae?40H=uy@KQA#yKO;3KC%-(uC?{p}J0>e8Z3CbY4GeeG&9AFFTvT^BAb45b`5L#&0>vJu zj>7(m&Wi4;8H$~?S9xSFZH{DBX9Qc?z%avb0pm=whRGK>)F<1raZTRCW&)FOTp&2p z4J0EoS)4ta5u#=l`!blk;*7+Zs$lue9P%m7;=Gg*<_ Xoe$(+pw)#d7-v*9Fl;X2-Xa75&QMr0 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc index f7b64ca04be0efc987236cf158b87f58ce41d97f..78b6979a51aacfbe71a99651615d7c5104810c52 100644 GIT binary patch delta 1353 zcmZ8hZA?>F7{2G;ekd){(%!bWE&YJsd7To5>~$4?EWL*ZU*w z-4WaInCbXTQ_wJJkMepR$PPtV_%jY75c@EwCakc6D1S32F(yjWM1lYhp|4uUe!)Q` zTKHpirE;Um70+wFZCNY)(i?Ovw=A}VvAE83S7lzeK-5%^F+lpDX^VxvM4+lxf!)Jx z&{i90*m$cUPFPpZg}hY3LP?+`Xr4EQ&yk!6VcjOwBs(b(-xp}30&TD?N@65l3+t1Cfg}C7R_$SIipM1A^0r@4;D>*AlwjLTuDH`&6tg(vn!{0xGb{{>mSu~wkoIdu z#Nv!<4wH6DH0w%bBML1&(a8b&I;ONqB+1K(2=b%6g5Y?Jr{5;5j0_?fWuI+G%9K=h zfR|z;@<#fHt}{TT_^)%5BI%V{f9+houPK>}f9hf=6sw{2`1fkv?xBUH%O@63EcM27 zDi?dHK9WUt!o9)XDCG9s(3S3D^cB}#E3R)_;yE=dEx}GwM0%)de}7D%3AIG&hdpI{ z&T+WO!CSFl?(3YjU&~1g#Gz_-5if%y;JhzW+b- zpZ}Y=_Z5EYYh3Z2QYpjG)p_T^{!bM5M7|Mk_h|poQSV^vXzZ|O?}6CZK+GHN9~~SU z9`TMKX83Sy$a|oFXlVF_;iE%+>{jt-1w|%Q;uq}EIF@mA%xM?ezZ}few_oz79UZJm zr2xd`!JF(lb(h#|K*C3B%EDS^KUG6_z1@&5tcB1pLd+N3WW~n4c=IrhVdGey1fn1> z#+>VCD`zS%dUEpKL<`kK8|EX|9M=X??cJ$RPbSdwMpH`OJ04EUdw(=S zbfQh{WpfcAgvE8sO$+!5zF*~%{U*kY_B^JPZh+rZ`K?@2bg86e!Tnx86PazDX`Lss zuE1hxb*iKV>I0hzq+>e*w@DlW&=<5yvW8F|(@D3$UBTp5Zd3h|rD3k0c21Wk%bDsa zZ_3g@iP3G@QkKVnatkHmH2R#zp4Qlzin;#z?nTY!6#@|}Zd8PI)mcbz8a6bzVsMX; z;Gn=Qjh-YaDHUjIf}{ZDUz32dG9Izk6)~nLc3<{ z5i5JO;fe^K0x;dIhcAVFx@_f^C38J2p^Jg!d@b674${|1VVOy zWPkvF!&LJt63$eNIHe!9N2>^g?CEGNsSXHZ9mhCBQ69sUc6fcKoe=QXop-@bcxzXg zb6NiwqNMJ4m{aTMKt^50X-wx-2^BrIsB!TkL_uTQdZgR%zq+T}_LT4iq_ZK9Nu=!{ zttgFer&@R!R%FX#gt8sL8*Lk9!h)9z0+xL8TO3Tn?>ow+%YsHMZ3ggBN3}g&vwg|7 zV_wVXX3aC^Ir|6JjBN)Mrgf81UMZ;9&Q3A#H=_1XcXD+~<4DV$%(0BTa@m5m$CWNL zV4ax`Pu6qhV!AsiN3AGb>}y@m0jCY6t$Ll)na%|hLAV*sMrw>VafOCAqi7~lBb4=g zY!!5epITD;>3tMQbwX(d=6XK0x!3qg-<9Zx(T`e})U`|}rK9@js>DD> zW6Q8tdn**658l}~T9!4qc?@V>b6UQ!oY+eW3wG1Xts-z0o;q14$(GfjvzC^_YbRZV zfIpwCaKSdALGMI39*Q5~6q=mEmR8spEfZp%UsQO6j=ik!R9=M4aTG{h z@X$mBA>g|ce#x>?u#vPH{(yoA**_-^i3}H3PvN%S1S9bXXFxX8D1-3DGwas;s?Y}E z%$Y6;LS8B`f1SAxs^JRND9IZAc}yjB!m5PF$62g`xl5@KkCTQ{uDAq!XyGK_MJSk8 zV0sH@cTn5ujgu{W2})w$O8h~9yYTh1pZl_g0FU8X&jPruH=m0pqI8VW&g&OqTzTd1 z1Tc6W5{P{$NLGX!d+;3*4lcnFI*4A;Z-STS7sV8!zIZc{r9lbA0I+$>pEYAyyaXI=Qcj~vl+mgrW SF{V3yjOv>>o`r1}rv3rA4)k#V diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc index f2d73cc5e49eba6a7ae6fb9a2f124dbc94af9132..be71ed6f2c0a0c0632add4b5c32307975ec60e44 100644 GIT binary patch delta 287 zcmdnr&Un6^k>@loFBbz4*fKJvZ{!hW@#xeKElw>e)=x=FEKki!)OX2GF3nBND=F4@ zO({)IEXmBz(+^Hg%t~wHV3kNVP(8O z*^O(9#uZWZ6^1uNM5nt?bf4id-*2Yh6%p<4%nV{05BNnpcst5Ec)zm(d7IU_HH7tb zfX-=PxWg+rL1Vh^MBN1~pm zHb6~38W_GXF>zXcVPg;wo>MfxYG&06jrF=Kb+5=@loFBbz41mFLbwvk7a#h_3>v^ce>SU)?lC^1hjDI>8YGg03qwK%&Z zzd*kLD3hO;n4_POnv;`Xo?n!cvN@CG3oGN3$#Gm;bT5mle_&t~)LCJ8Lqv4C`$YE{ z9`pTX`dtyx{>}^(e!wrvdP^UY57GChR^#ai{wM$Gu*Y94~Etq4=7KapmMIDghi96^uSHaEfY7R#$an L2GW}gRO96U1o~T7 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc index 550662c6f53b7ddad301d3834d69a5145c211a3c..2226906fc9eabe9f075aee4ee0a655e8b39b92f8 100644 GIT binary patch delta 2922 zcmZ8i3v5%@8NSE9cAPkN-m!z@kl3-o*p7JxN);d>AtB{i2&GHcnH%4m;MDOo=iVeu z3kw9KfHW1NBemsK&^B$bv|T4_mDt7}T{UT&HiZ_{?3QVTz1K;%Q=y#}WWT%t`t_ z>Orx9D!Gi5QVelWO=lxE3d{-A%l_k928^yf6> zqQ1VK`q)Hi=+OxnX?p+;3Ac-EF8__HnwOVcs|sB#pY{3AuRgWB~Hi#2+_1Q+|NCqYiL*F8UkH3q%E5o;UK-M*oF zTSxa!`X~+xp4hl^SNHa9aGYKK?+`EhufNgBH(3j2x}L@B>SDMbZAZZU=+g+*2)hyR zu?)MCO{ua%Q*5-ZX)WH$aBx*RJ3zmJZmp;*P_p}nRb8Q8KGOCneem{L0gQlN{D9(H zby0FT?_PMzVxy&CVfPxg`0yPg7Jfg&2608lG|U%1p*OI?LI^t%=!O^kUEr|Yya3x9 zTtHT`=Yu}r;-z5JQb^d_!8nj{H+aQP((H{T?~qbhlE?sD{f?5nk!=dFeX zAw{FZ>~d@=Im!MJi+fJsI=1K1*?!evrhnSE>d zS)jFj#VGrhyA4a z3Y_`istH^1Q{d6V$)SGcY-#TO0VvFK*7IUQAG|xSL&a$4#pno1ixHLr7`Ci3s!+;9 z;1$$%qSiqbNyeChusGeaV0;~S9iZxPjzWJBXfs!&GODH+g()>Rmh4YMsf?rTJi-NZ z5HUz7CW|3zit-HQoFPfH3n1b)nfehbkSW71$%Dh1PG7|V={Jh{(^S)w>-bULMmL_C z8k%i9<~f-ZX``I( z0q+tbP8Qt|v|}pKawczx5j&gOP!rg*vu(!?D4Rx!oYwSAx-XfNQqM>O@b2ImvD208 z`i2IdS*3@x0Syl^M;>JV`|+@aRc?||InVXbY8}Ntkj8%{TAWJs4&}_;nH$SD&3zpo35EH zJZ~_AG^_ypERY9Noj&p=d#&>cc$b5#YV!WB1X*?Kp{3max0LqKS~tJA*2JcG)i3cz z*dm}W77JCLV}}_Cbkv#^L2J7qRwqZiBbSSKLN18X^J1kxXLFCX=kB zyLtS1Q1T{0SEJO9@P+2XyD0BKDYVYl52GyEv9Ysl_m-aI*0yckof~)c(4*)viNLev z`zY};gT!$Pp^H*Ar%-(i<9Hnw6h((dWu`x`MltlALO_n_UjQx%W+?JNUx-?SrxQD{~#LvuP+@6~F3=U+lZ)T6WJS7F%w*mK`Ir1&+y)!y}X9hsRHjTq~%% zZ4+$v$J!V*!6ZySv&A OK0J}$imYj0CH@bc_tQoI delta 2825 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 YbRsGc7Y>wCVlMVg^v(XV9T3#N0sVk#?*IS* delta 2062 zcmb7FZA=^Y8NWa0v+uCaZ`kJij^8i^f&=7*1h)wbajODp(xpjg(rA#7rYj2#Bt?lx z!=`>PWGm<@C(o1!iiwQvOYh~kD_n4j&9al05}{)w_`TLf z8l*~s1O8*{)%cZ5&F62- zN9&%_7stOvA|CJWjh6!mE^mp@v(Y}B2}jbzg#iXN;D3MbUlnpq z%YtJ^u8}_=9L^lR+CAggAyvE?uD&1*g(e4mxGqvKusqSpIY>$@+n!%CxUmzTV0s{n*;CX80mvgZlKHK z>u9dngM1LsbZ|mPrUT~7Bq7DdQ%*PQh^6-`oL_@5$?FuWOJLt-e}3+l2WJ91=dG=) zfMQamAP5RL-5V(oQwu3f_KB{sE-{{K&o<1Pp3qjWc7--iuwyKL;sNcE?%zLBjtV%w z^l7Ey3qb{2jBj6ZXxGXSg~YZP)-Ol@hYeDJEx8CG7zs=oT6_0(vsB)FUy~rHTmF%8Nej{{qv{+ z?Z*|5pMMeW)5hXWw->p9I5;(&9nR~gbq)RSf#En z{}M*Wg)JPaqh&9oDr2__y&Q@HmuxMJaR`X3Px#D>{ItRWZ;@F-#p#35NesWU61EOKdqe;E{4&rD#agwy3QsMEk*0{ZTX&`wcqFx_2Sug7#Nka zsqi3-o<`pM$pv?F-ju7QnEnWx?7ZB%_EUXFxd=MR9}nZ9;59xU8Lm zQg|nd`bl&`Fw~%()eqQhz_(2JZU_ic=+1PDXYsLg3b>gGuUMRE7ATns7kX>Z9Xo0f zxK?zzPHuemE0XltmG~y5(l3l;M(`VX`&?z6N)k@5(3$DHx=+;{cv|?V6~&Bd2O=VM zCBo&b5!6AshD}YD1gs diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc index 1453129147f5cbae939d3672e37bc36a06af642f..b9b290a758800ae5e0721a30cf8c04e99c34f7dd 100644 GIT binary patch delta 830 zcmZuvOH30{6rI;;3)Z$UwI7}GE5$0&I#x0jD;gUMh*V>vKtu?P?NC9XDL<73c4w<7 zn8#-%C61p+#~20Q#*K++Vl=vNGK!Fxs4Go~Nu!CfbgZAa@NVwOJtybn-rSkb0DT79 z=Q^DRlWPY6;aTl7^`5g-T@TycLxqkqC)o~$@!=#F%-!Cs`wit4o4vULpO0z5HU2X|T=@Rsq3f{Vz| z3NM%*{NWkiHQAQo2hBVF45Pevvj4X-fN0B*66C-~)|euh4{P#bI7Y5RFY>-Az&Lzd z=uq6Qh3Ud}9CMbVrXq!ww8+t)u;m!`GS@BIXwEyjY9ugWmLclfSOkC>jynU&S2kKg zOU``&pEs7kU6c#QOlwgu)r$XPP_kE~Yi7WWgDGOVUWRaK%cAlXT_d5VWsM-mE+;Mj ziZWEq9)T2XQpl~EZo}^#k?5RBSg0ddad?(DSY&&UvTQDZPjqD?C}?oXoC= z4|Z?+pF-)wv&wIRpNC9qFn!K&L!#mQ;o+7DIAOVD;f!3r zL^u-aG>)0=&{yjU6utxEaQiXZAb2FwEqMN}?-9}9F>*z=GL!WTpleaR>IYM#8!!L> delta 840 zcmZ9KUr19?9LMkRZuh$7rdO}Kwaw{tX|n7#ZPU!4p$Mr3!+&UoUh~hw;hYnLC>SKM zn}n`ocrArVhU=kF&Rb6w5k)WV4^u(t&r=TxYl!$1olTJFynHx(f9L!Cp2ITTi_c8y(1IuF@6jy?oq+TI|p4Z z_Z|1RYXB9{o+A$*AvuD~Lc8xtz8+p;PrwcKBfuLg%;sv~e!eT6gr|g{Wnt)eszg(h z+l3o=Q$4Wi3ECGXQ^!y?_dy0&7}NRag@PoZR`IYy?;|nMj{YD6JcpZwrSz-jB%x3g zz{A4ZnV1Qd$YJ4cMu(<~ew^S~Z2FTp^bwI9n`EEMn{~`?<4=QFg2}#mDUim+7UK2!Trh|S=4$phQd|d;B+w# zIy_3sZCnHI?X#9yN8o~VVM}KY>&&q{b2zsVI;=zF`i&TRYwe@JEtq}9058@Rs6*;F zR~@u0l9GLiiXdlQEe#%~)pzyv|Ern?lD@nOQje8T66)-kPO)>kYo=H1jj9a3#@+nl zBmv}QqQX!5+qM~Yo(pgiD@{h3QjtoKSb~mbJF{JUCeD;gj=7Rq;c4k6Qw~>}+ti`E zaYJp$xabX9mL?-m*AOkH?I%qp}|k>(5iik(4NDo z3NsX1PLi1DUQ3n|{DNYKtt>&wxzZ#-$xWitFY^y1vIup~Ot;uA$)tg(szl64sIZ8> zcNpcSsq`<{X7c>hE@RkYOku_pbgXtRcfRO~GJKMt6-H?6xlX1y-ZKrJ!9P73db$TI z@>5WA(?epSM>oF%t|{&HjnSm~=FjT_x+Eb}XyEd->-Rj{)6_0Z9Y(ea7U$Vi$=cN^54S|-KZ z`^v%(#nQalmN5r;b1-eLOI6qN<~oL;G1>-&Npl^~b;!?%ENx}sEUC+oZk}{!NFPu7 z;=L)dDJspW&G1u|83&|=`-kcbv9BEo{~dgD1w1Boizlv~h<0Tu!{W@f85++Tt+Br4 zKDsljx3DU9B&qkN)ZQmJFuBm7wW32~^iy5V~Pry9s>w<>@_P51or)uhB&6e9xnC@_JE2g(YiC=9;5Oie$}OrSv6 z@iG*Cp7h6uQe<7UyIAt^xSB+cMI~>mp+*VT44d)Mqauw~t~Yf~#z@6NELKtm&x=SZbc)z#A^? zLRJg4r9ug_Dk>_;+Z=1u3KdtsXM!IOP=a?(!-oT{8ek4QsX}d$RP-lp{V7F1J@b{u z02>a!U;vb{phNz)yns+GN*AO|b4pPY73Gu^ym@#K2P*AbgAIb!O4vGR#evNWPY)Ud zZ=QlbAJn1j_3-V%c@5HEF>MzszIz|T5F>hu>lzZH%qFj=)p2Ag}ku_owtBT8xUW3>GSYQpZ?$!jmCFJP}IZiNO>Rj_%JJtQ+=}t!cv^ zA6#{?!@qMS>^%JGx8WMQk)0Bv$ zJbT#+#J2|?yFE;A&fNm(*#>+w&;jqyb{jx&ANHgY)b1@9CAw}b`(1%eXF}gMv*98JmK6f4q*ra-W1p_`oI6sqa=Bh@4#ih{Cip*ihRWY ze|@)u$=9LP4OFky(;jJic(8 zIi4n+@UyEE_@<{7_D0v6fVZtk0FA4>0}72hi>MwElBDz7Ek95jp8`xqK2WF&IC^gv z>r1;LIR99Ib;0WE(?9#)?WVA?_O!ye(`<4;>7qT^oz`Rw|5qm!s({`YGb|ZmCR&76 zGIZSdoJ{LH@u9567Mot0zA?*`##--%Rm(;iB-HW;x2sP$1oYZ@nOF@9q36Jd-*_599urZ z5^o<%26|xeLzfU~{EM^Q{FMMZ4A*bHXnykr#+@g$jFxRk6Ylu#tieP}vL;LHDmRpLotx z18?7T+JM@S0PqjYxc~qF delta 2620 zcmbtWeM}qY8Nb(O!=3R3ANJu7Y-3}LvB5T9#iWE0T8EDSNy#@&qK>qQ(v~I}P#`2* zvuR4rvMQ$UCXPUbQ8M9W>&kZjRMXZZRia7DG(nDp%jB(SnzTy$qh|;8Ix=Z{&Pk_E z>VM;p_j!1qk9*$V^LwAysdvf6ACrc=45KIDZ|^6cpZKK#(=~5I_75K)8jid^Ff?!~ zeC*`F$g2a9*zw`lM^2xKoB_+}Qv-vMlg9@KPmi4*8hl0gJAFc<&w~^f2%fz_V3)T9 zpD}#b#y#Ddx6RnD)h#wIG^XlBTjT;EP)rbcp3Ry6oUc#2JZrA-iYqL-Y918U@@xVn zJXm{A=-+ZehuZK>Qwb%RU0Fgyd+=XOE)t~hZ_^33zXwu$N_=sFSm$ihFHXIfB}lp| zzC*HWk_(#kP!LLVJ#&5 z-nMTb{LOcZg*!e{tLa9#E#k(57hRYNamIxc;CnQ|!kup#^*G>p(byggDG$W@8x z+T@VL+19w~6|Oq9N91ba?FtFo>xCRtq61C%VWfdV{rFbY-;fK^(7xoTWC5@d;{)uB z#nXjTg-P~|4>~Shlxz3ek2^}4o z+!22+fzm9O7~sv=DMMm+(j!@{)1yoZyaylPr?5=H{q|%v&erW zmp#px6NmWWYaMIlO)KS1BC}P7X1hP!BiSm{M!WHqmWm>f3Utz~sJ4u{2!Cv8FDNX4 z96*!gw^BQj6F@*u*G?_^5gzPa*2{T>x$Y5Rq{FyvSH$`==Odzk4X>Dei5Op=)JZOH zme6xy{GDB+Z(UW(ch)RUeoA|dQT@YensC+xd9x&ZO)h}X%atlaw35jZr_vtpqGiFNX2=pnba=(! zjK>nza$YADni3;FI1lZ2`I95FF9F7^3yE&-V_0Hv0V-OHYC(b%0BUoS4n5_wD* z-`U;o1}WPh*G7Mi6%i}t!$dVCnfuB^|!=DWwjESrdt|Jpj6{R^>^4KaD0A8_y)B&l~2fX3} zJPeT1B${dGk>so7^ONX`KBEHz5RHWeV)40=Now}!Bcd0v^*Hl>5ZAmpW*41M6S9St ziX^XZF}e`Fx|NT?k!>O2H*e;l(x>)qV0VS%QY-!4x#N13F*2d9Lfv_*9({(pFTU!|k;z7L$st)|WjKkmOdp&& z$R89rUyro=#VmSDIBy#4JDq97F(EQ$`oyD z8LkJzZ7Q|kDU`?8jhayn?zvcpn`UBf<-Q!GTfc_I6<=ks(UUA&HTqNzSIAoki!I*q zl=ghd|G{0`f5|Hw2)kpxWTs>mCSM8Dia(!OwTm{m28au!_DH3k`LUU?*|WSl>9_#? zFB7n+?W|DSS+S`UeQhV3ATF0~Q|U%uh6z2hcNvEb26OHO2h3U{lDB-0 z#4n`GZRuA6>7|N|m7v;nVByXwU#2 zegA0aQol@u=qT?`vsM^I^&$&BFJvOAI;q5&pd@GM{Nb6yvqzzwYy>XqB?_dX0}tW* zzbHcvh?S2Z!f1^bDu)qlXVhq5B^ZR8A54(wByJWO0wN1<8={-yZIYqra_?ksvTd4x?U6~ zCA0kzycNAjn7i49?5ZY{stGu0aVIIUH~v f_&7qRaq(?GCE4M}0I4g&+i!0rK?>(@|6KbYw#-4{ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py index cfa45d2a..e16292b8 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py @@ -49,6 +49,24 @@ sys.exit(%(func)s()) ''' +# Pre-fetch the contents of all executable wrapper stubs. +# This is to address https://github.com/pypa/pip/issues/12666. +# When updating pip, we rename the old pip in place before installing the +# new version. If we try to fetch a wrapper *after* that rename, the finder +# machinery will be confused as the package is no longer available at the +# location where it was imported from. So we load everything into memory in +# advance. + +# Issue 31: don't hardcode an absolute package name, but +# determine it relative to the current package +distlib_package = __name__.rsplit('.', 1)[0] + +WRAPPERS = { + r.name: r.bytes + for r in finder(distlib_package).iterator("") + if r.name.endswith(".exe") +} + def enquote_executable(executable): if ' ' in executable: @@ -409,15 +427,11 @@ def _get_launcher(self, kind): bits = '32' platform_suffix = '-arm' if get_platform() == 'win-arm64' else '' name = '%s%s%s.exe' % (kind, bits, platform_suffix) - # Issue 31: don't hardcode an absolute package name, but - # determine it relative to the current package - distlib_package = __name__.rsplit('.', 1)[0] - resource = finder(distlib_package).find(name) - if not resource: + if name not in WRAPPERS: msg = ('Unable to find resource %s in package %s' % (name, distlib_package)) raise ValueError(msg) - return resource.bytes + return WRAPPERS[name] # Public API follows diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc index 9b0ea885fee8f1ec528ef3c708ee557d2d78ee1b..d1ab428eedf1956e8df721f81a09796bc607b92c 100644 GIT binary patch delta 98 zcmcb_{)(OFG%qg~0}$9UGNy0jVP^Jd*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix xPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD66w2LQBOAus>{ delta 72 zcmX@dw2g`9G%qg~0}uq?|CTn9r`aH1KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQQvoIRJg?8p{9x diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc index e266851c65a4003b580be74676d1ab16d636efa7..1868e355fe2837bce1840ae5b46d1e26e916b4f2 100644 GIT binary patch delta 4321 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 F{s;BFKJ5Si diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py b/env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py index 89e18680..78ccdfa4 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2015,2016,2017 Nir Cohen +# Copyright 2015-2021 Nir Cohen # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -55,7 +55,7 @@ # Python 3.7 TypedDict = dict -__version__ = "1.8.0" +__version__ = "1.9.0" class VersionDict(TypedDict): @@ -125,6 +125,7 @@ class InfoDict(TypedDict): # Base file names to be looked up for if _UNIXCONFDIR is not readable. _DISTRO_RELEASE_BASENAMES = [ "SuSE-release", + "altlinux-release", "arch-release", "base-release", "centos-release", @@ -151,6 +152,8 @@ class InfoDict(TypedDict): "system-release", "plesk-release", "iredmail-release", + "board-release", + "ec2_version", ) @@ -243,6 +246,7 @@ def id() -> str: "rocky" Rocky Linux "aix" AIX "guix" Guix System + "altlinux" ALT Linux ============== ========================================= If you have a need to get distros for reliable IDs added into this set, @@ -991,10 +995,10 @@ def info(self, pretty: bool = False, best: bool = False) -> InfoDict: For details, see :func:`distro.info`. """ - return dict( + return InfoDict( id=self.id(), version=self.version(pretty, best), - version_parts=dict( + version_parts=VersionDict( major=self.major_version(best), minor=self.minor_version(best), build_number=self.build_number(best), diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc index 307140654084d8905dd33a7376a414a15dfceac1..0221d76520482ec4e6b339f9d4d84a2aa892755f 100644 GIT binary patch delta 98 zcmZo>pUuv5nwOW00SIgv8PhlN>}T?5)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=9n7IQ0mIWFe diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc index 2d95a8a52ac8c9aae81d988046f767bda4a1d4fb..96c15f042af60533ca85d428d9bf875a9502acf9 100644 GIT binary patch delta 2101 zcmZuyTWk|Y6rHixyX#lh8-DJqYuk*eT$H>urZjbmL0)N+gR0Oi%ofNbGG8dCihTL!FRv8~7+ z-=g{S3Qg5<@Jm?Fvlf7GM9|8og~2MQN=&ss+mDf6wLnWOC0Tpa&p)6qi}s@ZkdeK0 zn+{QWgNN-q2FoCaDFCJ&ARG=qem{27)R`I6hT~`TR6N$3PE3sJM#hZwX%mTfCYd&3 z#}n}}orMo2;+j65jrI5U#=uGUrsBqE`WQ>6^hAbVvR@V|U{XG6yVSwTaUnmz4O@{g z8JwuVBqS>l1cWMtYJl}(SdjlE3_5X^fhc9={B=i+y7-i%#)ljWB6uy}3yu?_MS8hI z>`+Br8nIaiC2I~iD47q4f%2!@EjmV$MtqFex?@HxR0U@|_uOj1ADC~v+*zn^;;OgW7n$wd}^QVU-C8N<%SudpoHd6 zEGi9)a)Y(QfvA(!Vb%2rVT1;NqA;9Jk1;HkH6k=2>_KQo*f{+b3|q)SLTbP>cK}S2 z6O+rQ!_Y=dJvzt=Mha4OBjFL%FlP7`gC2#K}WKzzF zDHQ2*mQna=smbj;2Yrw&WmNu&RBM+~etuJmP?i58g{Pvf&BDYZE;{07BAH~h;Ik;e zW4c+Ku8ohX=t`PN!_35ugl^p`+m2)KL1B1L3=gIB(Y1m10{xN@B*ZWaUl<0PA#4}I zZUFv;TtkEWqNj`gj{2<%K2ien&DZQdE6or5m9v@oH<$cdXL@p*}G$=A?KxDfYj~&0$@%_*m#;k(Z zl^yPWPUo9u!^wNrAr8(eYG;}h1i7To9{zb**YF`sd2U!QatJy)hY_rg1F525#K-lL zPASCehP$+MdJ~*0Bu6y*?mieuvpk~I+j4{-Ri=G%QZwSa+S@y#66=FReoxV+P)7{M zmR?Nj>+8U<2LTs_cM`KrTrh0CkVVDR<1F#c(8z?5!1tRCKwlD*a7PzNL2}QW`$-BE z6#oOay6g_+-Jyb4eV}al=rz>1wx`jB+pC0+N4_danxB#}Ic@M~&IQ{#N)a-cIG z=v*W9v~le)ZJ?Vd2-c4Bzt!kYHx=ibRtPj#Td(h3-rkjmUt{+wGAltseHX+JmG_ic KO>7%Q6rR~X@7i8Fc5sO8BsQr-*g|bY3WPY6C<-d=Axc#Wk`Gi)cAPqKykTsF z!lfYjfH)CGf~pb~;ud-V_0kifw@OGT5rRZpi3o`cCn9Q5DHnKeH?fl-b)@~?yl>vV zdGo#5y*YY2XZ~oKK?39Q?mw0Mx|yV<_0iYPQX&x+Sn9)-2+~N9jNr>o+sesOJX34M9W}B4RO*3Ik;_6UdwxqG>bku@PXS%oHh_&DlM$ z_{{OW(W^*ytfiC^YqAv=cj+rsy7P!$rPLB{%V(xdh~N=`h76F+X7`s0R~n2r3d?0) zuIJ~km7CRaVTLu9o6c%s6;_;jxmLKwYBlG5hu3WJoBSE=74ItIy;RP(%Er4)h?$`w_w(h<)`<%_GC&n_xaI z+cHyZg{e$tT184iP(`;@IBh_DsU_o`!?|ju3RUx{7zicr{I1#bg$-ktck1OS%%2AM z^IsVIH1AcacbN^ z|0#qQ5rz@E66MfEzyyuw09s^E8d9@gjqMRI-^!l3JL8!juG}BnoQqw)KYs6O8<+h| zIn;ILF}kj4R=|y4s4sA~!s^X(ZH6s4HseQSz(Tr8zs^U2=%|Q`rxBh-z%sdp;N6Qe zILiYx@DqdEcrf6Od~6;Hn);uhG75V=@_g|z8uFJgcUQs*bdN|V{)(gugX%D<1qRgu zgKB~C)jALhd|#|_@m+LGEJuTrCwg`yE$%XT2=Bn;p$gC<8xmPjd#A{Q? zA(vq<9oy0iMplli?@)@N0lC#B5JSvZ-)-TBcI9>t*PgQZKJCA;;{J_cdX# z|4Di`XB=Ix(kYxBuf+{5vL>078JcZR(;+(CrNC)Vi>Y2K5v1CuZ*3<=wh|+40*=>^{{Z5?Kj{Df diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc index b97161773d4f39c8c9300c25f298dd89caddc829..8658eafff8a4b1d0e921f708b264bec05b4bae7d 100644 GIT binary patch delta 98 zcmeBVU&zjLnwOW00SIgv8Pg~7{Pt+p4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix zPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOE#M`1~CBu`UD`% delta 74 zcmZ3;-pS5$nwOW00SJQce@mOl^V=X>KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv b04S56mzblUk(!f}U!Gr-ld{>LF^CBOvuGM; diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc index f0f8bc0568d76b91d50a3bf19a8714ba2c4059e7..881b9e306266e17d100985eae4f935d40c16852a 100644 GIT binary patch delta 1695 zcmah}eQZ-z6u-BxAM4)w@!Gw%YuBw^*RSzWM%zKRGJ~ClC;`lv1{ARC3T|%ee0^gQ zN+<~l;Lub~CevUtB7?!00UIOHKZuZ!7^AYd!GOj~ACgQy<8)`zl$vx-X z^E>Cf_kQP|cYgn^z3T5(s&Yiu8jN=hHC|MI#H>5u>qy3hq_3+pIu!4T`q~n)!M=FE znDo8SH5iME-HCo*do0=;7i?=|(XM#k9^d-)Z9ZZo+Iph>yAqp(L{B^>W@nhNivJWN zlty#o~_(_Cro|~G@D6^m!<@snKDP>hMAgK=8nz?7i)bcq&MZuk(R%!RA)RhO2=q?R_UN%tIf&~ z5Ue(%tiV!h!L!|FW@$GVvI}(#O!N5VMb1T16|tiYtXucv4cb1$=ZX z=<7P+vVBRgtco}nkyg=Nib3c<8DEOE3rLp|YU^H=h+g=i?#*f`5|=C>DKtqMNEb$X zke3B_{WiE#-;E8h)R~5h&Nlgd0w#OmPiF^nlXt=vR~R0;G!0vCE{{$xkLD_?Mm?}` ztbKwz*>S$@0zdh3fx*5|0byfv9$~KeJ{)jWl9aT%3K?AU)kvl}JUA=mVHx% zd}sH&!ZI4a-|H1?M$6CFQ0{L?yrwy}X>@DT_u zvs>Py(UfVMP0$e~99j^%>^sZ;VDJdM-MCr%A@v@k0;m{)pBlSr$BF493?^3;=ipaq z{hUgZe(^pTh21xJ7reIe8oBsxu=$52e__&bbHhUGk}4$<=~XDM6zW=R_db-82r5wt zihvulU=Qk{CRDCb^z&kg7?RP$!o5H>3iC=G#KaCgp#VRNzo0LGKM-K;sI!?OauSY@!Mxp{ZMJ0R_9AjBw zKf!J@Nl}1-CNmy~;U+6S3TK;Yw5JIooS~w`8{BMauHQ)MQWxpUv3w?aLO;V=^Abk6 z3+J@@%-YNlXkg8%KIRT*gySu42I)+YTeZFJSVhE*uDbb1n29aE4=FAqyEszU;EmN* z&mzAS|HJNAtDU$UT8!1u7ho0gelCT2R8QEhCTz8Y{8$5tkOe>G&q{3Ck6%LS5_`v* z)z2hH3E^f(<5~Ls&rxxXifu$}7AA@GmKUiLrl|XKD(KHa7>7@q>)C%$2j4aO9RrlL z2Lw-}yhJJsI_7m+h8v9ey+%0eYi?nZBBFgFri>|VK#0ILc4WEGJ;XvgPQs%ZI zmgpPkCV%-0^r0Ep9j?Pu@Nsw(ODCu_1LN8G@F8qoiuqAT9uYMbDXNLK0zEz24kN9O ul_qS+434&sIVY;FTUSmS{dq)Om!t)%@=aQ7%#duNMx6z!@-FzT^~&FJY_(Vb delta 2145 zcmZ`(eQZW(%1dUaYnfOs0jP1Sm zvUb!FrrK0iLT7e5YN?rIsR*)xrcQ3FN>!(oYW%Z*OdV7=vS?a$|8>=apnj^_?sahJ zG^B2%J#RLSNdIkJ+?B+`*1Vmh6DA}ghnm5-SnmhOufp#oatoP~!Qd{1ejLm4_c}vtZkH=Hv5DR?`71FyKe1{p8z zOKKP3hU@!yKk;5L-tjP%TIUGH2jJg5E)cro#u^tOTd_{4b`S2dxz97@$(M|meao|# zLe<{bJGNMz?<#8Ev-7Hjux{Fs-BEAvT(dY%X&RifD3^xL&M(cD124|ixPi?~v2V>( zxAS!ycZyYQB%Nv{=}xh023v9T9q@JsD~H`D8U1TSRrz=1h}VsEhwB#7vRmLEy%7(w zY8$fiYpk^xT48-9@jB~kGBm6Q%!0>Htg1)$j=Ky(Q_aZCsV3Ckc?;bk1~-W&yTp<0 zW=Rb;hl$J>@~xL)QCPz~9P|Fc{Q!#;Pm7XAd3;H;@h1;~r|*zvaS=}Rg~MzY@wS$v z31#43ArfAEP3eU(-_OlTxJ5{s;CsIPBj0KL=h3A*hr;Mr$cL2v)`}lVQH&IN%;rcM zN#s5_7-6v)D!u~~$9GI;j%Kn?WQ5slQp{yj8AV7W=Mu9bnJ8Idj(9{#cxpjNC_*kP zr<7DSLw{2g!R}9C7aaE&umGR>f1qC@yU2foslYT_;{)r+uKTVAmI6B-QZ;%@yx|Iz z#pOLKuAxTvP&In+-KcmiDmFSjr6VuemfM$q@+bZk?aR{@(>jA=JJ%6*PpAm<6Dor` zqqoh-+6z|$UKsBGMZcG3zU@ak+o}2MTK@Cf?Wm)N6pd`+?5zq1-xb7bf(V}koIdY% zlF1b(nYg&h5XP6XnH=-V_|69%nyZfShb%hC@lH($L$!a=o=37tF%Uv?BpLAD$D1|< zUO>Qk@3Sso#onUiF%*Mi0qyQpT|%BsrH)%4NgNW>M7^w#&SoAzZrq&}ewfM4D+4Ti z7!3EWGO{8`zb5e#E#azlCXuEQGdW2-oO%+1p@FtDWZ^&LlS}Zk&?B*%dU7!vR#&O5 zX7yE#zK_hdqVDv=g>hB zN96taWsUE@g`B!^xG{K@q4wg?X-$U)&Il34!6JB5=+oyll0~t=lhGhNJ<#5n)VA*G zf+54-RS`}Obij?M2b`?`bDHH%H#M8H4gja^&@MJPd7Xhxenb9;3xR#RNCU zTn3%QHJ9EJ+HGyE5R8(hITxh|^ex{4QfTvSBu9B&s|!ixP4IEd%^6#(q=C$|f#C0a z2W%ZK@3u%M$eL83aFW8)1Xdl>nG|iHDUsqXNy=Whl!E+*1c46cT@6)fh&5S7nk-|`QVBnq-q%Uaa^}^FBs1n zORk#T3ri!%jCGE@e>zDFZXB1+THg&>$&aKr9r6AGb>L z)o6gVlI@!V9*yD!w`=P_>b^de7NIT zl5^ECn?06GrA6swdW^I1QoIlU7Ouu0HPIH{XtWCz@AxygJB0a?PesI(C!1z@YMuVw z+y_^7_@Y~|vp8ScQw}V5RXx#bu9%95>vioqHR=S9T}2X2Oo=?K#HfSd+Ii)_NIy71 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc index 85a2b1b64d5e561aa1f2f28c8835ef34bad938f9..cb07de78ffa58f486a1393d93647dc9acdbb6e71 100644 GIT binary patch literal 99518 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 literal 38400 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc index 32d4f6c1c4d2dac1cd45ba80f0a91326c1ef5571..6a45931e3cd52327ff332da2c61d3d248fab5024 100644 GIT binary patch delta 121 zcmaDL@>zuEG%qg~0}$9UGNy0j*}~${rXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k=G%qg~0}uq?|CY9qXA6r#o_=U?YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{ny2WuST(#h$pDjb)2RX#DWv5HUbW6fm-(wqOWma+f< DEmr^X)@m8j*l-(Eh^5;&x?;=$?zE@|Ep6!v=}I+ zpOTbVo|=`Y?~=6{C|M%Y diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc index 7838d1fbda8e32749395fb323453b68239b2dce2..15f2dae2cfe15144044e836487080a943926116a 100644 GIT binary patch delta 13221 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 U^;We#orpYt_OrV^r@96GAALiZ9smFU delta 13360 zcmYk@d0>pk8wc<_lN*WJ#Fa!2i6bTC*jy?l;=Yw?)z2MeTXnpIDz%Qf&svOI+=M#1 z)wj+nS`?*dQL3%prIf0={pNk2*>Cyd-R$RiX5M*c=6(0w*;mPh&n zI(~QO)nnVkrkAHw@1pWKfvE%QzBsh6F|_XMy^LN1>-6s5YnZE7-Nt=~zCLWw;JSlV zWYEA~1M2qgJ7B<|5rd2Yh2F~1CkF%?8RX~Zy)pUuK)UX&GczMN=π!JhmRIi3~s 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 Tuple[str, int]: return decode(data), len(data) class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: if errors != 'strict': raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) if not data: - return "", 0 + return b'', 0 labels = _unicode_dots_re.split(data) - trailing_dot = '' + trailing_dot = b'' if labels: if not labels[-1]: - trailing_dot = '.' + trailing_dot = b'.' del labels[-1] elif not final: # Keep potentially unfinished label until the next call del labels[-1] if labels: - trailing_dot = '.' + trailing_dot = b'.' result = [] size = 0 @@ -54,18 +54,21 @@ def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int] size += len(label) # Join with U+002E - result_str = '.'.join(result) + trailing_dot # type: ignore + result_bytes = b'.'.join(result) + trailing_dot size += len(trailing_dot) - return result_str, size + return result_bytes, size class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: if errors != 'strict': raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) if not data: return ('', 0) + if not isinstance(data, str): + data = str(data, 'ascii') + labels = _unicode_dots_re.split(data) trailing_dot = '' if labels: @@ -99,14 +102,17 @@ class StreamReader(Codec, codecs.StreamReader): pass -def getregentry() -> codecs.CodecInfo: - # Compatibility as a search_function for codecs.register() +def search_function(name: str) -> Optional[codecs.CodecInfo]: + if name != 'idna2008': + return None return codecs.CodecInfo( - name='idna', - encode=Codec().encode, # type: ignore - decode=Codec().decode, # type: ignore + name=name, + encode=Codec().encode, + decode=Codec().decode, incrementalencoder=IncrementalEncoder, incrementaldecoder=IncrementalDecoder, streamwriter=StreamWriter, streamreader=StreamReader, ) + +codecs.register(search_function) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/core.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/core.py index 4f300371..0dae61ac 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/idna/core.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/core.py @@ -150,9 +150,11 @@ def valid_contextj(label: str, pos: int) -> bool: joining_type = idnadata.joining_types.get(ord(label[i])) if joining_type == ord('T'): continue - if joining_type in [ord('L'), ord('D')]: + elif joining_type in [ord('L'), ord('D')]: ok = True break + else: + break if not ok: return False @@ -162,9 +164,11 @@ def valid_contextj(label: str, pos: int) -> bool: joining_type = idnadata.joining_types.get(ord(label[i])) if joining_type == ord('T'): continue - if joining_type in [ord('R'), ord('D')]: + elif joining_type in [ord('R'), ord('D')]: ok = True break + else: + break return ok if cp_value == 0x200d: @@ -236,12 +240,8 @@ def check_label(label: Union[str, bytes, bytearray]) -> None: if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): continue elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - try: - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( - _unot(cp_value), pos+1, repr(label))) - except ValueError: - raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format( + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( _unot(cp_value), pos+1, repr(label))) elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): if not valid_contexto(label, pos): @@ -262,13 +262,8 @@ def alabel(label: str) -> bytes: except UnicodeEncodeError: pass - if not label: - raise IDNAError('No Input') - - label = str(label) check_label(label) - label_bytes = _punycode(label) - label_bytes = _alabel_prefix + label_bytes + label_bytes = _alabel_prefix + _punycode(label) if not valid_label_length(label_bytes): raise IDNAError('Label too long') @@ -318,7 +313,7 @@ def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False status = uts46row[1] replacement = None # type: Optional[str] if len(uts46row) == 3: - replacement = uts46row[2] # type: ignore + replacement = uts46row[2] if (status == 'V' or (status == 'D' and not transitional) or (status == '3' and not std3_rules and replacement is None)): @@ -338,9 +333,9 @@ def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes: - if isinstance(s, (bytes, bytearray)): + if not isinstance(s, str): try: - s = s.decode('ascii') + s = str(s, 'ascii') except UnicodeDecodeError: raise IDNAError('should pass a unicode string to the function rather than a byte string.') if uts46: @@ -372,8 +367,8 @@ def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str: try: - if isinstance(s, (bytes, bytearray)): - s = s.decode('ascii') + if not isinstance(s, str): + s = str(s, 'ascii') except UnicodeDecodeError: raise IDNAError('Invalid ASCII in A-label') if uts46: diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py index 67db4625..c61dcf97 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py @@ -1,6 +1,6 @@ # This file is automatically generated by tools/idna-data -__version__ = '15.0.0' +__version__ = '15.1.0' scripts = { 'Greek': ( 0x37000000374, @@ -59,6 +59,7 @@ 0x2b7400002b81e, 0x2b8200002cea2, 0x2ceb00002ebe1, + 0x2ebf00002ee5e, 0x2f8000002fa1e, 0x300000003134b, 0x31350000323b0, @@ -100,16 +101,190 @@ ), } joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 85, - 0x608: 85, - 0x60b: 85, + 0xad: 84, + 0x300: 84, + 0x301: 84, + 0x302: 84, + 0x303: 84, + 0x304: 84, + 0x305: 84, + 0x306: 84, + 0x307: 84, + 0x308: 84, + 0x309: 84, + 0x30a: 84, + 0x30b: 84, + 0x30c: 84, + 0x30d: 84, + 0x30e: 84, + 0x30f: 84, + 0x310: 84, + 0x311: 84, + 0x312: 84, + 0x313: 84, + 0x314: 84, + 0x315: 84, + 0x316: 84, + 0x317: 84, + 0x318: 84, + 0x319: 84, + 0x31a: 84, + 0x31b: 84, + 0x31c: 84, + 0x31d: 84, + 0x31e: 84, + 0x31f: 84, + 0x320: 84, + 0x321: 84, + 0x322: 84, + 0x323: 84, + 0x324: 84, + 0x325: 84, + 0x326: 84, + 0x327: 84, + 0x328: 84, + 0x329: 84, + 0x32a: 84, + 0x32b: 84, + 0x32c: 84, + 0x32d: 84, + 0x32e: 84, + 0x32f: 84, + 0x330: 84, + 0x331: 84, + 0x332: 84, + 0x333: 84, + 0x334: 84, + 0x335: 84, + 0x336: 84, + 0x337: 84, + 0x338: 84, + 0x339: 84, + 0x33a: 84, + 0x33b: 84, + 0x33c: 84, + 0x33d: 84, + 0x33e: 84, + 0x33f: 84, + 0x340: 84, + 0x341: 84, + 0x342: 84, + 0x343: 84, + 0x344: 84, + 0x345: 84, + 0x346: 84, + 0x347: 84, + 0x348: 84, + 0x349: 84, + 0x34a: 84, + 0x34b: 84, + 0x34c: 84, + 0x34d: 84, + 0x34e: 84, + 0x34f: 84, + 0x350: 84, + 0x351: 84, + 0x352: 84, + 0x353: 84, + 0x354: 84, + 0x355: 84, + 0x356: 84, + 0x357: 84, + 0x358: 84, + 0x359: 84, + 0x35a: 84, + 0x35b: 84, + 0x35c: 84, + 0x35d: 84, + 0x35e: 84, + 0x35f: 84, + 0x360: 84, + 0x361: 84, + 0x362: 84, + 0x363: 84, + 0x364: 84, + 0x365: 84, + 0x366: 84, + 0x367: 84, + 0x368: 84, + 0x369: 84, + 0x36a: 84, + 0x36b: 84, + 0x36c: 84, + 0x36d: 84, + 0x36e: 84, + 0x36f: 84, + 0x483: 84, + 0x484: 84, + 0x485: 84, + 0x486: 84, + 0x487: 84, + 0x488: 84, + 0x489: 84, + 0x591: 84, + 0x592: 84, + 0x593: 84, + 0x594: 84, + 0x595: 84, + 0x596: 84, + 0x597: 84, + 0x598: 84, + 0x599: 84, + 0x59a: 84, + 0x59b: 84, + 0x59c: 84, + 0x59d: 84, + 0x59e: 84, + 0x59f: 84, + 0x5a0: 84, + 0x5a1: 84, + 0x5a2: 84, + 0x5a3: 84, + 0x5a4: 84, + 0x5a5: 84, + 0x5a6: 84, + 0x5a7: 84, + 0x5a8: 84, + 0x5a9: 84, + 0x5aa: 84, + 0x5ab: 84, + 0x5ac: 84, + 0x5ad: 84, + 0x5ae: 84, + 0x5af: 84, + 0x5b0: 84, + 0x5b1: 84, + 0x5b2: 84, + 0x5b3: 84, + 0x5b4: 84, + 0x5b5: 84, + 0x5b6: 84, + 0x5b7: 84, + 0x5b8: 84, + 0x5b9: 84, + 0x5ba: 84, + 0x5bb: 84, + 0x5bc: 84, + 0x5bd: 84, + 0x5bf: 84, + 0x5c1: 84, + 0x5c2: 84, + 0x5c4: 84, + 0x5c5: 84, + 0x5c7: 84, + 0x610: 84, + 0x611: 84, + 0x612: 84, + 0x613: 84, + 0x614: 84, + 0x615: 84, + 0x616: 84, + 0x617: 84, + 0x618: 84, + 0x619: 84, + 0x61a: 84, + 0x61c: 84, 0x620: 68, - 0x621: 85, 0x622: 82, 0x623: 82, 0x624: 82, @@ -151,12 +326,33 @@ 0x648: 82, 0x649: 68, 0x64a: 68, + 0x64b: 84, + 0x64c: 84, + 0x64d: 84, + 0x64e: 84, + 0x64f: 84, + 0x650: 84, + 0x651: 84, + 0x652: 84, + 0x653: 84, + 0x654: 84, + 0x655: 84, + 0x656: 84, + 0x657: 84, + 0x658: 84, + 0x659: 84, + 0x65a: 84, + 0x65b: 84, + 0x65c: 84, + 0x65d: 84, + 0x65e: 84, + 0x65f: 84, 0x66e: 68, 0x66f: 68, + 0x670: 84, 0x671: 82, 0x672: 82, 0x673: 82, - 0x674: 85, 0x675: 82, 0x676: 82, 0x677: 82, @@ -253,7 +449,25 @@ 0x6d2: 82, 0x6d3: 82, 0x6d5: 82, - 0x6dd: 85, + 0x6d6: 84, + 0x6d7: 84, + 0x6d8: 84, + 0x6d9: 84, + 0x6da: 84, + 0x6db: 84, + 0x6dc: 84, + 0x6df: 84, + 0x6e0: 84, + 0x6e1: 84, + 0x6e2: 84, + 0x6e3: 84, + 0x6e4: 84, + 0x6e7: 84, + 0x6e8: 84, + 0x6ea: 84, + 0x6eb: 84, + 0x6ec: 84, + 0x6ed: 84, 0x6ee: 82, 0x6ef: 82, 0x6fa: 68, @@ -262,6 +476,7 @@ 0x6ff: 68, 0x70f: 84, 0x710: 82, + 0x711: 84, 0x712: 68, 0x713: 68, 0x714: 68, @@ -292,6 +507,33 @@ 0x72d: 68, 0x72e: 68, 0x72f: 82, + 0x730: 84, + 0x731: 84, + 0x732: 84, + 0x733: 84, + 0x734: 84, + 0x735: 84, + 0x736: 84, + 0x737: 84, + 0x738: 84, + 0x739: 84, + 0x73a: 84, + 0x73b: 84, + 0x73c: 84, + 0x73d: 84, + 0x73e: 84, + 0x73f: 84, + 0x740: 84, + 0x741: 84, + 0x742: 84, + 0x743: 84, + 0x744: 84, + 0x745: 84, + 0x746: 84, + 0x747: 84, + 0x748: 84, + 0x749: 84, + 0x74a: 84, 0x74d: 82, 0x74e: 68, 0x74f: 68, @@ -343,6 +585,17 @@ 0x77d: 68, 0x77e: 68, 0x77f: 68, + 0x7a6: 84, + 0x7a7: 84, + 0x7a8: 84, + 0x7a9: 84, + 0x7aa: 84, + 0x7ab: 84, + 0x7ac: 84, + 0x7ad: 84, + 0x7ae: 84, + 0x7af: 84, + 0x7b0: 84, 0x7ca: 68, 0x7cb: 68, 0x7cc: 68, @@ -376,7 +629,38 @@ 0x7e8: 68, 0x7e9: 68, 0x7ea: 68, + 0x7eb: 84, + 0x7ec: 84, + 0x7ed: 84, + 0x7ee: 84, + 0x7ef: 84, + 0x7f0: 84, + 0x7f1: 84, + 0x7f2: 84, + 0x7f3: 84, 0x7fa: 67, + 0x7fd: 84, + 0x816: 84, + 0x817: 84, + 0x818: 84, + 0x819: 84, + 0x81b: 84, + 0x81c: 84, + 0x81d: 84, + 0x81e: 84, + 0x81f: 84, + 0x820: 84, + 0x821: 84, + 0x822: 84, + 0x823: 84, + 0x825: 84, + 0x826: 84, + 0x827: 84, + 0x829: 84, + 0x82a: 84, + 0x82b: 84, + 0x82c: 84, + 0x82d: 84, 0x840: 82, 0x841: 68, 0x842: 68, @@ -402,13 +686,14 @@ 0x856: 82, 0x857: 82, 0x858: 82, + 0x859: 84, + 0x85a: 84, + 0x85b: 84, 0x860: 68, - 0x861: 85, 0x862: 68, 0x863: 68, 0x864: 68, 0x865: 68, - 0x866: 85, 0x867: 82, 0x868: 68, 0x869: 82, @@ -436,16 +721,20 @@ 0x884: 67, 0x885: 67, 0x886: 68, - 0x887: 85, - 0x888: 85, 0x889: 68, 0x88a: 68, 0x88b: 68, 0x88c: 68, 0x88d: 68, 0x88e: 82, - 0x890: 85, - 0x891: 85, + 0x898: 84, + 0x899: 84, + 0x89a: 84, + 0x89b: 84, + 0x89c: 84, + 0x89d: 84, + 0x89e: 84, + 0x89f: 84, 0x8a0: 68, 0x8a1: 68, 0x8a2: 68, @@ -459,7 +748,6 @@ 0x8aa: 82, 0x8ab: 82, 0x8ac: 82, - 0x8ad: 85, 0x8ae: 82, 0x8af: 68, 0x8b0: 68, @@ -487,11 +775,357 @@ 0x8c6: 68, 0x8c7: 68, 0x8c8: 68, - 0x8e2: 85, - 0x1806: 85, + 0x8ca: 84, + 0x8cb: 84, + 0x8cc: 84, + 0x8cd: 84, + 0x8ce: 84, + 0x8cf: 84, + 0x8d0: 84, + 0x8d1: 84, + 0x8d2: 84, + 0x8d3: 84, + 0x8d4: 84, + 0x8d5: 84, + 0x8d6: 84, + 0x8d7: 84, + 0x8d8: 84, + 0x8d9: 84, + 0x8da: 84, + 0x8db: 84, + 0x8dc: 84, + 0x8dd: 84, + 0x8de: 84, + 0x8df: 84, + 0x8e0: 84, + 0x8e1: 84, + 0x8e3: 84, + 0x8e4: 84, + 0x8e5: 84, + 0x8e6: 84, + 0x8e7: 84, + 0x8e8: 84, + 0x8e9: 84, + 0x8ea: 84, + 0x8eb: 84, + 0x8ec: 84, + 0x8ed: 84, + 0x8ee: 84, + 0x8ef: 84, + 0x8f0: 84, + 0x8f1: 84, + 0x8f2: 84, + 0x8f3: 84, + 0x8f4: 84, + 0x8f5: 84, + 0x8f6: 84, + 0x8f7: 84, + 0x8f8: 84, + 0x8f9: 84, + 0x8fa: 84, + 0x8fb: 84, + 0x8fc: 84, + 0x8fd: 84, + 0x8fe: 84, + 0x8ff: 84, + 0x900: 84, + 0x901: 84, + 0x902: 84, + 0x93a: 84, + 0x93c: 84, + 0x941: 84, + 0x942: 84, + 0x943: 84, + 0x944: 84, + 0x945: 84, + 0x946: 84, + 0x947: 84, + 0x948: 84, + 0x94d: 84, + 0x951: 84, + 0x952: 84, + 0x953: 84, + 0x954: 84, + 0x955: 84, + 0x956: 84, + 0x957: 84, + 0x962: 84, + 0x963: 84, + 0x981: 84, + 0x9bc: 84, + 0x9c1: 84, + 0x9c2: 84, + 0x9c3: 84, + 0x9c4: 84, + 0x9cd: 84, + 0x9e2: 84, + 0x9e3: 84, + 0x9fe: 84, + 0xa01: 84, + 0xa02: 84, + 0xa3c: 84, + 0xa41: 84, + 0xa42: 84, + 0xa47: 84, + 0xa48: 84, + 0xa4b: 84, + 0xa4c: 84, + 0xa4d: 84, + 0xa51: 84, + 0xa70: 84, + 0xa71: 84, + 0xa75: 84, + 0xa81: 84, + 0xa82: 84, + 0xabc: 84, + 0xac1: 84, + 0xac2: 84, + 0xac3: 84, + 0xac4: 84, + 0xac5: 84, + 0xac7: 84, + 0xac8: 84, + 0xacd: 84, + 0xae2: 84, + 0xae3: 84, + 0xafa: 84, + 0xafb: 84, + 0xafc: 84, + 0xafd: 84, + 0xafe: 84, + 0xaff: 84, + 0xb01: 84, + 0xb3c: 84, + 0xb3f: 84, + 0xb41: 84, + 0xb42: 84, + 0xb43: 84, + 0xb44: 84, + 0xb4d: 84, + 0xb55: 84, + 0xb56: 84, + 0xb62: 84, + 0xb63: 84, + 0xb82: 84, + 0xbc0: 84, + 0xbcd: 84, + 0xc00: 84, + 0xc04: 84, + 0xc3c: 84, + 0xc3e: 84, + 0xc3f: 84, + 0xc40: 84, + 0xc46: 84, + 0xc47: 84, + 0xc48: 84, + 0xc4a: 84, + 0xc4b: 84, + 0xc4c: 84, + 0xc4d: 84, + 0xc55: 84, + 0xc56: 84, + 0xc62: 84, + 0xc63: 84, + 0xc81: 84, + 0xcbc: 84, + 0xcbf: 84, + 0xcc6: 84, + 0xccc: 84, + 0xccd: 84, + 0xce2: 84, + 0xce3: 84, + 0xd00: 84, + 0xd01: 84, + 0xd3b: 84, + 0xd3c: 84, + 0xd41: 84, + 0xd42: 84, + 0xd43: 84, + 0xd44: 84, + 0xd4d: 84, + 0xd62: 84, + 0xd63: 84, + 0xd81: 84, + 0xdca: 84, + 0xdd2: 84, + 0xdd3: 84, + 0xdd4: 84, + 0xdd6: 84, + 0xe31: 84, + 0xe34: 84, + 0xe35: 84, + 0xe36: 84, + 0xe37: 84, + 0xe38: 84, + 0xe39: 84, + 0xe3a: 84, + 0xe47: 84, + 0xe48: 84, + 0xe49: 84, + 0xe4a: 84, + 0xe4b: 84, + 0xe4c: 84, + 0xe4d: 84, + 0xe4e: 84, + 0xeb1: 84, + 0xeb4: 84, + 0xeb5: 84, + 0xeb6: 84, + 0xeb7: 84, + 0xeb8: 84, + 0xeb9: 84, + 0xeba: 84, + 0xebb: 84, + 0xebc: 84, + 0xec8: 84, + 0xec9: 84, + 0xeca: 84, + 0xecb: 84, + 0xecc: 84, + 0xecd: 84, + 0xece: 84, + 0xf18: 84, + 0xf19: 84, + 0xf35: 84, + 0xf37: 84, + 0xf39: 84, + 0xf71: 84, + 0xf72: 84, + 0xf73: 84, + 0xf74: 84, + 0xf75: 84, + 0xf76: 84, + 0xf77: 84, + 0xf78: 84, + 0xf79: 84, + 0xf7a: 84, + 0xf7b: 84, + 0xf7c: 84, + 0xf7d: 84, + 0xf7e: 84, + 0xf80: 84, + 0xf81: 84, + 0xf82: 84, + 0xf83: 84, + 0xf84: 84, + 0xf86: 84, + 0xf87: 84, + 0xf8d: 84, + 0xf8e: 84, + 0xf8f: 84, + 0xf90: 84, + 0xf91: 84, + 0xf92: 84, + 0xf93: 84, + 0xf94: 84, + 0xf95: 84, + 0xf96: 84, + 0xf97: 84, + 0xf99: 84, + 0xf9a: 84, + 0xf9b: 84, + 0xf9c: 84, + 0xf9d: 84, + 0xf9e: 84, + 0xf9f: 84, + 0xfa0: 84, + 0xfa1: 84, + 0xfa2: 84, + 0xfa3: 84, + 0xfa4: 84, + 0xfa5: 84, + 0xfa6: 84, + 0xfa7: 84, + 0xfa8: 84, + 0xfa9: 84, + 0xfaa: 84, + 0xfab: 84, + 0xfac: 84, + 0xfad: 84, + 0xfae: 84, + 0xfaf: 84, + 0xfb0: 84, + 0xfb1: 84, + 0xfb2: 84, + 0xfb3: 84, + 0xfb4: 84, + 0xfb5: 84, + 0xfb6: 84, + 0xfb7: 84, + 0xfb8: 84, + 0xfb9: 84, + 0xfba: 84, + 0xfbb: 84, + 0xfbc: 84, + 0xfc6: 84, + 0x102d: 84, + 0x102e: 84, + 0x102f: 84, + 0x1030: 84, + 0x1032: 84, + 0x1033: 84, + 0x1034: 84, + 0x1035: 84, + 0x1036: 84, + 0x1037: 84, + 0x1039: 84, + 0x103a: 84, + 0x103d: 84, + 0x103e: 84, + 0x1058: 84, + 0x1059: 84, + 0x105e: 84, + 0x105f: 84, + 0x1060: 84, + 0x1071: 84, + 0x1072: 84, + 0x1073: 84, + 0x1074: 84, + 0x1082: 84, + 0x1085: 84, + 0x1086: 84, + 0x108d: 84, + 0x109d: 84, + 0x135d: 84, + 0x135e: 84, + 0x135f: 84, + 0x1712: 84, + 0x1713: 84, + 0x1714: 84, + 0x1732: 84, + 0x1733: 84, + 0x1752: 84, + 0x1753: 84, + 0x1772: 84, + 0x1773: 84, + 0x17b4: 84, + 0x17b5: 84, + 0x17b7: 84, + 0x17b8: 84, + 0x17b9: 84, + 0x17ba: 84, + 0x17bb: 84, + 0x17bc: 84, + 0x17bd: 84, + 0x17c6: 84, + 0x17c9: 84, + 0x17ca: 84, + 0x17cb: 84, + 0x17cc: 84, + 0x17cd: 84, + 0x17ce: 84, + 0x17cf: 84, + 0x17d0: 84, + 0x17d1: 84, + 0x17d2: 84, + 0x17d3: 84, + 0x17dd: 84, 0x1807: 68, 0x180a: 67, - 0x180e: 85, + 0x180b: 84, + 0x180c: 84, + 0x180d: 84, + 0x180f: 84, 0x1820: 68, 0x1821: 68, 0x1822: 68, @@ -581,11 +1215,6 @@ 0x1876: 68, 0x1877: 68, 0x1878: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, 0x1885: 84, 0x1886: 84, 0x1887: 68, @@ -622,14 +1251,339 @@ 0x18a6: 68, 0x18a7: 68, 0x18a8: 68, + 0x18a9: 84, 0x18aa: 68, - 0x200c: 85, + 0x1920: 84, + 0x1921: 84, + 0x1922: 84, + 0x1927: 84, + 0x1928: 84, + 0x1932: 84, + 0x1939: 84, + 0x193a: 84, + 0x193b: 84, + 0x1a17: 84, + 0x1a18: 84, + 0x1a1b: 84, + 0x1a56: 84, + 0x1a58: 84, + 0x1a59: 84, + 0x1a5a: 84, + 0x1a5b: 84, + 0x1a5c: 84, + 0x1a5d: 84, + 0x1a5e: 84, + 0x1a60: 84, + 0x1a62: 84, + 0x1a65: 84, + 0x1a66: 84, + 0x1a67: 84, + 0x1a68: 84, + 0x1a69: 84, + 0x1a6a: 84, + 0x1a6b: 84, + 0x1a6c: 84, + 0x1a73: 84, + 0x1a74: 84, + 0x1a75: 84, + 0x1a76: 84, + 0x1a77: 84, + 0x1a78: 84, + 0x1a79: 84, + 0x1a7a: 84, + 0x1a7b: 84, + 0x1a7c: 84, + 0x1a7f: 84, + 0x1ab0: 84, + 0x1ab1: 84, + 0x1ab2: 84, + 0x1ab3: 84, + 0x1ab4: 84, + 0x1ab5: 84, + 0x1ab6: 84, + 0x1ab7: 84, + 0x1ab8: 84, + 0x1ab9: 84, + 0x1aba: 84, + 0x1abb: 84, + 0x1abc: 84, + 0x1abd: 84, + 0x1abe: 84, + 0x1abf: 84, + 0x1ac0: 84, + 0x1ac1: 84, + 0x1ac2: 84, + 0x1ac3: 84, + 0x1ac4: 84, + 0x1ac5: 84, + 0x1ac6: 84, + 0x1ac7: 84, + 0x1ac8: 84, + 0x1ac9: 84, + 0x1aca: 84, + 0x1acb: 84, + 0x1acc: 84, + 0x1acd: 84, + 0x1ace: 84, + 0x1b00: 84, + 0x1b01: 84, + 0x1b02: 84, + 0x1b03: 84, + 0x1b34: 84, + 0x1b36: 84, + 0x1b37: 84, + 0x1b38: 84, + 0x1b39: 84, + 0x1b3a: 84, + 0x1b3c: 84, + 0x1b42: 84, + 0x1b6b: 84, + 0x1b6c: 84, + 0x1b6d: 84, + 0x1b6e: 84, + 0x1b6f: 84, + 0x1b70: 84, + 0x1b71: 84, + 0x1b72: 84, + 0x1b73: 84, + 0x1b80: 84, + 0x1b81: 84, + 0x1ba2: 84, + 0x1ba3: 84, + 0x1ba4: 84, + 0x1ba5: 84, + 0x1ba8: 84, + 0x1ba9: 84, + 0x1bab: 84, + 0x1bac: 84, + 0x1bad: 84, + 0x1be6: 84, + 0x1be8: 84, + 0x1be9: 84, + 0x1bed: 84, + 0x1bef: 84, + 0x1bf0: 84, + 0x1bf1: 84, + 0x1c2c: 84, + 0x1c2d: 84, + 0x1c2e: 84, + 0x1c2f: 84, + 0x1c30: 84, + 0x1c31: 84, + 0x1c32: 84, + 0x1c33: 84, + 0x1c36: 84, + 0x1c37: 84, + 0x1cd0: 84, + 0x1cd1: 84, + 0x1cd2: 84, + 0x1cd4: 84, + 0x1cd5: 84, + 0x1cd6: 84, + 0x1cd7: 84, + 0x1cd8: 84, + 0x1cd9: 84, + 0x1cda: 84, + 0x1cdb: 84, + 0x1cdc: 84, + 0x1cdd: 84, + 0x1cde: 84, + 0x1cdf: 84, + 0x1ce0: 84, + 0x1ce2: 84, + 0x1ce3: 84, + 0x1ce4: 84, + 0x1ce5: 84, + 0x1ce6: 84, + 0x1ce7: 84, + 0x1ce8: 84, + 0x1ced: 84, + 0x1cf4: 84, + 0x1cf8: 84, + 0x1cf9: 84, + 0x1dc0: 84, + 0x1dc1: 84, + 0x1dc2: 84, + 0x1dc3: 84, + 0x1dc4: 84, + 0x1dc5: 84, + 0x1dc6: 84, + 0x1dc7: 84, + 0x1dc8: 84, + 0x1dc9: 84, + 0x1dca: 84, + 0x1dcb: 84, + 0x1dcc: 84, + 0x1dcd: 84, + 0x1dce: 84, + 0x1dcf: 84, + 0x1dd0: 84, + 0x1dd1: 84, + 0x1dd2: 84, + 0x1dd3: 84, + 0x1dd4: 84, + 0x1dd5: 84, + 0x1dd6: 84, + 0x1dd7: 84, + 0x1dd8: 84, + 0x1dd9: 84, + 0x1dda: 84, + 0x1ddb: 84, + 0x1ddc: 84, + 0x1ddd: 84, + 0x1dde: 84, + 0x1ddf: 84, + 0x1de0: 84, + 0x1de1: 84, + 0x1de2: 84, + 0x1de3: 84, + 0x1de4: 84, + 0x1de5: 84, + 0x1de6: 84, + 0x1de7: 84, + 0x1de8: 84, + 0x1de9: 84, + 0x1dea: 84, + 0x1deb: 84, + 0x1dec: 84, + 0x1ded: 84, + 0x1dee: 84, + 0x1def: 84, + 0x1df0: 84, + 0x1df1: 84, + 0x1df2: 84, + 0x1df3: 84, + 0x1df4: 84, + 0x1df5: 84, + 0x1df6: 84, + 0x1df7: 84, + 0x1df8: 84, + 0x1df9: 84, + 0x1dfa: 84, + 0x1dfb: 84, + 0x1dfc: 84, + 0x1dfd: 84, + 0x1dfe: 84, + 0x1dff: 84, + 0x200b: 84, 0x200d: 67, - 0x202f: 85, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, + 0x200e: 84, + 0x200f: 84, + 0x202a: 84, + 0x202b: 84, + 0x202c: 84, + 0x202d: 84, + 0x202e: 84, + 0x2060: 84, + 0x2061: 84, + 0x2062: 84, + 0x2063: 84, + 0x2064: 84, + 0x206a: 84, + 0x206b: 84, + 0x206c: 84, + 0x206d: 84, + 0x206e: 84, + 0x206f: 84, + 0x20d0: 84, + 0x20d1: 84, + 0x20d2: 84, + 0x20d3: 84, + 0x20d4: 84, + 0x20d5: 84, + 0x20d6: 84, + 0x20d7: 84, + 0x20d8: 84, + 0x20d9: 84, + 0x20da: 84, + 0x20db: 84, + 0x20dc: 84, + 0x20dd: 84, + 0x20de: 84, + 0x20df: 84, + 0x20e0: 84, + 0x20e1: 84, + 0x20e2: 84, + 0x20e3: 84, + 0x20e4: 84, + 0x20e5: 84, + 0x20e6: 84, + 0x20e7: 84, + 0x20e8: 84, + 0x20e9: 84, + 0x20ea: 84, + 0x20eb: 84, + 0x20ec: 84, + 0x20ed: 84, + 0x20ee: 84, + 0x20ef: 84, + 0x20f0: 84, + 0x2cef: 84, + 0x2cf0: 84, + 0x2cf1: 84, + 0x2d7f: 84, + 0x2de0: 84, + 0x2de1: 84, + 0x2de2: 84, + 0x2de3: 84, + 0x2de4: 84, + 0x2de5: 84, + 0x2de6: 84, + 0x2de7: 84, + 0x2de8: 84, + 0x2de9: 84, + 0x2dea: 84, + 0x2deb: 84, + 0x2dec: 84, + 0x2ded: 84, + 0x2dee: 84, + 0x2def: 84, + 0x2df0: 84, + 0x2df1: 84, + 0x2df2: 84, + 0x2df3: 84, + 0x2df4: 84, + 0x2df5: 84, + 0x2df6: 84, + 0x2df7: 84, + 0x2df8: 84, + 0x2df9: 84, + 0x2dfa: 84, + 0x2dfb: 84, + 0x2dfc: 84, + 0x2dfd: 84, + 0x2dfe: 84, + 0x2dff: 84, + 0x302a: 84, + 0x302b: 84, + 0x302c: 84, + 0x302d: 84, + 0x3099: 84, + 0x309a: 84, + 0xa66f: 84, + 0xa670: 84, + 0xa671: 84, + 0xa672: 84, + 0xa674: 84, + 0xa675: 84, + 0xa676: 84, + 0xa677: 84, + 0xa678: 84, + 0xa679: 84, + 0xa67a: 84, + 0xa67b: 84, + 0xa67c: 84, + 0xa67d: 84, + 0xa69e: 84, + 0xa69f: 84, + 0xa6f0: 84, + 0xa6f1: 84, + 0xa802: 84, + 0xa806: 84, + 0xa80b: 84, + 0xa825: 84, + 0xa826: 84, + 0xa82c: 84, 0xa840: 68, 0xa841: 68, 0xa842: 68, @@ -681,20 +1635,151 @@ 0xa870: 68, 0xa871: 68, 0xa872: 76, - 0xa873: 85, + 0xa8c4: 84, + 0xa8c5: 84, + 0xa8e0: 84, + 0xa8e1: 84, + 0xa8e2: 84, + 0xa8e3: 84, + 0xa8e4: 84, + 0xa8e5: 84, + 0xa8e6: 84, + 0xa8e7: 84, + 0xa8e8: 84, + 0xa8e9: 84, + 0xa8ea: 84, + 0xa8eb: 84, + 0xa8ec: 84, + 0xa8ed: 84, + 0xa8ee: 84, + 0xa8ef: 84, + 0xa8f0: 84, + 0xa8f1: 84, + 0xa8ff: 84, + 0xa926: 84, + 0xa927: 84, + 0xa928: 84, + 0xa929: 84, + 0xa92a: 84, + 0xa92b: 84, + 0xa92c: 84, + 0xa92d: 84, + 0xa947: 84, + 0xa948: 84, + 0xa949: 84, + 0xa94a: 84, + 0xa94b: 84, + 0xa94c: 84, + 0xa94d: 84, + 0xa94e: 84, + 0xa94f: 84, + 0xa950: 84, + 0xa951: 84, + 0xa980: 84, + 0xa981: 84, + 0xa982: 84, + 0xa9b3: 84, + 0xa9b6: 84, + 0xa9b7: 84, + 0xa9b8: 84, + 0xa9b9: 84, + 0xa9bc: 84, + 0xa9bd: 84, + 0xa9e5: 84, + 0xaa29: 84, + 0xaa2a: 84, + 0xaa2b: 84, + 0xaa2c: 84, + 0xaa2d: 84, + 0xaa2e: 84, + 0xaa31: 84, + 0xaa32: 84, + 0xaa35: 84, + 0xaa36: 84, + 0xaa43: 84, + 0xaa4c: 84, + 0xaa7c: 84, + 0xaab0: 84, + 0xaab2: 84, + 0xaab3: 84, + 0xaab4: 84, + 0xaab7: 84, + 0xaab8: 84, + 0xaabe: 84, + 0xaabf: 84, + 0xaac1: 84, + 0xaaec: 84, + 0xaaed: 84, + 0xaaf6: 84, + 0xabe5: 84, + 0xabe8: 84, + 0xabed: 84, + 0xfb1e: 84, + 0xfe00: 84, + 0xfe01: 84, + 0xfe02: 84, + 0xfe03: 84, + 0xfe04: 84, + 0xfe05: 84, + 0xfe06: 84, + 0xfe07: 84, + 0xfe08: 84, + 0xfe09: 84, + 0xfe0a: 84, + 0xfe0b: 84, + 0xfe0c: 84, + 0xfe0d: 84, + 0xfe0e: 84, + 0xfe0f: 84, + 0xfe20: 84, + 0xfe21: 84, + 0xfe22: 84, + 0xfe23: 84, + 0xfe24: 84, + 0xfe25: 84, + 0xfe26: 84, + 0xfe27: 84, + 0xfe28: 84, + 0xfe29: 84, + 0xfe2a: 84, + 0xfe2b: 84, + 0xfe2c: 84, + 0xfe2d: 84, + 0xfe2e: 84, + 0xfe2f: 84, + 0xfeff: 84, + 0xfff9: 84, + 0xfffa: 84, + 0xfffb: 84, + 0x101fd: 84, + 0x102e0: 84, + 0x10376: 84, + 0x10377: 84, + 0x10378: 84, + 0x10379: 84, + 0x1037a: 84, + 0x10a01: 84, + 0x10a02: 84, + 0x10a03: 84, + 0x10a05: 84, + 0x10a06: 84, + 0x10a0c: 84, + 0x10a0d: 84, + 0x10a0e: 84, + 0x10a0f: 84, + 0x10a38: 84, + 0x10a39: 84, + 0x10a3a: 84, + 0x10a3f: 84, 0x10ac0: 68, 0x10ac1: 68, 0x10ac2: 68, 0x10ac3: 68, 0x10ac4: 68, 0x10ac5: 82, - 0x10ac6: 85, 0x10ac7: 82, - 0x10ac8: 85, 0x10ac9: 82, 0x10aca: 82, - 0x10acb: 85, - 0x10acc: 85, 0x10acd: 76, 0x10ace: 82, 0x10acf: 82, @@ -716,9 +1801,9 @@ 0x10adf: 68, 0x10ae0: 68, 0x10ae1: 82, - 0x10ae2: 85, - 0x10ae3: 85, 0x10ae4: 82, + 0x10ae5: 84, + 0x10ae6: 84, 0x10aeb: 68, 0x10aec: 68, 0x10aed: 68, @@ -748,7 +1833,6 @@ 0x10bac: 82, 0x10bad: 68, 0x10bae: 68, - 0x10baf: 85, 0x10d00: 76, 0x10d01: 68, 0x10d02: 68, @@ -785,6 +1869,15 @@ 0x10d21: 68, 0x10d22: 82, 0x10d23: 68, + 0x10d24: 84, + 0x10d25: 84, + 0x10d26: 84, + 0x10d27: 84, + 0x10eab: 84, + 0x10eac: 84, + 0x10efd: 84, + 0x10efe: 84, + 0x10eff: 84, 0x10f30: 68, 0x10f31: 68, 0x10f32: 68, @@ -806,7 +1899,17 @@ 0x10f42: 68, 0x10f43: 68, 0x10f44: 68, - 0x10f45: 85, + 0x10f46: 84, + 0x10f47: 84, + 0x10f48: 84, + 0x10f49: 84, + 0x10f4a: 84, + 0x10f4b: 84, + 0x10f4c: 84, + 0x10f4d: 84, + 0x10f4e: 84, + 0x10f4f: 84, + 0x10f50: 84, 0x10f51: 68, 0x10f52: 68, 0x10f53: 68, @@ -829,14 +1932,16 @@ 0x10f7f: 68, 0x10f80: 68, 0x10f81: 68, + 0x10f82: 84, + 0x10f83: 84, + 0x10f84: 84, + 0x10f85: 84, 0x10fb0: 68, - 0x10fb1: 85, 0x10fb2: 68, 0x10fb3: 68, 0x10fb4: 82, 0x10fb5: 82, 0x10fb6: 82, - 0x10fb7: 85, 0x10fb8: 68, 0x10fb9: 82, 0x10fba: 82, @@ -845,20 +1950,668 @@ 0x10fbd: 82, 0x10fbe: 68, 0x10fbf: 68, - 0x10fc0: 85, 0x10fc1: 68, 0x10fc2: 82, 0x10fc3: 82, 0x10fc4: 68, - 0x10fc5: 85, - 0x10fc6: 85, - 0x10fc7: 85, - 0x10fc8: 85, 0x10fc9: 82, 0x10fca: 68, 0x10fcb: 76, - 0x110bd: 85, - 0x110cd: 85, + 0x11001: 84, + 0x11038: 84, + 0x11039: 84, + 0x1103a: 84, + 0x1103b: 84, + 0x1103c: 84, + 0x1103d: 84, + 0x1103e: 84, + 0x1103f: 84, + 0x11040: 84, + 0x11041: 84, + 0x11042: 84, + 0x11043: 84, + 0x11044: 84, + 0x11045: 84, + 0x11046: 84, + 0x11070: 84, + 0x11073: 84, + 0x11074: 84, + 0x1107f: 84, + 0x11080: 84, + 0x11081: 84, + 0x110b3: 84, + 0x110b4: 84, + 0x110b5: 84, + 0x110b6: 84, + 0x110b9: 84, + 0x110ba: 84, + 0x110c2: 84, + 0x11100: 84, + 0x11101: 84, + 0x11102: 84, + 0x11127: 84, + 0x11128: 84, + 0x11129: 84, + 0x1112a: 84, + 0x1112b: 84, + 0x1112d: 84, + 0x1112e: 84, + 0x1112f: 84, + 0x11130: 84, + 0x11131: 84, + 0x11132: 84, + 0x11133: 84, + 0x11134: 84, + 0x11173: 84, + 0x11180: 84, + 0x11181: 84, + 0x111b6: 84, + 0x111b7: 84, + 0x111b8: 84, + 0x111b9: 84, + 0x111ba: 84, + 0x111bb: 84, + 0x111bc: 84, + 0x111bd: 84, + 0x111be: 84, + 0x111c9: 84, + 0x111ca: 84, + 0x111cb: 84, + 0x111cc: 84, + 0x111cf: 84, + 0x1122f: 84, + 0x11230: 84, + 0x11231: 84, + 0x11234: 84, + 0x11236: 84, + 0x11237: 84, + 0x1123e: 84, + 0x11241: 84, + 0x112df: 84, + 0x112e3: 84, + 0x112e4: 84, + 0x112e5: 84, + 0x112e6: 84, + 0x112e7: 84, + 0x112e8: 84, + 0x112e9: 84, + 0x112ea: 84, + 0x11300: 84, + 0x11301: 84, + 0x1133b: 84, + 0x1133c: 84, + 0x11340: 84, + 0x11366: 84, + 0x11367: 84, + 0x11368: 84, + 0x11369: 84, + 0x1136a: 84, + 0x1136b: 84, + 0x1136c: 84, + 0x11370: 84, + 0x11371: 84, + 0x11372: 84, + 0x11373: 84, + 0x11374: 84, + 0x11438: 84, + 0x11439: 84, + 0x1143a: 84, + 0x1143b: 84, + 0x1143c: 84, + 0x1143d: 84, + 0x1143e: 84, + 0x1143f: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145e: 84, + 0x114b3: 84, + 0x114b4: 84, + 0x114b5: 84, + 0x114b6: 84, + 0x114b7: 84, + 0x114b8: 84, + 0x114ba: 84, + 0x114bf: 84, + 0x114c0: 84, + 0x114c2: 84, + 0x114c3: 84, + 0x115b2: 84, + 0x115b3: 84, + 0x115b4: 84, + 0x115b5: 84, + 0x115bc: 84, + 0x115bd: 84, + 0x115bf: 84, + 0x115c0: 84, + 0x115dc: 84, + 0x115dd: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163a: 84, + 0x1163d: 84, + 0x1163f: 84, + 0x11640: 84, + 0x116ab: 84, + 0x116ad: 84, + 0x116b0: 84, + 0x116b1: 84, + 0x116b2: 84, + 0x116b3: 84, + 0x116b4: 84, + 0x116b5: 84, + 0x116b7: 84, + 0x1171d: 84, + 0x1171e: 84, + 0x1171f: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172a: 84, + 0x1172b: 84, + 0x1182f: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183a: 84, + 0x1193b: 84, + 0x1193c: 84, + 0x1193e: 84, + 0x11943: 84, + 0x119d4: 84, + 0x119d5: 84, + 0x119d6: 84, + 0x119d7: 84, + 0x119da: 84, + 0x119db: 84, + 0x119e0: 84, + 0x11a01: 84, + 0x11a02: 84, + 0x11a03: 84, + 0x11a04: 84, + 0x11a05: 84, + 0x11a06: 84, + 0x11a07: 84, + 0x11a08: 84, + 0x11a09: 84, + 0x11a0a: 84, + 0x11a33: 84, + 0x11a34: 84, + 0x11a35: 84, + 0x11a36: 84, + 0x11a37: 84, + 0x11a38: 84, + 0x11a3b: 84, + 0x11a3c: 84, + 0x11a3d: 84, + 0x11a3e: 84, + 0x11a47: 84, + 0x11a51: 84, + 0x11a52: 84, + 0x11a53: 84, + 0x11a54: 84, + 0x11a55: 84, + 0x11a56: 84, + 0x11a59: 84, + 0x11a5a: 84, + 0x11a5b: 84, + 0x11a8a: 84, + 0x11a8b: 84, + 0x11a8c: 84, + 0x11a8d: 84, + 0x11a8e: 84, + 0x11a8f: 84, + 0x11a90: 84, + 0x11a91: 84, + 0x11a92: 84, + 0x11a93: 84, + 0x11a94: 84, + 0x11a95: 84, + 0x11a96: 84, + 0x11a98: 84, + 0x11a99: 84, + 0x11c30: 84, + 0x11c31: 84, + 0x11c32: 84, + 0x11c33: 84, + 0x11c34: 84, + 0x11c35: 84, + 0x11c36: 84, + 0x11c38: 84, + 0x11c39: 84, + 0x11c3a: 84, + 0x11c3b: 84, + 0x11c3c: 84, + 0x11c3d: 84, + 0x11c3f: 84, + 0x11c92: 84, + 0x11c93: 84, + 0x11c94: 84, + 0x11c95: 84, + 0x11c96: 84, + 0x11c97: 84, + 0x11c98: 84, + 0x11c99: 84, + 0x11c9a: 84, + 0x11c9b: 84, + 0x11c9c: 84, + 0x11c9d: 84, + 0x11c9e: 84, + 0x11c9f: 84, + 0x11ca0: 84, + 0x11ca1: 84, + 0x11ca2: 84, + 0x11ca3: 84, + 0x11ca4: 84, + 0x11ca5: 84, + 0x11ca6: 84, + 0x11ca7: 84, + 0x11caa: 84, + 0x11cab: 84, + 0x11cac: 84, + 0x11cad: 84, + 0x11cae: 84, + 0x11caf: 84, + 0x11cb0: 84, + 0x11cb2: 84, + 0x11cb3: 84, + 0x11cb5: 84, + 0x11cb6: 84, + 0x11d31: 84, + 0x11d32: 84, + 0x11d33: 84, + 0x11d34: 84, + 0x11d35: 84, + 0x11d36: 84, + 0x11d3a: 84, + 0x11d3c: 84, + 0x11d3d: 84, + 0x11d3f: 84, + 0x11d40: 84, + 0x11d41: 84, + 0x11d42: 84, + 0x11d43: 84, + 0x11d44: 84, + 0x11d45: 84, + 0x11d47: 84, + 0x11d90: 84, + 0x11d91: 84, + 0x11d95: 84, + 0x11d97: 84, + 0x11ef3: 84, + 0x11ef4: 84, + 0x11f00: 84, + 0x11f01: 84, + 0x11f36: 84, + 0x11f37: 84, + 0x11f38: 84, + 0x11f39: 84, + 0x11f3a: 84, + 0x11f40: 84, + 0x11f42: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343a: 84, + 0x1343b: 84, + 0x1343c: 84, + 0x1343d: 84, + 0x1343e: 84, + 0x1343f: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344a: 84, + 0x1344b: 84, + 0x1344c: 84, + 0x1344d: 84, + 0x1344e: 84, + 0x1344f: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x16af0: 84, + 0x16af1: 84, + 0x16af2: 84, + 0x16af3: 84, + 0x16af4: 84, + 0x16b30: 84, + 0x16b31: 84, + 0x16b32: 84, + 0x16b33: 84, + 0x16b34: 84, + 0x16b35: 84, + 0x16b36: 84, + 0x16f4f: 84, + 0x16f8f: 84, + 0x16f90: 84, + 0x16f91: 84, + 0x16f92: 84, + 0x16fe4: 84, + 0x1bc9d: 84, + 0x1bc9e: 84, + 0x1bca0: 84, + 0x1bca1: 84, + 0x1bca2: 84, + 0x1bca3: 84, + 0x1cf00: 84, + 0x1cf01: 84, + 0x1cf02: 84, + 0x1cf03: 84, + 0x1cf04: 84, + 0x1cf05: 84, + 0x1cf06: 84, + 0x1cf07: 84, + 0x1cf08: 84, + 0x1cf09: 84, + 0x1cf0a: 84, + 0x1cf0b: 84, + 0x1cf0c: 84, + 0x1cf0d: 84, + 0x1cf0e: 84, + 0x1cf0f: 84, + 0x1cf10: 84, + 0x1cf11: 84, + 0x1cf12: 84, + 0x1cf13: 84, + 0x1cf14: 84, + 0x1cf15: 84, + 0x1cf16: 84, + 0x1cf17: 84, + 0x1cf18: 84, + 0x1cf19: 84, + 0x1cf1a: 84, + 0x1cf1b: 84, + 0x1cf1c: 84, + 0x1cf1d: 84, + 0x1cf1e: 84, + 0x1cf1f: 84, + 0x1cf20: 84, + 0x1cf21: 84, + 0x1cf22: 84, + 0x1cf23: 84, + 0x1cf24: 84, + 0x1cf25: 84, + 0x1cf26: 84, + 0x1cf27: 84, + 0x1cf28: 84, + 0x1cf29: 84, + 0x1cf2a: 84, + 0x1cf2b: 84, + 0x1cf2c: 84, + 0x1cf2d: 84, + 0x1cf30: 84, + 0x1cf31: 84, + 0x1cf32: 84, + 0x1cf33: 84, + 0x1cf34: 84, + 0x1cf35: 84, + 0x1cf36: 84, + 0x1cf37: 84, + 0x1cf38: 84, + 0x1cf39: 84, + 0x1cf3a: 84, + 0x1cf3b: 84, + 0x1cf3c: 84, + 0x1cf3d: 84, + 0x1cf3e: 84, + 0x1cf3f: 84, + 0x1cf40: 84, + 0x1cf41: 84, + 0x1cf42: 84, + 0x1cf43: 84, + 0x1cf44: 84, + 0x1cf45: 84, + 0x1cf46: 84, + 0x1d167: 84, + 0x1d168: 84, + 0x1d169: 84, + 0x1d173: 84, + 0x1d174: 84, + 0x1d175: 84, + 0x1d176: 84, + 0x1d177: 84, + 0x1d178: 84, + 0x1d179: 84, + 0x1d17a: 84, + 0x1d17b: 84, + 0x1d17c: 84, + 0x1d17d: 84, + 0x1d17e: 84, + 0x1d17f: 84, + 0x1d180: 84, + 0x1d181: 84, + 0x1d182: 84, + 0x1d185: 84, + 0x1d186: 84, + 0x1d187: 84, + 0x1d188: 84, + 0x1d189: 84, + 0x1d18a: 84, + 0x1d18b: 84, + 0x1d1aa: 84, + 0x1d1ab: 84, + 0x1d1ac: 84, + 0x1d1ad: 84, + 0x1d242: 84, + 0x1d243: 84, + 0x1d244: 84, + 0x1da00: 84, + 0x1da01: 84, + 0x1da02: 84, + 0x1da03: 84, + 0x1da04: 84, + 0x1da05: 84, + 0x1da06: 84, + 0x1da07: 84, + 0x1da08: 84, + 0x1da09: 84, + 0x1da0a: 84, + 0x1da0b: 84, + 0x1da0c: 84, + 0x1da0d: 84, + 0x1da0e: 84, + 0x1da0f: 84, + 0x1da10: 84, + 0x1da11: 84, + 0x1da12: 84, + 0x1da13: 84, + 0x1da14: 84, + 0x1da15: 84, + 0x1da16: 84, + 0x1da17: 84, + 0x1da18: 84, + 0x1da19: 84, + 0x1da1a: 84, + 0x1da1b: 84, + 0x1da1c: 84, + 0x1da1d: 84, + 0x1da1e: 84, + 0x1da1f: 84, + 0x1da20: 84, + 0x1da21: 84, + 0x1da22: 84, + 0x1da23: 84, + 0x1da24: 84, + 0x1da25: 84, + 0x1da26: 84, + 0x1da27: 84, + 0x1da28: 84, + 0x1da29: 84, + 0x1da2a: 84, + 0x1da2b: 84, + 0x1da2c: 84, + 0x1da2d: 84, + 0x1da2e: 84, + 0x1da2f: 84, + 0x1da30: 84, + 0x1da31: 84, + 0x1da32: 84, + 0x1da33: 84, + 0x1da34: 84, + 0x1da35: 84, + 0x1da36: 84, + 0x1da3b: 84, + 0x1da3c: 84, + 0x1da3d: 84, + 0x1da3e: 84, + 0x1da3f: 84, + 0x1da40: 84, + 0x1da41: 84, + 0x1da42: 84, + 0x1da43: 84, + 0x1da44: 84, + 0x1da45: 84, + 0x1da46: 84, + 0x1da47: 84, + 0x1da48: 84, + 0x1da49: 84, + 0x1da4a: 84, + 0x1da4b: 84, + 0x1da4c: 84, + 0x1da4d: 84, + 0x1da4e: 84, + 0x1da4f: 84, + 0x1da50: 84, + 0x1da51: 84, + 0x1da52: 84, + 0x1da53: 84, + 0x1da54: 84, + 0x1da55: 84, + 0x1da56: 84, + 0x1da57: 84, + 0x1da58: 84, + 0x1da59: 84, + 0x1da5a: 84, + 0x1da5b: 84, + 0x1da5c: 84, + 0x1da5d: 84, + 0x1da5e: 84, + 0x1da5f: 84, + 0x1da60: 84, + 0x1da61: 84, + 0x1da62: 84, + 0x1da63: 84, + 0x1da64: 84, + 0x1da65: 84, + 0x1da66: 84, + 0x1da67: 84, + 0x1da68: 84, + 0x1da69: 84, + 0x1da6a: 84, + 0x1da6b: 84, + 0x1da6c: 84, + 0x1da75: 84, + 0x1da84: 84, + 0x1da9b: 84, + 0x1da9c: 84, + 0x1da9d: 84, + 0x1da9e: 84, + 0x1da9f: 84, + 0x1daa1: 84, + 0x1daa2: 84, + 0x1daa3: 84, + 0x1daa4: 84, + 0x1daa5: 84, + 0x1daa6: 84, + 0x1daa7: 84, + 0x1daa8: 84, + 0x1daa9: 84, + 0x1daaa: 84, + 0x1daab: 84, + 0x1daac: 84, + 0x1daad: 84, + 0x1daae: 84, + 0x1daaf: 84, + 0x1e000: 84, + 0x1e001: 84, + 0x1e002: 84, + 0x1e003: 84, + 0x1e004: 84, + 0x1e005: 84, + 0x1e006: 84, + 0x1e008: 84, + 0x1e009: 84, + 0x1e00a: 84, + 0x1e00b: 84, + 0x1e00c: 84, + 0x1e00d: 84, + 0x1e00e: 84, + 0x1e00f: 84, + 0x1e010: 84, + 0x1e011: 84, + 0x1e012: 84, + 0x1e013: 84, + 0x1e014: 84, + 0x1e015: 84, + 0x1e016: 84, + 0x1e017: 84, + 0x1e018: 84, + 0x1e01b: 84, + 0x1e01c: 84, + 0x1e01d: 84, + 0x1e01e: 84, + 0x1e01f: 84, + 0x1e020: 84, + 0x1e021: 84, + 0x1e023: 84, + 0x1e024: 84, + 0x1e026: 84, + 0x1e027: 84, + 0x1e028: 84, + 0x1e029: 84, + 0x1e02a: 84, + 0x1e08f: 84, + 0x1e130: 84, + 0x1e131: 84, + 0x1e132: 84, + 0x1e133: 84, + 0x1e134: 84, + 0x1e135: 84, + 0x1e136: 84, + 0x1e2ae: 84, + 0x1e2ec: 84, + 0x1e2ed: 84, + 0x1e2ee: 84, + 0x1e2ef: 84, + 0x1e4ec: 84, + 0x1e4ed: 84, + 0x1e4ee: 84, + 0x1e4ef: 84, + 0x1e8d0: 84, + 0x1e8d1: 84, + 0x1e8d2: 84, + 0x1e8d3: 84, + 0x1e8d4: 84, + 0x1e8d5: 84, + 0x1e8d6: 84, 0x1e900: 68, 0x1e901: 68, 0x1e902: 68, @@ -927,7 +2680,351 @@ 0x1e941: 68, 0x1e942: 68, 0x1e943: 68, + 0x1e944: 84, + 0x1e945: 84, + 0x1e946: 84, + 0x1e947: 84, + 0x1e948: 84, + 0x1e949: 84, + 0x1e94a: 84, 0x1e94b: 84, + 0xe0001: 84, + 0xe0020: 84, + 0xe0021: 84, + 0xe0022: 84, + 0xe0023: 84, + 0xe0024: 84, + 0xe0025: 84, + 0xe0026: 84, + 0xe0027: 84, + 0xe0028: 84, + 0xe0029: 84, + 0xe002a: 84, + 0xe002b: 84, + 0xe002c: 84, + 0xe002d: 84, + 0xe002e: 84, + 0xe002f: 84, + 0xe0030: 84, + 0xe0031: 84, + 0xe0032: 84, + 0xe0033: 84, + 0xe0034: 84, + 0xe0035: 84, + 0xe0036: 84, + 0xe0037: 84, + 0xe0038: 84, + 0xe0039: 84, + 0xe003a: 84, + 0xe003b: 84, + 0xe003c: 84, + 0xe003d: 84, + 0xe003e: 84, + 0xe003f: 84, + 0xe0040: 84, + 0xe0041: 84, + 0xe0042: 84, + 0xe0043: 84, + 0xe0044: 84, + 0xe0045: 84, + 0xe0046: 84, + 0xe0047: 84, + 0xe0048: 84, + 0xe0049: 84, + 0xe004a: 84, + 0xe004b: 84, + 0xe004c: 84, + 0xe004d: 84, + 0xe004e: 84, + 0xe004f: 84, + 0xe0050: 84, + 0xe0051: 84, + 0xe0052: 84, + 0xe0053: 84, + 0xe0054: 84, + 0xe0055: 84, + 0xe0056: 84, + 0xe0057: 84, + 0xe0058: 84, + 0xe0059: 84, + 0xe005a: 84, + 0xe005b: 84, + 0xe005c: 84, + 0xe005d: 84, + 0xe005e: 84, + 0xe005f: 84, + 0xe0060: 84, + 0xe0061: 84, + 0xe0062: 84, + 0xe0063: 84, + 0xe0064: 84, + 0xe0065: 84, + 0xe0066: 84, + 0xe0067: 84, + 0xe0068: 84, + 0xe0069: 84, + 0xe006a: 84, + 0xe006b: 84, + 0xe006c: 84, + 0xe006d: 84, + 0xe006e: 84, + 0xe006f: 84, + 0xe0070: 84, + 0xe0071: 84, + 0xe0072: 84, + 0xe0073: 84, + 0xe0074: 84, + 0xe0075: 84, + 0xe0076: 84, + 0xe0077: 84, + 0xe0078: 84, + 0xe0079: 84, + 0xe007a: 84, + 0xe007b: 84, + 0xe007c: 84, + 0xe007d: 84, + 0xe007e: 84, + 0xe007f: 84, + 0xe0100: 84, + 0xe0101: 84, + 0xe0102: 84, + 0xe0103: 84, + 0xe0104: 84, + 0xe0105: 84, + 0xe0106: 84, + 0xe0107: 84, + 0xe0108: 84, + 0xe0109: 84, + 0xe010a: 84, + 0xe010b: 84, + 0xe010c: 84, + 0xe010d: 84, + 0xe010e: 84, + 0xe010f: 84, + 0xe0110: 84, + 0xe0111: 84, + 0xe0112: 84, + 0xe0113: 84, + 0xe0114: 84, + 0xe0115: 84, + 0xe0116: 84, + 0xe0117: 84, + 0xe0118: 84, + 0xe0119: 84, + 0xe011a: 84, + 0xe011b: 84, + 0xe011c: 84, + 0xe011d: 84, + 0xe011e: 84, + 0xe011f: 84, + 0xe0120: 84, + 0xe0121: 84, + 0xe0122: 84, + 0xe0123: 84, + 0xe0124: 84, + 0xe0125: 84, + 0xe0126: 84, + 0xe0127: 84, + 0xe0128: 84, + 0xe0129: 84, + 0xe012a: 84, + 0xe012b: 84, + 0xe012c: 84, + 0xe012d: 84, + 0xe012e: 84, + 0xe012f: 84, + 0xe0130: 84, + 0xe0131: 84, + 0xe0132: 84, + 0xe0133: 84, + 0xe0134: 84, + 0xe0135: 84, + 0xe0136: 84, + 0xe0137: 84, + 0xe0138: 84, + 0xe0139: 84, + 0xe013a: 84, + 0xe013b: 84, + 0xe013c: 84, + 0xe013d: 84, + 0xe013e: 84, + 0xe013f: 84, + 0xe0140: 84, + 0xe0141: 84, + 0xe0142: 84, + 0xe0143: 84, + 0xe0144: 84, + 0xe0145: 84, + 0xe0146: 84, + 0xe0147: 84, + 0xe0148: 84, + 0xe0149: 84, + 0xe014a: 84, + 0xe014b: 84, + 0xe014c: 84, + 0xe014d: 84, + 0xe014e: 84, + 0xe014f: 84, + 0xe0150: 84, + 0xe0151: 84, + 0xe0152: 84, + 0xe0153: 84, + 0xe0154: 84, + 0xe0155: 84, + 0xe0156: 84, + 0xe0157: 84, + 0xe0158: 84, + 0xe0159: 84, + 0xe015a: 84, + 0xe015b: 84, + 0xe015c: 84, + 0xe015d: 84, + 0xe015e: 84, + 0xe015f: 84, + 0xe0160: 84, + 0xe0161: 84, + 0xe0162: 84, + 0xe0163: 84, + 0xe0164: 84, + 0xe0165: 84, + 0xe0166: 84, + 0xe0167: 84, + 0xe0168: 84, + 0xe0169: 84, + 0xe016a: 84, + 0xe016b: 84, + 0xe016c: 84, + 0xe016d: 84, + 0xe016e: 84, + 0xe016f: 84, + 0xe0170: 84, + 0xe0171: 84, + 0xe0172: 84, + 0xe0173: 84, + 0xe0174: 84, + 0xe0175: 84, + 0xe0176: 84, + 0xe0177: 84, + 0xe0178: 84, + 0xe0179: 84, + 0xe017a: 84, + 0xe017b: 84, + 0xe017c: 84, + 0xe017d: 84, + 0xe017e: 84, + 0xe017f: 84, + 0xe0180: 84, + 0xe0181: 84, + 0xe0182: 84, + 0xe0183: 84, + 0xe0184: 84, + 0xe0185: 84, + 0xe0186: 84, + 0xe0187: 84, + 0xe0188: 84, + 0xe0189: 84, + 0xe018a: 84, + 0xe018b: 84, + 0xe018c: 84, + 0xe018d: 84, + 0xe018e: 84, + 0xe018f: 84, + 0xe0190: 84, + 0xe0191: 84, + 0xe0192: 84, + 0xe0193: 84, + 0xe0194: 84, + 0xe0195: 84, + 0xe0196: 84, + 0xe0197: 84, + 0xe0198: 84, + 0xe0199: 84, + 0xe019a: 84, + 0xe019b: 84, + 0xe019c: 84, + 0xe019d: 84, + 0xe019e: 84, + 0xe019f: 84, + 0xe01a0: 84, + 0xe01a1: 84, + 0xe01a2: 84, + 0xe01a3: 84, + 0xe01a4: 84, + 0xe01a5: 84, + 0xe01a6: 84, + 0xe01a7: 84, + 0xe01a8: 84, + 0xe01a9: 84, + 0xe01aa: 84, + 0xe01ab: 84, + 0xe01ac: 84, + 0xe01ad: 84, + 0xe01ae: 84, + 0xe01af: 84, + 0xe01b0: 84, + 0xe01b1: 84, + 0xe01b2: 84, + 0xe01b3: 84, + 0xe01b4: 84, + 0xe01b5: 84, + 0xe01b6: 84, + 0xe01b7: 84, + 0xe01b8: 84, + 0xe01b9: 84, + 0xe01ba: 84, + 0xe01bb: 84, + 0xe01bc: 84, + 0xe01bd: 84, + 0xe01be: 84, + 0xe01bf: 84, + 0xe01c0: 84, + 0xe01c1: 84, + 0xe01c2: 84, + 0xe01c3: 84, + 0xe01c4: 84, + 0xe01c5: 84, + 0xe01c6: 84, + 0xe01c7: 84, + 0xe01c8: 84, + 0xe01c9: 84, + 0xe01ca: 84, + 0xe01cb: 84, + 0xe01cc: 84, + 0xe01cd: 84, + 0xe01ce: 84, + 0xe01cf: 84, + 0xe01d0: 84, + 0xe01d1: 84, + 0xe01d2: 84, + 0xe01d3: 84, + 0xe01d4: 84, + 0xe01d5: 84, + 0xe01d6: 84, + 0xe01d7: 84, + 0xe01d8: 84, + 0xe01d9: 84, + 0xe01da: 84, + 0xe01db: 84, + 0xe01dc: 84, + 0xe01dd: 84, + 0xe01de: 84, + 0xe01df: 84, + 0xe01e0: 84, + 0xe01e1: 84, + 0xe01e2: 84, + 0xe01e3: 84, + 0xe01e4: 84, + 0xe01e5: 84, + 0xe01e6: 84, + 0xe01e7: 84, + 0xe01e8: 84, + 0xe01e9: 84, + 0xe01ea: 84, + 0xe01eb: 84, + 0xe01ec: 84, + 0xe01ed: 84, + 0xe01ee: 84, + 0xe01ef: 84, } codepoint_classes = { 'PVALID': ( @@ -1834,7 +3931,6 @@ 0xa7d50000a7d6, 0xa7d70000a7d8, 0xa7d90000a7da, - 0xa7f20000a7f5, 0xa7f60000a7f8, 0xa7fa0000a828, 0xa82c0000a82d, @@ -1907,9 +4003,7 @@ 0x1060000010737, 0x1074000010756, 0x1076000010768, - 0x1078000010786, - 0x10787000107b1, - 0x107b2000107bb, + 0x1078000010781, 0x1080000010806, 0x1080800010809, 0x1080a00010836, @@ -2112,7 +4206,6 @@ 0x1e01b0001e022, 0x1e0230001e025, 0x1e0260001e02b, - 0x1e0300001e06e, 0x1e08f0001e090, 0x1e1000001e12d, 0x1e1300001e13e, @@ -2134,6 +4227,7 @@ 0x2b7400002b81e, 0x2b8200002cea2, 0x2ceb00002ebe1, + 0x2ebf00002ee5e, 0x300000003134b, 0x31350000323b0, ), diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py index 8501893b..ed811133 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py @@ -1,2 +1,2 @@ -__version__ = '3.4' +__version__ = '3.7' diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py index 186796c1..6a1eddbf 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py @@ -7,7 +7,7 @@ """IDNA Mapping Table from UTS46.""" -__version__ = '15.0.0' +__version__ = '15.1.0' def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x0, '3'), @@ -1899,7 +1899,7 @@ def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1E9A, 'M', 'aʾ'), (0x1E9B, 'M', 'ṡ'), (0x1E9C, 'V'), - (0x1E9E, 'M', 'ss'), + (0x1E9E, 'M', 'ß'), (0x1E9F, 'V'), (0x1EA0, 'M', 'ạ'), (0x1EA1, 'V'), @@ -2418,10 +2418,6 @@ def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x222F, 'M', '∮∮'), (0x2230, 'M', '∮∮∮'), (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), (0x2329, 'M', '〈'), (0x232A, 'M', '〉'), (0x232B, 'V'), @@ -2502,14 +2498,14 @@ def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x24BA, 'M', 'e'), (0x24BB, 'M', 'f'), (0x24BC, 'M', 'g'), - ] - -def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x24BD, 'M', 'h'), (0x24BE, 'M', 'i'), (0x24BF, 'M', 'j'), (0x24C0, 'M', 'k'), + ] + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x24C1, 'M', 'l'), (0x24C2, 'M', 'm'), (0x24C3, 'M', 'n'), @@ -2606,14 +2602,14 @@ def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2C26, 'M', 'ⱖ'), (0x2C27, 'M', 'ⱗ'), (0x2C28, 'M', 'ⱘ'), - ] - -def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2C29, 'M', 'ⱙ'), (0x2C2A, 'M', 'ⱚ'), (0x2C2B, 'M', 'ⱛ'), (0x2C2C, 'M', 'ⱜ'), + ] + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2C2D, 'M', 'ⱝ'), (0x2C2E, 'M', 'ⱞ'), (0x2C2F, 'M', 'ⱟ'), @@ -2710,14 +2706,14 @@ def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2CC0, 'M', 'ⳁ'), (0x2CC1, 'V'), (0x2CC2, 'M', 'ⳃ'), - ] - -def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2CC3, 'V'), (0x2CC4, 'M', 'ⳅ'), (0x2CC5, 'V'), (0x2CC6, 'M', 'ⳇ'), + ] + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2CC7, 'V'), (0x2CC8, 'M', 'ⳉ'), (0x2CC9, 'V'), @@ -2814,14 +2810,14 @@ def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F13, 'M', '勹'), (0x2F14, 'M', '匕'), (0x2F15, 'M', '匚'), - ] - -def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2F16, 'M', '匸'), (0x2F17, 'M', '十'), (0x2F18, 'M', '卜'), (0x2F19, 'M', '卩'), + ] + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2F1A, 'M', '厂'), (0x2F1B, 'M', '厶'), (0x2F1C, 'M', '又'), @@ -2918,14 +2914,14 @@ def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F77, 'M', '糸'), (0x2F78, 'M', '缶'), (0x2F79, 'M', '网'), - ] - -def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2F7A, 'M', '羊'), (0x2F7B, 'M', '羽'), (0x2F7C, 'M', '老'), (0x2F7D, 'M', '而'), + ] + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2F7E, 'M', '耒'), (0x2F7F, 'M', '耳'), (0x2F80, 'M', '聿'), @@ -3022,14 +3018,14 @@ def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x3036, 'M', '〒'), (0x3037, 'V'), (0x3038, 'M', '十'), - ] - -def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x3039, 'M', '卄'), (0x303A, 'M', '卅'), (0x303B, 'V'), (0x3040, 'X'), + ] + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x3041, 'V'), (0x3097, 'X'), (0x3099, 'V'), @@ -3126,14 +3122,14 @@ def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x3182, 'M', 'ᇱ'), (0x3183, 'M', 'ᇲ'), (0x3184, 'M', 'ᅗ'), - ] - -def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x3185, 'M', 'ᅘ'), (0x3186, 'M', 'ᅙ'), (0x3187, 'M', 'ᆄ'), (0x3188, 'M', 'ᆅ'), + ] + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x3189, 'M', 'ᆈ'), (0x318A, 'M', 'ᆑ'), (0x318B, 'M', 'ᆒ'), @@ -3230,14 +3226,14 @@ def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x3244, 'M', '問'), (0x3245, 'M', '幼'), (0x3246, 'M', '文'), - ] - -def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x3247, 'M', '箏'), (0x3248, 'V'), (0x3250, 'M', 'pte'), (0x3251, 'M', '21'), + ] + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x3252, 'M', '22'), (0x3253, 'M', '23'), (0x3254, 'M', '24'), @@ -3334,14 +3330,14 @@ def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x32AF, 'M', '協'), (0x32B0, 'M', '夜'), (0x32B1, 'M', '36'), - ] - -def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x32B2, 'M', '37'), (0x32B3, 'M', '38'), (0x32B4, 'M', '39'), (0x32B5, 'M', '40'), + ] + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x32B6, 'M', '41'), (0x32B7, 'M', '42'), (0x32B8, 'M', '43'), @@ -3438,14 +3434,14 @@ def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x3313, 'M', 'ギルダー'), (0x3314, 'M', 'キロ'), (0x3315, 'M', 'キログラム'), - ] - -def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x3316, 'M', 'キロメートル'), (0x3317, 'M', 'キロワット'), (0x3318, 'M', 'グラム'), (0x3319, 'M', 'グラムトン'), + ] + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x331A, 'M', 'クルゼイロ'), (0x331B, 'M', 'クローネ'), (0x331C, 'M', 'ケース'), @@ -3542,14 +3538,14 @@ def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x3377, 'M', 'dm'), (0x3378, 'M', 'dm2'), (0x3379, 'M', 'dm3'), - ] - -def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x337A, 'M', 'iu'), (0x337B, 'M', '平成'), (0x337C, 'M', '昭和'), (0x337D, 'M', '大正'), + ] + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x337E, 'M', '明治'), (0x337F, 'M', '株式会社'), (0x3380, 'M', 'pa'), @@ -3646,14 +3642,14 @@ def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x33DB, 'M', 'sr'), (0x33DC, 'M', 'sv'), (0x33DD, 'M', 'wb'), - ] - -def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x33DE, 'M', 'v∕m'), (0x33DF, 'M', 'a∕m'), (0x33E0, 'M', '1日'), (0x33E1, 'M', '2日'), + ] + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x33E2, 'M', '3日'), (0x33E3, 'M', '4日'), (0x33E4, 'M', '5日'), @@ -3750,14 +3746,14 @@ def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xA68B, 'V'), (0xA68C, 'M', 'ꚍ'), (0xA68D, 'V'), - ] - -def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xA68E, 'M', 'ꚏ'), (0xA68F, 'V'), (0xA690, 'M', 'ꚑ'), (0xA691, 'V'), + ] + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xA692, 'M', 'ꚓ'), (0xA693, 'V'), (0xA694, 'M', 'ꚕ'), @@ -3854,14 +3850,14 @@ def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xA779, 'M', 'ꝺ'), (0xA77A, 'V'), (0xA77B, 'M', 'ꝼ'), - ] - -def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xA77C, 'V'), (0xA77D, 'M', 'ᵹ'), (0xA77E, 'M', 'ꝿ'), (0xA77F, 'V'), + ] + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xA780, 'M', 'ꞁ'), (0xA781, 'V'), (0xA782, 'M', 'ꞃ'), @@ -3958,14 +3954,14 @@ def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xA878, 'X'), (0xA880, 'V'), (0xA8C6, 'X'), - ] - -def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xA8CE, 'V'), (0xA8DA, 'X'), (0xA8E0, 'V'), (0xA954, 'X'), + ] + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xA95F, 'V'), (0xA97D, 'X'), (0xA980, 'V'), @@ -4062,14 +4058,14 @@ def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xABA8, 'M', 'Ꮨ'), (0xABA9, 'M', 'Ꮩ'), (0xABAA, 'M', 'Ꮪ'), - ] - -def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xABAB, 'M', 'Ꮫ'), (0xABAC, 'M', 'Ꮬ'), (0xABAD, 'M', 'Ꮭ'), (0xABAE, 'M', 'Ꮮ'), + ] + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xABAF, 'M', 'Ꮯ'), (0xABB0, 'M', 'Ꮰ'), (0xABB1, 'M', 'Ꮱ'), @@ -4166,14 +4162,14 @@ def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xF943, 'M', '弄'), (0xF944, 'M', '籠'), (0xF945, 'M', '聾'), - ] - -def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xF946, 'M', '牢'), (0xF947, 'M', '磊'), (0xF948, 'M', '賂'), (0xF949, 'M', '雷'), + ] + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xF94A, 'M', '壘'), (0xF94B, 'M', '屢'), (0xF94C, 'M', '樓'), @@ -4270,14 +4266,14 @@ def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xF9A7, 'M', '獵'), (0xF9A8, 'M', '令'), (0xF9A9, 'M', '囹'), - ] - -def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xF9AA, 'M', '寧'), (0xF9AB, 'M', '嶺'), (0xF9AC, 'M', '怜'), (0xF9AD, 'M', '玲'), + ] + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xF9AE, 'M', '瑩'), (0xF9AF, 'M', '羚'), (0xF9B0, 'M', '聆'), @@ -4374,14 +4370,14 @@ def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFA0B, 'M', '廓'), (0xFA0C, 'M', '兀'), (0xFA0D, 'M', '嗀'), - ] - -def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFA0E, 'V'), (0xFA10, 'M', '塚'), (0xFA11, 'V'), (0xFA12, 'M', '晴'), + ] + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFA13, 'V'), (0xFA15, 'M', '凞'), (0xFA16, 'M', '猪'), @@ -4478,14 +4474,14 @@ def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFA76, 'M', '勇'), (0xFA77, 'M', '勺'), (0xFA78, 'M', '喝'), - ] - -def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFA79, 'M', '啕'), (0xFA7A, 'M', '喙'), (0xFA7B, 'M', '嗢'), (0xFA7C, 'M', '塚'), + ] + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFA7D, 'M', '墳'), (0xFA7E, 'M', '奄'), (0xFA7F, 'M', '奔'), @@ -4582,14 +4578,14 @@ def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFADA, 'X'), (0xFB00, 'M', 'ff'), (0xFB01, 'M', 'fi'), - ] - -def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFB02, 'M', 'fl'), (0xFB03, 'M', 'ffi'), (0xFB04, 'M', 'ffl'), (0xFB05, 'M', 'st'), + ] + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFB07, 'X'), (0xFB13, 'M', 'մն'), (0xFB14, 'M', 'մե'), @@ -4686,14 +4682,14 @@ def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFBDB, 'M', 'ۈ'), (0xFBDD, 'M', 'ۇٴ'), (0xFBDE, 'M', 'ۋ'), - ] - -def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFBE0, 'M', 'ۅ'), (0xFBE2, 'M', 'ۉ'), (0xFBE4, 'M', 'ې'), (0xFBE8, 'M', 'ى'), + ] + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFBEA, 'M', 'ئا'), (0xFBEC, 'M', 'ئە'), (0xFBEE, 'M', 'ئو'), @@ -4790,14 +4786,14 @@ def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFC54, 'M', 'هي'), (0xFC55, 'M', 'يج'), (0xFC56, 'M', 'يح'), - ] - -def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFC57, 'M', 'يخ'), (0xFC58, 'M', 'يم'), (0xFC59, 'M', 'يى'), (0xFC5A, 'M', 'يي'), + ] + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFC5B, 'M', 'ذٰ'), (0xFC5C, 'M', 'رٰ'), (0xFC5D, 'M', 'ىٰ'), @@ -4894,14 +4890,14 @@ def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFCB8, 'M', 'طح'), (0xFCB9, 'M', 'ظم'), (0xFCBA, 'M', 'عج'), - ] - -def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFCBB, 'M', 'عم'), (0xFCBC, 'M', 'غج'), (0xFCBD, 'M', 'غم'), (0xFCBE, 'M', 'فج'), + ] + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFCBF, 'M', 'فح'), (0xFCC0, 'M', 'فخ'), (0xFCC1, 'M', 'فم'), @@ -4998,14 +4994,14 @@ def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFD1C, 'M', 'حي'), (0xFD1D, 'M', 'جى'), (0xFD1E, 'M', 'جي'), - ] - -def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFD1F, 'M', 'خى'), (0xFD20, 'M', 'خي'), (0xFD21, 'M', 'صى'), (0xFD22, 'M', 'صي'), + ] + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFD23, 'M', 'ضى'), (0xFD24, 'M', 'ضي'), (0xFD25, 'M', 'شج'), @@ -5102,14 +5098,14 @@ def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFDA4, 'M', 'تمى'), (0xFDA5, 'M', 'جمي'), (0xFDA6, 'M', 'جحى'), - ] - -def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFDA7, 'M', 'جمى'), (0xFDA8, 'M', 'سخى'), (0xFDA9, 'M', 'صحي'), (0xFDAA, 'M', 'شحي'), + ] + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFDAB, 'M', 'ضحي'), (0xFDAC, 'M', 'لجي'), (0xFDAD, 'M', 'لمي'), @@ -5206,14 +5202,14 @@ def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFE5B, '3', '{'), (0xFE5C, '3', '}'), (0xFE5D, 'M', '〔'), - ] - -def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFE5E, 'M', '〕'), (0xFE5F, '3', '#'), (0xFE60, '3', '&'), (0xFE61, '3', '*'), + ] + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFE62, '3', '+'), (0xFE63, 'M', '-'), (0xFE64, '3', '<'), @@ -5310,14 +5306,14 @@ def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFF18, 'M', '8'), (0xFF19, 'M', '9'), (0xFF1A, '3', ':'), - ] - -def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFF1B, '3', ';'), (0xFF1C, '3', '<'), (0xFF1D, '3', '='), (0xFF1E, '3', '>'), + ] + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFF1F, '3', '?'), (0xFF20, '3', '@'), (0xFF21, 'M', 'a'), @@ -5414,14 +5410,14 @@ def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFF7C, 'M', 'シ'), (0xFF7D, 'M', 'ス'), (0xFF7E, 'M', 'セ'), - ] - -def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFF7F, 'M', 'ソ'), (0xFF80, 'M', 'タ'), (0xFF81, 'M', 'チ'), (0xFF82, 'M', 'ツ'), + ] + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFF83, 'M', 'テ'), (0xFF84, 'M', 'ト'), (0xFF85, 'M', 'ナ'), @@ -5518,14 +5514,14 @@ def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xFFE7, 'X'), (0xFFE8, 'M', '│'), (0xFFE9, 'M', '←'), - ] - -def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0xFFEA, 'M', '↑'), (0xFFEB, 'M', '→'), (0xFFEC, 'M', '↓'), (0xFFED, 'M', '■'), + ] + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0xFFEE, 'M', '○'), (0xFFEF, 'X'), (0x10000, 'V'), @@ -5622,14 +5618,14 @@ def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x104B3, 'M', '𐓛'), (0x104B4, 'M', '𐓜'), (0x104B5, 'M', '𐓝'), - ] - -def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x104B6, 'M', '𐓞'), (0x104B7, 'M', '𐓟'), (0x104B8, 'M', '𐓠'), (0x104B9, 'M', '𐓡'), + ] + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x104BA, 'M', '𐓢'), (0x104BB, 'M', '𐓣'), (0x104BC, 'M', '𐓤'), @@ -5726,14 +5722,14 @@ def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x10786, 'X'), (0x10787, 'M', 'ʣ'), (0x10788, 'M', 'ꭦ'), - ] - -def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x10789, 'M', 'ʥ'), (0x1078A, 'M', 'ʤ'), (0x1078B, 'M', 'ɖ'), (0x1078C, 'M', 'ɗ'), + ] + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1078D, 'M', 'ᶑ'), (0x1078E, 'M', 'ɘ'), (0x1078F, 'M', 'ɞ'), @@ -5830,14 +5826,14 @@ def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x10A60, 'V'), (0x10AA0, 'X'), (0x10AC0, 'V'), - ] - -def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x10AE7, 'X'), (0x10AEB, 'V'), (0x10AF7, 'X'), (0x10B00, 'V'), + ] + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x10B36, 'X'), (0x10B39, 'V'), (0x10B56, 'X'), @@ -5934,14 +5930,14 @@ def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1107F, 'V'), (0x110BD, 'X'), (0x110BE, 'V'), - ] - -def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x110C3, 'X'), (0x110D0, 'V'), (0x110E9, 'X'), (0x110F0, 'V'), + ] + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x110FA, 'X'), (0x11100, 'V'), (0x11135, 'X'), @@ -6038,14 +6034,14 @@ def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x118A4, 'M', '𑣄'), (0x118A5, 'M', '𑣅'), (0x118A6, 'M', '𑣆'), - ] - -def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x118A7, 'M', '𑣇'), (0x118A8, 'M', '𑣈'), (0x118A9, 'M', '𑣉'), (0x118AA, 'M', '𑣊'), + ] + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x118AB, 'M', '𑣋'), (0x118AC, 'M', '𑣌'), (0x118AD, 'M', '𑣍'), @@ -6142,14 +6138,14 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x11EE0, 'V'), (0x11EF9, 'X'), (0x11F00, 'V'), - ] - -def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x11F11, 'X'), (0x11F12, 'V'), (0x11F3B, 'X'), (0x11F3E, 'V'), + ] + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x11F5A, 'X'), (0x11FB0, 'V'), (0x11FB1, 'X'), @@ -6246,14 +6242,14 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x18D00, 'V'), (0x18D09, 'X'), (0x1AFF0, 'V'), - ] - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1AFF4, 'X'), (0x1AFF5, 'V'), (0x1AFFC, 'X'), (0x1AFFD, 'V'), + ] + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1AFFF, 'X'), (0x1B000, 'V'), (0x1B123, 'X'), @@ -6350,14 +6346,14 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D41E, 'M', 'e'), (0x1D41F, 'M', 'f'), (0x1D420, 'M', 'g'), - ] - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D421, 'M', 'h'), (0x1D422, 'M', 'i'), (0x1D423, 'M', 'j'), (0x1D424, 'M', 'k'), + ] + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D425, 'M', 'l'), (0x1D426, 'M', 'm'), (0x1D427, 'M', 'n'), @@ -6454,14 +6450,14 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D482, 'M', 'a'), (0x1D483, 'M', 'b'), (0x1D484, 'M', 'c'), - ] - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D485, 'M', 'd'), (0x1D486, 'M', 'e'), (0x1D487, 'M', 'f'), (0x1D488, 'M', 'g'), + ] + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D489, 'M', 'h'), (0x1D48A, 'M', 'i'), (0x1D48B, 'M', 'j'), @@ -6558,14 +6554,14 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D4E9, 'M', 'z'), (0x1D4EA, 'M', 'a'), (0x1D4EB, 'M', 'b'), - ] - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D4EC, 'M', 'c'), (0x1D4ED, 'M', 'd'), (0x1D4EE, 'M', 'e'), (0x1D4EF, 'M', 'f'), + ] + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D4F0, 'M', 'g'), (0x1D4F1, 'M', 'h'), (0x1D4F2, 'M', 'i'), @@ -6662,14 +6658,14 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D550, 'M', 'y'), (0x1D551, 'X'), (0x1D552, 'M', 'a'), - ] - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D553, 'M', 'b'), (0x1D554, 'M', 'c'), (0x1D555, 'M', 'd'), (0x1D556, 'M', 'e'), + ] + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D557, 'M', 'f'), (0x1D558, 'M', 'g'), (0x1D559, 'M', 'h'), @@ -6766,14 +6762,14 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D5B4, 'M', 'u'), (0x1D5B5, 'M', 'v'), (0x1D5B6, 'M', 'w'), - ] - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D5B7, 'M', 'x'), (0x1D5B8, 'M', 'y'), (0x1D5B9, 'M', 'z'), (0x1D5BA, 'M', 'a'), + ] + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D5BB, 'M', 'b'), (0x1D5BC, 'M', 'c'), (0x1D5BD, 'M', 'd'), @@ -6870,14 +6866,14 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D618, 'M', 'q'), (0x1D619, 'M', 'r'), (0x1D61A, 'M', 's'), - ] - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D61B, 'M', 't'), (0x1D61C, 'M', 'u'), (0x1D61D, 'M', 'v'), (0x1D61E, 'M', 'w'), + ] + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D61F, 'M', 'x'), (0x1D620, 'M', 'y'), (0x1D621, 'M', 'z'), @@ -6974,14 +6970,14 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D67C, 'M', 'm'), (0x1D67D, 'M', 'n'), (0x1D67E, 'M', 'o'), - ] - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D67F, 'M', 'p'), (0x1D680, 'M', 'q'), (0x1D681, 'M', 'r'), (0x1D682, 'M', 's'), + ] + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D683, 'M', 't'), (0x1D684, 'M', 'u'), (0x1D685, 'M', 'v'), @@ -7078,14 +7074,14 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D6E2, 'M', 'α'), (0x1D6E3, 'M', 'β'), (0x1D6E4, 'M', 'γ'), - ] - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D6E5, 'M', 'δ'), (0x1D6E6, 'M', 'ε'), (0x1D6E7, 'M', 'ζ'), (0x1D6E8, 'M', 'η'), + ] + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D6E9, 'M', 'θ'), (0x1D6EA, 'M', 'ι'), (0x1D6EB, 'M', 'κ'), @@ -7182,14 +7178,14 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D747, 'M', 'σ'), (0x1D749, 'M', 'τ'), (0x1D74A, 'M', 'υ'), - ] - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D74B, 'M', 'φ'), (0x1D74C, 'M', 'χ'), (0x1D74D, 'M', 'ψ'), (0x1D74E, 'M', 'ω'), + ] + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D74F, 'M', '∂'), (0x1D750, 'M', 'ε'), (0x1D751, 'M', 'θ'), @@ -7286,14 +7282,14 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D7AD, 'M', 'δ'), (0x1D7AE, 'M', 'ε'), (0x1D7AF, 'M', 'ζ'), - ] - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D7B0, 'M', 'η'), (0x1D7B1, 'M', 'θ'), (0x1D7B2, 'M', 'ι'), (0x1D7B3, 'M', 'κ'), + ] + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D7B4, 'M', 'λ'), (0x1D7B5, 'M', 'μ'), (0x1D7B6, 'M', 'ν'), @@ -7390,14 +7386,14 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1E030, 'M', 'а'), (0x1E031, 'M', 'б'), (0x1E032, 'M', 'в'), - ] - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1E033, 'M', 'г'), (0x1E034, 'M', 'д'), (0x1E035, 'M', 'е'), (0x1E036, 'M', 'ж'), + ] + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1E037, 'M', 'з'), (0x1E038, 'M', 'и'), (0x1E039, 'M', 'к'), @@ -7494,14 +7490,14 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1E907, 'M', '𞤩'), (0x1E908, 'M', '𞤪'), (0x1E909, 'M', '𞤫'), - ] - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1E90A, 'M', '𞤬'), (0x1E90B, 'M', '𞤭'), (0x1E90C, 'M', '𞤮'), (0x1E90D, 'M', '𞤯'), + ] + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1E90E, 'M', '𞤰'), (0x1E90F, 'M', '𞤱'), (0x1E910, 'M', '𞤲'), @@ -7598,14 +7594,14 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1EE48, 'X'), (0x1EE49, 'M', 'ي'), (0x1EE4A, 'X'), - ] - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1EE4B, 'M', 'ل'), (0x1EE4C, 'X'), (0x1EE4D, 'M', 'ن'), (0x1EE4E, 'M', 'س'), + ] + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1EE4F, 'M', 'ع'), (0x1EE50, 'X'), (0x1EE51, 'M', 'ص'), @@ -7702,14 +7698,14 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1EEB2, 'M', 'ق'), (0x1EEB3, 'M', 'ر'), (0x1EEB4, 'M', 'ش'), - ] - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1EEB5, 'M', 'ت'), (0x1EEB6, 'M', 'ث'), (0x1EEB7, 'M', 'خ'), (0x1EEB8, 'M', 'ذ'), + ] + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1EEB9, 'M', 'ض'), (0x1EEBA, 'M', 'ظ'), (0x1EEBB, 'M', 'غ'), @@ -7806,14 +7802,14 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1F150, 'V'), (0x1F16A, 'M', 'mc'), (0x1F16B, 'M', 'md'), - ] - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1F16C, 'M', 'mr'), (0x1F16D, 'V'), (0x1F190, 'M', 'dj'), (0x1F191, 'V'), + ] + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1F1AE, 'X'), (0x1F1E6, 'V'), (0x1F200, 'M', 'ほか'), @@ -7910,14 +7906,14 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1FA54, 'X'), (0x1FA60, 'V'), (0x1FA6E, 'X'), - ] - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1FA70, 'V'), (0x1FA7D, 'X'), (0x1FA80, 'V'), (0x1FA89, 'X'), + ] + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1FA90, 'V'), (0x1FABE, 'X'), (0x1FABF, 'V'), @@ -7953,6 +7949,8 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2CEA2, 'X'), (0x2CEB0, 'V'), (0x2EBE1, 'X'), + (0x2EBF0, 'V'), + (0x2EE5E, 'X'), (0x2F800, 'M', '丽'), (0x2F801, 'M', '丸'), (0x2F802, 'M', '乁'), @@ -8014,12 +8012,12 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F83C, 'M', '咞'), (0x2F83D, 'M', '吸'), (0x2F83E, 'M', '呈'), + (0x2F83F, 'M', '周'), + (0x2F840, 'M', '咢'), ] def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F83F, 'M', '周'), - (0x2F840, 'M', '咢'), (0x2F841, 'M', '哶'), (0x2F842, 'M', '唐'), (0x2F843, 'M', '啓'), @@ -8118,12 +8116,12 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F8A4, 'M', '𢛔'), (0x2F8A5, 'M', '惇'), (0x2F8A6, 'M', '慈'), + (0x2F8A7, 'M', '慌'), + (0x2F8A8, 'M', '慎'), ] def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F8A7, 'M', '慌'), - (0x2F8A8, 'M', '慎'), (0x2F8A9, 'M', '慌'), (0x2F8AA, 'M', '慺'), (0x2F8AB, 'M', '憎'), @@ -8222,12 +8220,12 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F908, 'M', '港'), (0x2F909, 'M', '湮'), (0x2F90A, 'M', '㴳'), + (0x2F90B, 'M', '滋'), + (0x2F90C, 'M', '滇'), ] def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F90B, 'M', '滋'), - (0x2F90C, 'M', '滇'), (0x2F90D, 'M', '𣻑'), (0x2F90E, 'M', '淹'), (0x2F90F, 'M', '潮'), @@ -8326,12 +8324,12 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F96F, 'M', '縂'), (0x2F970, 'M', '繅'), (0x2F971, 'M', '䌴'), + (0x2F972, 'M', '𦈨'), + (0x2F973, 'M', '𦉇'), ] def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F972, 'M', '𦈨'), - (0x2F973, 'M', '𦉇'), (0x2F974, 'M', '䍙'), (0x2F975, 'M', '𦋙'), (0x2F976, 'M', '罺'), @@ -8430,12 +8428,12 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F9D3, 'M', '𧲨'), (0x2F9D4, 'M', '貫'), (0x2F9D5, 'M', '賁'), + (0x2F9D6, 'M', '贛'), + (0x2F9D7, 'M', '起'), ] def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F9D6, 'M', '贛'), - (0x2F9D7, 'M', '起'), (0x2F9D8, 'M', '𧼯'), (0x2F9D9, 'M', '𠠄'), (0x2F9DA, 'M', '跋'), diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py index 1300b866..919b86f1 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py @@ -1,16 +1,14 @@ -# coding: utf-8 from .exceptions import * from .ext import ExtType, Timestamp import os -import sys -version = (1, 0, 5) -__version__ = "1.0.5" +version = (1, 0, 8) +__version__ = "1.0.8" -if os.environ.get("MSGPACK_PUREPYTHON") or sys.version_info[0] == 2: +if os.environ.get("MSGPACK_PUREPYTHON"): from .fallback import Packer, unpackb, Unpacker else: try: diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc index 1618485378b4ce7c9a62385cd918ee56ddac9232..d50e80cfcf8f832fcde6f747ef72eaa9ca416a30 100644 GIT binary patch delta 664 zcmZ8e&ubGw6rRccXm&T7Una^@sDYHGsnE4*Q9=zw6RcR4%Mb^~&7`8};=^wR-dM^4cnU4Sz$8?M7}czp~c@LIWGO z(2#VHUG?38M|%ChuHk`;`dfa_Zn&sRXs+TSOuQX?Wu4!Io7@MWZIBlk&*UgCU;)#MqNWk|BvOZm%! z_?)6d#fyh^BN?MU3M8KA&db$7PZ-ciE*98ZWme6Ks*CJ{l4C!V>80o<>ULY=NZ5<; zqy~qPw&8j~TNICs``)%s`!z~^8qN^5Lnqm)I@J)9P+=PO`!~Ae`FPMJWje<-@$bQN z4yO`?@B~=jLH;MuPE}xJ_9ni@vwH^TvU*V3FCCQk%b(LT$5MeEt7};?)wX Lxgs6SL5}|bDkzhv delta 731 zcmZ8dO=}ZD7@paWG}+Cj&E~@fa;T)_gJ`y;6rq(sT17!@i?N67rEEGAnq;%P%qAxF z(iVhXJQ(&*_!IQjdKJNnpsZjIdhr$z6!hZEiibEb&->2ve$4Z}Kb4m;<+Y+nfS&s0 zkCr)BGF%vri-iJ@1XI*SB2t=0EmnL zikNaQsz-Z@uJmGh3<67zfPkN!=8^OS=y4=dR8f>-0w?q&R`e8(>uId&R}O_7z;la$ zC@}Z8#ec0E;Aw6MMtlPdVM+1AaAi@XY95Qrm8Ht6uimfU*{N;b+uPZFaC@im@b323 zH;%?V9e#(Bx5eF9aX%B5;BJT~i zA+aS925B$De_oAIuf!3y;DDumocRd~F8gm`fuyMMMaS6hHpx7rylX-proFl_S(fR$ z#1oa8pvD)F(KlS4rTr@n4J=knvMkr@i^Wo!dGo%6NBh|6w{6Syc|7V9fwf^<@Hv}O z?xA-k=5x_UbQYSl*S1==A8r|@*<}3!(M$k|dcVc&Q7{@482sc5rfnc!Wav^^gP!Ay z3|+#8CQL&x+OP1%3C`@<=;a8Bk1i3FD@(D3N~;G~3O2LaJ%tT$|m1{3`${ F{sA+gs@4Di diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc index 02e4c6526c0adfaba4340973770b57f56789854c..dd4a7abe7a75fba1e79a2a706b3b2fa8ee38babd 100644 GIT binary patch delta 99 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 delta 10213 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 K`A self._max_str_len: - raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len)) + raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})") obj = self._read(n) elif b & 0b11110000 == 0b10010000: n = b & 0b00001111 typ = TYPE_ARRAY if n > self._max_array_len: - raise ValueError( - "%s exceeds max_array_len(%s)" % (n, self._max_array_len) - ) + raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})") elif b & 0b11110000 == 0b10000000: n = b & 0b00001111 typ = TYPE_MAP if n > self._max_map_len: - raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len)) + raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})") elif b == 0xC0: obj = None elif b == 0xC2: @@ -477,65 +429,61 @@ def _read_header(self): size, fmt, typ = _MSGPACK_HEADERS[b] self._reserve(size) if len(fmt) > 0: - n = _unpack_from(fmt, self._buffer, self._buff_i)[0] + n = struct.unpack_from(fmt, self._buffer, self._buff_i)[0] else: n = self._buffer[self._buff_i] self._buff_i += size if n > self._max_bin_len: - raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + raise ValueError(f"{n} exceeds max_bin_len({self._max_bin_len})") obj = self._read(n) elif 0xC7 <= b <= 0xC9: size, fmt, typ = _MSGPACK_HEADERS[b] self._reserve(size) - L, n = _unpack_from(fmt, self._buffer, self._buff_i) + L, n = struct.unpack_from(fmt, self._buffer, self._buff_i) self._buff_i += size if L > self._max_ext_len: - raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + raise ValueError(f"{L} exceeds max_ext_len({self._max_ext_len})") obj = self._read(L) elif 0xCA <= b <= 0xD3: size, fmt = _MSGPACK_HEADERS[b] self._reserve(size) if len(fmt) > 0: - obj = _unpack_from(fmt, self._buffer, self._buff_i)[0] + obj = struct.unpack_from(fmt, self._buffer, self._buff_i)[0] else: obj = self._buffer[self._buff_i] self._buff_i += size elif 0xD4 <= b <= 0xD8: size, fmt, typ = _MSGPACK_HEADERS[b] if self._max_ext_len < size: - raise ValueError( - "%s exceeds max_ext_len(%s)" % (size, self._max_ext_len) - ) + raise ValueError(f"{size} exceeds max_ext_len({self._max_ext_len})") self._reserve(size + 1) - n, obj = _unpack_from(fmt, self._buffer, self._buff_i) + n, obj = struct.unpack_from(fmt, self._buffer, self._buff_i) self._buff_i += size + 1 elif 0xD9 <= b <= 0xDB: size, fmt, typ = _MSGPACK_HEADERS[b] self._reserve(size) if len(fmt) > 0: - (n,) = _unpack_from(fmt, self._buffer, self._buff_i) + (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i) else: n = self._buffer[self._buff_i] self._buff_i += size if n > self._max_str_len: - raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len)) + raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})") obj = self._read(n) elif 0xDC <= b <= 0xDD: size, fmt, typ = _MSGPACK_HEADERS[b] self._reserve(size) - (n,) = _unpack_from(fmt, self._buffer, self._buff_i) + (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i) self._buff_i += size if n > self._max_array_len: - raise ValueError( - "%s exceeds max_array_len(%s)" % (n, self._max_array_len) - ) + raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})") elif 0xDE <= b <= 0xDF: size, fmt, typ = _MSGPACK_HEADERS[b] self._reserve(size) - (n,) = _unpack_from(fmt, self._buffer, self._buff_i) + (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i) self._buff_i += size if n > self._max_map_len: - raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len)) + raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})") else: raise FormatError("Unknown header: 0x%x" % b) return typ, n, obj @@ -554,12 +502,12 @@ def _unpack(self, execute=EX_CONSTRUCT): # TODO should we eliminate the recursion? if typ == TYPE_ARRAY: if execute == EX_SKIP: - for i in xrange(n): + for i in range(n): # TODO check whether we need to call `list_hook` self._unpack(EX_SKIP) return ret = newlist_hint(n) - for i in xrange(n): + for i in range(n): ret.append(self._unpack(EX_CONSTRUCT)) if self._list_hook is not None: ret = self._list_hook(ret) @@ -567,25 +515,22 @@ def _unpack(self, execute=EX_CONSTRUCT): return ret if self._use_list else tuple(ret) if typ == TYPE_MAP: if execute == EX_SKIP: - for i in xrange(n): + for i in range(n): # TODO check whether we need to call hooks self._unpack(EX_SKIP) self._unpack(EX_SKIP) return if self._object_pairs_hook is not None: ret = self._object_pairs_hook( - (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) - for _ in xrange(n) + (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) for _ in range(n) ) else: ret = {} - for _ in xrange(n): + for _ in range(n): key = self._unpack(EX_CONSTRUCT) - if self._strict_map_key and type(key) not in (unicode, bytes): - raise ValueError( - "%s is not allowed for map key" % str(type(key)) - ) - if not PY2 and type(key) is str: + if self._strict_map_key and type(key) not in (str, bytes): + raise ValueError("%s is not allowed for map key" % str(type(key))) + if isinstance(key, str): key = sys.intern(key) ret[key] = self._unpack(EX_CONSTRUCT) if self._object_hook is not None: @@ -659,7 +604,7 @@ def tell(self): return self._stream_offset -class Packer(object): +class Packer: """ MessagePack Packer @@ -671,7 +616,8 @@ class Packer(object): Packer's constructor has some keyword arguments: - :param callable default: + :param default: + When specified, it should be callable. Convert user type to builtin type that Packer supports. See also simplejson's document. @@ -698,7 +644,6 @@ class Packer(object): If set to true, datetime with tzinfo is packed into Timestamp type. Note that the tzinfo is stripped in the timestamp. You can get UTC datetime with `timestamp=3` option of the Unpacker. - (Python 2 is not supported). :param str unicode_errors: The error handler for encoding unicode. (default: 'strict') @@ -743,8 +688,6 @@ def __init__( self._autoreset = autoreset self._use_bin_type = use_bin_type self._buffer = StringIO() - if PY2 and datetime: - raise ValueError("datetime is not supported in Python 2") self._datetime = bool(datetime) self._unicode_errors = unicode_errors or "strict" if default is not None: @@ -774,7 +717,7 @@ def _pack( if obj: return self._buffer.write(b"\xc3") return self._buffer.write(b"\xc2") - if check(obj, int_types): + if check(obj, int): if 0 <= obj < 0x80: return self._buffer.write(struct.pack("B", obj)) if -0x20 <= obj < 0: @@ -806,7 +749,7 @@ def _pack( raise ValueError("%s is too large" % type(obj).__name__) self._pack_bin_header(n) return self._buffer.write(obj) - if check(obj, unicode): + if check(obj, str): obj = obj.encode("utf-8", self._unicode_errors) n = len(obj) if n >= 2**32: @@ -855,13 +798,11 @@ def _pack( if check(obj, list_types): n = len(obj) self._pack_array_header(n) - for i in xrange(n): + for i in range(n): self._pack(obj[i], nest_limit - 1) return if check(obj, dict): - return self._pack_map_pairs( - len(obj), dict_iteritems(obj), nest_limit - 1 - ) + return self._pack_map_pairs(len(obj), obj.items(), nest_limit - 1) if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None: obj = Timestamp.from_datetime(obj) @@ -874,9 +815,9 @@ def _pack( continue if self._datetime and check(obj, _DateTime): - raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,)) + raise ValueError(f"Cannot serialize {obj!r} where tzinfo=None") - raise TypeError("Cannot serialize %r" % (obj,)) + raise TypeError(f"Cannot serialize {obj!r}") def pack(self, obj): try: @@ -963,7 +904,7 @@ def _pack_map_header(self, n): def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): self._pack_map_header(n) - for (k, v) in pairs: + for k, v in pairs: self._pack(k, nest_limit - 1) self._pack(v, nest_limit - 1) @@ -1004,7 +945,7 @@ def reset(self): def getbuffer(self): """Return view of internal buffer.""" - if USING_STRINGBUILDER or PY2: + if USING_STRINGBUILDER: return memoryview(self.bytes()) else: return self._buffer.getbuffer() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py deleted file mode 100644 index 3551bc2d..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "21.3" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD-2-Clause or Apache-2.0" -__copyright__ = "2014-2019 %s" % __author__ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py index 3c50c5dc..9ba41d83 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py @@ -2,24 +2,14 @@ # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. -from .__about__ import ( - __author__, - __copyright__, - __email__, - __license__, - __summary__, - __title__, - __uri__, - __version__, -) +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] +__version__ = "24.1" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD-2-Clause or Apache-2.0" +__copyright__ = "2014 %s" % __author__ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc deleted file mode 100644 index c04e62790bedc904a3e61886a505f3cb858ce9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 648 zcmYL_zmL-}6vv(ZO4D9S2ZYcKr+~yzP~&TkfnP$vbw)@POBTzm-NvdLN48VcOyQ3} ztcZ=jg^8`Yg-ZMbCr)CxiI-NVdy+r)^ZWYg`TNuNI|yR(```Ra4WU0(aubm6<0^vf zD_S6izB@5uPVBH+Tx0dP&KhxpHRC30#VzK>E^G5<(LyM0Z@fWg(7x~pvBFAD$VHbB zldo1(Zy<3A$+bA#uDLcsrI2(8p}9?zhBLh6D=OqcBgKrTrfTC8GE><`i$!89Sw?3| zx)AB2czCWf4{|G{u!5Ulu5|EW1MSk_AmXNYkXW0U7Z@*uP4a0tQ!AWpGKz28G@?;> zRt&}}rIG~`o6qMqpeYMP%EVf*oXTLPQme%@w@RC$&-T(cW-kqeDvsYx#=~fME@^If z0Asv`_6Z+G;c0OcosOOk0ndX+=Ka8{te_IUsVl#Ay+WfxvjTXDv|FKF!2|q2S3q=a z@J9pA;U(2H4W|jUg5ohZORF-RL8Y1sCtOPPNomP2PuEzADg3wc zWSFdZ%9OtK1H*Vzm4nw|wz+PKdHjVh5!Hn diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc index 7d52dd7f285485bdbd2438e9df1654873cf2a2e4..e6c478db0c6a1b4fb1b6e0b2c9b404877dcefc4c 100644 GIT binary patch delta 470 zcmXAlziZo25XYrhwj((*9y%l~l-EKF4%jad9!emPHfo0wLcny<(8sghv-BKEPrM&3 z(h_CuW;(S0Lbv`Oow^xM9{L9ux^?PHa&X5T_qp#K_ouaT{9nHBS;kInJJ~M%gPTKB ze6xrZS;UTPvJ>r)R@5R+7dRtes`PxW z04@k%1!12U(KrJ!FO*<2t+_4M)M~Ji}U2VD5Nr^iw(t#z%EG zI69ty7xHqryLJ&$Ol1_Ibq^t_+j)*fwfwp7tv!UWHph!)^W>wCP|V9puq0Io{jmPt zJ?-BY_(4)3A(`RNbb(>WW1Z7NN%)rN7%RpLIE`^e&Hfk@npg1RB7`R4;Q|*4zY=^w zWA&BUm+$&U(Kaq8CTv@_ZErox-*4PiKWKU@Z`5=*{YOo22Ws&#A|_@Q#Ny@THm0@ekH|@iGV&DcY&;8Z(1n4C z4X8w=PMjM+-0;)g`LFw*?|C@v6O8MZuiFnw$ZIHmBl=0!XP7*Yoa9s!Lpe1Ok4(&C z)8QS{Za^9MBEu1#}Qs zqkgay6IY{qs|fvnvfYr~xW7rkRcPGtiL6mfww~RTXwDYG3p<|7MWqD0l;xsw1uO8y zS)tinYVGcv*Ey4R$+ViVqQNuR)A8{MD^(?r3Nc-XnJihM3I#zI^B&VzBpPPB>bwUX0 z^(mR1oi{UY-t4@YdH#DSr=GR)xJAR#~Ci!*o|VV1rJWRl3FpU8~t$}m}1zl%Yf z&9MC}eRBOAee(T0Jh_ZJ>*@C}#6?~vGJlQ8ZpC|>we|J;DAfa0ufh&TZR%=R;|x$v zA8`7AhBHVx1Hc*l8O{*p3;}2OwySDUxX8xp!~+Z={^YTvLR!rzLSEDjMUVUar-oER z$m_X_s;n4-C`cL6Fog5xf%7OZo
    `L!xQ(!@MS-3gxmQ6-;pe6sZ~r8ERI|h`L|Z zOhr$Nk|LNn(9y5vZ5?spxRxn`CPmN{Q3fH04;ELm`HYfPfFy%GouZ-0LQdN+44G!$ z*q=xYs)iXKRL!BnKwQdY6Pco6$T>NYZr|Dd;yzK?EAQJa?cLMBOKoptfyGNJDLL#TJea znc0kg0i79RtbnL#Ig`p5eemw;Jua>Oy5MCT%o4;Kgq1@283-*`k%_r1w5V6RC}vc- zFUDHlR7w-GN-AafQ>koDE@Ti7rc&<|#Ed<2i!7nG2ft6e37^YI$OGafWmrsf=cEF< z%t$2Vf<&!JoRq|jq6=O8pW%aiQw!mwLF=Ph8^_QiPJgZjJ(d;l!AYxgbyd)jn7 z)AnlUV?FGECP1j$!5)9$Y8QZayKF|}`Nd|rlfB)dDe85&Km@>gRvj}2EcP{HV69af zPzb>jh@h)%OOUj_B?8Pm>L8hgoWu3IWxn52bjLiFH~E?<4XK*4z=FWSMg&_C976Cp zfWDY_t@F6v-Fx>~+{xYhUa;6Bde-89vv<#)Hp_kFh%PmN+|N~QF~v={m{P9IvC8-E`V$H<(6I7FsFKC7M{G~mc24}jk`@H z2!WmQF&~75or6kozX0P6C9f+61U(IRA(wtM8`+FfHStkx7%X54vorwINm6FYBvoC8 z5FaU%;i{oEA|NtzyLygCTqedf9c7nHWOfs&&9P-x<}SPlz6zTdqjbo8nf=i9k;~zF zj{!Lr-2*G**`Why?kWxAoDLrWhj?Y5?3V+7m7S0Ktu zb*fz!gseEIO8bQcOsg@r6zJ&b>BZ60(^K+wP!zx|R>v5(GZP+uWIeQ+^^n7=Kfg-T zi4!MkngEC4Xu|ZS$5v^AIhz$UQO*ix`nhKh(NV!2x zEkR|MM5rpNSroRG>S97p7Zgp($xvg2tq+)3DY4dVSv%RmS(gO^Dj3viXdlu!JxkL- zEMmD*X^T%`UtzfoQ!hxS#Vfj=(`k{i_<^FS7?#&r*z!6nTJBUnmCl;1FKnketrfD6m^lNAq{RRy{nQpuza`j0*I-f> zqZoMBF_*#6@l;_CplYg_N|hqjY!`PZahNv-AP-$7m4?Pq?tRZ9$NCOeqRo@9OuRBx zn2$a?np}31`i=@)A>NK5YNp^YIC!MWWY7#zv;(8`!Di8S9QoG%P>m4?{NGoS9b zwPWU~MZ)ZBt+Z~rac=tD)bW{}z+E3-V%f&7Q_gGt2`c0lprq?`$VuM&eyf{m@MbbHu4{>JV&d#5$n9b@mr zc)%a3GMI5`mH8bYlf1l*CLq1fi-BjmUC z^q+)Y726funB^{L*vjcU@P(r%1&%{T!VrdI+ks>j4uXNkRwGl#@GFICL5Wglfn;Ek zxJtgO+dxC(uOUlGq5-G2HB6E6>NQiA~;` z@z^yvXD7~@&U3hRjS6^`Yc*GbYxPOOk)j(aJC+7Ih8rAg1wVLEnq-`w`%&(AyB;$PT6TOLjDOd-Ve-JlfhqIGrRhsI%G2eU?!QDo-~8F;FHU^+5Q%P@?3n0)Y#(a*XQUZYaH!>hfl=^f-R7m@=ts7^@S{jx(aoa%2GTHV*f$+| z>3kMn5nwtrwgR|D?zvpNcgee*Kf^4YWf=Y_11@%l@4Lc$bcqG*9%8lIm>kO06pV3>O@FT?#ON|>jAAc1d*?^_c37um4vW*Fc2rey+; wWv`0~j>^|FW0_?F=&~Q*PhCGdcDDM?Gxeh;*79Wn=zk+ghKb%M2k literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc index 2f8253a288cf21bd0839d947fcdc0c415bb3ae7b..daaba0c7cc948aed22854aff04e881bd5a6a4eec 100644 GIT binary patch literal 9737 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 literal 12094 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 Ba7_RJ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc index 62624276a2450c0f88904fc79a63eb1b92b96cc0..ef73cd37c94bcdd7855f8245ba39c280296f670c 100644 GIT binary patch delta 2544 zcmZ8iZ%iD=6`$GN`@{X=IPMPz*ko<|Cl_O5<0f(A7;_eo*rmiN*p;tMx692OzU$uY zd3Mhjf_=nsBU+J`XsZ}2s&FJnp>ir&$`^lZ@}d3EFCZ-cS&&+(tyF(139i!6sOp=A zOCYn_H*em|d-LY~-n^N9?n!IypMyakf_4n!;kSJ6)W$1#^*%=EIwB~I2quDt3qo4J zoEJ4QEjqoFmYm*|b~(K}?S@{`JOyvsTc}Cb6ntqP=(vbm^A`f?07e3O2@%gVM7*@- zw#fHHC>;9d+jq zTJw1CnFbOj^&dsHtO>&kDc`ZKwV9GA;a)tuS+>rTIB`{NkOr$yXnv}h??#(RVzc$B zS_zGcqhfNK^_FnGlEk)OEf#fCHFJ8==ue8a_oPXgYU<4P^{WL+2FoRl+TH5r4e86QtJ>MQIFp3ugdjDiYyEkUE^mxlt*(+hqro@0Shj zEM*2bV2in;X}bz)9=3NCaz&l>Cnf7of!#k1Das~C73FtmmG8VZ)qchR<#sZpj?lc? z-mPcK1zI$X_8wBsILB%q$fz1+aw?+|S{QBb>+5a@M(@t6#bNz4)AKZATCYkyos1`~ zL+XJs0ziI_9{OwFJO$+1DHf?tXEq>*F+yJW;pF(^f#8oZ#@3zMR7(=~Ly%mC$#SKn zU<(Hh+PG-&M37|`wL+oix)Lxj8iD*1{bvHrC%P8ej^Dg66P|6j(JTHHI#xGU*%Api=d{gBm^l^6wTdtMpnVGQ!SW^lAb*ID0LRV!C{qdZh% zdWIT?EwXaamQJ5M-Q!@xl3)$+^wCQ+Q#REhjaF=&wFQmX64!AOMux^5ki*I_HMc_i zJXqKPzcB%10<9z@S9CcTo_=PA+zYneys#Wj%!I9`2jRU7;k}b5z7SFEt`#rx`Xk4=e9i?hfAbpP1-g_P5NKv#;NHebK*fUfTCX z2(;&et^fUdAo81Yw|w*deV-%jiarWORz&F6jJ@E+)j;Yf`c*vDF5dD2_er}eb;R?@ zcRZXw8a+`jej3I=wqROX=T%LUhp23VIHTzXg$Yx4hAOD4+7>&qS|ruga0gA< zr)R5{t)ci%YbxI8{aWxre2=vlPktl#DxL$(m86?-C~eUgHP~U!xfoP4%7VZ<Qefl={Kij!IOXX{9M$c(75T8`{gy>* zsUdi3sV+7tEytQ>j?8x6=$z}AWA|enlRXckEi;#9uiUsY-*RA1z2ll2xuf2d?p&O& z?_3OYekP*$VIbl7mj=IaS5t{pleIt5T{#M)HN2mF7y2>J#_^L91CaS4O=i2{`jlC5 zEwcH+kjLeIzyKEV7_eSWUgG3sARz68ZY)?u_eWsoHD`V-SbgOjS+cUt_9zO`Gm2vS z6eU~ch${-?Mar(pmWvrv*ENI5FlGli;V+o&Hb+aj;xOZNi@7-Ar?R~Y)v{T59G&aG z{;2HX6EzwuD;YI&o;v6`ab~qJW9@1@TybC&;rhe7QPOgzjZMbiq4j5n-{>{(iv^vO zHQLF32t!_6jeh}w+l29Ff`p}i2M})k8>(AEHA^VGgnWNNhZfMGf1vG8+yV|wzwiV> zx9aoYUc3@Tg8u=IF5u|rLIl^ht%^v9tpMA$+E#~;uk5k(rYld~557E!A9;h5>U8?P RR|fcMPvVsblA0XH{tvxYeO>?n literal 6928 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0025b8953561944a6b52baf93c8aa6c84a850bac GIT binary patch literal 7957 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 E506hG-2eap literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc index 74dea04bb97ac796373c582c7a5f19e3c61706b8..0a365a32faca18f205e14dbeae70c356a1d7a3b7 100644 GIT binary patch literal 11053 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 kve98$JkF8no(x^UmbI89{>OV literal 14076 zcmbt4Sx{WpmG||&(G4_vvownkjaY<0tC0i-v??7W_)49n3>hY@=7)^4jMH#7 z&Ni&z%7+xCK%}!mK@JjDdyTLcgFU` zZsS@gom;tWl+LzPI_W&xxouoK)G6Saq&o5_SaSk&21B@_cYo`G^Nv4O%?(<$wRP}lWgQDt~M+l0#6Qe;-!0+~o>N8`b@KSx&4`qj5)E)@% zm)txnst@vku~AWb%oF5zsAxXv<^`_r@*qc>iY8h<%?V@Ppdgw~jRk@nI}qeO{$bJJ zh{|`63KQSCCYxuE!c+wV}7>D zJ|=LyU>7a~#=NYZ=Y}}m9t_w|_MNnE-@2=Xw(q~M5_K+@ALw(rM1#xa3$SBe%$r=U zm&e@R_#3Uu#RdjluKQ#Ssa$`#^(=PY`jVS>`&-Uma0fl^)?Q9{DHs@S9fdczoUIo) zuQzZhz^5sYk*l|Rns}^%O76px%!3jt& z5&u^aT>=dzzAh1M$F<2I6V~@UhYQap$+Y_eK|6ODb{fcv;9)s?UVPAQA1u6&ubvBjpwzH z*NrP3I#JahU_md?1rRkn7aZgL{ey8U5eEWugAgVB*75<|CX>u0Ngi|K&Mt2Zd`Q+Pv% zro%Tu;Wh~--c6E`R5GzHqzCc$1BAy0K$8;G5hdw9!#4v;z#4JFVE4gWpvx4ei54-ki{ zf1T-^P&8~_S8jIf1G@Dt*Pz!e2rd_20sZl908(iOrt;h<5-&4VD(=I2H2{FAc}V@f zTlZXwtd%o|GB6bjfBHPT{l$O{YYGs%dfKwNz1QrVxa z4>2>ZM08~mGx#oepD8;%h(mA$enN8EHfh>6Y1&xfZ<@B^#OO2T{H3D6<95#6UXmb~ zPK+jJeiEzgM}WJcf5Vv`#McN;U~)!W$!w(kMDp!)-`A>dHkZn<43LdQ!k?{y9=y4I|aqTJi4rBzh z_ux#_=FM)t)48Z^SZ>?(JIn6*?#0}?@Tm`TH-BK+9ntN6Vkw$2|M@dD$=xHMIDRj` zNhN9|52-~|4|#YYm}U|uw(TOw=3in=5WAu&h>WCZNGY>RP#hswnN%BK1D0+N%3*3? zmCQhvc?ql&esgMDmWGOxJtW5-Qph9n=AcogV-jpnR3LJn18H`3vY$lTc2;=}Xy_$! z0Axxr$?$osY6KQKGfgUz{j%yWtAjg*)ga8EBEi1|70rL4FBCjwT=2k4nNm(FM=Y6C z!EECw5WxZ}g32VFDWa&nL>$_F-U_v;4ox%SP@>!6x3&YoQNqCTPm&k&sIWHamcIZy<&9iU!L@Ku~8rveOwurIq zshQ}lvpeo|Eb8o!O_o{BjiaHq4@~8cq58#;`_}lI9d8$gn-@)6Ke1GVhQg=jJTXf{ zMAz^MZ1DO!b&J}nk8-;n7A@v>&8R;z<}O={ZtuFaE7bSe{)nmOiM1$Xy<0L@65jNB zRn*!r-yXHLL`*G@Vax+}`WE#y%a;6`m#<%5(EP4s=X_fz@2+jm_D01AB|Br5T@l@` zCzisQ98?pfy9C_Pzg8FbY|^DE2Gm6KFf%{~C1aAghzA$CqSWrZ5B{k4f*>mS3qtA& zCl9ZmK~({pPm@r4xHhzBS~_9BbR5v9$#M9<$8J&;BcAAVl%J;zAk5c>uEYm`)gQq+ z9t3z~^Fs(&1j7h81Q!56I7^D=1bBg;L4+bO%3p^}+JT0;OFG%9mei-{7?v5qHyLS? z*~r+DckQHNIH6bMeM@&bYU7NQ)RqIJmIQV3>pJi&8S(=0t1gkt$`{BbCWx%2X+ur+ zOo|dzs3uj@g~5cz0l%Jk9fC37$S7FVqynJ&4Xs@JDx)BiDiDo?W(G$`(=U<%zZ^2wWJ5 z%s}K-RN=Y_sKaoJN_!NdGaQ6}U`hGc;Ki@tC)@%s4IZ>wUGvyd63V|@JXaj9d8_GO z(~nvfY9rMhOWl3Q?d>iSe@AZ9^t{)?wtVk-X(Jn5W|bfy(0JlCHZh`sUd zmANbP=YQ(G?|tBpRqdVbUDg_>Cm{q7J~GeG4=waQv_8~69D6kI=-~Tpk(%Q%bALqF z|FO|BtDGIUu`i-36_CMK8~2i5>AUsH_jC+ElcvZva^`3n6Ob z0qQiq;y$K)g|FAZ*I_cufE@y-|BHXZQ$NKbQYLwuw1txVe1;vC(lWvID%lqqNpK%1 ziKi5+N(p8z>Rd?jZij>aL>gTv8#Ku^`Bx^DUx!&usixFZnv}Y#ped_vZBolXAXYV! zE7wRq<$kBMlbVg*PwD(M8@HU&ruDvI>qPImXY#}<(=(}^R8Q*U3kE4%5ho#FeG$$m zw1Xk9M5|U{Uj5^wVk0gOr*iZQ6$zp`qzMAvpi7gMsXPYk1$FA^yKn7_R z9WF>a{MInUn6T(T*MR?$*tSXkC2q~-fi*|anxkhf*l|ku00#qIflfpfe1J(a;P`1k zPt;LG3%ihu8+*bA)*DDN5m2Q|)|4B7F)wQ*8U~d_A!hsf*e*a>cOQ8SER0|m*n!;?Mb1kr=t;zBI~AN#<1 zk+L*;PtTIXdBXn?+adUO_z7zOKpWU=Lc!?+Px4DYBUW|IjOMYWG*plF+`Gz1O~;~T zdqlTAV%h$Qu@EdncF|b7Y|5YAcKyhbsUm8sSgdSa&^$E8DtkXP^*zoh4r$(0FXq%Q z+p4c0o9UU&pB?xF`m4QjdC}7FxV$d>wT0SWINou@$~$NE%jH#f56>OGrGFx2X7!mh zo}>dC6Av?KTND~S12`X$o~{t{TY5j9{`XfbMun9BWmtgI1@APnLfB|v@99RqsDS- zQOsPr`pspXWws;4+}e3(AYAa4?Vc@G(HyllM|I6J+GS(@bU$62LFg@!Fw8)gU}I4CYRfWSK{3%5LK|g?&62WyiNiG6 zmQ~&{Qeo$B0`gPbRG?Uo!h=7IU;x1h1jiAaM9`1m7=j}RP9ZoAz+tA63ZEOt1<{-y z6z6|}wa|hBPe~AUax@yP94X2TK{zQSu7T!ocu4)efX%L9vx4-Xw~Ge;z^qkyU^`KY z1*BefyOBRU0tVz+_y@>96wFw8M_8(Ai&nKQRqc*e?T#7uO!q!6t5_;)ik3Akm9<67 zz!5KgQnhWlrv9W45L=Y}MwasvXg)9kHri zj~llwH6DsK9*Q*{SuU%%+c4Mg=B}mMu4rvntoHdw+a7gCY7fN94n8ii-8IdbR*Ow0 z%?dH8HQBpUmb$fbFp;EP&oWuxyp{29-fH;Hjd}d$tzq@77H-z)I3?mxup^zgM@ z2X~bW@a4|HBT_o}8X=ed4IG_BsvrIZGPg;pE1M!=sK_%?(r%CyEqp!4o@g4+bWXQ| z17MWj!j~{~Bf*&jlV}6!-5AR%QI(g0>-mOC9`h>1qox#B6qgv;?L`GI-^qzzaM@#@ z$ZN9G5UU+zD!|*}HpZu@fgD;IQH6Up-KUTCofeI>(tvacNGIDeJSrx7TLeNJfkDvs z&4?HWATnHOOF5miY(NbGaw5{jSfmqwoSoyJ; z-tQd$;<2UTGopg``BlsLHQ^oM#z@oNWjLs-?{1pg6s~@2)4fge)%P3`Yf~h@6(wXm+%){`IWyQ`Ex-O^pAe6LIm*|d`x7m6->6J%14g^f>O znca!I2U7U!5j4*Ff``WDggLAj8aeW%oQ!)AUv4quI+4S)b+ka%zoOoh}{kggBdlSC}%m4!M&^UiG-OUe=;gtxy3Kl@Ej2D8yDX<6l1WmAUg7Hg2c9w%1cVJe*jiS^ck`p)s zl&8GG@lx8*x!~jm$9NuxJxRY++DG}oASVdYog<_lBDHuDh?=oc7F-X>Jbwfjd52QV z-x}{G_3m8So)vZR5CWIjxH6&^MFw3ci0$T+s%^2#_K425Y%GcxYnDw_OQ!m$sXqM5 zqN)88iycg|ihC82tvxYIZ$#HC2^H=yIC(R|G8lZOsv_m~2L}6iRJ5WBSCxMs%hd>K z5Y!@|njC=@3BywxFEVJ==8&*L;1Le4;bSGAQ8!DsL7MRf$R_DF$fi|Ij=GNtADTb2 zP`e;3G~EA2w61f7Ao6|HQ~Hz!!yz2Z8OK3UC&xqicaea9MDQ~Jq9!;#3fJwV+bpQ^443SuE#)I%=;FY3XEXVkIS5|17p&jcQi0FgN+=~>+NJUFR@NBfRP zt-+%WCmJx&N3U4MBZKHDi*V5iL=kQbQJ($=QE)jFZ{!7d(QppEx;}c52dy&cRviX^ zq>DA3nCn4s5CB|p={|k9`}t#i{EJvL3taFdewgbX#Or;c@m$~Ofx{>IT|LK7ihAkD zaGf|Qn&R1W-N(-MiJIq6oHzzpLjnuuN<4q~Oy6-)hZg|hQ=cGej-Bj2-PbQ_PD@X@ zTHjYsCfjtMIdPo-XQc5Gf+?g-;SIu%6BXRcq5`fGD2DMDq_I-b0vz$fH)$FZ!%J4L zVY}}km_zUb1V2Q84hY>sl3=9^8+_>{oosX@WmW_mGi!+hyX z0mZMHh*}fTRK`?QA8EAk1tq3&tU|1|@nbAi#59$wYK6LLRYSD8cv-82vW}L^VjA13 zUZpNyH6+VMHIz-sa*hVdW?C+dY06eDTD5I8mzGOnn$p!gow{r_AIdZ4n5KBus#lk+ z7GP2TZSQKKL2X?vl1s%#D3v6tmYSey85H4O4^m>wfsx9Szk_For8RR@1l{eI7H>!YfZIIs!go;f9R)uBVLZ;6^V-Dl?O9%!Sc z)@l7Rfk8{6@L$@tNVa`!v4ucu+V6EPC}Xu9QA@|PX_=Uoh%E~LH><8!#q?#n-=kgeePcqmOV8ea!c+A@cJ|hS9HrtEGqiVJ^P$wQ0kOM#toZ z>Ow-eCv_YHi&m-%@L+@On#rNyh5WBKN u%~&IqZ7T$x3xjL;Sjn|8n$VeWZCD65%za~xK=Jds3Z{?wj3A_E)Bggtjkg5= diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07a67e83a6c86f91622e55b34107e574d272aabb GIT binary patch literal 24995 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc index ee677c57cf240dd8e99724d78075ea88aa588138..1405ea2a32d3d4cd2c0d2842732b2b198c964e92 100644 GIT binary patch literal 4452 zcmaJ^Z%iD=6`$F?Tkapn-2o=H)36u_z7}(FAdM9av19Ct*ru*&EcMc8yS`oE&Ud?b zcF%BtE7$c08(A^*Ljgq=P8%t!hVS$CyzvO*`hgp`&lP#~x!P#(Yx)tzmS5I1-IUFwt{G9z;*V-M%QI-I zL^gHuHMWJq<1#T+iKrK|Nup*{%>>Qx8OkKXIn9(Oj}xL3&=*e2A6T&`ITNd2v&3`$Q;5H8E-Ti4`jsCuBn$(X*P;DQ02)hG>lG*|Y*O zBPtP1T|9IAjQH9shq~AxLs6IIktDh-NwR#Bl+l%Jn$iJDx|o&I#hw~TQuKr*-9wvn zxm)kY-l2oXl=Je0nv!D!dLl~=XT**x*#xt9Y#8tap;ly;&ZiBL zJ(qd2Y`KyhW_V{zr=8)iatgZ4|B|1;6KInE8JfWN@KChQibw#r?IDoR!(=XH@c<3W zMGx?ufXB#VM{= zjMk85n9g#g^rU79hE7aXAtJB{^>Xq(TD3qG~pBRK9<deB$j>U^sU zCrZ}?uqa;H<#7%O$PjU=vKM%?z2I2R%+ZjH29-MNQoWy@Xnb+4~-5 zwm0Z>#Q*})2x1JxkNR!qwVB62&JdvjyViwoP28B6GoLhdtTc7pb$#Z&=Pfk7TBz&J zd%9Uhv2BlZ?QD-UO4B{gAn+6JHVq-Dc^jnmA{K0fN3>R9Lb+Thc0A^heyZs^?P-67vPa(jKYH7l(|amcLsbAZz}YvS@%?7Tn>!KCu63?s8-L9k|( z1j(^Xg&h7axeNOdn#2U$2*#^o{TW=1Th#h7)2b5tK&uM3sMW)?N-2o5H=6!cOU{Z~ zyO|b!*6b*tRfS8n9CUasU(!fwhAC?amC&ov3J&S!U}ikco@Wqk%NU`d*bctsxXUr$ zx7@lp2Co!)l1>sKNRoOH@Dr)Gfg>L^ZQS zvs^>Era}+BUF?hJC{R5c=tEQN8vV7D|Lw%)W)v&Wych*d%4F)O8caA>f*?Zr9 zR8sWq*x{Dvu>DN#C#Rv8-Y^CY<&er@{BIA!t^Y*gKhWW?Q1ox8=PT3(zh?rEJ&Svu SA!z;+IDxTm1JRnrn*RfJ54MQ_ literal 6964 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc index fd9c6bd6f494945082e437b4d459404619e661bf..d607c18b8078ee084c4154dbf6ec8bc235a9f413 100644 GIT binary patch literal 38781 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 literal 31265 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 delta 8805 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc index 5acac77bef3acbdb2ee33d819618aa348647e153..dafe216e02f9d7011cab860ca1a998d8f025cf07 100644 GIT binary patch delta 3595 zcmb7HYiv}<6`r||z5DRK*RREowGG(Uc-K4)H~|8&OQFON3?yCRZq~ln_AdKy=3e8l zT4RG~6ZIElDwz~gs4BH4R4rAjHvQMq(EjKjqfHfZg%qUpNBXDQ)TAX;s(R+`UgMIg zQpehvbI*KpX6`xPIdlE5=!ZM!{^)i)5wu+xPy8r^&?oG{YGOse%Rj*gEg%IcID@h{ zjxm$D3>W8MJ@1Qb0W*(?_cr2MwNo4O>Qc<&KdJi2M=mjA^kWS_% z@<&KMt&Zum%pJsj`V1e%m^!#w`VYRvR}Y6J4XmqUU6{Ve*TZy*|G``nQ?Ra?2~RLg zRgk~Yb#iYszA?IUq-Y7%F_wsqbXz)kZNYXjnuv{TDD=XTWVBFOQWY#sbfjxfTQn-m z-4;Y1Tw8E-y`pT8yJFq)S0Dg((|t)@9jh_|u~C2@@DVTn0)z!r#H2$9snXIs-DD4L zK^8AGk6ukG1j$rHSGadLYwkSOZ7b^>jC(Gwh^!2tpNXN-o7MSQPIp^S-D62b&H@i3 znI9_nSr{WJ&5Ch<3`%h%PE0G;F!=XQ*E3Sl9%#9USZltdY9dq#VRYxmm8V{ozcu3|9ebV>tsyU!Jx4f)l&vi+G?zM%ndNTjo}!b=Fxpu(}%A1yRP=@TT8C4Tf&lS>yoh5 zq~fs{ggnTSVk)7NWGa)&O(Y5`$*&xlZN(yHM!!tIEk5hzauBjvZUW8nMJ{cJAcpLx zwgY=xiabQH7IRdxtrZkL?PdX%gbN689(vBUHZUsycj|RNSTtKYVAdZ|u@wcY;sM6A z;}$H}U@$0YUkLI0596%1a;JHkAy*BZh5M$ z03B@J0*0SL!J`G_ov^RV-eH~u=#P0iX#X|;7{};cM+lO;&9Pl1GOVB{9Y;1F0YR&U z?o;$=9xb)(zHxT3?W%Tt)3wt#&VI4X^6PwUJuXOHuf#UW8`c`=iJ4~84A}%2vW3}U z6}-w)(ntH9J&~80`ic3b9XH~O`0DU=|Fsi0;$M*M^qbChyqPXKo9l&iK9w^hqGr^j zrWzbkNe8T^_ni%Wq9L7zA_&!yusg)CO(lt@DuxK7t{L9yqJ*YSn6;6mc_czTu2%m6 z5O=~)+Xsx9M-M%8x9e;DHdG&8n7lN3w`KR@>7Sl`_iU+Ucd2go{NazJ@Snp?*Vezi z{(5-v=&jaLc<-CudxGPQL+1`%Z2drJqrY@T_;=$a`jP7#-cL`~G{rj6ole)_HvZ05 z4E+j2VN+y>pUKc4gKwZdp)_W+{Q2){VwiIv`kA|RjptMsIB>Ga!Icc~SxJXafl6bn zJuX>no3$71^8uYDs@W88QM!T@A5=1=_}>vN9Mm#aD9om>a7tfe>5BGrGh;Vh^aOZI zUh;(I963%2%sTYe6(pww*_kZMv(BPW6pN0cb6glk9Y_yY$hC-sW^Jp^=4PjQQeTU< z^YFPcYddS3!87P}{_AK4%b}ry5Sy9I6tctnu@ zgJ6v5Cc#F5-cJZd-wJ%n_*DqDgdj}pjm>6;Nzz5y>TakjN@h%?v(l=VNc6kGVTizA zgUx0HzR%aq{g(*H5;+PM4IZ3lekK@B!n~DYpD?T43?SJ~;tcCxu1;vWnkBE8Yc+Ms zsHsNvDPNNjKxiy|AdfSlb|-W5cbM*DdO37uZpGC-r9h|YX1D)h=bL+$gz%$>uK&}~ zoNJ#S-S#{7#rWG{?>?EoEsG$_wo2?b!?u;{SQyRcGlq?*bNV#N5q9~@!Ya@yhDRDzUfqE zTsfAU=!uMzd_m1=s(un4M@GJEtL1;%8j;%!XCg5^4R50+5`5Hl zt(;_92kY2BE9QF>WRS-4*(r#&;XJT^=y4$l z4NE9^FVu2z-@?I52bWr3EQO9PA^!tdy?LSkQvc;lDF_fBtm=E_b0p%~r`t_^1xwbBD|3xOIm)J`nB8BIwJn;x62E&*LxiFg_4>EsHQdJb}Y_jrpzfZ$MsB A2><{9 delta 2304 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 literal 19957 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py new file mode 100644 index 00000000..f7a02180 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py @@ -0,0 +1,110 @@ +""" +ELF file parser. + +This provides a class ``ELFFile`` that parses an ELF executable in a similar +interface to ``ZipFile``. Only the read interface is implemented. + +Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca +ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html +""" + +from __future__ import annotations + +import enum +import os +import struct +from typing import IO + + +class ELFInvalid(ValueError): + pass + + +class EIClass(enum.IntEnum): + C32 = 1 + C64 = 2 + + +class EIData(enum.IntEnum): + Lsb = 1 + Msb = 2 + + +class EMachine(enum.IntEnum): + I386 = 3 + S390 = 22 + Arm = 40 + X8664 = 62 + AArc64 = 183 + + +class ELFFile: + """ + Representation of an ELF executable. + """ + + def __init__(self, f: IO[bytes]) -> None: + self._f = f + + try: + ident = self._read("16B") + except struct.error: + raise ELFInvalid("unable to parse identification") + magic = bytes(ident[:4]) + if magic != b"\x7fELF": + raise ELFInvalid(f"invalid magic: {magic!r}") + + self.capacity = ident[4] # Format for program header (bitness). + self.encoding = ident[5] # Data structure encoding (endianness). + + try: + # e_fmt: Format for program header. + # p_fmt: Format for section header. + # p_idx: Indexes to find p_type, p_offset, and p_filesz. + e_fmt, self._p_fmt, self._p_idx = { + (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. + (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. + }[(self.capacity, self.encoding)] + except KeyError: + raise ELFInvalid( + f"unrecognized capacity ({self.capacity}) or " + f"encoding ({self.encoding})" + ) + + try: + ( + _, + self.machine, # Architecture type. + _, + _, + self._e_phoff, # Offset of program header. + _, + self.flags, # Processor-specific flags. + _, + self._e_phentsize, # Size of section. + self._e_phnum, # Number of sections. + ) = self._read(e_fmt) + except struct.error as e: + raise ELFInvalid("unable to parse machine and section information") from e + + def _read(self, fmt: str) -> tuple[int, ...]: + return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) + + @property + def interpreter(self) -> str | None: + """ + The path recorded in the ``PT_INTERP`` section header. + """ + for index in range(self._e_phnum): + self._f.seek(self._e_phoff + self._e_phentsize * index) + try: + data = self._read(self._p_fmt) + except struct.error: + continue + if data[self._p_idx[0]] != 3: # Not PT_INTERP. + continue + self._f.seek(data[self._p_idx[1]]) + return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") + return None diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py index 4c379aa6..08f651fb 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py @@ -1,122 +1,72 @@ +from __future__ import annotations + import collections +import contextlib import functools import os import re -import struct import sys import warnings -from typing import IO, Dict, Iterator, NamedTuple, Optional, Tuple - - -# Python does not provide platform information at sufficient granularity to -# identify the architecture of the running executable in some cases, so we -# determine it dynamically by reading the information from the running -# process. This only applies on Linux, which uses the ELF format. -class _ELFFileHeader: - # https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header - class _InvalidELFFileHeader(ValueError): - """ - An invalid ELF file header was found. - """ - - ELF_MAGIC_NUMBER = 0x7F454C46 - ELFCLASS32 = 1 - ELFCLASS64 = 2 - ELFDATA2LSB = 1 - ELFDATA2MSB = 2 - EM_386 = 3 - EM_S390 = 22 - EM_ARM = 40 - EM_X86_64 = 62 - EF_ARM_ABIMASK = 0xFF000000 - EF_ARM_ABI_VER5 = 0x05000000 - EF_ARM_ABI_FLOAT_HARD = 0x00000400 - - def __init__(self, file: IO[bytes]) -> None: - def unpack(fmt: str) -> int: - try: - data = file.read(struct.calcsize(fmt)) - result: Tuple[int, ...] = struct.unpack(fmt, data) - except struct.error: - raise _ELFFileHeader._InvalidELFFileHeader() - return result[0] - - self.e_ident_magic = unpack(">I") - if self.e_ident_magic != self.ELF_MAGIC_NUMBER: - raise _ELFFileHeader._InvalidELFFileHeader() - self.e_ident_class = unpack("B") - if self.e_ident_class not in {self.ELFCLASS32, self.ELFCLASS64}: - raise _ELFFileHeader._InvalidELFFileHeader() - self.e_ident_data = unpack("B") - if self.e_ident_data not in {self.ELFDATA2LSB, self.ELFDATA2MSB}: - raise _ELFFileHeader._InvalidELFFileHeader() - self.e_ident_version = unpack("B") - self.e_ident_osabi = unpack("B") - self.e_ident_abiversion = unpack("B") - self.e_ident_pad = file.read(7) - format_h = "H" - format_i = "I" - format_q = "Q" - format_p = format_i if self.e_ident_class == self.ELFCLASS32 else format_q - self.e_type = unpack(format_h) - self.e_machine = unpack(format_h) - self.e_version = unpack(format_i) - self.e_entry = unpack(format_p) - self.e_phoff = unpack(format_p) - self.e_shoff = unpack(format_p) - self.e_flags = unpack(format_i) - self.e_ehsize = unpack(format_h) - self.e_phentsize = unpack(format_h) - self.e_phnum = unpack(format_h) - self.e_shentsize = unpack(format_h) - self.e_shnum = unpack(format_h) - self.e_shstrndx = unpack(format_h) - - -def _get_elf_header() -> Optional[_ELFFileHeader]: +from typing import Generator, Iterator, NamedTuple, Sequence + +from ._elffile import EIClass, EIData, ELFFile, EMachine + +EF_ARM_ABIMASK = 0xFF000000 +EF_ARM_ABI_VER5 = 0x05000000 +EF_ARM_ABI_FLOAT_HARD = 0x00000400 + + +# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` +# as the type for `path` until then. +@contextlib.contextmanager +def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]: try: - with open(sys.executable, "rb") as f: - elf_header = _ELFFileHeader(f) - except (OSError, TypeError, _ELFFileHeader._InvalidELFFileHeader): - return None - return elf_header + with open(path, "rb") as f: + yield ELFFile(f) + except (OSError, TypeError, ValueError): + yield None -def _is_linux_armhf() -> bool: +def _is_linux_armhf(executable: str) -> bool: # hard-float ABI can be detected from the ELF header of the running # process # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf - elf_header = _get_elf_header() - if elf_header is None: - return False - result = elf_header.e_ident_class == elf_header.ELFCLASS32 - result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB - result &= elf_header.e_machine == elf_header.EM_ARM - result &= ( - elf_header.e_flags & elf_header.EF_ARM_ABIMASK - ) == elf_header.EF_ARM_ABI_VER5 - result &= ( - elf_header.e_flags & elf_header.EF_ARM_ABI_FLOAT_HARD - ) == elf_header.EF_ARM_ABI_FLOAT_HARD - return result - - -def _is_linux_i686() -> bool: - elf_header = _get_elf_header() - if elf_header is None: - return False - result = elf_header.e_ident_class == elf_header.ELFCLASS32 - result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB - result &= elf_header.e_machine == elf_header.EM_386 - return result + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.Arm + and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 + and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD + ) + + +def _is_linux_i686(executable: str) -> bool: + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.I386 + ) -def _have_compatible_abi(arch: str) -> bool: - if arch == "armv7l": - return _is_linux_armhf() - if arch == "i686": - return _is_linux_i686() - return arch in {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x"} +def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: + if "armv7l" in archs: + return _is_linux_armhf(executable) + if "i686" in archs: + return _is_linux_i686(executable) + allowed_archs = { + "x86_64", + "aarch64", + "ppc64", + "ppc64le", + "s390x", + "loongarch64", + "riscv64", + } + return any(arch in allowed_archs for arch in archs) # If glibc ever changes its major version, we need to know what the last @@ -124,7 +74,7 @@ def _have_compatible_abi(arch: str) -> bool: # For now, guess what the highest minor version might be, assume it will # be 50 for testing. Once this actually happens, update the dictionary # with the actual value. -_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50) +_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50) class _GLibCVersion(NamedTuple): @@ -132,7 +82,7 @@ class _GLibCVersion(NamedTuple): minor: int -def _glibc_version_string_confstr() -> Optional[str]: +def _glibc_version_string_confstr() -> str | None: """ Primary implementation of glibc_version_string using os.confstr. """ @@ -141,17 +91,17 @@ def _glibc_version_string_confstr() -> Optional[str]: # platform module. # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 try: - # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17". - version_string = os.confstr("CS_GNU_LIBC_VERSION") + # Should be a string like "glibc 2.17". + version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION") assert version_string is not None - _, version = version_string.split() + _, version = version_string.rsplit() except (AssertionError, AttributeError, OSError, ValueError): # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... return None return version -def _glibc_version_string_ctypes() -> Optional[str]: +def _glibc_version_string_ctypes() -> str | None: """ Fallback implementation of glibc_version_string using ctypes. """ @@ -195,12 +145,12 @@ def _glibc_version_string_ctypes() -> Optional[str]: return version_str -def _glibc_version_string() -> Optional[str]: +def _glibc_version_string() -> str | None: """Returns glibc version string, or None if not using glibc.""" return _glibc_version_string_confstr() or _glibc_version_string_ctypes() -def _parse_glibc_version(version_str: str) -> Tuple[int, int]: +def _parse_glibc_version(version_str: str) -> tuple[int, int]: """Parse glibc version. We use a regexp instead of str.split because we want to discard any @@ -211,16 +161,16 @@ def _parse_glibc_version(version_str: str) -> Tuple[int, int]: m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) if not m: warnings.warn( - "Expected glibc version with 2 components major.minor," - " got: %s" % version_str, + f"Expected glibc version with 2 components major.minor," + f" got: {version_str}", RuntimeWarning, ) return -1, -1 return int(m.group("major")), int(m.group("minor")) -@functools.lru_cache() -def _get_glibc_version() -> Tuple[int, int]: +@functools.lru_cache +def _get_glibc_version() -> tuple[int, int]: version_str = _glibc_version_string() if version_str is None: return (-1, -1) @@ -228,13 +178,13 @@ def _get_glibc_version() -> Tuple[int, int]: # From PEP 513, PEP 600 -def _is_compatible(name: str, arch: str, version: _GLibCVersion) -> bool: +def _is_compatible(arch: str, version: _GLibCVersion) -> bool: sys_glibc = _get_glibc_version() if sys_glibc < version: return False # Check for presence of _manylinux module. try: - import _manylinux # noqa + import _manylinux except ImportError: return True if hasattr(_manylinux, "manylinux_compatible"): @@ -264,12 +214,22 @@ def _is_compatible(name: str, arch: str, version: _GLibCVersion) -> bool: } -def platform_tags(linux: str, arch: str) -> Iterator[str]: - if not _have_compatible_abi(arch): +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate manylinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be manylinux-compatible. + + :returns: An iterator of compatible manylinux tags. + """ + if not _have_compatible_abi(sys.executable, archs): return # Oldest glibc to be supported regardless of architecture is (2, 17). too_old_glibc2 = _GLibCVersion(2, 16) - if arch in {"x86_64", "i686"}: + if set(archs) & {"x86_64", "i686"}: # On x86/i686 also oldest glibc to be supported is (2, 5). too_old_glibc2 = _GLibCVersion(2, 4) current_glibc = _GLibCVersion(*_get_glibc_version()) @@ -283,19 +243,20 @@ def platform_tags(linux: str, arch: str) -> Iterator[str]: for glibc_major in range(current_glibc.major - 1, 1, -1): glibc_minor = _LAST_GLIBC_MINOR[glibc_major] glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) - for glibc_max in glibc_max_list: - if glibc_max.major == too_old_glibc2.major: - min_minor = too_old_glibc2.minor - else: - # For other glibc major versions oldest supported is (x, 0). - min_minor = -1 - for glibc_minor in range(glibc_max.minor, min_minor, -1): - glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) - tag = "manylinux_{}_{}".format(*glibc_version) - if _is_compatible(tag, arch, glibc_version): - yield linux.replace("linux", tag) - # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. - if glibc_version in _LEGACY_MANYLINUX_MAP: - legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] - if _is_compatible(legacy_tag, arch, glibc_version): - yield linux.replace("linux", legacy_tag) + for arch in archs: + for glibc_max in glibc_max_list: + if glibc_max.major == too_old_glibc2.major: + min_minor = too_old_glibc2.minor + else: + # For other glibc major versions oldest supported is (x, 0). + min_minor = -1 + for glibc_minor in range(glibc_max.minor, min_minor, -1): + glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) + tag = "manylinux_{}_{}".format(*glibc_version) + if _is_compatible(arch, glibc_version): + yield f"{tag}_{arch}" + # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. + if glibc_version in _LEGACY_MANYLINUX_MAP: + legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] + if _is_compatible(arch, glibc_version): + yield f"{legacy_tag}_{arch}" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py index 8ac3059b..d2bf30b5 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py @@ -4,68 +4,15 @@ linked against musl, and what musl version is used. """ -import contextlib +from __future__ import annotations + import functools -import operator -import os import re -import struct import subprocess import sys -from typing import IO, Iterator, NamedTuple, Optional, Tuple - - -def _read_unpacked(f: IO[bytes], fmt: str) -> Tuple[int, ...]: - return struct.unpack(fmt, f.read(struct.calcsize(fmt))) +from typing import Iterator, NamedTuple, Sequence - -def _parse_ld_musl_from_elf(f: IO[bytes]) -> Optional[str]: - """Detect musl libc location by parsing the Python executable. - - Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca - ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html - """ - f.seek(0) - try: - ident = _read_unpacked(f, "16B") - except struct.error: - return None - if ident[:4] != tuple(b"\x7fELF"): # Invalid magic, not ELF. - return None - f.seek(struct.calcsize("HHI"), 1) # Skip file type, machine, and version. - - try: - # e_fmt: Format for program header. - # p_fmt: Format for section header. - # p_idx: Indexes to find p_type, p_offset, and p_filesz. - e_fmt, p_fmt, p_idx = { - 1: ("IIIIHHH", "IIIIIIII", (0, 1, 4)), # 32-bit. - 2: ("QQQIHHH", "IIQQQQQQ", (0, 2, 5)), # 64-bit. - }[ident[4]] - except KeyError: - return None - else: - p_get = operator.itemgetter(*p_idx) - - # Find the interpreter section and return its content. - try: - _, e_phoff, _, _, _, e_phentsize, e_phnum = _read_unpacked(f, e_fmt) - except struct.error: - return None - for i in range(e_phnum + 1): - f.seek(e_phoff + e_phentsize * i) - try: - p_type, p_offset, p_filesz = p_get(_read_unpacked(f, p_fmt)) - except struct.error: - return None - if p_type != 3: # Not PT_INTERP. - continue - f.seek(p_offset) - interpreter = os.fsdecode(f.read(p_filesz)).strip("\0") - if "musl" not in interpreter: - return None - return interpreter - return None +from ._elffile import ELFFile class _MuslVersion(NamedTuple): @@ -73,7 +20,7 @@ class _MuslVersion(NamedTuple): minor: int -def _parse_musl_version(output: str) -> Optional[_MuslVersion]: +def _parse_musl_version(output: str) -> _MuslVersion | None: lines = [n for n in (n.strip() for n in output.splitlines()) if n] if len(lines) < 2 or lines[0][:4] != "musl": return None @@ -83,8 +30,8 @@ def _parse_musl_version(output: str) -> Optional[_MuslVersion]: return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) -@functools.lru_cache() -def _get_musl_version(executable: str) -> Optional[_MuslVersion]: +@functools.lru_cache +def _get_musl_version(executable: str) -> _MuslVersion | None: """Detect currently-running musl runtime version. This is done by checking the specified executable's dynamic linking @@ -95,32 +42,34 @@ def _get_musl_version(executable: str) -> Optional[_MuslVersion]: Version 1.2.2 Dynamic Program Loader """ - with contextlib.ExitStack() as stack: - try: - f = stack.enter_context(open(executable, "rb")) - except OSError: - return None - ld = _parse_ld_musl_from_elf(f) - if not ld: + try: + with open(executable, "rb") as f: + ld = ELFFile(f).interpreter + except (OSError, TypeError, ValueError): + return None + if ld is None or "musl" not in ld: return None - proc = subprocess.run([ld], stderr=subprocess.PIPE, universal_newlines=True) + proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) return _parse_musl_version(proc.stderr) -def platform_tags(arch: str) -> Iterator[str]: +def platform_tags(archs: Sequence[str]) -> Iterator[str]: """Generate musllinux tags compatible to the current platform. - :param arch: Should be the part of platform tag after the ``linux_`` - prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a - prerequisite for the current platform to be musllinux-compatible. + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be musllinux-compatible. :returns: An iterator of compatible musllinux tags. """ sys_musl = _get_musl_version(sys.executable) if sys_musl is None: # Python not dynamically linked against musl. return - for minor in range(sys_musl.minor, -1, -1): - yield f"musllinux_{sys_musl.major}_{minor}_{arch}" + for arch in archs: + for minor in range(sys_musl.minor, -1, -1): + yield f"musllinux_{sys_musl.major}_{minor}_{arch}" if __name__ == "__main__": # pragma: no cover diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py new file mode 100644 index 00000000..c1238c06 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py @@ -0,0 +1,354 @@ +"""Handwritten parser of dependency specifiers. + +The docstring for each __parse_* function contains EBNF-inspired grammar representing +the implementation. +""" + +from __future__ import annotations + +import ast +from typing import NamedTuple, Sequence, Tuple, Union + +from ._tokenizer import DEFAULT_RULES, Tokenizer + + +class Node: + def __init__(self, value: str) -> None: + self.value = value + + def __str__(self) -> str: + return self.value + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}('{self}')>" + + def serialize(self) -> str: + raise NotImplementedError + + +class Variable(Node): + def serialize(self) -> str: + return str(self) + + +class Value(Node): + def serialize(self) -> str: + return f'"{self}"' + + +class Op(Node): + def serialize(self) -> str: + return str(self) + + +MarkerVar = Union[Variable, Value] +MarkerItem = Tuple[MarkerVar, Op, MarkerVar] +MarkerAtom = Union[MarkerItem, Sequence["MarkerAtom"]] +MarkerList = Sequence[Union["MarkerList", MarkerAtom, str]] + + +class ParsedRequirement(NamedTuple): + name: str + url: str + extras: list[str] + specifier: str + marker: MarkerList | None + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for dependency specifier +# -------------------------------------------------------------------------------------- +def parse_requirement(source: str) -> ParsedRequirement: + return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: + """ + requirement = WS? IDENTIFIER WS? extras WS? requirement_details + """ + tokenizer.consume("WS") + + name_token = tokenizer.expect( + "IDENTIFIER", expected="package name at the start of dependency specifier" + ) + name = name_token.text + tokenizer.consume("WS") + + extras = _parse_extras(tokenizer) + tokenizer.consume("WS") + + url, specifier, marker = _parse_requirement_details(tokenizer) + tokenizer.expect("END", expected="end of dependency specifier") + + return ParsedRequirement(name, url, extras, specifier, marker) + + +def _parse_requirement_details( + tokenizer: Tokenizer, +) -> tuple[str, str, MarkerList | None]: + """ + requirement_details = AT URL (WS requirement_marker?)? + | specifier WS? (requirement_marker)? + """ + + specifier = "" + url = "" + marker = None + + if tokenizer.check("AT"): + tokenizer.read() + tokenizer.consume("WS") + + url_start = tokenizer.position + url = tokenizer.expect("URL", expected="URL after @").text + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + tokenizer.expect("WS", expected="whitespace after URL") + + # The input might end after whitespace. + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, span_start=url_start, after="URL and whitespace" + ) + else: + specifier_start = tokenizer.position + specifier = _parse_specifier(tokenizer) + tokenizer.consume("WS") + + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, + span_start=specifier_start, + after=( + "version specifier" + if specifier + else "name and no valid version specifier" + ), + ) + + return (url, specifier, marker) + + +def _parse_requirement_marker( + tokenizer: Tokenizer, *, span_start: int, after: str +) -> MarkerList: + """ + requirement_marker = SEMICOLON marker WS? + """ + + if not tokenizer.check("SEMICOLON"): + tokenizer.raise_syntax_error( + f"Expected end or semicolon (after {after})", + span_start=span_start, + ) + tokenizer.read() + + marker = _parse_marker(tokenizer) + tokenizer.consume("WS") + + return marker + + +def _parse_extras(tokenizer: Tokenizer) -> list[str]: + """ + extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? + """ + if not tokenizer.check("LEFT_BRACKET", peek=True): + return [] + + with tokenizer.enclosing_tokens( + "LEFT_BRACKET", + "RIGHT_BRACKET", + around="extras", + ): + tokenizer.consume("WS") + extras = _parse_extras_list(tokenizer) + tokenizer.consume("WS") + + return extras + + +def _parse_extras_list(tokenizer: Tokenizer) -> list[str]: + """ + extras_list = identifier (wsp* ',' wsp* identifier)* + """ + extras: list[str] = [] + + if not tokenizer.check("IDENTIFIER"): + return extras + + extras.append(tokenizer.read().text) + + while True: + tokenizer.consume("WS") + if tokenizer.check("IDENTIFIER", peek=True): + tokenizer.raise_syntax_error("Expected comma between extra names") + elif not tokenizer.check("COMMA"): + break + + tokenizer.read() + tokenizer.consume("WS") + + extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") + extras.append(extra_token.text) + + return extras + + +def _parse_specifier(tokenizer: Tokenizer) -> str: + """ + specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS + | WS? version_many WS? + """ + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="version specifier", + ): + tokenizer.consume("WS") + parsed_specifiers = _parse_version_many(tokenizer) + tokenizer.consume("WS") + + return parsed_specifiers + + +def _parse_version_many(tokenizer: Tokenizer) -> str: + """ + version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? + """ + parsed_specifiers = "" + while tokenizer.check("SPECIFIER"): + span_start = tokenizer.position + parsed_specifiers += tokenizer.read().text + if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): + tokenizer.raise_syntax_error( + ".* suffix can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position + 1, + ) + if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): + tokenizer.raise_syntax_error( + "Local version label can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position, + ) + tokenizer.consume("WS") + if not tokenizer.check("COMMA"): + break + parsed_specifiers += tokenizer.read().text + tokenizer.consume("WS") + + return parsed_specifiers + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for marker expression +# -------------------------------------------------------------------------------------- +def parse_marker(source: str) -> MarkerList: + return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: + retval = _parse_marker(tokenizer) + tokenizer.expect("END", expected="end of marker expression") + return retval + + +def _parse_marker(tokenizer: Tokenizer) -> MarkerList: + """ + marker = marker_atom (BOOLOP marker_atom)+ + """ + expression = [_parse_marker_atom(tokenizer)] + while tokenizer.check("BOOLOP"): + token = tokenizer.read() + expr_right = _parse_marker_atom(tokenizer) + expression.extend((token.text, expr_right)) + return expression + + +def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: + """ + marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? + | WS? marker_item WS? + """ + + tokenizer.consume("WS") + if tokenizer.check("LEFT_PARENTHESIS", peek=True): + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="marker expression", + ): + tokenizer.consume("WS") + marker: MarkerAtom = _parse_marker(tokenizer) + tokenizer.consume("WS") + else: + marker = _parse_marker_item(tokenizer) + tokenizer.consume("WS") + return marker + + +def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: + """ + marker_item = WS? marker_var WS? marker_op WS? marker_var WS? + """ + tokenizer.consume("WS") + marker_var_left = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + marker_op = _parse_marker_op(tokenizer) + tokenizer.consume("WS") + marker_var_right = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + return (marker_var_left, marker_op, marker_var_right) + + +def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: + """ + marker_var = VARIABLE | QUOTED_STRING + """ + if tokenizer.check("VARIABLE"): + return process_env_var(tokenizer.read().text.replace(".", "_")) + elif tokenizer.check("QUOTED_STRING"): + return process_python_str(tokenizer.read().text) + else: + tokenizer.raise_syntax_error( + message="Expected a marker variable or quoted string" + ) + + +def process_env_var(env_var: str) -> Variable: + if env_var in ("platform_python_implementation", "python_implementation"): + return Variable("platform_python_implementation") + else: + return Variable(env_var) + + +def process_python_str(python_str: str) -> Value: + value = ast.literal_eval(python_str) + return Value(str(value)) + + +def _parse_marker_op(tokenizer: Tokenizer) -> Op: + """ + marker_op = IN | NOT IN | OP + """ + if tokenizer.check("IN"): + tokenizer.read() + return Op("in") + elif tokenizer.check("NOT"): + tokenizer.read() + tokenizer.expect("WS", expected="whitespace after 'not'") + tokenizer.expect("IN", expected="'in' after 'not'") + return Op("not in") + elif tokenizer.check("OP"): + return Op(tokenizer.read().text) + else: + return tokenizer.raise_syntax_error( + "Expected marker operator, one of " + "<=, <, !=, ==, >=, >, ~=, ===, in, not in" + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py new file mode 100644 index 00000000..89d04160 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py @@ -0,0 +1,194 @@ +from __future__ import annotations + +import contextlib +import re +from dataclasses import dataclass +from typing import Iterator, NoReturn + +from .specifiers import Specifier + + +@dataclass +class Token: + name: str + text: str + position: int + + +class ParserSyntaxError(Exception): + """The provided source text could not be parsed correctly.""" + + def __init__( + self, + message: str, + *, + source: str, + span: tuple[int, int], + ) -> None: + self.span = span + self.message = message + self.source = source + + super().__init__() + + def __str__(self) -> str: + marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" + return "\n ".join([self.message, self.source, marker]) + + +DEFAULT_RULES: dict[str, str | re.Pattern[str]] = { + "LEFT_PARENTHESIS": r"\(", + "RIGHT_PARENTHESIS": r"\)", + "LEFT_BRACKET": r"\[", + "RIGHT_BRACKET": r"\]", + "SEMICOLON": r";", + "COMMA": r",", + "QUOTED_STRING": re.compile( + r""" + ( + ('[^']*') + | + ("[^"]*") + ) + """, + re.VERBOSE, + ), + "OP": r"(===|==|~=|!=|<=|>=|<|>)", + "BOOLOP": r"\b(or|and)\b", + "IN": r"\bin\b", + "NOT": r"\bnot\b", + "VARIABLE": re.compile( + r""" + \b( + python_version + |python_full_version + |os[._]name + |sys[._]platform + |platform_(release|system) + |platform[._](version|machine|python_implementation) + |python_implementation + |implementation_(name|version) + |extra + )\b + """, + re.VERBOSE, + ), + "SPECIFIER": re.compile( + Specifier._operator_regex_str + Specifier._version_regex_str, + re.VERBOSE | re.IGNORECASE, + ), + "AT": r"\@", + "URL": r"[^ \t]+", + "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", + "VERSION_PREFIX_TRAIL": r"\.\*", + "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", + "WS": r"[ \t]+", + "END": r"$", +} + + +class Tokenizer: + """Context-sensitive token parsing. + + Provides methods to examine the input stream to check whether the next token + matches. + """ + + def __init__( + self, + source: str, + *, + rules: dict[str, str | re.Pattern[str]], + ) -> None: + self.source = source + self.rules: dict[str, re.Pattern[str]] = { + name: re.compile(pattern) for name, pattern in rules.items() + } + self.next_token: Token | None = None + self.position = 0 + + def consume(self, name: str) -> None: + """Move beyond provided token name, if at current position.""" + if self.check(name): + self.read() + + def check(self, name: str, *, peek: bool = False) -> bool: + """Check whether the next token has the provided name. + + By default, if the check succeeds, the token *must* be read before + another check. If `peek` is set to `True`, the token is not loaded and + would need to be checked again. + """ + assert ( + self.next_token is None + ), f"Cannot check for {name!r}, already have {self.next_token!r}" + assert name in self.rules, f"Unknown token name: {name!r}" + + expression = self.rules[name] + + match = expression.match(self.source, self.position) + if match is None: + return False + if not peek: + self.next_token = Token(name, match[0], self.position) + return True + + def expect(self, name: str, *, expected: str) -> Token: + """Expect a certain token name next, failing with a syntax error otherwise. + + The token is *not* read. + """ + if not self.check(name): + raise self.raise_syntax_error(f"Expected {expected}") + return self.read() + + def read(self) -> Token: + """Consume the next token and return it.""" + token = self.next_token + assert token is not None + + self.position += len(token.text) + self.next_token = None + + return token + + def raise_syntax_error( + self, + message: str, + *, + span_start: int | None = None, + span_end: int | None = None, + ) -> NoReturn: + """Raise ParserSyntaxError at the given position.""" + span = ( + self.position if span_start is None else span_start, + self.position if span_end is None else span_end, + ) + raise ParserSyntaxError( + message, + source=self.source, + span=span, + ) + + @contextlib.contextmanager + def enclosing_tokens( + self, open_token: str, close_token: str, *, around: str + ) -> Iterator[None]: + if self.check(open_token): + open_position = self.position + self.read() + else: + open_position = None + + yield + + if open_position is None: + return + + if not self.check(close_token): + self.raise_syntax_error( + f"Expected matching {close_token} for {open_token}, after {around}", + span_start=open_position, + ) + + self.read() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py index 540e7a4d..7ac7bb69 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py @@ -2,25 +2,19 @@ # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. +from __future__ import annotations + import operator import os import platform import sys -from typing import Any, Callable, Dict, List, Optional, Tuple, Union - -from pip._vendor.pyparsing import ( # noqa: N817 - Forward, - Group, - Literal as L, - ParseException, - ParseResults, - QuotedString, - ZeroOrMore, - stringEnd, - stringStart, -) +from typing import Any, Callable, TypedDict, cast +from ._parser import MarkerAtom, MarkerList, Op, Value, Variable +from ._parser import parse_marker as _parse_marker +from ._tokenizer import ParserSyntaxError from .specifiers import InvalidSpecifier, Specifier +from .utils import canonicalize_name __all__ = [ "InvalidMarker", @@ -52,103 +46,97 @@ class UndefinedEnvironmentName(ValueError): """ -class Node: - def __init__(self, value: Any) -> None: - self.value = value +class Environment(TypedDict): + implementation_name: str + """The implementation's identifier, e.g. ``'cpython'``.""" - def __str__(self) -> str: - return str(self.value) + implementation_version: str + """ + The implementation's version, e.g. ``'3.13.0a2'`` for CPython 3.13.0a2, or + ``'7.3.13'`` for PyPy3.10 v7.3.13. + """ - def __repr__(self) -> str: - return f"<{self.__class__.__name__}('{self}')>" - - def serialize(self) -> str: - raise NotImplementedError - - -class Variable(Node): - def serialize(self) -> str: - return str(self) - - -class Value(Node): - def serialize(self) -> str: - return f'"{self}"' - - -class Op(Node): - def serialize(self) -> str: - return str(self) - - -VARIABLE = ( - L("implementation_version") - | L("platform_python_implementation") - | L("implementation_name") - | L("python_full_version") - | L("platform_release") - | L("platform_version") - | L("platform_machine") - | L("platform_system") - | L("python_version") - | L("sys_platform") - | L("os_name") - | L("os.name") # PEP-345 - | L("sys.platform") # PEP-345 - | L("platform.version") # PEP-345 - | L("platform.machine") # PEP-345 - | L("platform.python_implementation") # PEP-345 - | L("python_implementation") # undocumented setuptools legacy - | L("extra") # PEP-508 -) -ALIASES = { - "os.name": "os_name", - "sys.platform": "sys_platform", - "platform.version": "platform_version", - "platform.machine": "platform_machine", - "platform.python_implementation": "platform_python_implementation", - "python_implementation": "platform_python_implementation", -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + os_name: str + """ + The value of :py:data:`os.name`. The name of the operating system dependent module + imported, e.g. ``'posix'``. + """ -VERSION_CMP = ( - L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") -) + platform_machine: str + """ + Returns the machine type, e.g. ``'i386'``. -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + An empty string if the value cannot be determined. + """ -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + platform_release: str + """ + The system's release, e.g. ``'2.2.0'`` or ``'NT'``. -BOOLOP = L("and") | L("or") + An empty string if the value cannot be determined. + """ -MARKER_VAR = VARIABLE | MARKER_VALUE + platform_system: str + """ + The system/OS name, e.g. ``'Linux'``, ``'Windows'`` or ``'Java'``. -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + An empty string if the value cannot be determined. + """ -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() + platform_version: str + """ + The system's release version, e.g. ``'#3 on degas'``. -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + An empty string if the value cannot be determined. + """ -MARKER = stringStart + MARKER_EXPR + stringEnd + python_full_version: str + """ + The Python version as string ``'major.minor.patchlevel'``. + Note that unlike the Python :py:data:`sys.version`, this value will always include + the patchlevel (it defaults to 0). + """ -def _coerce_parse_result(results: Union[ParseResults, List[Any]]) -> List[Any]: - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results + platform_python_implementation: str + """ + A string identifying the Python implementation, e.g. ``'CPython'``. + """ + + python_version: str + """The Python version as string ``'major.minor'``.""" + + sys_platform: str + """ + This string contains a platform identifier that can be used to append + platform-specific components to :py:data:`sys.path`, for instance. + + For Unix systems, except on Linux and AIX, this is the lowercased OS name as + returned by ``uname -s`` with the first part of the version as returned by + ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, at the time when Python + was built. + """ + + +def _normalize_extra_values(results: Any) -> Any: + """ + Normalize extra values. + """ + if isinstance(results[0], tuple): + lhs, op, rhs = results[0] + if isinstance(lhs, Variable) and lhs.value == "extra": + normalized_extra = canonicalize_name(rhs.value) + rhs = Value(normalized_extra) + elif isinstance(rhs, Variable) and rhs.value == "extra": + normalized_extra = canonicalize_name(lhs.value) + lhs = Value(normalized_extra) + results[0] = lhs, op, rhs + return results def _format_marker( - marker: Union[List[str], Tuple[Node, ...], str], first: Optional[bool] = True + marker: list[str] | MarkerAtom | str, first: bool | None = True ) -> str: - assert isinstance(marker, (list, tuple, str)) # Sometimes we have a structure like [[...]] which is a single item list @@ -174,7 +162,7 @@ def _format_marker( return marker -_operators: Dict[str, Operator] = { +_operators: dict[str, Operator] = { "in": lambda lhs, rhs: lhs in rhs, "not in": lambda lhs, rhs: lhs not in rhs, "<": operator.lt, @@ -192,35 +180,29 @@ def _eval_op(lhs: str, op: Op, rhs: str) -> bool: except InvalidSpecifier: pass else: - return spec.contains(lhs) + return spec.contains(lhs, prereleases=True) - oper: Optional[Operator] = _operators.get(op.serialize()) + oper: Operator | None = _operators.get(op.serialize()) if oper is None: raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") return oper(lhs, rhs) -class Undefined: - pass - - -_undefined = Undefined() - - -def _get_env(environment: Dict[str, str], name: str) -> str: - value: Union[str, Undefined] = environment.get(name, _undefined) +def _normalize(*values: str, key: str) -> tuple[str, ...]: + # PEP 685 – Comparison of extra names for optional distribution dependencies + # https://peps.python.org/pep-0685/ + # > When comparing extra names, tools MUST normalize the names being + # > compared using the semantics outlined in PEP 503 for names + if key == "extra": + return tuple(canonicalize_name(v) for v in values) - if isinstance(value, Undefined): - raise UndefinedEnvironmentName( - f"{name!r} does not exist in evaluation environment." - ) + # other environment markers don't have such standards + return values - return value - -def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool: - groups: List[List[bool]] = [[]] +def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool: + groups: list[list[bool]] = [[]] for marker in markers: assert isinstance(marker, (list, tuple, str)) @@ -231,12 +213,15 @@ def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool: lhs, op, rhs = marker if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) + environment_key = lhs.value + lhs_value = environment[environment_key] rhs_value = rhs.value else: lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) + environment_key = rhs.value + rhs_value = environment[environment_key] + lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) groups[-1].append(_eval_op(lhs_value, op, rhs_value)) else: assert marker in ["and", "or"] @@ -246,7 +231,7 @@ def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool: return any(all(item) for item in groups) -def format_full_version(info: "sys._version_info") -> str: +def format_full_version(info: sys._version_info) -> str: version = "{0.major}.{0.minor}.{0.micro}".format(info) kind = info.releaselevel if kind != "final": @@ -254,7 +239,7 @@ def format_full_version(info: "sys._version_info") -> str: return version -def default_environment() -> Dict[str, str]: +def default_environment() -> Environment: iver = format_full_version(sys.implementation.version) implementation_name = sys.implementation.name return { @@ -274,13 +259,29 @@ def default_environment() -> Dict[str, str]: class Marker: def __init__(self, marker: str) -> None: + # Note: We create a Marker object without calling this constructor in + # packaging.requirements.Requirement. If any additional logic is + # added here, make sure to mirror/adapt Requirement. try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - raise InvalidMarker( - f"Invalid marker: {marker!r}, parse error at " - f"{marker[e.loc : e.loc + 8]!r}" - ) + self._markers = _normalize_extra_values(_parse_marker(marker)) + # The attribute `_markers` can be described in terms of a recursive type: + # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] + # + # For example, the following expression: + # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") + # + # is parsed into: + # [ + # (, ')>, ), + # 'and', + # [ + # (, , ), + # 'or', + # (, , ) + # ] + # ] + except ParserSyntaxError as e: + raise InvalidMarker(str(e)) from e def __str__(self) -> str: return _format_marker(self._markers) @@ -288,7 +289,16 @@ def __str__(self) -> str: def __repr__(self) -> str: return f"" - def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: + def __hash__(self) -> int: + return hash((self.__class__.__name__, str(self))) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Marker): + return NotImplemented + + return str(self) == str(other) + + def evaluate(self, environment: dict[str, str] | None = None) -> bool: """Evaluate a marker. Return the boolean from evaluating the given marker against the @@ -297,8 +307,19 @@ def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: The environment is determined from the current Python process. """ - current_environment = default_environment() + current_environment = cast("dict[str, str]", default_environment()) + current_environment["extra"] = "" + # Work around platform.python_version() returning something that is not PEP 440 + # compliant for non-tagged Python builds. We preserve default_environment()'s + # behavior of returning platform.python_version() verbatim, and leave it to the + # caller to provide a syntactically valid version if they want to override it. + if current_environment["python_full_version"].endswith("+"): + current_environment["python_full_version"] += "local" if environment is not None: current_environment.update(environment) + # The API used to allow setting extra to None. We need to handle this + # case for backwards compatibility. + if current_environment["extra"] is None: + current_environment["extra"] = "" return _evaluate_markers(self._markers, current_environment) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py new file mode 100644 index 00000000..eb8dc844 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py @@ -0,0 +1,804 @@ +from __future__ import annotations + +import email.feedparser +import email.header +import email.message +import email.parser +import email.policy +import typing +from typing import ( + Any, + Callable, + Generic, + Literal, + TypedDict, + cast, +) + +from . import requirements, specifiers, utils +from . import version as version_module + +T = typing.TypeVar("T") + + +try: + ExceptionGroup +except NameError: # pragma: no cover + + class ExceptionGroup(Exception): + """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. + + If :external:exc:`ExceptionGroup` is already defined by Python itself, + that version is used instead. + """ + + message: str + exceptions: list[Exception] + + def __init__(self, message: str, exceptions: list[Exception]) -> None: + self.message = message + self.exceptions = exceptions + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" + +else: # pragma: no cover + ExceptionGroup = ExceptionGroup + + +class InvalidMetadata(ValueError): + """A metadata field contains invalid data.""" + + field: str + """The name of the field that contains invalid data.""" + + def __init__(self, field: str, message: str) -> None: + self.field = field + super().__init__(message) + + +# The RawMetadata class attempts to make as few assumptions about the underlying +# serialization formats as possible. The idea is that as long as a serialization +# formats offer some very basic primitives in *some* way then we can support +# serializing to and from that format. +class RawMetadata(TypedDict, total=False): + """A dictionary of raw core metadata. + + Each field in core metadata maps to a key of this dictionary (when data is + provided). The key is lower-case and underscores are used instead of dashes + compared to the equivalent core metadata field. Any core metadata field that + can be specified multiple times or can hold multiple values in a single + field have a key with a plural name. See :class:`Metadata` whose attributes + match the keys of this dictionary. + + Core metadata fields that can be specified multiple times are stored as a + list or dict depending on which is appropriate for the field. Any fields + which hold multiple values in a single field are stored as a list. + + """ + + # Metadata 1.0 - PEP 241 + metadata_version: str + name: str + version: str + platforms: list[str] + summary: str + description: str + keywords: list[str] + home_page: str + author: str + author_email: str + license: str + + # Metadata 1.1 - PEP 314 + supported_platforms: list[str] + download_url: str + classifiers: list[str] + requires: list[str] + provides: list[str] + obsoletes: list[str] + + # Metadata 1.2 - PEP 345 + maintainer: str + maintainer_email: str + requires_dist: list[str] + provides_dist: list[str] + obsoletes_dist: list[str] + requires_python: str + requires_external: list[str] + project_urls: dict[str, str] + + # Metadata 2.0 + # PEP 426 attempted to completely revamp the metadata format + # but got stuck without ever being able to build consensus on + # it and ultimately ended up withdrawn. + # + # However, a number of tools had started emitting METADATA with + # `2.0` Metadata-Version, so for historical reasons, this version + # was skipped. + + # Metadata 2.1 - PEP 566 + description_content_type: str + provides_extra: list[str] + + # Metadata 2.2 - PEP 643 + dynamic: list[str] + + # Metadata 2.3 - PEP 685 + # No new fields were added in PEP 685, just some edge case were + # tightened up to provide better interoptability. + + +_STRING_FIELDS = { + "author", + "author_email", + "description", + "description_content_type", + "download_url", + "home_page", + "license", + "maintainer", + "maintainer_email", + "metadata_version", + "name", + "requires_python", + "summary", + "version", +} + +_LIST_FIELDS = { + "classifiers", + "dynamic", + "obsoletes", + "obsoletes_dist", + "platforms", + "provides", + "provides_dist", + "provides_extra", + "requires", + "requires_dist", + "requires_external", + "supported_platforms", +} + +_DICT_FIELDS = { + "project_urls", +} + + +def _parse_keywords(data: str) -> list[str]: + """Split a string of comma-separate keyboards into a list of keywords.""" + return [k.strip() for k in data.split(",")] + + +def _parse_project_urls(data: list[str]) -> dict[str, str]: + """Parse a list of label/URL string pairings separated by a comma.""" + urls = {} + for pair in data: + # Our logic is slightly tricky here as we want to try and do + # *something* reasonable with malformed data. + # + # The main thing that we have to worry about, is data that does + # not have a ',' at all to split the label from the Value. There + # isn't a singular right answer here, and we will fail validation + # later on (if the caller is validating) so it doesn't *really* + # matter, but since the missing value has to be an empty str + # and our return value is dict[str, str], if we let the key + # be the missing value, then they'd have multiple '' values that + # overwrite each other in a accumulating dict. + # + # The other potentional issue is that it's possible to have the + # same label multiple times in the metadata, with no solid "right" + # answer with what to do in that case. As such, we'll do the only + # thing we can, which is treat the field as unparseable and add it + # to our list of unparsed fields. + parts = [p.strip() for p in pair.split(",", 1)] + parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items + + # TODO: The spec doesn't say anything about if the keys should be + # considered case sensitive or not... logically they should + # be case-preserving and case-insensitive, but doing that + # would open up more cases where we might have duplicate + # entries. + label, url = parts + if label in urls: + # The label already exists in our set of urls, so this field + # is unparseable, and we can just add the whole thing to our + # unparseable data and stop processing it. + raise KeyError("duplicate labels in project urls") + urls[label] = url + + return urls + + +def _get_payload(msg: email.message.Message, source: bytes | str) -> str: + """Get the body of the message.""" + # If our source is a str, then our caller has managed encodings for us, + # and we don't need to deal with it. + if isinstance(source, str): + payload: str = msg.get_payload() + return payload + # If our source is a bytes, then we're managing the encoding and we need + # to deal with it. + else: + bpayload: bytes = msg.get_payload(decode=True) + try: + return bpayload.decode("utf8", "strict") + except UnicodeDecodeError: + raise ValueError("payload in an invalid encoding") + + +# The various parse_FORMAT functions here are intended to be as lenient as +# possible in their parsing, while still returning a correctly typed +# RawMetadata. +# +# To aid in this, we also generally want to do as little touching of the +# data as possible, except where there are possibly some historic holdovers +# that make valid data awkward to work with. +# +# While this is a lower level, intermediate format than our ``Metadata`` +# class, some light touch ups can make a massive difference in usability. + +# Map METADATA fields to RawMetadata. +_EMAIL_TO_RAW_MAPPING = { + "author": "author", + "author-email": "author_email", + "classifier": "classifiers", + "description": "description", + "description-content-type": "description_content_type", + "download-url": "download_url", + "dynamic": "dynamic", + "home-page": "home_page", + "keywords": "keywords", + "license": "license", + "maintainer": "maintainer", + "maintainer-email": "maintainer_email", + "metadata-version": "metadata_version", + "name": "name", + "obsoletes": "obsoletes", + "obsoletes-dist": "obsoletes_dist", + "platform": "platforms", + "project-url": "project_urls", + "provides": "provides", + "provides-dist": "provides_dist", + "provides-extra": "provides_extra", + "requires": "requires", + "requires-dist": "requires_dist", + "requires-external": "requires_external", + "requires-python": "requires_python", + "summary": "summary", + "supported-platform": "supported_platforms", + "version": "version", +} +_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} + + +def parse_email(data: bytes | str) -> tuple[RawMetadata, dict[str, list[str]]]: + """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). + + This function returns a two-item tuple of dicts. The first dict is of + recognized fields from the core metadata specification. Fields that can be + parsed and translated into Python's built-in types are converted + appropriately. All other fields are left as-is. Fields that are allowed to + appear multiple times are stored as lists. + + The second dict contains all other fields from the metadata. This includes + any unrecognized fields. It also includes any fields which are expected to + be parsed into a built-in type but were not formatted appropriately. Finally, + any fields that are expected to appear only once but are repeated are + included in this dict. + + """ + raw: dict[str, str | list[str] | dict[str, str]] = {} + unparsed: dict[str, list[str]] = {} + + if isinstance(data, str): + parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) + else: + parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) + + # We have to wrap parsed.keys() in a set, because in the case of multiple + # values for a key (a list), the key will appear multiple times in the + # list of keys, but we're avoiding that by using get_all(). + for name in frozenset(parsed.keys()): + # Header names in RFC are case insensitive, so we'll normalize to all + # lower case to make comparisons easier. + name = name.lower() + + # We use get_all() here, even for fields that aren't multiple use, + # because otherwise someone could have e.g. two Name fields, and we + # would just silently ignore it rather than doing something about it. + headers = parsed.get_all(name) or [] + + # The way the email module works when parsing bytes is that it + # unconditionally decodes the bytes as ascii using the surrogateescape + # handler. When you pull that data back out (such as with get_all() ), + # it looks to see if the str has any surrogate escapes, and if it does + # it wraps it in a Header object instead of returning the string. + # + # As such, we'll look for those Header objects, and fix up the encoding. + value = [] + # Flag if we have run into any issues processing the headers, thus + # signalling that the data belongs in 'unparsed'. + valid_encoding = True + for h in headers: + # It's unclear if this can return more types than just a Header or + # a str, so we'll just assert here to make sure. + assert isinstance(h, (email.header.Header, str)) + + # If it's a header object, we need to do our little dance to get + # the real data out of it. In cases where there is invalid data + # we're going to end up with mojibake, but there's no obvious, good + # way around that without reimplementing parts of the Header object + # ourselves. + # + # That should be fine since, if mojibacked happens, this key is + # going into the unparsed dict anyways. + if isinstance(h, email.header.Header): + # The Header object stores it's data as chunks, and each chunk + # can be independently encoded, so we'll need to check each + # of them. + chunks: list[tuple[bytes, str | None]] = [] + for bin, encoding in email.header.decode_header(h): + try: + bin.decode("utf8", "strict") + except UnicodeDecodeError: + # Enable mojibake. + encoding = "latin1" + valid_encoding = False + else: + encoding = "utf8" + chunks.append((bin, encoding)) + + # Turn our chunks back into a Header object, then let that + # Header object do the right thing to turn them into a + # string for us. + value.append(str(email.header.make_header(chunks))) + # This is already a string, so just add it. + else: + value.append(h) + + # We've processed all of our values to get them into a list of str, + # but we may have mojibake data, in which case this is an unparsed + # field. + if not valid_encoding: + unparsed[name] = value + continue + + raw_name = _EMAIL_TO_RAW_MAPPING.get(name) + if raw_name is None: + # This is a bit of a weird situation, we've encountered a key that + # we don't know what it means, so we don't know whether it's meant + # to be a list or not. + # + # Since we can't really tell one way or another, we'll just leave it + # as a list, even though it may be a single item list, because that's + # what makes the most sense for email headers. + unparsed[name] = value + continue + + # If this is one of our string fields, then we'll check to see if our + # value is a list of a single item. If it is then we'll assume that + # it was emitted as a single string, and unwrap the str from inside + # the list. + # + # If it's any other kind of data, then we haven't the faintest clue + # what we should parse it as, and we have to just add it to our list + # of unparsed stuff. + if raw_name in _STRING_FIELDS and len(value) == 1: + raw[raw_name] = value[0] + # If this is one of our list of string fields, then we can just assign + # the value, since email *only* has strings, and our get_all() call + # above ensures that this is a list. + elif raw_name in _LIST_FIELDS: + raw[raw_name] = value + # Special Case: Keywords + # The keywords field is implemented in the metadata spec as a str, + # but it conceptually is a list of strings, and is serialized using + # ", ".join(keywords), so we'll do some light data massaging to turn + # this into what it logically is. + elif raw_name == "keywords" and len(value) == 1: + raw[raw_name] = _parse_keywords(value[0]) + # Special Case: Project-URL + # The project urls is implemented in the metadata spec as a list of + # specially-formatted strings that represent a key and a value, which + # is fundamentally a mapping, however the email format doesn't support + # mappings in a sane way, so it was crammed into a list of strings + # instead. + # + # We will do a little light data massaging to turn this into a map as + # it logically should be. + elif raw_name == "project_urls": + try: + raw[raw_name] = _parse_project_urls(value) + except KeyError: + unparsed[name] = value + # Nothing that we've done has managed to parse this, so it'll just + # throw it in our unparseable data and move on. + else: + unparsed[name] = value + + # We need to support getting the Description from the message payload in + # addition to getting it from the the headers. This does mean, though, there + # is the possibility of it being set both ways, in which case we put both + # in 'unparsed' since we don't know which is right. + try: + payload = _get_payload(parsed, data) + except ValueError: + unparsed.setdefault("description", []).append( + parsed.get_payload(decode=isinstance(data, bytes)) + ) + else: + if payload: + # Check to see if we've already got a description, if so then both + # it, and this body move to unparseable. + if "description" in raw: + description_header = cast(str, raw.pop("description")) + unparsed.setdefault("description", []).extend( + [description_header, payload] + ) + elif "description" in unparsed: + unparsed["description"].append(payload) + else: + raw["description"] = payload + + # We need to cast our `raw` to a metadata, because a TypedDict only support + # literal key names, but we're computing our key names on purpose, but the + # way this function is implemented, our `TypedDict` can only have valid key + # names. + return cast(RawMetadata, raw), unparsed + + +_NOT_FOUND = object() + + +# Keep the two values in sync. +_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] +_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] + +_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) + + +class _Validator(Generic[T]): + """Validate a metadata field. + + All _process_*() methods correspond to a core metadata field. The method is + called with the field's raw value. If the raw value is valid it is returned + in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). + If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause + as appropriate). + """ + + name: str + raw_name: str + added: _MetadataVersion + + def __init__( + self, + *, + added: _MetadataVersion = "1.0", + ) -> None: + self.added = added + + def __set_name__(self, _owner: Metadata, name: str) -> None: + self.name = name + self.raw_name = _RAW_TO_EMAIL_MAPPING[name] + + def __get__(self, instance: Metadata, _owner: type[Metadata]) -> T: + # With Python 3.8, the caching can be replaced with functools.cached_property(). + # No need to check the cache as attribute lookup will resolve into the + # instance's __dict__ before __get__ is called. + cache = instance.__dict__ + value = instance._raw.get(self.name) + + # To make the _process_* methods easier, we'll check if the value is None + # and if this field is NOT a required attribute, and if both of those + # things are true, we'll skip the the converter. This will mean that the + # converters never have to deal with the None union. + if self.name in _REQUIRED_ATTRS or value is not None: + try: + converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") + except AttributeError: + pass + else: + value = converter(value) + + cache[self.name] = value + try: + del instance._raw[self.name] # type: ignore[misc] + except KeyError: + pass + + return cast(T, value) + + def _invalid_metadata( + self, msg: str, cause: Exception | None = None + ) -> InvalidMetadata: + exc = InvalidMetadata( + self.raw_name, msg.format_map({"field": repr(self.raw_name)}) + ) + exc.__cause__ = cause + return exc + + def _process_metadata_version(self, value: str) -> _MetadataVersion: + # Implicitly makes Metadata-Version required. + if value not in _VALID_METADATA_VERSIONS: + raise self._invalid_metadata(f"{value!r} is not a valid metadata version") + return cast(_MetadataVersion, value) + + def _process_name(self, value: str) -> str: + if not value: + raise self._invalid_metadata("{field} is a required field") + # Validate the name as a side-effect. + try: + utils.canonicalize_name(value, validate=True) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + else: + return value + + def _process_version(self, value: str) -> version_module.Version: + if not value: + raise self._invalid_metadata("{field} is a required field") + try: + return version_module.parse(value) + except version_module.InvalidVersion as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_summary(self, value: str) -> str: + """Check the field contains no newlines.""" + if "\n" in value: + raise self._invalid_metadata("{field} must be a single line") + return value + + def _process_description_content_type(self, value: str) -> str: + content_types = {"text/plain", "text/x-rst", "text/markdown"} + message = email.message.EmailMessage() + message["content-type"] = value + + content_type, parameters = ( + # Defaults to `text/plain` if parsing failed. + message.get_content_type().lower(), + message["content-type"].params, + ) + # Check if content-type is valid or defaulted to `text/plain` and thus was + # not parseable. + if content_type not in content_types or content_type not in value.lower(): + raise self._invalid_metadata( + f"{{field}} must be one of {list(content_types)}, not {value!r}" + ) + + charset = parameters.get("charset", "UTF-8") + if charset != "UTF-8": + raise self._invalid_metadata( + f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" + ) + + markdown_variants = {"GFM", "CommonMark"} + variant = parameters.get("variant", "GFM") # Use an acceptable default. + if content_type == "text/markdown" and variant not in markdown_variants: + raise self._invalid_metadata( + f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " + f"not {variant!r}", + ) + return value + + def _process_dynamic(self, value: list[str]) -> list[str]: + for dynamic_field in map(str.lower, value): + if dynamic_field in {"name", "version", "metadata-version"}: + raise self._invalid_metadata( + f"{value!r} is not allowed as a dynamic field" + ) + elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: + raise self._invalid_metadata(f"{value!r} is not a valid dynamic field") + return list(map(str.lower, value)) + + def _process_provides_extra( + self, + value: list[str], + ) -> list[utils.NormalizedName]: + normalized_names = [] + try: + for name in value: + normalized_names.append(utils.canonicalize_name(name, validate=True)) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{name!r} is invalid for {{field}}", cause=exc + ) + else: + return normalized_names + + def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: + try: + return specifiers.SpecifierSet(value) + except specifiers.InvalidSpecifier as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_requires_dist( + self, + value: list[str], + ) -> list[requirements.Requirement]: + reqs = [] + try: + for req in value: + reqs.append(requirements.Requirement(req)) + except requirements.InvalidRequirement as exc: + raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc) + else: + return reqs + + +class Metadata: + """Representation of distribution metadata. + + Compared to :class:`RawMetadata`, this class provides objects representing + metadata fields instead of only using built-in types. Any invalid metadata + will cause :exc:`InvalidMetadata` to be raised (with a + :py:attr:`~BaseException.__cause__` attribute as appropriate). + """ + + _raw: RawMetadata + + @classmethod + def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> Metadata: + """Create an instance from :class:`RawMetadata`. + + If *validate* is true, all metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + ins = cls() + ins._raw = data.copy() # Mutations occur due to caching enriched values. + + if validate: + exceptions: list[Exception] = [] + try: + metadata_version = ins.metadata_version + metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) + except InvalidMetadata as metadata_version_exc: + exceptions.append(metadata_version_exc) + metadata_version = None + + # Make sure to check for the fields that are present, the required + # fields (so their absence can be reported). + fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS + # Remove fields that have already been checked. + fields_to_check -= {"metadata_version"} + + for key in fields_to_check: + try: + if metadata_version: + # Can't use getattr() as that triggers descriptor protocol which + # will fail due to no value for the instance argument. + try: + field_metadata_version = cls.__dict__[key].added + except KeyError: + exc = InvalidMetadata(key, f"unrecognized field: {key!r}") + exceptions.append(exc) + continue + field_age = _VALID_METADATA_VERSIONS.index( + field_metadata_version + ) + if field_age > metadata_age: + field = _RAW_TO_EMAIL_MAPPING[key] + exc = InvalidMetadata( + field, + "{field} introduced in metadata version " + "{field_metadata_version}, not {metadata_version}", + ) + exceptions.append(exc) + continue + getattr(ins, key) + except InvalidMetadata as exc: + exceptions.append(exc) + + if exceptions: + raise ExceptionGroup("invalid metadata", exceptions) + + return ins + + @classmethod + def from_email(cls, data: bytes | str, *, validate: bool = True) -> Metadata: + """Parse metadata from email headers. + + If *validate* is true, the metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + raw, unparsed = parse_email(data) + + if validate: + exceptions: list[Exception] = [] + for unparsed_key in unparsed: + if unparsed_key in _EMAIL_TO_RAW_MAPPING: + message = f"{unparsed_key!r} has invalid data" + else: + message = f"unrecognized field: {unparsed_key!r}" + exceptions.append(InvalidMetadata(unparsed_key, message)) + + if exceptions: + raise ExceptionGroup("unparsed", exceptions) + + try: + return cls.from_raw(raw, validate=validate) + except ExceptionGroup as exc_group: + raise ExceptionGroup( + "invalid or unparsed metadata", exc_group.exceptions + ) from None + + metadata_version: _Validator[_MetadataVersion] = _Validator() + """:external:ref:`core-metadata-metadata-version` + (required; validated to be a valid metadata version)""" + name: _Validator[str] = _Validator() + """:external:ref:`core-metadata-name` + (required; validated using :func:`~packaging.utils.canonicalize_name` and its + *validate* parameter)""" + version: _Validator[version_module.Version] = _Validator() + """:external:ref:`core-metadata-version` (required)""" + dynamic: _Validator[list[str] | None] = _Validator( + added="2.2", + ) + """:external:ref:`core-metadata-dynamic` + (validated against core metadata field names and lowercased)""" + platforms: _Validator[list[str] | None] = _Validator() + """:external:ref:`core-metadata-platform`""" + supported_platforms: _Validator[list[str] | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-supported-platform`""" + summary: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" + description: _Validator[str | None] = _Validator() # TODO 2.1: can be in body + """:external:ref:`core-metadata-description`""" + description_content_type: _Validator[str | None] = _Validator(added="2.1") + """:external:ref:`core-metadata-description-content-type` (validated)""" + keywords: _Validator[list[str] | None] = _Validator() + """:external:ref:`core-metadata-keywords`""" + home_page: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-home-page`""" + download_url: _Validator[str | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-download-url`""" + author: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-author`""" + author_email: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-author-email`""" + maintainer: _Validator[str | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer`""" + maintainer_email: _Validator[str | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer-email`""" + license: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-license`""" + classifiers: _Validator[list[str] | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-classifier`""" + requires_dist: _Validator[list[requirements.Requirement] | None] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-dist`""" + requires_python: _Validator[specifiers.SpecifierSet | None] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-python`""" + # Because `Requires-External` allows for non-PEP 440 version specifiers, we + # don't do any processing on the values. + requires_external: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-requires-external`""" + project_urls: _Validator[dict[str, str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-project-url`""" + # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation + # regardless of metadata version. + provides_extra: _Validator[list[utils.NormalizedName] | None] = _Validator( + added="2.1", + ) + """:external:ref:`core-metadata-provides-extra`""" + provides_dist: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-provides-dist`""" + obsoletes_dist: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-obsoletes-dist`""" + requires: _Validator[list[str] | None] = _Validator(added="1.1") + """``Requires`` (deprecated)""" + provides: _Validator[list[str] | None] = _Validator(added="1.1") + """``Provides`` (deprecated)""" + obsoletes: _Validator[list[str] | None] = _Validator(added="1.1") + """``Obsoletes`` (deprecated)""" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py index 1eab7dd6..4e068c95 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py @@ -1,27 +1,15 @@ # This file is dual licensed under the terms of the Apache License, Version # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. +from __future__ import annotations -import re -import string -import urllib.parse -from typing import List, Optional as TOptional, Set +from typing import Any, Iterator -from pip._vendor.pyparsing import ( # noqa - Combine, - Literal as L, - Optional, - ParseException, - Regex, - Word, - ZeroOrMore, - originalTextFor, - stringEnd, - stringStart, -) - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet +from ._parser import parse_requirement as _parse_requirement +from ._tokenizer import ParserSyntaxError +from .markers import Marker, _normalize_extra_values +from .specifiers import SpecifierSet +from .utils import canonicalize_name class InvalidRequirement(ValueError): @@ -30,60 +18,6 @@ class InvalidRequirement(ValueError): """ -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r"[^ ]+")("url") -URL = AT + URI - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine( - VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False -)("_raw_spec") -_VERSION_SPEC = Optional((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start : t._original_end]) -) -MARKER_SEPARATOR = SEMICOLON -MARKER = MARKER_SEPARATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd -# pyparsing isn't thread safe during initialization, so we do it eagerly, see -# issue #104 -REQUIREMENT.parseString("x[]") - - class Requirement: """Parse a requirement. @@ -99,48 +33,59 @@ class Requirement: def __init__(self, requirement_string: str) -> None: try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - f'Parse error at "{ requirement_string[e.loc : e.loc + 8]!r}": {e.msg}' - ) - - self.name: str = req.name - if req.url: - parsed_url = urllib.parse.urlparse(req.url) - if parsed_url.scheme == "file": - if urllib.parse.urlunparse(parsed_url) != req.url: - raise InvalidRequirement("Invalid URL given") - elif not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc - ): - raise InvalidRequirement(f"Invalid URL: {req.url}") - self.url: TOptional[str] = req.url - else: - self.url = None - self.extras: Set[str] = set(req.extras.asList() if req.extras else []) - self.specifier: SpecifierSet = SpecifierSet(req.specifier) - self.marker: TOptional[Marker] = req.marker if req.marker else None - - def __str__(self) -> str: - parts: List[str] = [self.name] + parsed = _parse_requirement(requirement_string) + except ParserSyntaxError as e: + raise InvalidRequirement(str(e)) from e + + self.name: str = parsed.name + self.url: str | None = parsed.url or None + self.extras: set[str] = set(parsed.extras or []) + self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) + self.marker: Marker | None = None + if parsed.marker is not None: + self.marker = Marker.__new__(Marker) + self.marker._markers = _normalize_extra_values(parsed.marker) + + def _iter_parts(self, name: str) -> Iterator[str]: + yield name if self.extras: formatted_extras = ",".join(sorted(self.extras)) - parts.append(f"[{formatted_extras}]") + yield f"[{formatted_extras}]" if self.specifier: - parts.append(str(self.specifier)) + yield str(self.specifier) if self.url: - parts.append(f"@ {self.url}") + yield f"@ {self.url}" if self.marker: - parts.append(" ") + yield " " if self.marker: - parts.append(f"; {self.marker}") + yield f"; {self.marker}" - return "".join(parts) + def __str__(self) -> str: + return "".join(self._iter_parts(self.name)) def __repr__(self) -> str: return f"" + + def __hash__(self) -> int: + return hash( + ( + self.__class__.__name__, + *self._iter_parts(canonicalize_name(self.name)), + ) + ) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Requirement): + return NotImplemented + + return ( + canonicalize_name(self.name) == canonicalize_name(other.name) + and self.extras == other.extras + and self.specifier == other.specifier + and self.url == other.url + and self.marker == other.marker + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py index 0e218a6f..f3ac480f 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py @@ -1,38 +1,43 @@ # This file is dual licensed under the terms of the Apache License, Version # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. +""" +.. testsetup:: + + from pip._vendor.packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier + from pip._vendor.packaging.version import Version +""" + +from __future__ import annotations import abc -import functools import itertools import re -import warnings -from typing import ( - Callable, - Dict, - Iterable, - Iterator, - List, - Optional, - Pattern, - Set, - Tuple, - TypeVar, - Union, -) +from typing import Callable, Iterable, Iterator, TypeVar, Union from .utils import canonicalize_version -from .version import LegacyVersion, Version, parse +from .version import Version + +UnparsedVersion = Union[Version, str] +UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) +CallableOperator = Callable[[Version, str], bool] + -ParsedVersion = Union[Version, LegacyVersion] -UnparsedVersion = Union[Version, LegacyVersion, str] -VersionTypeVar = TypeVar("VersionTypeVar", bound=UnparsedVersion) -CallableOperator = Callable[[ParsedVersion, str], bool] +def _coerce_version(version: UnparsedVersion) -> Version: + if not isinstance(version, Version): + version = Version(version) + return version class InvalidSpecifier(ValueError): """ - An invalid specifier was found, users should refer to PEP 440. + Raised when attempting to create a :class:`Specifier` with a specifier + string that is invalid. + + >>> Specifier("lolwat") + Traceback (most recent call last): + ... + packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' """ @@ -40,266 +45,71 @@ class BaseSpecifier(metaclass=abc.ABCMeta): @abc.abstractmethod def __str__(self) -> str: """ - Returns the str representation of this Specifier like object. This + Returns the str representation of this Specifier-like object. This should be representative of the Specifier itself. """ @abc.abstractmethod def __hash__(self) -> int: """ - Returns a hash value for this Specifier like object. + Returns a hash value for this Specifier-like object. """ @abc.abstractmethod def __eq__(self, other: object) -> bool: """ - Returns a boolean representing whether or not the two Specifier like + Returns a boolean representing whether or not the two Specifier-like objects are equal. - """ - @abc.abstractproperty - def prereleases(self) -> Optional[bool]: + :param other: The other object to check against. """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. + + @property + @abc.abstractmethod + def prereleases(self) -> bool | None: + """Whether or not pre-releases as a whole are allowed. + + This can be set to either ``True`` or ``False`` to explicitly enable or disable + prereleases or it can be set to ``None`` (the default) to use default semantics. """ @prereleases.setter def prereleases(self, value: bool) -> None: - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. + """Setter for :attr:`prereleases`. + + :param value: The value to set. """ @abc.abstractmethod - def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: + def contains(self, item: str, prereleases: bool | None = None) -> bool: """ Determines if the given item is contained within this specifier. """ @abc.abstractmethod def filter( - self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None - ) -> Iterable[VersionTypeVar]: + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: """ Takes an iterable of items and filters them so that only items which are contained within this specifier are allowed in it. """ -class _IndividualSpecifier(BaseSpecifier): - - _operators: Dict[str, str] = {} - _regex: Pattern[str] - - def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier(f"Invalid specifier: '{spec}'") - - self._spec: Tuple[str, str] = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self) -> str: - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"<{self.__class__.__name__}({str(self)!r}{pre})>" - - def __str__(self) -> str: - return "{}{}".format(*self._spec) - - @property - def _canonical_spec(self) -> Tuple[str, str]: - return self._spec[0], canonicalize_version(self._spec[1]) - - def __hash__(self) -> int: - return hash(self._canonical_spec) - - def __eq__(self, other: object) -> bool: - if isinstance(other, str): - try: - other = self.__class__(str(other)) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._canonical_spec == other._canonical_spec - - def _get_operator(self, op: str) -> CallableOperator: - operator_callable: CallableOperator = getattr( - self, f"_compare_{self._operators[op]}" - ) - return operator_callable - - def _coerce_version(self, version: UnparsedVersion) -> ParsedVersion: - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self) -> str: - return self._spec[0] - - @property - def version(self) -> str: - return self._spec[1] - - @property - def prereleases(self) -> Optional[bool]: - return self._prereleases - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - def __contains__(self, item: str) -> bool: - return self.contains(item) - - def contains( - self, item: UnparsedVersion, prereleases: Optional[bool] = None - ) -> bool: - - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - normalized_item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if normalized_item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - operator_callable: CallableOperator = self._get_operator(self.operator) - return operator_callable(normalized_item, self.version) - - def filter( - self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None - ) -> Iterable[VersionTypeVar]: - - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later in case nothing - # else matches this specifier. - if parsed_version.is_prerelease and not ( - prereleases or self.prereleases - ): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the beginning. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = r""" - (?P(==|!=|<=|>=|<|>)) - \s* - (?P - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: - super().__init__(spec, prereleases) - - warnings.warn( - "Creating a LegacyVersion has been deprecated and will be " - "removed in the next major release", - DeprecationWarning, - ) - - def _coerce_version(self, version: UnparsedVersion) -> LegacyVersion: - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal( - self, prospective: LegacyVersion, spec: str - ) -> bool: - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective: LegacyVersion, spec: str) -> bool: - return prospective > self._coerce_version(spec) +class Specifier(BaseSpecifier): + """This class abstracts handling of version specifiers. + .. tip:: -def _require_version_compare( - fn: Callable[["Specifier", ParsedVersion, str], bool] -) -> Callable[["Specifier", ParsedVersion, str], bool]: - @functools.wraps(fn) - def wrapped(self: "Specifier", prospective: ParsedVersion, spec: str) -> bool: - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - - return wrapped - - -class Specifier(_IndividualSpecifier): + It is generally not required to instantiate this manually. You should instead + prefer to work with :class:`SpecifierSet` instead, which can parse + comma-separated version specifiers (which is what package metadata contains). + """ - _regex_str = r""" + _operator_regex_str = r""" (?P(~=|==|!=|<=|>=|<|>|===)) + """ + _version_regex_str = r""" (?P (?: # The identity operators allow for an escape hatch that will @@ -309,8 +119,10 @@ class Specifier(_IndividualSpecifier): # but included entirely as an escape hatch. (?<====) # Only match for the identity operator \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. + [^\s;)]* # The arbitrary version can be just about anything, + # we match everything except for whitespace, a + # semi-colon for marker support, and a closing paren + # since versions can be enclosed in them. ) | (?: @@ -323,23 +135,23 @@ class Specifier(_IndividualSpecifier): v? (?:[0-9]+!)? # epoch [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. + # You cannot use a wild card and a pre-release, post-release, a dev or + # local version together so group them with a | and make them optional. (?: + \.\* # Wild card syntax of .* + | + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* )? ) | @@ -354,7 +166,7 @@ class Specifier(_IndividualSpecifier): [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) (?: # pre release [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) + (alpha|beta|preview|pre|a|b|c|rc) [-_\.]? [0-9]* )? @@ -379,7 +191,7 @@ class Specifier(_IndividualSpecifier): [0-9]+(?:\.[0-9]+)* # release (?: # pre release [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) + (alpha|beta|preview|pre|a|b|c|rc) [-_\.]? [0-9]* )? @@ -391,7 +203,10 @@ class Specifier(_IndividualSpecifier): ) """ - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + _regex = re.compile( + r"^\s*" + _operator_regex_str + _version_regex_str + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) _operators = { "~=": "compatible", @@ -404,9 +219,153 @@ class Specifier(_IndividualSpecifier): "===": "arbitrary", } - @_require_version_compare - def _compare_compatible(self, prospective: ParsedVersion, spec: str) -> bool: + def __init__(self, spec: str = "", prereleases: bool | None = None) -> None: + """Initialize a Specifier instance. + + :param spec: + The string representation of a specifier which will be parsed and + normalized before use. + :param prereleases: + This tells the specifier if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + :raises InvalidSpecifier: + If the given specifier is invalid (i.e. bad syntax). + """ + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier(f"Invalid specifier: '{spec}'") + + self._spec: tuple[str, str] = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 + @property # type: ignore[override] + def prereleases(self) -> bool: + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if Version(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + @property + def operator(self) -> str: + """The operator of this specifier. + + >>> Specifier("==1.2.3").operator + '==' + """ + return self._spec[0] + + @property + def version(self) -> str: + """The version of this specifier. + + >>> Specifier("==1.2.3").version + '1.2.3' + """ + return self._spec[1] + def __repr__(self) -> str: + """A representation of the Specifier that shows all internal state. + + >>> Specifier('>=1.0.0') + =1.0.0')> + >>> Specifier('>=1.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> Specifier('>=1.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"<{self.__class__.__name__}({str(self)!r}{pre})>" + + def __str__(self) -> str: + """A string representation of the Specifier that can be round-tripped. + + >>> str(Specifier('>=1.0.0')) + '>=1.0.0' + >>> str(Specifier('>=1.0.0', prereleases=False)) + '>=1.0.0' + """ + return "{}{}".format(*self._spec) + + @property + def _canonical_spec(self) -> tuple[str, str]: + canonical_version = canonicalize_version( + self._spec[1], + strip_trailing_zero=(self._spec[0] != "~="), + ) + return self._spec[0], canonical_version + + def __hash__(self) -> int: + return hash(self._canonical_spec) + + def __eq__(self, other: object) -> bool: + """Whether or not the two Specifier-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") + True + >>> (Specifier("==1.2.3", prereleases=False) == + ... Specifier("==1.2.3", prereleases=True)) + True + >>> Specifier("==1.2.3") == "==1.2.3" + True + >>> Specifier("==1.2.3") == Specifier("==1.2.4") + False + >>> Specifier("==1.2.3") == Specifier("~=1.2.3") + False + """ + if isinstance(other, str): + try: + other = self.__class__(str(other)) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._canonical_spec == other._canonical_spec + + def _get_operator(self, op: str) -> CallableOperator: + operator_callable: CallableOperator = getattr( + self, f"_compare_{self._operators[op]}" + ) + return operator_callable + + def _compare_compatible(self, prospective: Version, spec: str) -> bool: # Compatible releases have an equivalent combination of >= and ==. That # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to # implement this in terms of the other specifiers instead of @@ -415,7 +374,7 @@ def _compare_compatible(self, prospective: ParsedVersion, spec: str) -> bool: # We want everything but the last item in the version, but we want to # ignore suffix segments. - prefix = ".".join( + prefix = _version_join( list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] ) @@ -426,34 +385,34 @@ def _compare_compatible(self, prospective: ParsedVersion, spec: str) -> bool: prospective, prefix ) - @_require_version_compare - def _compare_equal(self, prospective: ParsedVersion, spec: str) -> bool: - + def _compare_equal(self, prospective: Version, spec: str) -> bool: # We need special logic to handle prefix matching if spec.endswith(".*"): # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - split_spec = _version_split(spec[:-2]) # Remove the trailing .* + normalized_prospective = canonicalize_version( + prospective.public, strip_trailing_zero=False + ) + # Get the normalized version string ignoring the trailing .* + normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) + # Split the spec out by bangs and dots, and pretend that there is + # an implicit dot in between a release segment and a pre-release segment. + split_spec = _version_split(normalized_spec) - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - split_prospective = _version_split(str(prospective)) + # Split the prospective version out by bangs and dots, and pretend + # that there is an implicit dot in between a release segment and + # a pre-release segment. + split_prospective = _version_split(normalized_prospective) + + # 0-pad the prospective version before shortening it to get the correct + # shortened version. + padded_prospective, _ = _pad_version(split_prospective, split_spec) # Shorten the prospective version to be the same length as the spec # so that we can determine if the specifier is a prefix of the # prospective version or not. - shortened_prospective = split_prospective[: len(split_spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - padded_spec, padded_prospective = _pad_version( - split_spec, shortened_prospective - ) + shortened_prospective = padded_prospective[: len(split_spec)] - return padded_prospective == padded_spec + return shortened_prospective == split_spec else: # Convert our spec string into a Version spec_version = Version(spec) @@ -466,31 +425,22 @@ def _compare_equal(self, prospective: ParsedVersion, spec: str) -> bool: return prospective == spec_version - @_require_version_compare - def _compare_not_equal(self, prospective: ParsedVersion, spec: str) -> bool: + def _compare_not_equal(self, prospective: Version, spec: str) -> bool: return not self._compare_equal(prospective, spec) - @_require_version_compare - def _compare_less_than_equal(self, prospective: ParsedVersion, spec: str) -> bool: - + def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: # NB: Local version identifiers are NOT permitted in the version # specifier, so local version labels can be universally removed from # the prospective version. return Version(prospective.public) <= Version(spec) - @_require_version_compare - def _compare_greater_than_equal( - self, prospective: ParsedVersion, spec: str - ) -> bool: - + def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: # NB: Local version identifiers are NOT permitted in the version # specifier, so local version labels can be universally removed from # the prospective version. return Version(prospective.public) >= Version(spec) - @_require_version_compare - def _compare_less_than(self, prospective: ParsedVersion, spec_str: str) -> bool: - + def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: # Convert our spec to a Version instance, since we'll want to work with # it as a version. spec = Version(spec_str) @@ -514,9 +464,7 @@ def _compare_less_than(self, prospective: ParsedVersion, spec_str: str) -> bool: # version in the spec. return True - @_require_version_compare - def _compare_greater_than(self, prospective: ParsedVersion, spec_str: str) -> bool: - + def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: # Convert our spec to a Version instance, since we'll want to work with # it as a version. spec = Version(spec_str) @@ -549,42 +497,150 @@ def _compare_greater_than(self, prospective: ParsedVersion, spec_str: str) -> bo def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: return str(prospective).lower() == str(spec).lower() - @property - def prereleases(self) -> bool: + def __contains__(self, item: str | Version) -> bool: + """Return whether or not the item is contained in this specifier. - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases + :param item: The item to check for. - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True + >>> "1.2.3" in Specifier(">=1.2.3") + True + >>> Version("1.2.3") in Specifier(">=1.2.3") + True + >>> "1.0.0" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) + True + """ + return self.contains(item) - return False + def contains(self, item: UnparsedVersion, prereleases: bool | None = None) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this Specifier. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> Specifier(">=1.2.3").contains("1.2.3") + True + >>> Specifier(">=1.2.3").contains(Version("1.2.3")) + True + >>> Specifier(">=1.2.3").contains("1.0.0") + False + >>> Specifier(">=1.2.3").contains("1.3.0a1") + False + >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") + True + >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) + True + """ - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version, this allows us to have a shortcut for + # "2.0" in Specifier(">=2") + normalized_item = _coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if normalized_item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + operator_callable: CallableOperator = self._get_operator(self.operator) + return operator_callable(normalized_item, self.version) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifier. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(Specifier().contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) + ['1.2.3', '1.3', ] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) + ['1.5a1'] + >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + """ + + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = _coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later in case nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version _prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") -def _version_split(version: str) -> List[str]: - result: List[str] = [] - for item in version.split("."): +def _version_split(version: str) -> list[str]: + """Split version into components. + + The split components are intended for version comparison. The logic does + not attempt to retain the original version string, so joining the + components back with :func:`_version_join` may not produce the original + version string. + """ + result: list[str] = [] + + epoch, _, rest = version.rpartition("!") + result.append(epoch or "0") + + for item in rest.split("."): match = _prefix_regex.search(item) if match: result.extend(match.groups()) @@ -593,13 +649,24 @@ def _version_split(version: str) -> List[str]: return result +def _version_join(components: list[str]) -> str: + """Join split version components into a version string. + + This function assumes the input came from :func:`_version_split`, where the + first component must be the epoch (either empty or numeric), and all other + components numeric. + """ + epoch, *rest = components + return f"{epoch}!{'.'.join(rest)}" + + def _is_not_suffix(segment: str) -> bool: return not any( segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") ) -def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]: +def _pad_version(left: list[str], right: list[str]) -> tuple[list[str], list[str]]: left_split, right_split = [], [] # Get the release segment of our versions @@ -614,35 +681,80 @@ def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + return ( + list(itertools.chain.from_iterable(left_split)), + list(itertools.chain.from_iterable(right_split)), + ) class SpecifierSet(BaseSpecifier): - def __init__( - self, specifiers: str = "", prereleases: Optional[bool] = None - ) -> None: + """This class abstracts handling of a set of version specifiers. + + It can be passed a single specifier (``>=3.0``), a comma-separated list of + specifiers (``>=3.0,!=3.1``), or no specifier at all. + """ + + def __init__(self, specifiers: str = "", prereleases: bool | None = None) -> None: + """Initialize a SpecifierSet instance. + + :param specifiers: + The string representation of a specifier or a comma-separated list of + specifiers which will be parsed and normalized before use. + :param prereleases: + This tells the SpecifierSet if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + + :raises InvalidSpecifier: + If the given ``specifiers`` are not parseable than this exception will be + raised. + """ - # Split on , to break each individual specifier into it's own item, and + # Split on `,` to break each individual specifier into it's own item, and # strip each item to remove leading/trailing whitespace. split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed: Set[_IndividualSpecifier] = set() - for specifier in split_specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) + # Make each individual specifier a Specifier and save in a frozen set for later. + self._specs = frozenset(map(Specifier, split_specifiers)) # Store our prereleases value so we can use it later to determine if # we accept prereleases or not. self._prereleases = prereleases + @property + def prereleases(self) -> bool | None: + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + def __repr__(self) -> str: + """A representation of the specifier set that shows all internal state. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> SpecifierSet('>=1.0.0,!=2.0.0') + =1.0.0')> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ pre = ( f", prereleases={self.prereleases!r}" if self._prereleases is not None @@ -652,12 +764,31 @@ def __repr__(self) -> str: return f"" def __str__(self) -> str: + """A string representation of the specifier set that can be round-tripped. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) + '!=1.0.1,>=1.0.0' + >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) + '!=1.0.1,>=1.0.0' + """ return ",".join(sorted(str(s) for s in self._specs)) def __hash__(self) -> int: return hash(self._specs) - def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": + def __and__(self, other: SpecifierSet | str) -> SpecifierSet: + """Return a SpecifierSet which is a combination of the two sets. + + :param other: The other object to combine with. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' + =1.0.0')> + >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') + =1.0.0')> + """ if isinstance(other, str): other = SpecifierSet(other) elif not isinstance(other, SpecifierSet): @@ -681,7 +812,25 @@ def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": return specifier def __eq__(self, other: object) -> bool: - if isinstance(other, (str, _IndividualSpecifier)): + """Whether or not the two SpecifierSet-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == + ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") + False + """ + if isinstance(other, (str, Specifier)): other = SpecifierSet(str(other)) elif not isinstance(other, SpecifierSet): return NotImplemented @@ -689,43 +838,72 @@ def __eq__(self, other: object) -> bool: return self._specs == other._specs def __len__(self) -> int: + """Returns the number of specifiers in this specifier set.""" return len(self._specs) - def __iter__(self) -> Iterator[_IndividualSpecifier]: - return iter(self._specs) - - @property - def prereleases(self) -> Optional[bool]: - - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) + def __iter__(self) -> Iterator[Specifier]: + """ + Returns an iterator over all the underlying :class:`Specifier` instances + in this specifier set. - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value + >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) + [, =1.0.0')>] + """ + return iter(self._specs) def __contains__(self, item: UnparsedVersion) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) + True + """ return self.contains(item) def contains( - self, item: UnparsedVersion, prereleases: Optional[bool] = None + self, + item: UnparsedVersion, + prereleases: bool | None = None, + installed: bool | None = None, ) -> bool: - - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) + """Return whether or not the item is contained in this SpecifierSet. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this SpecifierSet. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) + True + """ + # Ensure that our item is a Version instance. + if not isinstance(item, Version): + item = Version(item) # Determine if we're forcing a prerelease or not, if we're not forcing # one for this particular filter call, then we'll use whatever the @@ -742,6 +920,9 @@ def contains( if not prereleases and item.is_prerelease: return False + if installed and item.is_prerelease: + item = Version(item.base_version) + # We simply dispatch to the underlying specs here to make sure that the # given version is contained within all of them. # Note: This use of all() here means that an empty set of specifiers @@ -749,9 +930,46 @@ def contains( return all(s.contains(item, prereleases=prereleases) for s in self._specs) def filter( - self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None - ) -> Iterable[VersionTypeVar]: - + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifiers in this set. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) + ['1.3', ] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) + [] + >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + + An "empty" SpecifierSet will filter items based on the presence of prerelease + versions in the set. + + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet("").filter(["1.5a1"])) + ['1.5a1'] + >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + """ # Determine if we're forcing a prerelease or not, if we're not forcing # one for this particular filter call, then we'll use whatever the # SpecifierSet thinks for whether or not we should support prereleases. @@ -764,27 +982,16 @@ def filter( if self._specs: for spec in self._specs: iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable + return iter(iterable) # If we do not have any specifiers, then we need to have a rough filter # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. + # releases. else: - filtered: List[VersionTypeVar] = [] - found_prereleases: List[VersionTypeVar] = [] - - item: UnparsedVersion - parsed_version: Union[Version, LegacyVersion] + filtered: list[UnparsedVersionVar] = [] + found_prereleases: list[UnparsedVersionVar] = [] for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue + parsed_version = _coerce_version(item) # Store any item which is a pre-release for later unless we've # already found a final version or we are accepting prereleases @@ -797,6 +1004,6 @@ def filter( # If we've found no items except for pre-releases, then we'll go # ahead and use the pre-releases if not filtered and found_prereleases and prereleases is None: - return found_prereleases + return iter(found_prereleases) - return filtered + return iter(filtered) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py index 9a3d25a7..6667d299 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py @@ -2,21 +2,21 @@ # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. +from __future__ import annotations + import logging import platform +import re +import struct +import subprocess import sys import sysconfig from importlib.machinery import EXTENSION_SUFFIXES from typing import ( - Dict, - FrozenSet, Iterable, Iterator, - List, - Optional, Sequence, Tuple, - Union, cast, ) @@ -27,7 +27,7 @@ PythonVersion = Sequence[int] MacVersion = Tuple[int, int] -INTERPRETER_SHORT_NAMES: Dict[str, str] = { +INTERPRETER_SHORT_NAMES: dict[str, str] = { "python": "py", # Generic. "cpython": "cp", "pypy": "pp", @@ -36,7 +36,7 @@ } -_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32 +_32_BIT_INTERPRETER = struct.calcsize("P") == 4 class Tag: @@ -93,7 +93,7 @@ def __repr__(self) -> str: return f"<{self} @ {id(self)}>" -def parse_tag(tag: str) -> FrozenSet[Tag]: +def parse_tag(tag: str) -> frozenset[Tag]: """ Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. @@ -109,8 +109,8 @@ def parse_tag(tag: str) -> FrozenSet[Tag]: return frozenset(tags) -def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: - value = sysconfig.get_config_var(name) +def _get_config_var(name: str, warn: bool = False) -> int | str | None: + value: int | str | None = sysconfig.get_config_var(name) if value is None and warn: logger.debug( "Config variable '%s' is unset, Python ABI tag may be incorrect", name @@ -119,23 +119,40 @@ def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: def _normalize_string(string: str) -> str: - return string.replace(".", "_").replace("-", "_") + return string.replace(".", "_").replace("-", "_").replace(" ", "_") + +def _is_threaded_cpython(abis: list[str]) -> bool: + """ + Determine if the ABI corresponds to a threaded (`--disable-gil`) build. -def _abi3_applies(python_version: PythonVersion) -> bool: + The threaded builds are indicated by a "t" in the abiflags. + """ + if len(abis) == 0: + return False + # expect e.g., cp313 + m = re.match(r"cp\d+(.*)", abis[0]) + if not m: + return False + abiflags = m.group(1) + return "t" in abiflags + + +def _abi3_applies(python_version: PythonVersion, threading: bool) -> bool: """ Determine if the Python version supports abi3. - PEP 384 was first implemented in Python 3.2. + PEP 384 was first implemented in Python 3.2. The threaded (`--disable-gil`) + builds do not support abi3. """ - return len(python_version) > 1 and tuple(python_version) >= (3, 2) + return len(python_version) > 1 and tuple(python_version) >= (3, 2) and not threading -def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: +def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> list[str]: py_version = tuple(py_version) # To allow for version comparison. abis = [] version = _version_nodot(py_version[:2]) - debug = pymalloc = ucs4 = "" + threading = debug = pymalloc = ucs4 = "" with_debug = _get_config_var("Py_DEBUG", warn) has_refcount = hasattr(sys, "gettotalrefcount") # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled @@ -144,6 +161,8 @@ def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: has_ext = "_d.pyd" in EXTENSION_SUFFIXES if with_debug or (with_debug is None and (has_refcount or has_ext)): debug = "d" + if py_version >= (3, 13) and _get_config_var("Py_GIL_DISABLED", warn): + threading = "t" if py_version < (3, 8): with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) if with_pymalloc or with_pymalloc is None: @@ -157,20 +176,15 @@ def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: elif debug: # Debug builds can also load "normal" extension modules. # We can also assume no UCS-4 or pymalloc requirement. - abis.append(f"cp{version}") - abis.insert( - 0, - "cp{version}{debug}{pymalloc}{ucs4}".format( - version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4 - ), - ) + abis.append(f"cp{version}{threading}") + abis.insert(0, f"cp{version}{threading}{debug}{pymalloc}{ucs4}") return abis def cpython_tags( - python_version: Optional[PythonVersion] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, + python_version: PythonVersion | None = None, + abis: Iterable[str] | None = None, + platforms: Iterable[str] | None = None, *, warn: bool = False, ) -> Iterator[Tag]: @@ -211,11 +225,14 @@ def cpython_tags( for abi in abis: for platform_ in platforms: yield Tag(interpreter, abi, platform_) - if _abi3_applies(python_version): + + threading = _is_threaded_cpython(abis) + use_abi3 = _abi3_applies(python_version, threading) + if use_abi3: yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) - if _abi3_applies(python_version): + if use_abi3: for minor_version in range(python_version[1] - 1, 1, -1): for platform_ in platforms: interpreter = "cp{version}".format( @@ -224,16 +241,51 @@ def cpython_tags( yield Tag(interpreter, "abi3", platform_) -def _generic_abi() -> Iterator[str]: - abi = sysconfig.get_config_var("SOABI") - if abi: - yield _normalize_string(abi) +def _generic_abi() -> list[str]: + """ + Return the ABI tag based on EXT_SUFFIX. + """ + # The following are examples of `EXT_SUFFIX`. + # We want to keep the parts which are related to the ABI and remove the + # parts which are related to the platform: + # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 + # - mac: '.cpython-310-darwin.so' => cp310 + # - win: '.cp310-win_amd64.pyd' => cp310 + # - win: '.pyd' => cp37 (uses _cpython_abis()) + # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 + # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' + # => graalpy_38_native + + ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) + if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": + raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") + parts = ext_suffix.split(".") + if len(parts) < 3: + # CPython3.7 and earlier uses ".pyd" on Windows. + return _cpython_abis(sys.version_info[:2]) + soabi = parts[1] + if soabi.startswith("cpython"): + # non-windows + abi = "cp" + soabi.split("-")[1] + elif soabi.startswith("cp"): + # windows + abi = soabi.split("-")[0] + elif soabi.startswith("pypy"): + abi = "-".join(soabi.split("-")[:2]) + elif soabi.startswith("graalpy"): + abi = "-".join(soabi.split("-")[:3]) + elif soabi: + # pyston, ironpython, others? + abi = soabi + else: + return [] + return [_normalize_string(abi)] def generic_tags( - interpreter: Optional[str] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, + interpreter: str | None = None, + abis: Iterable[str] | None = None, + platforms: Iterable[str] | None = None, *, warn: bool = False, ) -> Iterator[Tag]: @@ -251,8 +303,9 @@ def generic_tags( interpreter = "".join([interp_name, interp_version]) if abis is None: abis = _generic_abi() + else: + abis = list(abis) platforms = list(platforms or platform_tags()) - abis = list(abis) if "none" not in abis: abis.append("none") for abi in abis: @@ -276,9 +329,9 @@ def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: def compatible_tags( - python_version: Optional[PythonVersion] = None, - interpreter: Optional[str] = None, - platforms: Optional[Iterable[str]] = None, + python_version: PythonVersion | None = None, + interpreter: str | None = None, + platforms: Iterable[str] | None = None, ) -> Iterator[Tag]: """ Yields the sequence of tags that are compatible with a specific version of Python. @@ -310,7 +363,7 @@ def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: return "i386" -def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: +def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> list[str]: formats = [cpu_arch] if cpu_arch == "x86_64": if version < (10, 4): @@ -343,7 +396,7 @@ def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: def mac_platforms( - version: Optional[MacVersion] = None, arch: Optional[str] = None + version: MacVersion | None = None, arch: str | None = None ) -> Iterator[str]: """ Yields the platform tags for a macOS system. @@ -356,6 +409,22 @@ def mac_platforms( version_str, _, cpu_arch = platform.mac_ver() if version is None: version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + if version == (10, 16): + # When built against an older macOS SDK, Python will report macOS 10.16 + # instead of the real version. + version_str = subprocess.run( + [ + sys.executable, + "-sS", + "-c", + "import platform; print(platform.mac_ver()[0])", + ], + check=True, + env={"SYSTEM_VERSION_COMPAT": "0"}, + stdout=subprocess.PIPE, + text=True, + ).stdout + version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) else: version = version if arch is None: @@ -416,15 +485,21 @@ def mac_platforms( def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: linux = _normalize_string(sysconfig.get_platform()) + if not linux.startswith("linux_"): + # we should never be here, just yield the sysconfig one and return + yield linux + return if is_32bit: if linux == "linux_x86_64": linux = "linux_i686" elif linux == "linux_aarch64": - linux = "linux_armv7l" + linux = "linux_armv8l" _, arch = linux.split("_", 1) - yield from _manylinux.platform_tags(linux, arch) - yield from _musllinux.platform_tags(arch) - yield linux + archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) + yield from _manylinux.platform_tags(archs) + yield from _musllinux.platform_tags(archs) + for arch in archs: + yield f"linux_{arch}" def _generic_platforms() -> Iterator[str]: @@ -446,6 +521,9 @@ def platform_tags() -> Iterator[str]: def interpreter_name() -> str: """ Returns the name of the running interpreter. + + Some implementations have a reserved, two-letter abbreviation which will + be returned when appropriate. """ name = sys.implementation.name return INTERPRETER_SHORT_NAMES.get(name) or name @@ -482,6 +560,9 @@ def sys_tags(*, warn: bool = False) -> Iterator[Tag]: yield from generic_tags() if interp_name == "pp": - yield from compatible_tags(interpreter="pp3") + interp = "pp3" + elif interp_name == "cp": + interp = "cp" + interpreter_version(warn=warn) else: - yield from compatible_tags() + interp = None + yield from compatible_tags(interpreter=interp) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py index bab11b80..d33da5bb 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py @@ -2,8 +2,10 @@ # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. +from __future__ import annotations + import re -from typing import FrozenSet, NewType, Tuple, Union, cast +from typing import NewType, Tuple, Union, cast from .tags import Tag, parse_tag from .version import InvalidVersion, Version @@ -12,6 +14,12 @@ NormalizedName = NewType("NormalizedName", str) +class InvalidName(ValueError): + """ + An invalid distribution name; users should refer to the packaging user guide. + """ + + class InvalidWheelFilename(ValueError): """ An invalid wheel filename was found, users should refer to PEP 427. @@ -24,18 +32,31 @@ class InvalidSdistFilename(ValueError): """ +# Core metadata spec for `Name` +_validate_regex = re.compile( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE +) _canonicalize_regex = re.compile(r"[-_.]+") +_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") # PEP 427: The build number must start with a digit. _build_tag_regex = re.compile(r"(\d+)(.*)") -def canonicalize_name(name: str) -> NormalizedName: +def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: + if validate and not _validate_regex.match(name): + raise InvalidName(f"name is invalid: {name!r}") # This is taken from PEP 503. value = _canonicalize_regex.sub("-", name).lower() return cast(NormalizedName, value) -def canonicalize_version(version: Union[Version, str]) -> str: +def is_normalized_name(name: str) -> bool: + return _normalized_regex.match(name) is not None + + +def canonicalize_version( + version: Version | str, *, strip_trailing_zero: bool = True +) -> str: """ This is very similar to Version.__str__, but has one subtle difference with the way it handles the release segment. @@ -56,8 +77,11 @@ def canonicalize_version(version: Union[Version, str]) -> str: parts.append(f"{parsed.epoch}!") # Release segment - # NB: This strips trailing '.0's to normalize - parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in parsed.release))) + release_segment = ".".join(str(x) for x in parsed.release) + if strip_trailing_zero: + # NB: This strips trailing '.0's to normalize + release_segment = re.sub(r"(\.0)+$", "", release_segment) + parts.append(release_segment) # Pre-release if parsed.pre is not None: @@ -80,7 +104,7 @@ def canonicalize_version(version: Union[Version, str]) -> str: def parse_wheel_filename( filename: str, -) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]: +) -> tuple[NormalizedName, Version, BuildTag, frozenset[Tag]]: if not filename.endswith(".whl"): raise InvalidWheelFilename( f"Invalid wheel filename (extension must be '.whl'): {filename}" @@ -95,11 +119,18 @@ def parse_wheel_filename( parts = filename.split("-", dashes - 2) name_part = parts[0] - # See PEP 427 for the rules on escaping the project name + # See PEP 427 for the rules on escaping the project name. if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: raise InvalidWheelFilename(f"Invalid project name: {filename}") name = canonicalize_name(name_part) - version = Version(parts[1]) + + try: + version = Version(parts[1]) + except InvalidVersion as e: + raise InvalidWheelFilename( + f"Invalid wheel filename (invalid version): {filename}" + ) from e + if dashes == 5: build_part = parts[2] build_match = _build_tag_regex.match(build_part) @@ -114,7 +145,7 @@ def parse_wheel_filename( return (name, version, build, tags) -def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: +def parse_sdist_filename(filename: str) -> tuple[NormalizedName, Version]: if filename.endswith(".tar.gz"): file_stem = filename[: -len(".tar.gz")] elif filename.endswith(".zip"): @@ -132,5 +163,12 @@ def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") name = canonicalize_name(name_part) - version = Version(version_part) + + try: + version = Version(version_part) + except InvalidVersion as e: + raise InvalidSdistFilename( + f"Invalid sdist filename (invalid version): {filename}" + ) from e + return (name, version) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py index de9a09a4..8b0a0408 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py @@ -1,64 +1,73 @@ # This file is dual licensed under the terms of the Apache License, Version # 2.0, and the BSD License. See the LICENSE file in the root of this repository # for complete details. +""" +.. testsetup:: + + from pip._vendor.packaging.version import parse, Version +""" + +from __future__ import annotations -import collections import itertools import re -import warnings -from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union +from typing import Any, Callable, NamedTuple, SupportsInt, Tuple, Union from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType -__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] +__all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"] + +LocalType = Tuple[Union[int, str], ...] -InfiniteTypes = Union[InfinityType, NegativeInfinityType] -PrePostDevType = Union[InfiniteTypes, Tuple[str, int]] -SubLocalType = Union[InfiniteTypes, int, str] -LocalType = Union[ +CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] +CmpLocalType = Union[ NegativeInfinityType, - Tuple[ - Union[ - SubLocalType, - Tuple[SubLocalType, str], - Tuple[NegativeInfinityType, SubLocalType], - ], - ..., - ], + Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], ] CmpKey = Tuple[ - int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType -] -LegacyCmpKey = Tuple[int, Tuple[str, ...]] -VersionComparisonMethod = Callable[ - [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool + int, + Tuple[int, ...], + CmpPrePostDevType, + CmpPrePostDevType, + CmpPrePostDevType, + CmpLocalType, ] +VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] -_Version = collections.namedtuple( - "_Version", ["epoch", "release", "dev", "pre", "post", "local"] -) +class _Version(NamedTuple): + epoch: int + release: tuple[int, ...] + dev: tuple[str, int] | None + pre: tuple[str, int] | None + post: tuple[str, int] | None + local: LocalType | None -def parse(version: str) -> Union["LegacyVersion", "Version"]: - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. + +def parse(version: str) -> Version: + """Parse the given version string. + + >>> parse('1.0.dev1') + + + :param version: The version string to parse. + :raises InvalidVersion: When the version string is not a valid version. """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) + return Version(version) class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. + """Raised when a version string is not a valid version. + + >>> Version("invalid") + Traceback (most recent call last): + ... + packaging.version.InvalidVersion: Invalid version: 'invalid' """ class _BaseVersion: - _key: Union[CmpKey, LegacyCmpKey] + _key: tuple[Any, ...] def __hash__(self) -> int: return hash(self._key) @@ -66,13 +75,13 @@ def __hash__(self) -> int: # Please keep the duplicated `isinstance` check # in the six comparisons hereunder # unless you find a way to avoid adding overhead function calls. - def __lt__(self, other: "_BaseVersion") -> bool: + def __lt__(self, other: _BaseVersion) -> bool: if not isinstance(other, _BaseVersion): return NotImplemented return self._key < other._key - def __le__(self, other: "_BaseVersion") -> bool: + def __le__(self, other: _BaseVersion) -> bool: if not isinstance(other, _BaseVersion): return NotImplemented @@ -84,13 +93,13 @@ def __eq__(self, other: object) -> bool: return self._key == other._key - def __ge__(self, other: "_BaseVersion") -> bool: + def __ge__(self, other: _BaseVersion) -> bool: if not isinstance(other, _BaseVersion): return NotImplemented return self._key >= other._key - def __gt__(self, other: "_BaseVersion") -> bool: + def __gt__(self, other: _BaseVersion) -> bool: if not isinstance(other, _BaseVersion): return NotImplemented @@ -103,133 +112,16 @@ def __ne__(self, other: object) -> bool: return self._key != other._key -class LegacyVersion(_BaseVersion): - def __init__(self, version: str) -> None: - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - warnings.warn( - "Creating a LegacyVersion has been deprecated and will be " - "removed in the next major release", - DeprecationWarning, - ) - - def __str__(self) -> str: - return self._version - - def __repr__(self) -> str: - return f"" - - @property - def public(self) -> str: - return self._version - - @property - def base_version(self) -> str: - return self._version - - @property - def epoch(self) -> int: - return -1 - - @property - def release(self) -> None: - return None - - @property - def pre(self) -> None: - return None - - @property - def post(self) -> None: - return None - - @property - def dev(self) -> None: - return None - - @property - def local(self) -> None: - return None - - @property - def is_prerelease(self) -> bool: - return False - - @property - def is_postrelease(self) -> bool: - return False - - @property - def is_devrelease(self) -> bool: - return False - - -_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) - -_legacy_version_replacement_map = { - "pre": "c", - "preview": "c", - "-": "final-", - "rc": "c", - "dev": "@", -} - - -def _parse_version_parts(s: str) -> Iterator[str]: - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version: str) -> LegacyCmpKey: - - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts: List[str] = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - - return epoch, tuple(parts) - - # Deliberately not anchored to the start and end of the string, to make it # easier for 3rd party code to reuse -VERSION_PATTERN = r""" +_VERSION_PATTERN = r""" v? (?: (?:(?P[0-9]+)!)? # epoch (?P[0-9]+(?:\.[0-9]+)*) # release segment (?P
                                              # pre-release
                 [-_\.]?
    -            (?P(a|b|c|rc|alpha|beta|pre|preview))
    +            (?Palpha|a|beta|b|preview|pre|c|rc)
                 [-_\.]?
                 (?P[0-9]+)?
             )?
    @@ -253,12 +145,56 @@ def _legacy_cmpkey(version: str) -> LegacyCmpKey:
         (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
     """
     
    +VERSION_PATTERN = _VERSION_PATTERN
    +"""
    +A string containing the regular expression used to match a valid version.
    +
    +The pattern is not anchored at either end, and is intended for embedding in larger
    +expressions (for example, matching a version number as part of a file name). The
    +regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
    +flags set.
    +
    +:meta hide-value:
    +"""
    +
     
     class Version(_BaseVersion):
    +    """This class abstracts handling of a project's versions.
    +
    +    A :class:`Version` instance is comparison aware and can be compared and
    +    sorted using the standard Python interfaces.
    +
    +    >>> v1 = Version("1.0a5")
    +    >>> v2 = Version("1.0")
    +    >>> v1
    +    
    +    >>> v2
    +    
    +    >>> v1 < v2
    +    True
    +    >>> v1 == v2
    +    False
    +    >>> v1 > v2
    +    False
    +    >>> v1 >= v2
    +    False
    +    >>> v1 <= v2
    +    True
    +    """
     
         _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
    +    _key: CmpKey
     
         def __init__(self, version: str) -> None:
    +        """Initialize a Version object.
    +
    +        :param version:
    +            The string representation of a version which will be parsed and normalized
    +            before use.
    +        :raises InvalidVersion:
    +            If the ``version`` does not conform to PEP 440 in any way then this
    +            exception will be raised.
    +        """
     
             # Validate the version and parse it into pieces
             match = self._regex.search(version)
    @@ -288,9 +224,19 @@ def __init__(self, version: str) -> None:
             )
     
         def __repr__(self) -> str:
    +        """A representation of the Version that shows all internal state.
    +
    +        >>> Version('1.0.0')
    +        
    +        """
             return f""
     
         def __str__(self) -> str:
    +        """A string representation of the version that can be rounded-tripped.
    +
    +        >>> str(Version("1.0a5"))
    +        '1.0a5'
    +        """
             parts = []
     
             # Epoch
    @@ -320,29 +266,77 @@ def __str__(self) -> str:
     
         @property
         def epoch(self) -> int:
    -        _epoch: int = self._version.epoch
    -        return _epoch
    +        """The epoch of the version.
    +
    +        >>> Version("2.0.0").epoch
    +        0
    +        >>> Version("1!2.0.0").epoch
    +        1
    +        """
    +        return self._version.epoch
     
         @property
    -    def release(self) -> Tuple[int, ...]:
    -        _release: Tuple[int, ...] = self._version.release
    -        return _release
    +    def release(self) -> tuple[int, ...]:
    +        """The components of the "release" segment of the version.
    +
    +        >>> Version("1.2.3").release
    +        (1, 2, 3)
    +        >>> Version("2.0.0").release
    +        (2, 0, 0)
    +        >>> Version("1!2.0.0.post0").release
    +        (2, 0, 0)
    +
    +        Includes trailing zeroes but not the epoch or any pre-release / development /
    +        post-release suffixes.
    +        """
    +        return self._version.release
     
         @property
    -    def pre(self) -> Optional[Tuple[str, int]]:
    -        _pre: Optional[Tuple[str, int]] = self._version.pre
    -        return _pre
    +    def pre(self) -> tuple[str, int] | None:
    +        """The pre-release segment of the version.
    +
    +        >>> print(Version("1.2.3").pre)
    +        None
    +        >>> Version("1.2.3a1").pre
    +        ('a', 1)
    +        >>> Version("1.2.3b1").pre
    +        ('b', 1)
    +        >>> Version("1.2.3rc1").pre
    +        ('rc', 1)
    +        """
    +        return self._version.pre
     
         @property
    -    def post(self) -> Optional[int]:
    +    def post(self) -> int | None:
    +        """The post-release number of the version.
    +
    +        >>> print(Version("1.2.3").post)
    +        None
    +        >>> Version("1.2.3.post1").post
    +        1
    +        """
             return self._version.post[1] if self._version.post else None
     
         @property
    -    def dev(self) -> Optional[int]:
    +    def dev(self) -> int | None:
    +        """The development number of the version.
    +
    +        >>> print(Version("1.2.3").dev)
    +        None
    +        >>> Version("1.2.3.dev1").dev
    +        1
    +        """
             return self._version.dev[1] if self._version.dev else None
     
         @property
    -    def local(self) -> Optional[str]:
    +    def local(self) -> str | None:
    +        """The local version segment of the version.
    +
    +        >>> print(Version("1.2.3").local)
    +        None
    +        >>> Version("1.2.3+abc").local
    +        'abc'
    +        """
             if self._version.local:
                 return ".".join(str(x) for x in self._version.local)
             else:
    @@ -350,10 +344,31 @@ def local(self) -> Optional[str]:
     
         @property
         def public(self) -> str:
    +        """The public portion of the version.
    +
    +        >>> Version("1.2.3").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc.dev1").public
    +        '1.2.3'
    +        """
             return str(self).split("+", 1)[0]
     
         @property
         def base_version(self) -> str:
    +        """The "base version" of the version.
    +
    +        >>> Version("1.2.3").base_version
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").base_version
    +        '1.2.3'
    +        >>> Version("1!1.2.3+abc.dev1").base_version
    +        '1!1.2.3'
    +
    +        The "base version" is the public version of the project without any pre or post
    +        release markers.
    +        """
             parts = []
     
             # Epoch
    @@ -367,33 +382,78 @@ def base_version(self) -> str:
     
         @property
         def is_prerelease(self) -> bool:
    +        """Whether this version is a pre-release.
    +
    +        >>> Version("1.2.3").is_prerelease
    +        False
    +        >>> Version("1.2.3a1").is_prerelease
    +        True
    +        >>> Version("1.2.3b1").is_prerelease
    +        True
    +        >>> Version("1.2.3rc1").is_prerelease
    +        True
    +        >>> Version("1.2.3dev1").is_prerelease
    +        True
    +        """
             return self.dev is not None or self.pre is not None
     
         @property
         def is_postrelease(self) -> bool:
    +        """Whether this version is a post-release.
    +
    +        >>> Version("1.2.3").is_postrelease
    +        False
    +        >>> Version("1.2.3.post1").is_postrelease
    +        True
    +        """
             return self.post is not None
     
         @property
         def is_devrelease(self) -> bool:
    +        """Whether this version is a development release.
    +
    +        >>> Version("1.2.3").is_devrelease
    +        False
    +        >>> Version("1.2.3.dev1").is_devrelease
    +        True
    +        """
             return self.dev is not None
     
         @property
         def major(self) -> int:
    +        """The first item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").major
    +        1
    +        """
             return self.release[0] if len(self.release) >= 1 else 0
     
         @property
         def minor(self) -> int:
    +        """The second item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").minor
    +        2
    +        >>> Version("1").minor
    +        0
    +        """
             return self.release[1] if len(self.release) >= 2 else 0
     
         @property
         def micro(self) -> int:
    +        """The third item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").micro
    +        3
    +        >>> Version("1").micro
    +        0
    +        """
             return self.release[2] if len(self.release) >= 3 else 0
     
     
     def _parse_letter_version(
    -    letter: str, number: Union[str, bytes, SupportsInt]
    -) -> Optional[Tuple[str, int]]:
    -
    +    letter: str | None, number: str | bytes | SupportsInt | None
    +) -> tuple[str, int] | None:
         if letter:
             # We consider there to be an implicit 0 in a pre-release if there is
             # not a numeral associated with it.
    @@ -429,7 +489,7 @@ def _parse_letter_version(
     _local_version_separators = re.compile(r"[\._-]")
     
     
    -def _parse_local_version(local: str) -> Optional[LocalType]:
    +def _parse_local_version(local: str | None) -> LocalType | None:
         """
         Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
         """
    @@ -443,13 +503,12 @@ def _parse_local_version(local: str) -> Optional[LocalType]:
     
     def _cmpkey(
         epoch: int,
    -    release: Tuple[int, ...],
    -    pre: Optional[Tuple[str, int]],
    -    post: Optional[Tuple[str, int]],
    -    dev: Optional[Tuple[str, int]],
    -    local: Optional[Tuple[SubLocalType]],
    +    release: tuple[int, ...],
    +    pre: tuple[str, int] | None,
    +    post: tuple[str, int] | None,
    +    dev: tuple[str, int] | None,
    +    local: LocalType | None,
     ) -> CmpKey:
    -
         # When we compare a release version, we want to compare it with all of the
         # trailing zeros removed. So we'll use a reverse the list, drop all the now
         # leading zeros until we come to something non zero, then take the rest
    @@ -464,7 +523,7 @@ def _cmpkey(
         # if there is not a pre or a post segment. If we have one of those then
         # the normal sorting rules will handle this case correctly.
         if pre is None and post is None and dev is not None:
    -        _pre: PrePostDevType = NegativeInfinity
    +        _pre: CmpPrePostDevType = NegativeInfinity
         # Versions without a pre-release (except as noted above) should sort after
         # those with one.
         elif pre is None:
    @@ -474,21 +533,21 @@ def _cmpkey(
     
         # Versions without a post segment should sort before those with one.
         if post is None:
    -        _post: PrePostDevType = NegativeInfinity
    +        _post: CmpPrePostDevType = NegativeInfinity
     
         else:
             _post = post
     
         # Versions without a development segment should sort after those with one.
         if dev is None:
    -        _dev: PrePostDevType = Infinity
    +        _dev: CmpPrePostDevType = Infinity
     
         else:
             _dev = dev
     
         if local is None:
             # Versions without a local segment should sort before those with one.
    -        _local: LocalType = NegativeInfinity
    +        _local: CmpLocalType = NegativeInfinity
         else:
             # Versions with a local segment need that segment parsed to implement
             # the sorting rules in PEP440.
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
    index ad279407..57ce7f10 100644
    --- a/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
    +++ b/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
    @@ -1,3 +1,6 @@
    +# TODO: Add Generic type annotations to initialized collections.
    +# For now we'd simply use implicit Any/Unknown which would add redundant annotations
    +# mypy: disable-error-code="var-annotated"
     """
     Package resource API
     --------------------
    @@ -17,12 +20,36 @@
     :mod:`importlib.metadata` and :pypi:`packaging` instead.
     """
     
    +from __future__ import annotations
    +
     import sys
    +
    +if sys.version_info < (3, 8):  # noqa: UP036 # Check for unsupported versions
    +    raise RuntimeError("Python 3.8 or later is required")
    +
     import os
     import io
     import time
     import re
     import types
    +from typing import (
    +    Any,
    +    Literal,
    +    Dict,
    +    Iterator,
    +    Mapping,
    +    MutableSequence,
    +    NamedTuple,
    +    NoReturn,
    +    Tuple,
    +    Union,
    +    TYPE_CHECKING,
    +    Protocol,
    +    Callable,
    +    Iterable,
    +    TypeVar,
    +    overload,
    +)
     import zipfile
     import zipimport
     import warnings
    @@ -41,21 +68,16 @@
     import ntpath
     import posixpath
     import importlib
    +import importlib.abc
    +import importlib.machinery
     from pkgutil import get_importer
     
    -try:
    -    import _imp
    -except ImportError:
    -    # Python 3.2 compatibility
    -    import imp as _imp
    -
    -try:
    -    FileExistsError
    -except NameError:
    -    FileExistsError = OSError
    +import _imp
     
     # capture these to bypass sandboxing
     from os import utime
    +from os import open as os_open
    +from os.path import isdir, split
     
     try:
         from os import mkdir, rename, unlink
    @@ -65,64 +87,59 @@
         # no write support, probably under GAE
         WRITE_SUPPORT = False
     
    -from os import open as os_open
    -from os.path import isdir, split
    -
    -try:
    -    import importlib.machinery as importlib_machinery
    -
    -    # access attribute to force import under delayed import mechanisms.
    -    importlib_machinery.__name__
    -except ImportError:
    -    importlib_machinery = None
    -
     from pip._internal.utils._jaraco_text import (
         yield_lines,
         drop_comment,
         join_continuation,
     )
    -
    -from pip._vendor import platformdirs
    -from pip._vendor import packaging
    -
    -__import__('pip._vendor.packaging.version')
    -__import__('pip._vendor.packaging.specifiers')
    -__import__('pip._vendor.packaging.requirements')
    -__import__('pip._vendor.packaging.markers')
    -__import__('pip._vendor.packaging.utils')
    -
    -if sys.version_info < (3, 5):
    -    raise RuntimeError("Python 3.5 or later is required")
    -
    -# declare some globals that will be defined later to
    -# satisfy the linters.
    -require = None
    -working_set = None
    -add_activation_listener = None
    -resources_stream = None
    -cleanup_resources = None
    -resource_dir = None
    -resource_stream = None
    -set_extraction_path = None
    -resource_isdir = None
    -resource_string = None
    -iter_entry_points = None
    -resource_listdir = None
    -resource_filename = None
    -resource_exists = None
    -_distribution_finders = None
    -_namespace_handlers = None
    -_namespace_packages = None
    -
    -
    -warnings.warn(
    -    "pkg_resources is deprecated as an API. "
    -    "See https://setuptools.pypa.io/en/latest/pkg_resources.html",
    -    DeprecationWarning,
    -    stacklevel=2
    +from pip._vendor.packaging import markers as _packaging_markers
    +from pip._vendor.packaging import requirements as _packaging_requirements
    +from pip._vendor.packaging import utils as _packaging_utils
    +from pip._vendor.packaging import version as _packaging_version
    +from pip._vendor.platformdirs import user_cache_dir as _user_cache_dir
    +
    +if TYPE_CHECKING:
    +    from _typeshed import BytesPath, StrPath, StrOrBytesPath
    +    from pip._vendor.typing_extensions import Self
    +
    +
    +# Patch: Remove deprecation warning from vendored pkg_resources.
    +# Setting PYTHONWARNINGS=error to verify builds produce no warnings
    +# causes immediate exceptions.
    +# See https://github.com/pypa/pip/issues/12243
    +
    +
    +_T = TypeVar("_T")
    +_DistributionT = TypeVar("_DistributionT", bound="Distribution")
    +# Type aliases
    +_NestedStr = Union[str, Iterable[Union[str, Iterable["_NestedStr"]]]]
    +_InstallerTypeT = Callable[["Requirement"], "_DistributionT"]
    +_InstallerType = Callable[["Requirement"], Union["Distribution", None]]
    +_PkgReqType = Union[str, "Requirement"]
    +_EPDistType = Union["Distribution", _PkgReqType]
    +_MetadataType = Union["IResourceProvider", None]
    +_ResolvedEntryPoint = Any  # Can be any attribute in the module
    +_ResourceStream = Any  # TODO / Incomplete: A readable file-like object
    +# Any object works, but let's indicate we expect something like a module (optionally has __loader__ or __file__)
    +_ModuleLike = Union[object, types.ModuleType]
    +# Any: Should be _ModuleLike but we end up with issues where _ModuleLike doesn't have _ZipLoaderModule's __loader__
    +_ProviderFactoryType = Callable[[Any], "IResourceProvider"]
    +_DistFinderType = Callable[[_T, str, bool], Iterable["Distribution"]]
    +_NSHandlerType = Callable[[_T, str, str, types.ModuleType], Union[str, None]]
    +_AdapterT = TypeVar(
    +    "_AdapterT", _DistFinderType[Any], _ProviderFactoryType, _NSHandlerType[Any]
     )
     
     
    +# Use _typeshed.importlib.LoaderProtocol once available https://github.com/python/typeshed/pull/11890
    +class _LoaderProtocol(Protocol):
    +    def load_module(self, fullname: str, /) -> types.ModuleType: ...
    +
    +
    +class _ZipLoaderModule(Protocol):
    +    __loader__: zipimport.zipimporter
    +
    +
     _PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I)
     
     
    @@ -133,18 +150,18 @@ class PEP440Warning(RuntimeWarning):
         """
     
     
    -parse_version = packaging.version.Version
    +parse_version = _packaging_version.Version
     
     
    -_state_vars = {}
    +_state_vars: dict[str, str] = {}
     
     
    -def _declare_state(vartype, **kw):
    -    globals().update(kw)
    -    _state_vars.update(dict.fromkeys(kw, vartype))
    +def _declare_state(vartype: str, varname: str, initial_value: _T) -> _T:
    +    _state_vars[varname] = vartype
    +    return initial_value
     
     
    -def __getstate__():
    +def __getstate__() -> dict[str, Any]:
         state = {}
         g = globals()
         for k, v in _state_vars.items():
    @@ -152,7 +169,7 @@ def __getstate__():
         return state
     
     
    -def __setstate__(state):
    +def __setstate__(state: dict[str, Any]) -> dict[str, Any]:
         g = globals()
         for k, v in state.items():
             g['_sset_' + _state_vars[k]](k, g[k], v)
    @@ -307,17 +324,17 @@ class VersionConflict(ResolutionError):
         _template = "{self.dist} is installed but {self.req} is required"
     
         @property
    -    def dist(self):
    +    def dist(self) -> Distribution:
             return self.args[0]
     
         @property
    -    def req(self):
    +    def req(self) -> Requirement:
             return self.args[1]
     
         def report(self):
             return self._template.format(**locals())
     
    -    def with_context(self, required_by):
    +    def with_context(self, required_by: set[Distribution | str]):
             """
             If required_by is non-empty, return a version of self that is a
             ContextualVersionConflict.
    @@ -337,7 +354,7 @@ class ContextualVersionConflict(VersionConflict):
         _template = VersionConflict._template + ' by {self.required_by}'
     
         @property
    -    def required_by(self):
    +    def required_by(self) -> set[str]:
             return self.args[2]
     
     
    @@ -350,11 +367,11 @@ class DistributionNotFound(ResolutionError):
         )
     
         @property
    -    def req(self):
    +    def req(self) -> Requirement:
             return self.args[0]
     
         @property
    -    def requirers(self):
    +    def requirers(self) -> set[str] | None:
             return self.args[1]
     
         @property
    @@ -374,7 +391,7 @@ class UnknownExtra(ResolutionError):
         """Distribution doesn't have an "extra feature" of the given name"""
     
     
    -_provider_factories = {}
    +_provider_factories: dict[type[_ModuleLike], _ProviderFactoryType] = {}
     
     PY_MAJOR = '{}.{}'.format(*sys.version_info)
     EGG_DIST = 3
    @@ -384,7 +401,9 @@ class UnknownExtra(ResolutionError):
     DEVELOP_DIST = -1
     
     
    -def register_loader_type(loader_type, provider_factory):
    +def register_loader_type(
    +    loader_type: type[_ModuleLike], provider_factory: _ProviderFactoryType
    +):
         """Register `provider_factory` to make providers for `loader_type`
     
         `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
    @@ -394,7 +413,11 @@ def register_loader_type(loader_type, provider_factory):
         _provider_factories[loader_type] = provider_factory
     
     
    -def get_provider(moduleOrReq):
    +@overload
    +def get_provider(moduleOrReq: str) -> IResourceProvider: ...
    +@overload
    +def get_provider(moduleOrReq: Requirement) -> Distribution: ...
    +def get_provider(moduleOrReq: str | Requirement) -> IResourceProvider | Distribution:
         """Return an IResourceProvider for the named module or requirement"""
         if isinstance(moduleOrReq, Requirement):
             return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
    @@ -407,20 +430,18 @@ def get_provider(moduleOrReq):
         return _find_adapter(_provider_factories, loader)(module)
     
     
    -def _macos_vers(_cache=[]):
    -    if not _cache:
    -        version = platform.mac_ver()[0]
    -        # fallback for MacPorts
    -        if version == '':
    -            plist = '/System/Library/CoreServices/SystemVersion.plist'
    -            if os.path.exists(plist):
    -                if hasattr(plistlib, 'readPlist'):
    -                    plist_content = plistlib.readPlist(plist)
    -                    if 'ProductVersion' in plist_content:
    -                        version = plist_content['ProductVersion']
    -
    -        _cache.append(version.split('.'))
    -    return _cache[0]
    +@functools.lru_cache(maxsize=None)
    +def _macos_vers():
    +    version = platform.mac_ver()[0]
    +    # fallback for MacPorts
    +    if version == '':
    +        plist = '/System/Library/CoreServices/SystemVersion.plist'
    +        if os.path.exists(plist):
    +            with open(plist, 'rb') as fh:
    +                plist_content = plistlib.load(fh)
    +            if 'ProductVersion' in plist_content:
    +                version = plist_content['ProductVersion']
    +    return version.split('.')
     
     
     def _macos_arch(machine):
    @@ -458,7 +479,7 @@ def get_build_platform():
     get_platform = get_build_platform
     
     
    -def compatible_platforms(provided, required):
    +def compatible_platforms(provided: str | None, required: str | None):
         """Can code for the `provided` platform run on the `required` platform?
     
         Returns true if either platform is ``None``, or the platforms are equal.
    @@ -507,102 +528,106 @@ def compatible_platforms(provided, required):
         return False
     
     
    -def run_script(dist_spec, script_name):
    -    """Locate distribution `dist_spec` and run its `script_name` script"""
    -    ns = sys._getframe(1).f_globals
    -    name = ns['__name__']
    -    ns.clear()
    -    ns['__name__'] = name
    -    require(dist_spec)[0].run_script(script_name, ns)
    -
    -
    -# backward compatibility
    -run_main = run_script
    -
    -
    -def get_distribution(dist):
    +@overload
    +def get_distribution(dist: _DistributionT) -> _DistributionT: ...
    +@overload
    +def get_distribution(dist: _PkgReqType) -> Distribution: ...
    +def get_distribution(dist: Distribution | _PkgReqType) -> Distribution:
         """Return a current distribution object for a Requirement or string"""
         if isinstance(dist, str):
             dist = Requirement.parse(dist)
         if isinstance(dist, Requirement):
    -        dist = get_provider(dist)
    +        # Bad type narrowing, dist has to be a Requirement here, so get_provider has to return Distribution
    +        dist = get_provider(dist)  # type: ignore[assignment]
         if not isinstance(dist, Distribution):
    -        raise TypeError("Expected string, Requirement, or Distribution", dist)
    +        raise TypeError("Expected str, Requirement, or Distribution", dist)
         return dist
     
     
    -def load_entry_point(dist, group, name):
    +def load_entry_point(dist: _EPDistType, group: str, name: str) -> _ResolvedEntryPoint:
         """Return `name` entry point of `group` for `dist` or raise ImportError"""
         return get_distribution(dist).load_entry_point(group, name)
     
     
    -def get_entry_map(dist, group=None):
    +@overload
    +def get_entry_map(
    +    dist: _EPDistType, group: None = None
    +) -> dict[str, dict[str, EntryPoint]]: ...
    +@overload
    +def get_entry_map(dist: _EPDistType, group: str) -> dict[str, EntryPoint]: ...
    +def get_entry_map(dist: _EPDistType, group: str | None = None):
         """Return the entry point map for `group`, or the full entry map"""
         return get_distribution(dist).get_entry_map(group)
     
     
    -def get_entry_info(dist, group, name):
    +def get_entry_info(dist: _EPDistType, group: str, name: str):
         """Return the EntryPoint object for `group`+`name`, or ``None``"""
         return get_distribution(dist).get_entry_info(group, name)
     
     
    -class IMetadataProvider:
    -    def has_metadata(name):
    +class IMetadataProvider(Protocol):
    +    def has_metadata(self, name: str) -> bool:
             """Does the package's distribution contain the named metadata?"""
     
    -    def get_metadata(name):
    +    def get_metadata(self, name: str) -> str:
             """The named metadata resource as a string"""
     
    -    def get_metadata_lines(name):
    +    def get_metadata_lines(self, name: str) -> Iterator[str]:
             """Yield named metadata resource as list of non-blank non-comment lines
     
             Leading and trailing whitespace is stripped from each line, and lines
             with ``#`` as the first non-blank character are omitted."""
     
    -    def metadata_isdir(name):
    +    def metadata_isdir(self, name: str) -> bool:
             """Is the named metadata a directory?  (like ``os.path.isdir()``)"""
     
    -    def metadata_listdir(name):
    +    def metadata_listdir(self, name: str) -> list[str]:
             """List of metadata names in the directory (like ``os.listdir()``)"""
     
    -    def run_script(script_name, namespace):
    +    def run_script(self, script_name: str, namespace: dict[str, Any]) -> None:
             """Execute the named script in the supplied namespace dictionary"""
     
     
    -class IResourceProvider(IMetadataProvider):
    +class IResourceProvider(IMetadataProvider, Protocol):
         """An object that provides access to package resources"""
     
    -    def get_resource_filename(manager, resource_name):
    +    def get_resource_filename(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> str:
             """Return a true filesystem path for `resource_name`
     
    -        `manager` must be an ``IResourceManager``"""
    +        `manager` must be a ``ResourceManager``"""
     
    -    def get_resource_stream(manager, resource_name):
    +    def get_resource_stream(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> _ResourceStream:
             """Return a readable file-like object for `resource_name`
     
    -        `manager` must be an ``IResourceManager``"""
    +        `manager` must be a ``ResourceManager``"""
     
    -    def get_resource_string(manager, resource_name):
    -        """Return a string containing the contents of `resource_name`
    +    def get_resource_string(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> bytes:
    +        """Return the contents of `resource_name` as :obj:`bytes`
     
    -        `manager` must be an ``IResourceManager``"""
    +        `manager` must be a ``ResourceManager``"""
     
    -    def has_resource(resource_name):
    +    def has_resource(self, resource_name: str) -> bool:
             """Does the package contain the named resource?"""
     
    -    def resource_isdir(resource_name):
    +    def resource_isdir(self, resource_name: str) -> bool:
             """Is the named resource a directory?  (like ``os.path.isdir()``)"""
     
    -    def resource_listdir(resource_name):
    +    def resource_listdir(self, resource_name: str) -> list[str]:
             """List of resource names in the directory (like ``os.listdir()``)"""
     
     
     class WorkingSet:
         """A collection of active distributions on sys.path (or a similar list)"""
     
    -    def __init__(self, entries=None):
    +    def __init__(self, entries: Iterable[str] | None = None):
             """Create working set from list of path entries (default=sys.path)"""
    -        self.entries = []
    +        self.entries: list[str] = []
             self.entry_keys = {}
             self.by_key = {}
             self.normalized_to_canonical_keys = {}
    @@ -656,7 +681,7 @@ def _build_from_requirements(cls, req_spec):
             sys.path[:] = ws.entries
             return ws
     
    -    def add_entry(self, entry):
    +    def add_entry(self, entry: str):
             """Add a path item to ``.entries``, finding any distributions on it
     
             ``find_distributions(entry, True)`` is used to find distributions
    @@ -671,11 +696,11 @@ def add_entry(self, entry):
             for dist in find_distributions(entry, True):
                 self.add(dist, entry, False)
     
    -    def __contains__(self, dist):
    +    def __contains__(self, dist: Distribution) -> bool:
             """True if `dist` is the active distribution for its project"""
             return self.by_key.get(dist.key) == dist
     
    -    def find(self, req):
    +    def find(self, req: Requirement) -> Distribution | None:
             """Find a distribution matching requirement `req`
     
             If there is an active distribution for the requested project, this
    @@ -699,7 +724,7 @@ def find(self, req):
                 raise VersionConflict(dist, req)
             return dist
     
    -    def iter_entry_points(self, group, name=None):
    +    def iter_entry_points(self, group: str, name: str | None = None):
             """Yield entry point objects from `group` matching `name`
     
             If `name` is None, yields all entry points in `group` from all
    @@ -713,7 +738,7 @@ def iter_entry_points(self, group, name=None):
                 if name is None or name == entry.name
             )
     
    -    def run_script(self, requires, script_name):
    +    def run_script(self, requires: str, script_name: str):
             """Locate distribution for `requires` and run `script_name` script"""
             ns = sys._getframe(1).f_globals
             name = ns['__name__']
    @@ -721,13 +746,13 @@ def run_script(self, requires, script_name):
             ns['__name__'] = name
             self.require(requires)[0].run_script(script_name, ns)
     
    -    def __iter__(self):
    +    def __iter__(self) -> Iterator[Distribution]:
             """Yield distributions for non-duplicate projects in the working set
     
             The yield order is the order in which the items' path entries were
             added to the working set.
             """
    -        seen = {}
    +        seen = set()
             for item in self.entries:
                 if item not in self.entry_keys:
                     # workaround a cache issue
    @@ -735,10 +760,16 @@ def __iter__(self):
     
                 for key in self.entry_keys[item]:
                     if key not in seen:
    -                    seen[key] = 1
    +                    seen.add(key)
                         yield self.by_key[key]
     
    -    def add(self, dist, entry=None, insert=True, replace=False):
    +    def add(
    +        self,
    +        dist: Distribution,
    +        entry: str | None = None,
    +        insert: bool = True,
    +        replace: bool = False,
    +    ):
             """Add `dist` to working set, associated with `entry`
     
             If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
    @@ -762,7 +793,7 @@ def add(self, dist, entry=None, insert=True, replace=False):
                 return
     
             self.by_key[dist.key] = dist
    -        normalized_name = packaging.utils.canonicalize_name(dist.key)
    +        normalized_name = _packaging_utils.canonicalize_name(dist.key)
             self.normalized_to_canonical_keys[normalized_name] = dist.key
             if dist.key not in keys:
                 keys.append(dist.key)
    @@ -770,14 +801,42 @@ def add(self, dist, entry=None, insert=True, replace=False):
                 keys2.append(dist.key)
             self._added_new(dist)
     
    +    @overload
         def resolve(
             self,
    -        requirements,
    -        env=None,
    -        installer=None,
    -        replace_conflicting=False,
    -        extras=None,
    -    ):
    +        requirements: Iterable[Requirement],
    +        env: Environment | None,
    +        installer: _InstallerTypeT[_DistributionT],
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[_DistributionT]: ...
    +    @overload
    +    def resolve(
    +        self,
    +        requirements: Iterable[Requirement],
    +        env: Environment | None = None,
    +        *,
    +        installer: _InstallerTypeT[_DistributionT],
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[_DistributionT]: ...
    +    @overload
    +    def resolve(
    +        self,
    +        requirements: Iterable[Requirement],
    +        env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[Distribution]: ...
    +    def resolve(
    +        self,
    +        requirements: Iterable[Requirement],
    +        env: Environment | None = None,
    +        installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[Distribution] | list[_DistributionT]:
             """List all distributions needed to (recursively) meet `requirements`
     
             `requirements` must be a sequence of ``Requirement`` objects.  `env`,
    @@ -805,7 +864,7 @@ def resolve(
             # set up the stack
             requirements = list(requirements)[::-1]
             # set of processed requirements
    -        processed = {}
    +        processed = set()
             # key -> dist
             best = {}
             to_activate = []
    @@ -839,14 +898,14 @@ def resolve(
                     required_by[new_requirement].add(req.project_name)
                     req_extras[new_requirement] = req.extras
     
    -            processed[req] = True
    +            processed.add(req)
     
             # return list of distros to activate
             return to_activate
     
         def _resolve_dist(
             self, req, best, replace_conflicting, env, installer, required_by, to_activate
    -    ):
    +    ) -> Distribution:
             dist = best.get(req.key)
             if dist is None:
                 # Find the best distribution and add it to the map
    @@ -875,7 +934,41 @@ def _resolve_dist(
                 raise VersionConflict(dist, req).with_context(dependent_req)
             return dist
     
    -    def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True):
    +    @overload
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None,
    +        installer: _InstallerTypeT[_DistributionT],
    +        fallback: bool = True,
    +    ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ...
    +    @overload
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None = None,
    +        *,
    +        installer: _InstallerTypeT[_DistributionT],
    +        fallback: bool = True,
    +    ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ...
    +    @overload
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +        fallback: bool = True,
    +    ) -> tuple[list[Distribution], dict[Distribution, Exception]]: ...
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None = None,
    +        installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
    +        fallback: bool = True,
    +    ) -> tuple[
    +        list[Distribution] | list[_DistributionT],
    +        dict[Distribution, Exception],
    +    ]:
             """Find all activatable distributions in `plugin_env`
     
             Example usage::
    @@ -914,8 +1007,8 @@ def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True)
             # scan project names in alphabetic order
             plugin_projects.sort()
     
    -        error_info = {}
    -        distributions = {}
    +        error_info: dict[Distribution, Exception] = {}
    +        distributions: dict[Distribution, Exception | None] = {}
     
             if full_env is None:
                 env = Environment(self.entries)
    @@ -951,12 +1044,12 @@ def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True)
                         # success, no need to try any more versions of this project
                         break
     
    -        distributions = list(distributions)
    -        distributions.sort()
    +        sorted_distributions = list(distributions)
    +        sorted_distributions.sort()
     
    -        return distributions, error_info
    +        return sorted_distributions, error_info
     
    -    def require(self, *requirements):
    +    def require(self, *requirements: _NestedStr):
             """Ensure that distributions matching `requirements` are activated
     
             `requirements` must be a string or a (possibly-nested) sequence
    @@ -972,7 +1065,9 @@ def require(self, *requirements):
     
             return needed
     
    -    def subscribe(self, callback, existing=True):
    +    def subscribe(
    +        self, callback: Callable[[Distribution], object], existing: bool = True
    +    ):
             """Invoke `callback` for all distributions
     
             If `existing=True` (default),
    @@ -1008,12 +1103,12 @@ def __setstate__(self, e_k_b_n_c):
             self.callbacks = callbacks[:]
     
     
    -class _ReqExtras(dict):
    +class _ReqExtras(Dict["Requirement", Tuple[str, ...]]):
         """
         Map each requirement to the extras that demanded it.
         """
     
    -    def markers_pass(self, req, extras=None):
    +    def markers_pass(self, req: Requirement, extras: tuple[str, ...] | None = None):
             """
             Evaluate markers for req against each extra that
             demanded it.
    @@ -1032,7 +1127,10 @@ class Environment:
         """Searchable snapshot of distributions on a search path"""
     
         def __init__(
    -        self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR
    +        self,
    +        search_path: Iterable[str] | None = None,
    +        platform: str | None = get_supported_platform(),
    +        python: str | None = PY_MAJOR,
         ):
             """Snapshot distributions available on a search path
     
    @@ -1055,7 +1153,7 @@ def __init__(
             self.python = python
             self.scan(search_path)
     
    -    def can_add(self, dist):
    +    def can_add(self, dist: Distribution):
             """Is distribution `dist` acceptable for this environment?
     
             The distribution must match the platform and python version
    @@ -1069,11 +1167,11 @@ def can_add(self, dist):
             )
             return py_compat and compatible_platforms(dist.platform, self.platform)
     
    -    def remove(self, dist):
    +    def remove(self, dist: Distribution):
             """Remove `dist` from the environment"""
             self._distmap[dist.key].remove(dist)
     
    -    def scan(self, search_path=None):
    +    def scan(self, search_path: Iterable[str] | None = None):
             """Scan `search_path` for distributions usable in this environment
     
             Any distributions found are added to the environment.
    @@ -1088,7 +1186,7 @@ def scan(self, search_path=None):
                 for dist in find_distributions(item):
                     self.add(dist)
     
    -    def __getitem__(self, project_name):
    +    def __getitem__(self, project_name: str) -> list[Distribution]:
             """Return a newest-to-oldest list of distributions for `project_name`
     
             Uses case-insensitive `project_name` comparison, assuming all the
    @@ -1099,7 +1197,7 @@ def __getitem__(self, project_name):
             distribution_key = project_name.lower()
             return self._distmap.get(distribution_key, [])
     
    -    def add(self, dist):
    +    def add(self, dist: Distribution):
             """Add `dist` if we ``can_add()`` it and it has not already been added"""
             if self.can_add(dist) and dist.has_version():
                 dists = self._distmap.setdefault(dist.key, [])
    @@ -1107,7 +1205,29 @@ def add(self, dist):
                     dists.append(dist)
                     dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
     
    -    def best_match(self, req, working_set, installer=None, replace_conflicting=False):
    +    @overload
    +    def best_match(
    +        self,
    +        req: Requirement,
    +        working_set: WorkingSet,
    +        installer: _InstallerTypeT[_DistributionT],
    +        replace_conflicting: bool = False,
    +    ) -> _DistributionT: ...
    +    @overload
    +    def best_match(
    +        self,
    +        req: Requirement,
    +        working_set: WorkingSet,
    +        installer: _InstallerType | None = None,
    +        replace_conflicting: bool = False,
    +    ) -> Distribution | None: ...
    +    def best_match(
    +        self,
    +        req: Requirement,
    +        working_set: WorkingSet,
    +        installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
    +        replace_conflicting: bool = False,
    +    ) -> Distribution | None:
             """Find distribution best matching `req` and usable on `working_set`
     
             This calls the ``find(req)`` method of the `working_set` to see if a
    @@ -1134,7 +1254,32 @@ def best_match(self, req, working_set, installer=None, replace_conflicting=False
             # try to download/install
             return self.obtain(req, installer)
     
    -    def obtain(self, requirement, installer=None):
    +    @overload
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: _InstallerTypeT[_DistributionT],
    +    ) -> _DistributionT: ...
    +    @overload
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: Callable[[Requirement], None] | None = None,
    +    ) -> None: ...
    +    @overload
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: _InstallerType | None = None,
    +    ) -> Distribution | None: ...
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: Callable[[Requirement], None]
    +        | _InstallerType
    +        | None
    +        | _InstallerTypeT[_DistributionT] = None,
    +    ) -> Distribution | None:
             """Obtain a distribution matching `requirement` (e.g. via download)
     
             Obtain a distro that matches requirement (e.g. via download).  In the
    @@ -1143,16 +1288,15 @@ def obtain(self, requirement, installer=None):
             None is returned instead.  This method is a hook that allows subclasses
             to attempt other ways of obtaining a distribution before falling back
             to the `installer` argument."""
    -        if installer is not None:
    -            return installer(requirement)
    +        return installer(requirement) if installer else None
     
    -    def __iter__(self):
    +    def __iter__(self) -> Iterator[str]:
             """Yield the unique project names of the available distributions"""
             for key in self._distmap.keys():
                 if self[key]:
                     yield key
     
    -    def __iadd__(self, other):
    +    def __iadd__(self, other: Distribution | Environment):
             """In-place addition of a distribution or environment"""
             if isinstance(other, Distribution):
                 self.add(other)
    @@ -1164,7 +1308,7 @@ def __iadd__(self, other):
                 raise TypeError("Can't add %r to environment" % (other,))
             return self
     
    -    def __add__(self, other):
    +    def __add__(self, other: Distribution | Environment):
             """Add an environment or distribution to an environment"""
             new = self.__class__([], platform=None, python=None)
             for env in self, other:
    @@ -1191,46 +1335,54 @@ class ExtractionError(RuntimeError):
             The exception instance that caused extraction to fail
         """
     
    +    manager: ResourceManager
    +    cache_path: str
    +    original_error: BaseException | None
    +
     
     class ResourceManager:
         """Manage resource extraction and packages"""
     
    -    extraction_path = None
    +    extraction_path: str | None = None
     
         def __init__(self):
             self.cached_files = {}
     
    -    def resource_exists(self, package_or_requirement, resource_name):
    +    def resource_exists(self, package_or_requirement: _PkgReqType, resource_name: str):
             """Does the named resource exist?"""
             return get_provider(package_or_requirement).has_resource(resource_name)
     
    -    def resource_isdir(self, package_or_requirement, resource_name):
    +    def resource_isdir(self, package_or_requirement: _PkgReqType, resource_name: str):
             """Is the named resource an existing directory?"""
             return get_provider(package_or_requirement).resource_isdir(resource_name)
     
    -    def resource_filename(self, package_or_requirement, resource_name):
    +    def resource_filename(
    +        self, package_or_requirement: _PkgReqType, resource_name: str
    +    ):
             """Return a true filesystem path for specified resource"""
             return get_provider(package_or_requirement).get_resource_filename(
                 self, resource_name
             )
     
    -    def resource_stream(self, package_or_requirement, resource_name):
    +    def resource_stream(self, package_or_requirement: _PkgReqType, resource_name: str):
             """Return a readable file-like object for specified resource"""
             return get_provider(package_or_requirement).get_resource_stream(
                 self, resource_name
             )
     
    -    def resource_string(self, package_or_requirement, resource_name):
    -        """Return specified resource as a string"""
    +    def resource_string(
    +        self, package_or_requirement: _PkgReqType, resource_name: str
    +    ) -> bytes:
    +        """Return specified resource as :obj:`bytes`"""
             return get_provider(package_or_requirement).get_resource_string(
                 self, resource_name
             )
     
    -    def resource_listdir(self, package_or_requirement, resource_name):
    +    def resource_listdir(self, package_or_requirement: _PkgReqType, resource_name: str):
             """List the contents of the named resource directory"""
             return get_provider(package_or_requirement).resource_listdir(resource_name)
     
    -    def extraction_error(self):
    +    def extraction_error(self) -> NoReturn:
             """Give an error message for problems extracting file(s)"""
     
             old_exc = sys.exc_info()[1]
    @@ -1260,7 +1412,7 @@ def extraction_error(self):
             err.original_error = old_exc
             raise err
     
    -    def get_cache_path(self, archive_name, names=()):
    +    def get_cache_path(self, archive_name: str, names: Iterable[StrPath] = ()):
             """Return absolute location in cache for `archive_name` and `names`
     
             The parent directory of the resulting path will be created if it does
    @@ -1282,7 +1434,7 @@ def get_cache_path(self, archive_name, names=()):
     
             self._warn_unsafe_extraction_path(extract_path)
     
    -        self.cached_files[target_path] = 1
    +        self.cached_files[target_path] = True
             return target_path
     
         @staticmethod
    @@ -1312,7 +1464,7 @@ def _warn_unsafe_extraction_path(path):
                 ).format(**locals())
                 warnings.warn(msg, UserWarning)
     
    -    def postprocess(self, tempname, filename):
    +    def postprocess(self, tempname: StrOrBytesPath, filename: StrOrBytesPath):
             """Perform any platform-specific postprocessing of `tempname`
     
             This is where Mac header rewrites should be done; other platforms don't
    @@ -1332,7 +1484,7 @@ def postprocess(self, tempname, filename):
                 mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
                 os.chmod(tempname, mode)
     
    -    def set_extraction_path(self, path):
    +    def set_extraction_path(self, path: str):
             """Set the base path where resources will be extracted to, if needed.
     
             If you do not call this routine before any extractions take place, the
    @@ -1356,7 +1508,7 @@ def set_extraction_path(self, path):
     
             self.extraction_path = path
     
    -    def cleanup_resources(self, force=False):
    +    def cleanup_resources(self, force: bool = False) -> list[str]:
             """
             Delete all extracted resource files and directories, returning a list
             of the file and directory names that could not be successfully removed.
    @@ -1368,20 +1520,19 @@ def cleanup_resources(self, force=False):
             directory used for extractions.
             """
             # XXX
    +        return []
     
     
    -def get_default_cache():
    +def get_default_cache() -> str:
         """
         Return the ``PYTHON_EGG_CACHE`` environment variable
         or a platform-relevant user cache dir for an app
         named "Python-Eggs".
         """
    -    return os.environ.get('PYTHON_EGG_CACHE') or platformdirs.user_cache_dir(
    -        appname='Python-Eggs'
    -    )
    +    return os.environ.get('PYTHON_EGG_CACHE') or _user_cache_dir(appname='Python-Eggs')
     
     
    -def safe_name(name):
    +def safe_name(name: str):
         """Convert an arbitrary string to a standard distribution name
     
         Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    @@ -1389,14 +1540,14 @@ def safe_name(name):
         return re.sub('[^A-Za-z0-9.]+', '-', name)
     
     
    -def safe_version(version):
    +def safe_version(version: str):
         """
         Convert an arbitrary string to a standard version string
         """
         try:
             # normalize the version
    -        return str(packaging.version.Version(version))
    -    except packaging.version.InvalidVersion:
    +        return str(_packaging_version.Version(version))
    +    except _packaging_version.InvalidVersion:
             version = version.replace(' ', '.')
             return re.sub('[^A-Za-z0-9.]+', '-', version)
     
    @@ -1418,7 +1569,7 @@ def _forgiving_version(version):
         match = _PEP440_FALLBACK.search(version)
         if match:
             safe = match["safe"]
    -        rest = version[len(safe):]
    +        rest = version[len(safe) :]
         else:
             safe = "0"
             rest = version
    @@ -1433,7 +1584,7 @@ def _safe_segment(segment):
         return re.sub(r'\.[^A-Za-z0-9]+', '.', segment).strip(".-")
     
     
    -def safe_extra(extra):
    +def safe_extra(extra: str):
         """Convert an arbitrary string to a standard 'extra' name
     
         Any runs of non-alphanumeric characters are replaced with a single '_',
    @@ -1442,7 +1593,7 @@ def safe_extra(extra):
         return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()
     
     
    -def to_filename(name):
    +def to_filename(name: str):
         """Convert a project or version name to its filename-escaped form
     
         Any '-' characters are currently replaced with '_'.
    @@ -1450,7 +1601,7 @@ def to_filename(name):
         return name.replace('-', '_')
     
     
    -def invalid_marker(text):
    +def invalid_marker(text: str):
         """
         Validate text as a PEP 508 environment marker; return an exception
         if invalid or False otherwise.
    @@ -1464,7 +1615,7 @@ def invalid_marker(text):
         return False
     
     
    -def evaluate_marker(text, extra=None):
    +def evaluate_marker(text: str, extra: str | None = None) -> bool:
         """
         Evaluate a PEP 508 environment marker.
         Return a boolean indicating the marker result in this environment.
    @@ -1473,46 +1624,48 @@ def evaluate_marker(text, extra=None):
         This implementation uses the 'pyparsing' module.
         """
         try:
    -        marker = packaging.markers.Marker(text)
    +        marker = _packaging_markers.Marker(text)
             return marker.evaluate()
    -    except packaging.markers.InvalidMarker as e:
    +    except _packaging_markers.InvalidMarker as e:
             raise SyntaxError(e) from e
     
     
     class NullProvider:
         """Try to implement resources and metadata for arbitrary PEP 302 loaders"""
     
    -    egg_name = None
    -    egg_info = None
    -    loader = None
    +    egg_name: str | None = None
    +    egg_info: str | None = None
    +    loader: _LoaderProtocol | None = None
     
    -    def __init__(self, module):
    +    def __init__(self, module: _ModuleLike):
             self.loader = getattr(module, '__loader__', None)
             self.module_path = os.path.dirname(getattr(module, '__file__', ''))
     
    -    def get_resource_filename(self, manager, resource_name):
    +    def get_resource_filename(self, manager: ResourceManager, resource_name: str):
             return self._fn(self.module_path, resource_name)
     
    -    def get_resource_stream(self, manager, resource_name):
    +    def get_resource_stream(self, manager: ResourceManager, resource_name: str):
             return io.BytesIO(self.get_resource_string(manager, resource_name))
     
    -    def get_resource_string(self, manager, resource_name):
    +    def get_resource_string(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> bytes:
             return self._get(self._fn(self.module_path, resource_name))
     
    -    def has_resource(self, resource_name):
    +    def has_resource(self, resource_name: str):
             return self._has(self._fn(self.module_path, resource_name))
     
         def _get_metadata_path(self, name):
             return self._fn(self.egg_info, name)
     
    -    def has_metadata(self, name):
    +    def has_metadata(self, name: str) -> bool:
             if not self.egg_info:
    -            return self.egg_info
    +            return False
     
             path = self._get_metadata_path(name)
             return self._has(path)
     
    -    def get_metadata(self, name):
    +    def get_metadata(self, name: str):
             if not self.egg_info:
                 return ""
             path = self._get_metadata_path(name)
    @@ -1525,24 +1678,24 @@ def get_metadata(self, name):
                 exc.reason += ' in {} file at path: {}'.format(name, path)
                 raise
     
    -    def get_metadata_lines(self, name):
    +    def get_metadata_lines(self, name: str) -> Iterator[str]:
             return yield_lines(self.get_metadata(name))
     
    -    def resource_isdir(self, resource_name):
    +    def resource_isdir(self, resource_name: str):
             return self._isdir(self._fn(self.module_path, resource_name))
     
    -    def metadata_isdir(self, name):
    -        return self.egg_info and self._isdir(self._fn(self.egg_info, name))
    +    def metadata_isdir(self, name: str) -> bool:
    +        return bool(self.egg_info and self._isdir(self._fn(self.egg_info, name)))
     
    -    def resource_listdir(self, resource_name):
    +    def resource_listdir(self, resource_name: str):
             return self._listdir(self._fn(self.module_path, resource_name))
     
    -    def metadata_listdir(self, name):
    +    def metadata_listdir(self, name: str) -> list[str]:
             if self.egg_info:
                 return self._listdir(self._fn(self.egg_info, name))
             return []
     
    -    def run_script(self, script_name, namespace):
    +    def run_script(self, script_name: str, namespace: dict[str, Any]):
             script = 'scripts/' + script_name
             if not self.has_metadata(script):
                 raise ResolutionError(
    @@ -1550,13 +1703,13 @@ def run_script(self, script_name, namespace):
                         **locals()
                     ),
                 )
    +
             script_text = self.get_metadata(script).replace('\r\n', '\n')
             script_text = script_text.replace('\r', '\n')
             script_filename = self._fn(self.egg_info, script)
             namespace['__file__'] = script_filename
             if os.path.exists(script_filename):
    -            with open(script_filename) as fid:
    -                source = fid.read()
    +            source = _read_utf8_with_fallback(script_filename)
                 code = compile(source, script_filename, 'exec')
                 exec(code, namespace, namespace)
             else:
    @@ -1571,22 +1724,26 @@ def run_script(self, script_name, namespace):
                 script_code = compile(script_text, script_filename, 'exec')
                 exec(script_code, namespace, namespace)
     
    -    def _has(self, path):
    +    def _has(self, path) -> bool:
             raise NotImplementedError(
                 "Can't perform this operation for unregistered loader type"
             )
     
    -    def _isdir(self, path):
    +    def _isdir(self, path) -> bool:
             raise NotImplementedError(
                 "Can't perform this operation for unregistered loader type"
             )
     
    -    def _listdir(self, path):
    +    def _listdir(self, path) -> list[str]:
             raise NotImplementedError(
                 "Can't perform this operation for unregistered loader type"
             )
     
    -    def _fn(self, base, resource_name):
    +    def _fn(self, base: str | None, resource_name: str):
    +        if base is None:
    +            raise TypeError(
    +                "`base` parameter in `_fn` is `None`. Either override this method or check the parameter first."
    +            )
             self._validate_resource_path(resource_name)
             if resource_name:
                 return os.path.join(base, *resource_name.split('/'))
    @@ -1649,6 +1806,7 @@ def _validate_resource_path(path):
                 os.path.pardir in path.split(posixpath.sep)
                 or posixpath.isabs(path)
                 or ntpath.isabs(path)
    +            or path.startswith("\\")
             )
             if not invalid:
                 return
    @@ -1656,7 +1814,7 @@ def _validate_resource_path(path):
             msg = "Use of .. or absolute path in a resource path is not allowed."
     
             # Aggressively disallow Windows absolute paths
    -        if ntpath.isabs(path) and not posixpath.isabs(path):
    +        if (path.startswith("\\") or ntpath.isabs(path)) and not posixpath.isabs(path):
                 raise ValueError(msg)
     
             # for compatibility, warn; in future
    @@ -1666,9 +1824,10 @@ def _validate_resource_path(path):
                 DeprecationWarning,
             )
     
    -    def _get(self, path):
    -        if hasattr(self.loader, 'get_data'):
    -            return self.loader.get_data(path)
    +    def _get(self, path) -> bytes:
    +        if hasattr(self.loader, 'get_data') and self.loader:
    +            # Already checked get_data exists
    +            return self.loader.get_data(path)  # type: ignore[attr-defined]
             raise NotImplementedError(
                 "Can't perform this operation for loaders without 'get_data()'"
             )
    @@ -1691,7 +1850,7 @@ def _parents(path):
     class EggProvider(NullProvider):
         """Provider based on a virtual filesystem"""
     
    -    def __init__(self, module):
    +    def __init__(self, module: _ModuleLike):
             super().__init__(module)
             self._setup_prefix()
     
    @@ -1702,7 +1861,7 @@ def _setup_prefix(self):
             egg = next(eggs, None)
             egg and self._set_egg(egg)
     
    -    def _set_egg(self, path):
    +    def _set_egg(self, path: str):
             self.egg_name = os.path.basename(path)
             self.egg_info = os.path.join(path, 'EGG-INFO')
             self.egg_root = path
    @@ -1711,19 +1870,19 @@ def _set_egg(self, path):
     class DefaultProvider(EggProvider):
         """Provides access to package resources in the filesystem"""
     
    -    def _has(self, path):
    +    def _has(self, path) -> bool:
             return os.path.exists(path)
     
    -    def _isdir(self, path):
    +    def _isdir(self, path) -> bool:
             return os.path.isdir(path)
     
         def _listdir(self, path):
             return os.listdir(path)
     
    -    def get_resource_stream(self, manager, resource_name):
    +    def get_resource_stream(self, manager: object, resource_name: str):
             return open(self._fn(self.module_path, resource_name), 'rb')
     
    -    def _get(self, path):
    +    def _get(self, path) -> bytes:
             with open(path, 'rb') as stream:
                 return stream.read()
     
    @@ -1734,7 +1893,7 @@ def _register(cls):
                 'SourcelessFileLoader',
             )
             for name in loader_names:
    -            loader_cls = getattr(importlib_machinery, name, type(None))
    +            loader_cls = getattr(importlib.machinery, name, type(None))
                 register_loader_type(loader_cls, cls)
     
     
    @@ -1744,12 +1903,13 @@ def _register(cls):
     class EmptyProvider(NullProvider):
         """Provider that returns nothing for all requests"""
     
    -    module_path = None
    +    # A special case, we don't want all Providers inheriting from NullProvider to have a potentially None module_path
    +    module_path: str | None = None  # type: ignore[assignment]
     
         _isdir = _has = lambda self, path: False
     
    -    def _get(self, path):
    -        return ''
    +    def _get(self, path) -> bytes:
    +        return b''
     
         def _listdir(self, path):
             return []
    @@ -1761,13 +1921,14 @@ def __init__(self):
     empty_provider = EmptyProvider()
     
     
    -class ZipManifests(dict):
    +class ZipManifests(Dict[str, "MemoizedZipManifests.manifest_mod"]):
         """
         zip manifest builder
         """
     
    +    # `path` could be `StrPath | IO[bytes]` but that violates the LSP for `MemoizedZipManifests.load`
         @classmethod
    -    def build(cls, path):
    +    def build(cls, path: str):
             """
             Build a dictionary similar to the zipimport directory
             caches, except instead of tuples, store ZipInfo objects.
    @@ -1793,9 +1954,11 @@ class MemoizedZipManifests(ZipManifests):
         Memoized zipfile manifests.
         """
     
    -    manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime')
    +    class manifest_mod(NamedTuple):
    +        manifest: dict[str, zipfile.ZipInfo]
    +        mtime: float
     
    -    def load(self, path):
    +    def load(self, path: str) -> dict[str, zipfile.ZipInfo]:  # type: ignore[override] # ZipManifests.load is a classmethod
             """
             Load a manifest at path or return a suitable manifest already loaded.
             """
    @@ -1812,10 +1975,12 @@ def load(self, path):
     class ZipProvider(EggProvider):
         """Resource support for zips and eggs"""
     
    -    eagers = None
    +    eagers: list[str] | None = None
         _zip_manifests = MemoizedZipManifests()
    +    # ZipProvider's loader should always be a zipimporter or equivalent
    +    loader: zipimport.zipimporter
     
    -    def __init__(self, module):
    +    def __init__(self, module: _ZipLoaderModule):
             super().__init__(module)
             self.zip_pre = self.loader.archive + os.sep
     
    @@ -1841,7 +2006,7 @@ def _parts(self, zip_path):
         def zipinfo(self):
             return self._zip_manifests.load(self.loader.archive)
     
    -    def get_resource_filename(self, manager, resource_name):
    +    def get_resource_filename(self, manager: ResourceManager, resource_name: str):
             if not self.egg_name:
                 raise NotImplementedError(
                     "resource_filename() only supported for .egg, not .zip"
    @@ -1864,7 +2029,7 @@ def _get_date_and_size(zip_stat):
             return timestamp, size
     
         # FIXME: 'ZipProvider._extract_resource' is too complex (12)
    -    def _extract_resource(self, manager, zip_path):  # noqa: C901
    +    def _extract_resource(self, manager: ResourceManager, zip_path) -> str:  # noqa: C901
             if zip_path in self._index():
                 for name in self._index()[zip_path]:
                     last = self._extract_resource(manager, os.path.join(zip_path, name))
    @@ -1874,10 +2039,14 @@ def _extract_resource(self, manager, zip_path):  # noqa: C901
             timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
     
             if not WRITE_SUPPORT:
    -            raise IOError(
    -                '"os.rename" and "os.unlink" are not supported ' 'on this platform'
    +            raise OSError(
    +                '"os.rename" and "os.unlink" are not supported on this platform'
                 )
             try:
    +            if not self.egg_name:
    +                raise OSError(
    +                    '"egg_name" is empty. This likely means no egg could be found from the "module_path".'
    +                )
                 real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path))
     
                 if self._is_current(real_path, zip_path):
    @@ -1895,7 +2064,7 @@ def _extract_resource(self, manager, zip_path):  # noqa: C901
                 try:
                     rename(tmpnam, real_path)
     
    -            except os.error:
    +            except OSError:
                     if os.path.isfile(real_path):
                         if self._is_current(real_path, zip_path):
                             # the file became current since it was checked above,
    @@ -1908,7 +2077,7 @@ def _extract_resource(self, manager, zip_path):  # noqa: C901
                             return real_path
                     raise
     
    -        except os.error:
    +        except OSError:
                 # report a user-friendly error
                 manager.extraction_error()
     
    @@ -1956,20 +2125,20 @@ def _index(self):
                 self._dirindex = ind
                 return ind
     
    -    def _has(self, fspath):
    +    def _has(self, fspath) -> bool:
             zip_path = self._zipinfo_name(fspath)
             return zip_path in self.zipinfo or zip_path in self._index()
     
    -    def _isdir(self, fspath):
    +    def _isdir(self, fspath) -> bool:
             return self._zipinfo_name(fspath) in self._index()
     
         def _listdir(self, fspath):
             return list(self._index().get(self._zipinfo_name(fspath), ()))
     
    -    def _eager_to_zip(self, resource_name):
    +    def _eager_to_zip(self, resource_name: str):
             return self._zipinfo_name(self._fn(self.egg_root, resource_name))
     
    -    def _resource_to_zip(self, resource_name):
    +    def _resource_to_zip(self, resource_name: str):
             return self._zipinfo_name(self._fn(self.module_path, resource_name))
     
     
    @@ -1988,20 +2157,20 @@ class FileMetadata(EmptyProvider):
         the provided location.
         """
     
    -    def __init__(self, path):
    +    def __init__(self, path: StrPath):
             self.path = path
     
         def _get_metadata_path(self, name):
             return self.path
     
    -    def has_metadata(self, name):
    +    def has_metadata(self, name: str) -> bool:
             return name == 'PKG-INFO' and os.path.isfile(self.path)
     
    -    def get_metadata(self, name):
    +    def get_metadata(self, name: str):
             if name != 'PKG-INFO':
                 raise KeyError("No metadata except PKG-INFO is available")
     
    -        with io.open(self.path, encoding='utf-8', errors="replace") as f:
    +        with open(self.path, encoding='utf-8', errors="replace") as f:
                 metadata = f.read()
             self._warn_on_replacement(metadata)
             return metadata
    @@ -2013,7 +2182,7 @@ def _warn_on_replacement(self, metadata):
                 msg = tmpl.format(**locals())
                 warnings.warn(msg)
     
    -    def get_metadata_lines(self, name):
    +    def get_metadata_lines(self, name: str) -> Iterator[str]:
             return yield_lines(self.get_metadata(name))
     
     
    @@ -2037,7 +2206,7 @@ class PathMetadata(DefaultProvider):
             dist = Distribution.from_filename(egg_path, metadata=metadata)
         """
     
    -    def __init__(self, path, egg_info):
    +    def __init__(self, path: str, egg_info: str):
             self.module_path = path
             self.egg_info = egg_info
     
    @@ -2045,7 +2214,7 @@ def __init__(self, path, egg_info):
     class EggMetadata(ZipProvider):
         """Metadata provider for .egg files"""
     
    -    def __init__(self, importer):
    +    def __init__(self, importer: zipimport.zipimporter):
             """Create a metadata provider from a zipimporter"""
     
             self.zip_pre = importer.archive + os.sep
    @@ -2057,10 +2226,12 @@ def __init__(self, importer):
             self._setup_prefix()
     
     
    -_declare_state('dict', _distribution_finders={})
    +_distribution_finders: dict[type, _DistFinderType[Any]] = _declare_state(
    +    'dict', '_distribution_finders', {}
    +)
     
     
    -def register_finder(importer_type, distribution_finder):
    +def register_finder(importer_type: type[_T], distribution_finder: _DistFinderType[_T]):
         """Register `distribution_finder` to find distributions in sys.path items
     
         `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    @@ -2070,14 +2241,16 @@ def register_finder(importer_type, distribution_finder):
         _distribution_finders[importer_type] = distribution_finder
     
     
    -def find_distributions(path_item, only=False):
    +def find_distributions(path_item: str, only: bool = False):
         """Yield distributions accessible via `path_item`"""
         importer = get_importer(path_item)
         finder = _find_adapter(_distribution_finders, importer)
         return finder(importer, path_item, only)
     
     
    -def find_eggs_in_zip(importer, path_item, only=False):
    +def find_eggs_in_zip(
    +    importer: zipimport.zipimporter, path_item: str, only: bool = False
    +) -> Iterator[Distribution]:
         """
         Find eggs in zip files; possibly multiple nested eggs.
         """
    @@ -2095,8 +2268,7 @@ def find_eggs_in_zip(importer, path_item, only=False):
             if _is_egg_path(subitem):
                 subpath = os.path.join(path_item, subitem)
                 dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath)
    -            for dist in dists:
    -                yield dist
    +            yield from dists
             elif subitem.lower().endswith(('.dist-info', '.egg-info')):
                 subpath = os.path.join(path_item, subitem)
                 submeta = EggMetadata(zipimport.zipimporter(subpath))
    @@ -2107,14 +2279,16 @@ def find_eggs_in_zip(importer, path_item, only=False):
     register_finder(zipimport.zipimporter, find_eggs_in_zip)
     
     
    -def find_nothing(importer, path_item, only=False):
    +def find_nothing(
    +    importer: object | None, path_item: str | None, only: bool | None = False
    +):
         return ()
     
     
     register_finder(object, find_nothing)
     
     
    -def find_on_path(importer, path_item, only=False):
    +def find_on_path(importer: object | None, path_item, only=False):
         """Yield distributions accessible on a sys.path directory"""
         path_item = _normalize_cached(path_item)
     
    @@ -2131,8 +2305,7 @@ def find_on_path(importer, path_item, only=False):
         for entry in sorted(entries):
             fullpath = os.path.join(path_item, entry)
             factory = dist_factory(path_item, entry, only)
    -        for dist in factory(fullpath):
    -            yield dist
    +        yield from factory(fullpath)
     
     
     def dist_factory(path_item, entry, only):
    @@ -2170,7 +2343,7 @@ def __call__(self, fullpath):
             return iter(())
     
     
    -def safe_listdir(path):
    +def safe_listdir(path: StrOrBytesPath):
         """
         Attempt to list contents of path, but suppress some exceptions.
         """
    @@ -2186,13 +2359,13 @@ def safe_listdir(path):
         return ()
     
     
    -def distributions_from_metadata(path):
    +def distributions_from_metadata(path: str):
         root = os.path.dirname(path)
         if os.path.isdir(path):
             if len(os.listdir(path)) == 0:
                 # empty metadata dir; skip
                 return
    -        metadata = PathMetadata(root, path)
    +        metadata: _MetadataType = PathMetadata(root, path)
         else:
             metadata = FileMetadata(path)
         entry = os.path.basename(path)
    @@ -2208,11 +2381,10 @@ def non_empty_lines(path):
         """
         Yield non-empty lines from file at path
         """
    -    with open(path) as f:
    -        for line in f:
    -            line = line.strip()
    -            if line:
    -                yield line
    +    for line in _read_utf8_with_fallback(path).splitlines():
    +        line = line.strip()
    +        if line:
    +            yield line
     
     
     def resolve_egg_link(path):
    @@ -2231,13 +2403,19 @@ def resolve_egg_link(path):
     if hasattr(pkgutil, 'ImpImporter'):
         register_finder(pkgutil.ImpImporter, find_on_path)
     
    -register_finder(importlib_machinery.FileFinder, find_on_path)
    +register_finder(importlib.machinery.FileFinder, find_on_path)
     
    -_declare_state('dict', _namespace_handlers={})
    -_declare_state('dict', _namespace_packages={})
    +_namespace_handlers: dict[type, _NSHandlerType[Any]] = _declare_state(
    +    'dict', '_namespace_handlers', {}
    +)
    +_namespace_packages: dict[str | None, list[str]] = _declare_state(
    +    'dict', '_namespace_packages', {}
    +)
     
     
    -def register_namespace_handler(importer_type, namespace_handler):
    +def register_namespace_handler(
    +    importer_type: type[_T], namespace_handler: _NSHandlerType[_T]
    +):
         """Register `namespace_handler` to declare namespace packages
     
         `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    @@ -2292,7 +2470,7 @@ def _handle_ns(packageName, path_item):
         return subpath
     
     
    -def _rebuild_mod_path(orig_path, package_name, module):
    +def _rebuild_mod_path(orig_path, package_name, module: types.ModuleType):
         """
         Rebuild module.__path__ ensuring that all entries are ordered
         corresponding to their sys.path order
    @@ -2326,7 +2504,7 @@ def position_in_sys_path(path):
             module.__path__ = new_path
     
     
    -def declare_namespace(packageName):
    +def declare_namespace(packageName: str):
         """Declare that package 'packageName' is a namespace package"""
     
         msg = (
    @@ -2343,7 +2521,7 @@ def declare_namespace(packageName):
             if packageName in _namespace_packages:
                 return
     
    -        path = sys.path
    +        path: MutableSequence[str] = sys.path
             parent, _, _ = packageName.rpartition('.')
     
             if parent:
    @@ -2369,7 +2547,7 @@ def declare_namespace(packageName):
             _imp.release_lock()
     
     
    -def fixup_namespace_packages(path_item, parent=None):
    +def fixup_namespace_packages(path_item: str, parent: str | None = None):
         """Ensure that previously-declared namespace packages include path_item"""
         _imp.acquire_lock()
         try:
    @@ -2381,7 +2559,12 @@ def fixup_namespace_packages(path_item, parent=None):
             _imp.release_lock()
     
     
    -def file_ns_handler(importer, path_item, packageName, module):
    +def file_ns_handler(
    +    importer: object,
    +    path_item: StrPath,
    +    packageName: str,
    +    module: types.ModuleType,
    +):
         """Compute an ns-package subpath for a filesystem or zipfile importer"""
     
         subpath = os.path.join(path_item, packageName.split('.')[-1])
    @@ -2398,22 +2581,31 @@ def file_ns_handler(importer, path_item, packageName, module):
         register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
     
     register_namespace_handler(zipimport.zipimporter, file_ns_handler)
    -register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler)
    +register_namespace_handler(importlib.machinery.FileFinder, file_ns_handler)
     
     
    -def null_ns_handler(importer, path_item, packageName, module):
    +def null_ns_handler(
    +    importer: object,
    +    path_item: str | None,
    +    packageName: str | None,
    +    module: _ModuleLike | None,
    +):
         return None
     
     
     register_namespace_handler(object, null_ns_handler)
     
     
    -def normalize_path(filename):
    +@overload
    +def normalize_path(filename: StrPath) -> str: ...
    +@overload
    +def normalize_path(filename: BytesPath) -> bytes: ...
    +def normalize_path(filename: StrOrBytesPath):
         """Normalize a file/dir name for comparison purposes"""
         return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
     
     
    -def _cygwin_patch(filename):  # pragma: nocover
    +def _cygwin_patch(filename: StrOrBytesPath):  # pragma: nocover
         """
         Contrary to POSIX 2008, on Cygwin, getcwd (3) contains
         symlink components. Using
    @@ -2424,12 +2616,19 @@ def _cygwin_patch(filename):  # pragma: nocover
         return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
     
     
    -def _normalize_cached(filename, _cache={}):
    -    try:
    -        return _cache[filename]
    -    except KeyError:
    -        _cache[filename] = result = normalize_path(filename)
    -        return result
    +if TYPE_CHECKING:
    +    # https://github.com/python/mypy/issues/16261
    +    # https://github.com/python/typeshed/issues/6347
    +    @overload
    +    def _normalize_cached(filename: StrPath) -> str: ...
    +    @overload
    +    def _normalize_cached(filename: BytesPath) -> bytes: ...
    +    def _normalize_cached(filename: StrOrBytesPath) -> str | bytes: ...
    +else:
    +
    +    @functools.lru_cache(maxsize=None)
    +    def _normalize_cached(filename):
    +        return normalize_path(filename)
     
     
     def _is_egg_path(path):
    @@ -2482,7 +2681,14 @@ def _set_parent_ns(packageName):
     class EntryPoint:
         """Object representing an advertised importable object"""
     
    -    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
    +    def __init__(
    +        self,
    +        name: str,
    +        module_name: str,
    +        attrs: Iterable[str] = (),
    +        extras: Iterable[str] = (),
    +        dist: Distribution | None = None,
    +    ):
             if not MODULE(module_name):
                 raise ValueError("Invalid module name", module_name)
             self.name = name
    @@ -2502,7 +2708,26 @@ def __str__(self):
         def __repr__(self):
             return "EntryPoint.parse(%r)" % str(self)
     
    -    def load(self, require=True, *args, **kwargs):
    +    @overload
    +    def load(
    +        self,
    +        require: Literal[True] = True,
    +        env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +    ) -> _ResolvedEntryPoint: ...
    +    @overload
    +    def load(
    +        self,
    +        require: Literal[False],
    +        *args: Any,
    +        **kwargs: Any,
    +    ) -> _ResolvedEntryPoint: ...
    +    def load(
    +        self,
    +        require: bool = True,
    +        *args: Environment | _InstallerType | None,
    +        **kwargs: Environment | _InstallerType | None,
    +    ) -> _ResolvedEntryPoint:
             """
             Require packages for this EntryPoint, then resolve it.
             """
    @@ -2514,10 +2739,12 @@ def load(self, require=True, *args, **kwargs):
                     stacklevel=2,
                 )
             if require:
    -            self.require(*args, **kwargs)
    +            # We could pass `env` and `installer` directly,
    +            # but keeping `*args` and `**kwargs` for backwards compatibility
    +            self.require(*args, **kwargs)  # type: ignore
             return self.resolve()
     
    -    def resolve(self):
    +    def resolve(self) -> _ResolvedEntryPoint:
             """
             Resolve the entry point from its module and attrs.
             """
    @@ -2527,9 +2754,14 @@ def resolve(self):
             except AttributeError as exc:
                 raise ImportError(str(exc)) from exc
     
    -    def require(self, env=None, installer=None):
    -        if self.extras and not self.dist:
    -            raise UnknownExtra("Can't require() without a distribution", self)
    +    def require(
    +        self,
    +        env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +    ):
    +        if not self.dist:
    +            error_cls = UnknownExtra if self.extras else AttributeError
    +            raise error_cls("Can't require() without a distribution", self)
     
             # Get the requirements for this entry point with all its extras and
             # then resolve them. We have to pass `extras` along when resolving so
    @@ -2550,7 +2782,7 @@ def require(self, env=None, installer=None):
         )
     
         @classmethod
    -    def parse(cls, src, dist=None):
    +    def parse(cls, src: str, dist: Distribution | None = None):
             """Parse a single entry point from string `src`
     
             Entry point syntax follows the form::
    @@ -2575,15 +2807,20 @@ def _parse_extras(cls, extras_spec):
                 return ()
             req = Requirement.parse('x' + extras_spec)
             if req.specs:
    -            raise ValueError()
    +            raise ValueError
             return req.extras
     
         @classmethod
    -    def parse_group(cls, group, lines, dist=None):
    +    def parse_group(
    +        cls,
    +        group: str,
    +        lines: _NestedStr,
    +        dist: Distribution | None = None,
    +    ):
             """Parse an entry point group"""
             if not MODULE(group):
                 raise ValueError("Invalid group name", group)
    -        this = {}
    +        this: dict[str, Self] = {}
             for line in yield_lines(lines):
                 ep = cls.parse(line, dist)
                 if ep.name in this:
    @@ -2592,14 +2829,19 @@ def parse_group(cls, group, lines, dist=None):
             return this
     
         @classmethod
    -    def parse_map(cls, data, dist=None):
    +    def parse_map(
    +        cls,
    +        data: str | Iterable[str] | dict[str, str | Iterable[str]],
    +        dist: Distribution | None = None,
    +    ):
             """Parse a map of entry point groups"""
    +        _data: Iterable[tuple[str | None, str | Iterable[str]]]
             if isinstance(data, dict):
    -            data = data.items()
    +            _data = data.items()
             else:
    -            data = split_sections(data)
    -        maps = {}
    -        for group, lines in data:
    +            _data = split_sections(data)
    +        maps: dict[str, dict[str, Self]] = {}
    +        for group, lines in _data:
                 if group is None:
                     if not lines:
                         continue
    @@ -2633,13 +2875,13 @@ class Distribution:
     
         def __init__(
             self,
    -        location=None,
    -        metadata=None,
    -        project_name=None,
    -        version=None,
    -        py_version=PY_MAJOR,
    -        platform=None,
    -        precedence=EGG_DIST,
    +        location: str | None = None,
    +        metadata: _MetadataType = None,
    +        project_name: str | None = None,
    +        version: str | None = None,
    +        py_version: str | None = PY_MAJOR,
    +        platform: str | None = None,
    +        precedence: int = EGG_DIST,
         ):
             self.project_name = safe_name(project_name or 'Unknown')
             if version is not None:
    @@ -2651,7 +2893,13 @@ def __init__(
             self._provider = metadata or empty_provider
     
         @classmethod
    -    def from_location(cls, location, basename, metadata=None, **kw):
    +    def from_location(
    +        cls,
    +        location: str,
    +        basename: StrPath,
    +        metadata: _MetadataType = None,
    +        **kw: int,  # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility
    +    ) -> Distribution:
             project_name, version, py_version, platform = [None] * 4
             basename, ext = os.path.splitext(basename)
             if ext.lower() in _distributionImpl:
    @@ -2689,25 +2937,25 @@ def hashcmp(self):
         def __hash__(self):
             return hash(self.hashcmp)
     
    -    def __lt__(self, other):
    +    def __lt__(self, other: Distribution):
             return self.hashcmp < other.hashcmp
     
    -    def __le__(self, other):
    +    def __le__(self, other: Distribution):
             return self.hashcmp <= other.hashcmp
     
    -    def __gt__(self, other):
    +    def __gt__(self, other: Distribution):
             return self.hashcmp > other.hashcmp
     
    -    def __ge__(self, other):
    +    def __ge__(self, other: Distribution):
             return self.hashcmp >= other.hashcmp
     
    -    def __eq__(self, other):
    +    def __eq__(self, other: object):
             if not isinstance(other, self.__class__):
                 # It's not a Distribution, so they are not equal
                 return False
             return self.hashcmp == other.hashcmp
     
    -    def __ne__(self, other):
    +    def __ne__(self, other: object):
             return not self == other
     
         # These properties have to be lazy so that we don't have to load any
    @@ -2727,12 +2975,12 @@ def parsed_version(self):
             if not hasattr(self, "_parsed_version"):
                 try:
                     self._parsed_version = parse_version(self.version)
    -            except packaging.version.InvalidVersion as ex:
    +            except _packaging_version.InvalidVersion as ex:
                     info = f"(package: {self.project_name})"
                     if hasattr(ex, "add_note"):
                         ex.add_note(info)  # PEP 678
                         raise
    -                raise packaging.version.InvalidVersion(f"{str(ex)} {info}") from None
    +                raise _packaging_version.InvalidVersion(f"{str(ex)} {info}") from None
     
             return self._parsed_version
     
    @@ -2740,7 +2988,7 @@ def parsed_version(self):
         def _forgiving_parsed_version(self):
             try:
                 return self.parsed_version
    -        except packaging.version.InvalidVersion as ex:
    +        except _packaging_version.InvalidVersion as ex:
                 self._parsed_version = parse_version(_forgiving_version(self.version))
     
                 notes = "\n".join(getattr(ex, "__notes__", []))  # PEP 678
    @@ -2790,14 +3038,14 @@ def _dep_map(self):
             return self.__dep_map
     
         @staticmethod
    -    def _filter_extras(dm):
    +    def _filter_extras(dm: dict[str | None, list[Requirement]]):
             """
             Given a mapping of extras to dependencies, strip off
             environment markers and filter out any dependencies
             not matching the markers.
             """
             for extra in list(filter(None, dm)):
    -            new_extra = extra
    +            new_extra: str | None = extra
                 reqs = dm.pop(extra)
                 new_extra, _, marker = extra.partition(':')
                 fails_marker = marker and (
    @@ -2817,10 +3065,10 @@ def _build_dep_map(self):
                     dm.setdefault(extra, []).extend(parse_requirements(reqs))
             return dm
     
    -    def requires(self, extras=()):
    +    def requires(self, extras: Iterable[str] = ()):
             """List of Requirements needed for this distro if `extras` are used"""
             dm = self._dep_map
    -        deps = []
    +        deps: list[Requirement] = []
             deps.extend(dm.get(None, ()))
             for ext in extras:
                 try:
    @@ -2850,21 +3098,18 @@ def _get_metadata_path_for_display(self, name):
     
         def _get_metadata(self, name):
             if self.has_metadata(name):
    -            for line in self.get_metadata_lines(name):
    -                yield line
    +            yield from self.get_metadata_lines(name)
     
         def _get_version(self):
             lines = self._get_metadata(self.PKG_INFO)
    -        version = _version_from_file(lines)
    -
    -        return version
    +        return _version_from_file(lines)
     
    -    def activate(self, path=None, replace=False):
    +    def activate(self, path: list[str] | None = None, replace: bool = False):
             """Ensure distribution is importable on `path` (default=sys.path)"""
             if path is None:
                 path = sys.path
             self.insert_on(path, replace=replace)
    -        if path is sys.path:
    +        if path is sys.path and self.location is not None:
                 fixup_namespace_packages(self.location)
                 for pkg in self._get_metadata('namespace_packages.txt'):
                     if pkg in sys.modules:
    @@ -2904,50 +3149,62 @@ def __getattr__(self, attr):
     
         def __dir__(self):
             return list(
    -            set(super(Distribution, self).__dir__())
    +            set(super().__dir__())
                 | set(attr for attr in self._provider.__dir__() if not attr.startswith('_'))
             )
     
         @classmethod
    -    def from_filename(cls, filename, metadata=None, **kw):
    +    def from_filename(
    +        cls,
    +        filename: StrPath,
    +        metadata: _MetadataType = None,
    +        **kw: int,  # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility
    +    ):
             return cls.from_location(
                 _normalize_cached(filename), os.path.basename(filename), metadata, **kw
             )
     
         def as_requirement(self):
             """Return a ``Requirement`` that matches this distribution exactly"""
    -        if isinstance(self.parsed_version, packaging.version.Version):
    +        if isinstance(self.parsed_version, _packaging_version.Version):
                 spec = "%s==%s" % (self.project_name, self.parsed_version)
             else:
                 spec = "%s===%s" % (self.project_name, self.parsed_version)
     
             return Requirement.parse(spec)
     
    -    def load_entry_point(self, group, name):
    +    def load_entry_point(self, group: str, name: str) -> _ResolvedEntryPoint:
             """Return the `name` entry point of `group` or raise ImportError"""
             ep = self.get_entry_info(group, name)
             if ep is None:
                 raise ImportError("Entry point %r not found" % ((group, name),))
             return ep.load()
     
    -    def get_entry_map(self, group=None):
    +    @overload
    +    def get_entry_map(self, group: None = None) -> dict[str, dict[str, EntryPoint]]: ...
    +    @overload
    +    def get_entry_map(self, group: str) -> dict[str, EntryPoint]: ...
    +    def get_entry_map(self, group: str | None = None):
             """Return the entry point map for `group`, or the full entry map"""
    -        try:
    -            ep_map = self._ep_map
    -        except AttributeError:
    -            ep_map = self._ep_map = EntryPoint.parse_map(
    +        if not hasattr(self, "_ep_map"):
    +            self._ep_map = EntryPoint.parse_map(
                     self._get_metadata('entry_points.txt'), self
                 )
             if group is not None:
    -            return ep_map.get(group, {})
    -        return ep_map
    +            return self._ep_map.get(group, {})
    +        return self._ep_map
     
    -    def get_entry_info(self, group, name):
    +    def get_entry_info(self, group: str, name: str):
             """Return the EntryPoint object for `group`+`name`, or ``None``"""
             return self.get_entry_map(group).get(name)
     
         # FIXME: 'Distribution.insert_on' is too complex (13)
    -    def insert_on(self, path, loc=None, replace=False):  # noqa: C901
    +    def insert_on(  # noqa: C901
    +        self,
    +        path: list[str],
    +        loc=None,
    +        replace: bool = False,
    +    ):
             """Ensure self.location is on path
     
             If replace=False (default):
    @@ -3052,13 +3309,14 @@ def has_version(self):
                 return False
             return True
     
    -    def clone(self, **kw):
    +    def clone(self, **kw: str | int | IResourceProvider | None):
             """Copy this distribution, substituting in any changed keyword args"""
             names = 'project_name version py_version platform location precedence'
             for attr in names.split():
                 kw.setdefault(attr, getattr(self, attr, None))
             kw.setdefault('metadata', self._provider)
    -        return self.__class__(**kw)
    +        # Unsafely unpacking. But keeping **kw for backwards and subclassing compatibility
    +        return self.__class__(**kw)  # type:ignore[arg-type]
     
         @property
         def extras(self):
    @@ -3111,11 +3369,11 @@ def _dep_map(self):
                 self.__dep_map = self._compute_dependencies()
                 return self.__dep_map
     
    -    def _compute_dependencies(self):
    +    def _compute_dependencies(self) -> dict[str | None, list[Requirement]]:
             """Recompute this distribution's dependencies."""
    -        dm = self.__dep_map = {None: []}
    +        self.__dep_map: dict[str | None, list[Requirement]] = {None: []}
     
    -        reqs = []
    +        reqs: list[Requirement] = []
             # Including any condition expressions
             for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
                 reqs.extend(parse_requirements(req))
    @@ -3126,13 +3384,15 @@ def reqs_for_extra(extra):
                         yield req
     
             common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None)))
    -        dm[None].extend(common)
    +        self.__dep_map[None].extend(common)
     
             for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
                 s_extra = safe_extra(extra.strip())
    -            dm[s_extra] = [r for r in reqs_for_extra(extra) if r not in common]
    +            self.__dep_map[s_extra] = [
    +                r for r in reqs_for_extra(extra) if r not in common
    +            ]
     
    -        return dm
    +        return self.__dep_map
     
     
     _distributionImpl = {
    @@ -3155,7 +3415,7 @@ def issue_warning(*args, **kw):
         warnings.warn(stacklevel=level + 1, *args, **kw)
     
     
    -def parse_requirements(strs):
    +def parse_requirements(strs: _NestedStr):
         """
         Yield ``Requirement`` objects for each specification in `strs`.
     
    @@ -3164,19 +3424,20 @@ def parse_requirements(strs):
         return map(Requirement, join_continuation(map(drop_comment, yield_lines(strs))))
     
     
    -class RequirementParseError(packaging.requirements.InvalidRequirement):
    +class RequirementParseError(_packaging_requirements.InvalidRequirement):
         "Compatibility wrapper for InvalidRequirement"
     
     
    -class Requirement(packaging.requirements.Requirement):
    -    def __init__(self, requirement_string):
    +class Requirement(_packaging_requirements.Requirement):
    +    def __init__(self, requirement_string: str):
             """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
    -        super(Requirement, self).__init__(requirement_string)
    +        super().__init__(requirement_string)
             self.unsafe_name = self.name
             project_name = safe_name(self.name)
             self.project_name, self.key = project_name, project_name.lower()
             self.specs = [(spec.operator, spec.version) for spec in self.specifier]
    -        self.extras = tuple(map(safe_extra, self.extras))
    +        # packaging.requirements.Requirement uses a set for its extras. We use a variable-length tuple
    +        self.extras: tuple[str] = tuple(map(safe_extra, self.extras))
             self.hashCmp = (
                 self.key,
                 self.url,
    @@ -3186,13 +3447,13 @@ def __init__(self, requirement_string):
             )
             self.__hash = hash(self.hashCmp)
     
    -    def __eq__(self, other):
    +    def __eq__(self, other: object):
             return isinstance(other, Requirement) and self.hashCmp == other.hashCmp
     
         def __ne__(self, other):
             return not self == other
     
    -    def __contains__(self, item):
    +    def __contains__(self, item: Distribution | str | tuple[str, ...]) -> bool:
             if isinstance(item, Distribution):
                 if item.key != self.key:
                     return False
    @@ -3211,7 +3472,7 @@ def __repr__(self):
             return "Requirement.parse(%r)" % str(self)
     
         @staticmethod
    -    def parse(s):
    +    def parse(s: str | Iterable[str]):
             (req,) = parse_requirements(s)
             return req
     
    @@ -3226,15 +3487,18 @@ def _always_object(classes):
         return classes
     
     
    -def _find_adapter(registry, ob):
    +def _find_adapter(registry: Mapping[type, _AdapterT], ob: object) -> _AdapterT:
         """Return an adapter factory for `ob` from `registry`"""
         types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob))))
         for t in types:
             if t in registry:
                 return registry[t]
    +    # _find_adapter would previously return None, and immediately be called.
    +    # So we're raising a TypeError to keep backward compatibility if anyone depended on that behaviour.
    +    raise TypeError(f"Could not find adapter for {registry} and {ob}")
     
     
    -def ensure_directory(path):
    +def ensure_directory(path: StrOrBytesPath):
         """Ensure that the parent directory of `path` exists"""
         dirname = os.path.dirname(path)
         os.makedirs(dirname, exist_ok=True)
    @@ -3243,7 +3507,7 @@ def ensure_directory(path):
     def _bypass_ensure_directory(path):
         """Sandbox-bypassing version of ensure_directory()"""
         if not WRITE_SUPPORT:
    -        raise IOError('"os.mkdir" not supported on this platform.')
    +        raise OSError('"os.mkdir" not supported on this platform.')
         dirname, filename = split(path)
         if dirname and filename and not isdir(dirname):
             _bypass_ensure_directory(dirname)
    @@ -3253,7 +3517,7 @@ def _bypass_ensure_directory(path):
                 pass
     
     
    -def split_sections(s):
    +def split_sections(s: _NestedStr) -> Iterator[tuple[str | None, list[str]]]:
         """Split a string or iterable thereof into (section, content) pairs
     
         Each ``section`` is a stripped version of the section header ("[section]")
    @@ -3297,6 +3561,47 @@ def _mkstemp(*args, **kw):
     warnings.filterwarnings("ignore", category=PEP440Warning, append=True)
     
     
    +class PkgResourcesDeprecationWarning(Warning):
    +    """
    +    Base class for warning about deprecations in ``pkg_resources``
    +
    +    This class is not derived from ``DeprecationWarning``, and as such is
    +    visible by default.
    +    """
    +
    +
    +# Ported from ``setuptools`` to avoid introducing an import inter-dependency:
    +_LOCALE_ENCODING = "locale" if sys.version_info >= (3, 10) else None
    +
    +
    +def _read_utf8_with_fallback(file: str, fallback_encoding=_LOCALE_ENCODING) -> str:
    +    """See setuptools.unicode_utils._read_utf8_with_fallback"""
    +    try:
    +        with open(file, "r", encoding="utf-8") as f:
    +            return f.read()
    +    except UnicodeDecodeError:  # pragma: no cover
    +        msg = f"""\
    +        ********************************************************************************
    +        `encoding="utf-8"` fails with {file!r}, trying `encoding={fallback_encoding!r}`.
    +
    +        This fallback behaviour is considered **deprecated** and future versions of
    +        `setuptools/pkg_resources` may not implement it.
    +
    +        Please encode {file!r} with "utf-8" to ensure future builds will succeed.
    +
    +        If this file was produced by `setuptools` itself, cleaning up the cached files
    +        and re-building/re-installing the package with a newer version of `setuptools`
    +        (e.g. by updating `build-system.requires` in its `pyproject.toml`)
    +        might solve the problem.
    +        ********************************************************************************
    +        """
    +        # TODO: Add a deadline?
    +        #       See comment in setuptools.unicode_utils._Utf8EncodingNeeded
    +        warnings.warn(msg, PkgResourcesDeprecationWarning, stacklevel=2)
    +        with open(file, "r", encoding=fallback_encoding) as f:
    +            return f.read()
    +
    +
     # from jaraco.functools 1.3
     def _call_aside(f, *args, **kwargs):
         f(*args, **kwargs)
    @@ -3315,15 +3620,6 @@ def _initialize(g=globals()):
         )
     
     
    -class PkgResourcesDeprecationWarning(Warning):
    -    """
    -    Base class for warning about deprecations in ``pkg_resources``
    -
    -    This class is not derived from ``DeprecationWarning``, and as such is
    -    visible by default.
    -    """
    -
    -
     @_call_aside
     def _initialize_master_working_set():
         """
    @@ -3337,8 +3633,7 @@ def _initialize_master_working_set():
         Invocation by other packages is unsupported and done
         at their own risk.
         """
    -    working_set = WorkingSet._build_master()
    -    _declare_state('object', working_set=working_set)
    +    working_set = _declare_state('object', 'working_set', WorkingSet._build_master())
     
         require = working_set.require
         iter_entry_points = working_set.iter_entry_points
    @@ -3359,3 +3654,23 @@ def _initialize_master_working_set():
         # match order
         list(map(working_set.add_entry, sys.path))
         globals().update(locals())
    +
    +
    +if TYPE_CHECKING:
    +    # All of these are set by the @_call_aside methods above
    +    __resource_manager = ResourceManager()  # Won't exist at runtime
    +    resource_exists = __resource_manager.resource_exists
    +    resource_isdir = __resource_manager.resource_isdir
    +    resource_filename = __resource_manager.resource_filename
    +    resource_stream = __resource_manager.resource_stream
    +    resource_string = __resource_manager.resource_string
    +    resource_listdir = __resource_manager.resource_listdir
    +    set_extraction_path = __resource_manager.set_extraction_path
    +    cleanup_resources = __resource_manager.cleanup_resources
    +
    +    working_set = WorkingSet()
    +    require = working_set.require
    +    iter_entry_points = working_set.iter_entry_points
    +    add_activation_listener = working_set.subscribe
    +    run_script = working_set.run_script
    +    run_main = run_script
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc
    index 89b74e9f92d35c6bb013c7da4704e6ef2b58f6eb..f4e5b904a695a88a29a53fc1094aace4b91f82d8 100644
    GIT binary patch
    delta 61694
    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
    D7mk9b
    
    delta 47236
    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
    
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
    index 5ebf5957..d58dd2b7 100644
    --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
    +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
    @@ -1,7 +1,10 @@
     """
    -Utilities for determining application-specific dirs. See  for details and
    -usage.
    +Utilities for determining application-specific dirs.
    +
    +See  for details and usage.
    +
     """
    +
     from __future__ import annotations
     
     import os
    @@ -14,31 +17,27 @@
     
     if TYPE_CHECKING:
         from pathlib import Path
    -
    -    if sys.version_info >= (3, 8):  # pragma: no cover (py38+)
    -        from typing import Literal
    -    else:  # pragma: no cover (py38+)
    -        from pip._vendor.typing_extensions import Literal
    +    from typing import Literal
     
     
     def _set_platform_dir_class() -> type[PlatformDirsABC]:
         if sys.platform == "win32":
    -        from pip._vendor.platformdirs.windows import Windows as Result
    +        from pip._vendor.platformdirs.windows import Windows as Result  # noqa: PLC0415
         elif sys.platform == "darwin":
    -        from pip._vendor.platformdirs.macos import MacOS as Result
    +        from pip._vendor.platformdirs.macos import MacOS as Result  # noqa: PLC0415
         else:
    -        from pip._vendor.platformdirs.unix import Unix as Result
    +        from pip._vendor.platformdirs.unix import Unix as Result  # noqa: PLC0415
     
         if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system":
             if os.getenv("SHELL") or os.getenv("PREFIX"):
                 return Result
     
    -        from pip._vendor.platformdirs.android import _android_folder
    +        from pip._vendor.platformdirs.android import _android_folder  # noqa: PLC0415
     
             if _android_folder() is not None:
    -            from pip._vendor.platformdirs.android import Android
    +            from pip._vendor.platformdirs.android import Android  # noqa: PLC0415
     
    -            return Android  # return to avoid redefinition of result
    +            return Android  # return to avoid redefinition of a result
     
         return Result
     
    @@ -264,6 +263,11 @@ def user_music_dir() -> str:
         return PlatformDirs().user_music_dir
     
     
    +def user_desktop_dir() -> str:
    +    """:returns: desktop directory tied to the user"""
    +    return PlatformDirs().user_desktop_dir
    +
    +
     def user_runtime_dir(
         appname: str | None = None,
         appauthor: str | None | Literal[False] = None,
    @@ -288,6 +292,30 @@ def user_runtime_dir(
         ).user_runtime_dir
     
     
    +def site_runtime_dir(
    +    appname: str | None = None,
    +    appauthor: str | None | Literal[False] = None,
    +    version: str | None = None,
    +    opinion: bool = True,  # noqa: FBT001, FBT002
    +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
    +) -> str:
    +    """
    +    :param appname: See `appname `.
    +    :param appauthor: See `appauthor `.
    +    :param version: See `version `.
    +    :param opinion: See `opinion `.
    +    :param ensure_exists: See `ensure_exists `.
    +    :returns: runtime directory shared by users
    +    """
    +    return PlatformDirs(
    +        appname=appname,
    +        appauthor=appauthor,
    +        version=version,
    +        opinion=opinion,
    +        ensure_exists=ensure_exists,
    +    ).site_runtime_dir
    +
    +
     def user_data_path(
         appname: str | None = None,
         appauthor: str | None | Literal[False] = None,
    @@ -481,7 +509,7 @@ def user_log_path(
     
     
     def user_documents_path() -> Path:
    -    """:returns: documents path tied to the user"""
    +    """:returns: documents a path tied to the user"""
         return PlatformDirs().user_documents_path
     
     
    @@ -505,6 +533,11 @@ def user_music_path() -> Path:
         return PlatformDirs().user_music_path
     
     
    +def user_desktop_path() -> Path:
    +    """:returns: desktop path tied to the user"""
    +    return PlatformDirs().user_desktop_path
    +
    +
     def user_runtime_path(
         appname: str | None = None,
         appauthor: str | None | Literal[False] = None,
    @@ -529,38 +562,66 @@ def user_runtime_path(
         ).user_runtime_path
     
     
    +def site_runtime_path(
    +    appname: str | None = None,
    +    appauthor: str | None | Literal[False] = None,
    +    version: str | None = None,
    +    opinion: bool = True,  # noqa: FBT001, FBT002
    +    ensure_exists: bool = False,  # noqa: FBT001, FBT002
    +) -> Path:
    +    """
    +    :param appname: See `appname `.
    +    :param appauthor: See `appauthor `.
    +    :param version: See `version `.
    +    :param opinion: See `opinion `.
    +    :param ensure_exists: See `ensure_exists `.
    +    :returns: runtime path shared by users
    +    """
    +    return PlatformDirs(
    +        appname=appname,
    +        appauthor=appauthor,
    +        version=version,
    +        opinion=opinion,
    +        ensure_exists=ensure_exists,
    +    ).site_runtime_path
    +
    +
     __all__ = [
    -    "__version__",
    -    "__version_info__",
    -    "PlatformDirs",
         "AppDirs",
    +    "PlatformDirs",
         "PlatformDirsABC",
    -    "user_data_dir",
    -    "user_config_dir",
    +    "__version__",
    +    "__version_info__",
    +    "site_cache_dir",
    +    "site_cache_path",
    +    "site_config_dir",
    +    "site_config_path",
    +    "site_data_dir",
    +    "site_data_path",
    +    "site_runtime_dir",
    +    "site_runtime_path",
         "user_cache_dir",
    -    "user_state_dir",
    -    "user_log_dir",
    +    "user_cache_path",
    +    "user_config_dir",
    +    "user_config_path",
    +    "user_data_dir",
    +    "user_data_path",
    +    "user_desktop_dir",
    +    "user_desktop_path",
         "user_documents_dir",
    +    "user_documents_path",
         "user_downloads_dir",
    -    "user_pictures_dir",
    -    "user_videos_dir",
    +    "user_downloads_path",
    +    "user_log_dir",
    +    "user_log_path",
         "user_music_dir",
    +    "user_music_path",
    +    "user_pictures_dir",
    +    "user_pictures_path",
         "user_runtime_dir",
    -    "site_data_dir",
    -    "site_config_dir",
    -    "site_cache_dir",
    -    "user_data_path",
    -    "user_config_path",
    -    "user_cache_path",
    +    "user_runtime_path",
    +    "user_state_dir",
         "user_state_path",
    -    "user_log_path",
    -    "user_documents_path",
    -    "user_downloads_path",
    -    "user_pictures_path",
    +    "user_videos_dir",
         "user_videos_path",
    -    "user_music_path",
    -    "user_runtime_path",
    -    "site_data_path",
    -    "site_config_path",
    -    "site_cache_path",
     ]
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
    index 6a0d6dd1..fa8a677a 100644
    --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
    +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
    @@ -1,4 +1,5 @@
     """Main entry point."""
    +
     from __future__ import annotations
     
     from pip._vendor.platformdirs import PlatformDirs, __version__
    @@ -18,11 +19,12 @@
         "site_data_dir",
         "site_config_dir",
         "site_cache_dir",
    +    "site_runtime_dir",
     )
     
     
     def main() -> None:
    -    """Run main entry point."""
    +    """Run the main entry point."""
         app_name = "MyApp"
         app_author = "MyCompany"
     
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc
    index 52ae674ab988312329142faea627ec814d9837c5..7c8121f8e5fb74ad162459bd458e3ad62118ed13 100644
    GIT binary patch
    literal 19871
    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
    A2><{9
    
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc
    index 81ad9af51c45545cc63b05c2bf58adebead07f33..6b40b9e9c2f5f79749b6645031c27826dc039a2d 100644
    GIT binary patch
    delta 303
    zcmZ3(e~h2^G%qg~0}$9UGNwPA$h(e_f8w4uytf33GfPtAi%RoKGIKXCX0%}9kPIr#
    zQz*$u-F%-pg3+T_KeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K)Ik6-&KTkh6IWZ@-
    zNWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}5Lp>dU1Bv|kE{i+LvRW3^zuFCaSE
    zo=u*aK~QY60-HDrKaouog}(qQzaOgpAzPxKG|;FbkeRnQ;^XrYb5rBvS27eSgG3d9
    z#4iq;-29Z%oK(9a9Uzwxh>P`r#0O?ZM#h^A;!hcro-^2eU=iSCYGD1WHhBWO1Pe$r
    E05u3yt^fc4
    
    delta 336
    zcmX@czlNXpG%qg~0}uq?|CV-SBJVmzzKMI@Y~ICa%)}xZRGPQ>D{};+L8*RdacWVq
    zes*F}VxC@7Mq){3qP|ONadt_5fqnr{COEt|E=8cJ5Fu1;-r$(N7GFtOk?kvdJp}=`U;ytXvnk%&xGQ-{BUY!LdN=GPiDn3$ii=gffdO
    zES6wpm$?;D6)}U%+|MSCY=JE6N3ig3w!|zcpc9HfZn?z~AD@?)n;IX#lA%ZmB&q-;
    zesS33=BJeAq}ml}1G$VqT&xEqJ}@&fGTvkmzssQXoWbq`3qL1Q1M6oMNk)SY77Q#r
    W9aWc@C2z8Dw7Pv@W?+#5n+E`NcVIyP
    
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc
    index 6e95c4fe51c4241f658d9039c8214cb63298c0d6..56adaf30c16f869579a4a933b4425dabab1a5a11 100644
    GIT binary patch
    delta 3711
    zcmb_fTTENY8J;=59UtF~ZNLz0ZUIBUxrrq-*@hZO$ObmzqAYB(j_Y&C8hjyhj*~zj
    zCaY)_ZPRwysfsFXEA^#S6e(J1ANFb0R%*1;?y5C%B~rIlRkcyoK6IVSwpI3}^B$DXk4jn@xe;tWt$$DD{CJ0U2R=*R#_SHK9>{$I(06SOz5x_2L#{ul7-8f*X63yrF
    zw1-aMeNL`uo0vK^7>yhsjJz^DdW^n}59an_gw~LRrm={oIT26mB)wQAa@X~@%OTLT
    zL1lCr#;7uS4P#OngNET%#;9S;Dr3?xf|P?`yoR!8L44dYpGhdf17e_AA&gcxh08{BE1AOu+(iOorJ
    zFe^*J%uG;uQ=$=Fk1craqD16GCJid|q^?=m?7w_&5B*3NF{q~W=f(_8>A#JQ^ecV)
    z@tfgEnOTL!Z^kZ3v$60%CZ0`6X+;hXirIKfVeZ1?@mNwK!Txwmlu`@flP3qlOvnt(
    z#?t3Ar$}a2iYs*7Fo&z@&kVO*9=4&x#Xx3zj)J6$E*L{~^-O-`WUzutM&$HtI2zX-
    zjd{M2_^887XxOyova#Vx%MDW(Zlngj1N-P+{%zN;9U7nTU3DSG$`!tw*B#AyzPaoh
    zOY|*s81JE9SP#&@n}z4ZF$kTOZt(2|fLML>q(z`P;jpV|N6gQK&bk9TVm7Tin(}

    RY`xbLST8=(`P`(*x!H zt;(EYK8j9ubVzj5GAbs>V$J3;>)t*RWBRg*K{;=`i0{Mq-6D2F&JjqNt-W%4!j>7J z_X4O%goo(isyg~zA&?{4w30|k5bazDlOfR2?j-9MopM5vq8iPud2JuL!1OC~zGdCf zlIL60^&7p#6^-Q;A`Ye*^3s^6H>V!WT8OM3qyR{2dbfbI8z2k-$xU7Y=mR(ca1jK!H)g&IEac?csIwfHNBSk`o#24>=n3*3f3}!^51R>yeI8C5}lY zULE8Oo=uKPC6CH+hE|n(!1P+nfdm@zwe0^TJ0NRF#LGxwp~_7jF(Z)^bxEA!mN7;O z?3&s{{Su})SZ}`#=ZdvuZi$<<&{ba@wyEe~=x<*}OK9b5sux4joD!CGP!5-LqW<<~ zK0e=YS~VP3s>|LHnuU|Ut%=5GPV@>Kf3?lRy|}FnptCHymJLh#*#KP+ROJj$EoFSu zyJVPc+-AVKqUouQ$iW6LBaG5Iy}Cr~r6&Hz-1w)~%g>ox#mlhCb^Jdjw}i&g)9H<) zW~9LVt+p0K4D6GH?d=r0`L9dpvTh1p!Y|UW-u&#TO2|xqP<`ysD1luL;i5U!A6F6= z6UxGq>R7pocE>Ymg_XDN2s|$#%q0AJtZSyf zYiMuRp{}!64)iRC+r^j?TY^g>d`9dHh1MH}m!iV-?h(~>jHrW0A2OoA;(q@pRFNzF6GqE23r)dEp8 zq+&|^&7whOUX_p$4!fL9Dr!*BSKqGe!89LJ6p5tEl?5imz7JR{pIKOT0&t1_%V$`g zujHUY`x{n5sruY21I z-i{4#@4C0Q;O*P+o>=#uD0ola7-F7y`^wc4$D94kovr;(zCb>BsNm~+v2EKnV^-6u zylWk+9r;~H3-10Krr&$2*N%VhIDMtIwcUigyGjD``ELx}Guc+IYLrhG+^=bs8*}%Z zUN#}Cdu60#)7V*DDep7_94P%|2=Q*J3}QMlfHWF*-1W;;ktaM-#UoUFKYV+ zUFa^d4BB;fZ5YsH84T#|HeiNvruVGr5xwI!y;uJ+z2wknMyP{il0NWv zyQe{Xok2*iZXSu#eRUy+db{q2F@T?bn5esgEoBct&d@LFTPC<>;ibeOp@YrBv;?=RK=&9kz#N^oE zIC)XPzctjA-{2600QiJf1(FzoJ#lJYgN-Z(pmft81?_Kai)i19I1m{gc~LZ&oNzHA zN*NhStqk7`TiJe?^$5TQ6&lMk_>}fHg)3h7N>k(Z;Et`}Ba`F9k^dImoXX0H_;Z4P z9fAY=l|E@o9!)YS#E}#1u_(w22`&XkGiiwo1MelH>`@e=(U~m!&XJ-~0>8ybC%{>N zDE&!u&{w`-bg}sa;el04u#`U!tHl@YT^>1A@2nLuTef6ag; zJjTC8_WP*m&&d2c_!Its0)Iri@1x*j;|#{FH!_bAJRgkd5NCOJ-*2$@A-4y+S&`;^ VC6FGx!Ahn&LNByj)5EvHe*mZwKnef= delta 2699 zcmaJ@TWB2D89rxrXZA9C9qnp$Tkj;RwX{;?mF&jYj_q2O;@D{=70JT!He@~78AU6t zc9t_E+i@hM7E>I^L&SlaQc@Cn0pUVh{M3hpP-sFaq%sOPozyfYO=;;vR<;Rgo_hYX zaXhlp4C34WeCPWw=RX&8cj~iKkw1sSLBzhPzkfE<-?bKL!;h`?j68#pF6q8%a6vB0 z7zyYpr28);Jz&V!JRnD?7!r`-)1_Yrui+-6$94I#_gZs+is2peiXK|~RR)LG-pSy| z+CMWmN+q0WiMgB7X2zRP!a2>DCoH8F}y63;Bpc<<8d(( zXS^=P#~IPZ_&FoFm;h&dE+%NKKr+9JlDR10VnUn=x|lF$+|7t^CgjpYITLm zOx*BhSo)}oQeKSZ6~{MR(}`KpwQd^moJp!<+Pq<@iy3x;T%MG$gIZTi9-s7y}Cqfl3tmj+Dn8v>~-K#j^oImwZ>_p&hDj z{{YU=Nq-+xE&G2I@7keA1O_^LATUHpGXAQD5*I2M$ehlI#03hEX`eyJ%{1F&#t34t2;~{!XhT5B|ApMzqD4yD({I}dM z?+3P>$Gn~iJ&*T7K*wj+D>c?^M=&kNTi5Ja$2(_MYU=`tgSMZ6B`{E-Ti3%q_zC)9 z_yEiJd3-;8I%0*kmGq~`zP1xgeK*Wt72RWP$ZtmbHvD~TCEO$Wut#*C{2eAH`v97v zBeDASu)mKDwSAAxTMxqaZbtJP{`{972jb>-kL&RPJWX%MTY06gZJ&HY>2E7;50~4F z?%we4X5liSAJb|OHAK|db)mcH_{ z@GHqB?_3I^6~z0|bPNY_S-|Klf=ayX9bXoj_62m&a~55|c^{qbd`cm(3+vbkXp6R4 zu4;D$G=>hBclKIpSQcvS^WU=0q!92Ui4QIKHyEP-gtcZyvIW|8Q9 zm}iFd3kGogBVxxV{_Jg~bEE6=O=bVY72gNx?wjes8|lH#^xm84V>i;rHq*y%rYCQt zCpXiluSksq3Ms2&pWkaiq2wLp7d!r;B(C50j+rO}Bqs96LGD1|isRAh z72*SezjFLS@iWHvmp7iT9`ZWAQc0^;S*)kQAqfD7@(cgr1yf(F8b`@_He~N3vfg9R z@L-JpiXykrqaUNdhwvA?g)+BL>Jy~ilfI8}E^)=YhnSJrS`v^TzdH0jPTmpXSYeN; U(AofNtCz0kbM%#b*$Wx}2R7GHApigX diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc index b3e52610762a841c7be2b830e7c203b3c020faf9..88d7ccfcd8981bacab28b7de2f2a1e12ec1b37db 100644 GIT binary patch literal 12953 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 Q&w7}i`P9D%mQ>>Z0(+6ij{pDw delta 2390 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc index 7a3556acd425520218544039bce08774804fc661..6eb9e37af222eb797fa43f1df27e9ae31297b123 100644 GIT binary patch delta 5282 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc index 9d56a319136cda58fd82ea47378481d278c54f75..d26d4b89f2348979b9122cec085c5eb642db4e05 100644 GIT binary patch literal 639 zcmYL{&u`N(6vv&UNqk@4B7=V%(CX-WLgg-|^yd zBvx?F1bhS?fPe`wpqofSvM2enDf^14NC3-N!3nIM$Xg;4DSxf05g8{<4XZeX5{DwP zBy~xe@M-@j852sql+3i5L1|&LW^R}%W$!LT0F-2|wg;hyx!NIaKn$Kd#WWJcvzE0& z%i`<*7c5Q}F8wmPbi7h;8fBwgQWkM<3t0$_`)`zVuD72wtJcx|>d}Ma#yzgFVd#<` zRpOjDn=3A1T!|Rv`s3=O*73uJ)$TNFRjviyK6V&ivn-pCfZ0skEV3-B#e3CQlCh+O zd;{k~!Noh+i9`z!b?q0pZ^KI9417#j1gmJ^EKh(f$M!HS-f?V%{UNN?Do{XB>D#0i zG-(hQg_xW|&+Wo+$esn{z}PRt$Ypphw4LX64@WR`Lnz*epn$^Av)M^NedLPLtCumt z;YI4u575BFx9O(1ocISIdMe~hktFF%1JafE>PY{osPV*mgE delta 243 zcmey*a+0b3G%qg~0}uq?|CY7@NIwQ~V1NnA_$&fsOlL@8s9=m@h+<4(1ky}V%#}=< z%vG$$dKP+yn#?bmfofiIfCxq);it)Ri#tBPEVZaOGe0jr{uVowc}ox>T2eakwur?_ zhR;9^48KbBLyLjR^|KR;67%$uG7?KN6ZKtEi?d7e3-k+sGWmIlIr{BtLn8nH diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc index a06ed3ff1e3d21434612418b896f289b6c4641f6..e5bd4f95e88872ea1b73be74035d97d02615f197 100644 GIT binary patch delta 2719 zcmZ9OYitzP6@c%ZnVsDo@B4*W8+!mRcwy}gMx_lU2#O7HVxESyI7GX{-m$&*?v8V3 zHU_fPhWH0jNej7=lB!fKN`KW!t8^7bmD;M2`Xf^RI3-og0#d6gQXY!BjxCka{^+^0 zw!6y6d+wR+yomR+DIA%J z5@AkSa~p9Gkw~{Ni4n&ftX`K$l*mnXr%jwq#AOp#6LH(b-9!|dC{3irCa|-a^{G8J zf=#XyuT5aP>%?ah*!Vi}+XO$(`QVbnrU)go7N|^bia`+7xj{5rUytlr&)QUlpfA$1)Zt~a~jc$7t=#S z{b^8){t2x#W}KkLgr2k5=kg?Ot3KnrC*W<>K1CGpH`pG}Bm8Z)%X=RmsQP@r#dx6l zf&UuD$Joi>LwuU~d~ufTk*edNF^tbv7s4fs&$HRsrs}!qR>-UBYz)$?V3T_rq8LA4 zU25&Y_yyJ(kFzfoH+w8{Hu&^js#|4R+N%=XoV1K7_GPq<^|r}n>2g5@bjBDg><_u$kaU*lYm@T9>%9QWm82c>M?fi`2v80=Yd%8E!qo7j_L>@^9)ns1S3I#UY^XtJS zpyoyppQ4AeXhBKb4!?2m`tEDb|6tFJL$B<+9saioUC`CmIHm_cp(PMWUro+g7pHWS zHqI3od#cyk-8fas;Jwz8GxMa7$r&ZM%KT7k;`#C@z0NfWv_8`bs>;6T-G1z6p#2qo z=0gy(XxW1tAxMvS`=YvKv2*icylt_)V{u~}|7+W{xTR|;tc2x%MUYdulDoF!C8Hii zjzB$zT;T<0oc%$KMgFD)K32AUsBHVWbw^3f9=h+1++bJJJKVR!ca+3O&cq^nH(j3j zAx!u>a`Rh+;1(fk^(^2@AR??qp2`-Fg8dAyc}thEW&abw@i5woEVHOr!u$EDUXSe!DbH9)CB=|%3# z^Mdm9ObT`fo0@zWwULgsNMB4oB*qi(3Mz1=r4pD^cXx@D;)i?_HOtE<*dC72hgK-S_YO zi)$yRsYhlTjD1zwiheBhp*P)W@mDx4{>Fb$65kgw$Rw^gi`oS)|5Es%nE~^V+ZHXL8x*M+0Y$FLWt>ME=DZTlY$Rj1Ja delta 2161 zcmYk7ZEPIH8OLXK_jd2r_kQOWjyhao*}1dNcRt$*H4xqcaZpo8<)oksa9(@X`0Bme zV|I_2^em^~wy6Lq(I5dLNT?DYQqxB26-8AmwcpE!0Fe+E10MjXsw&myqBi6M;+Z+l zy^;2r|NfqN*=L@a*;iLSF@ygI1at&t?(_dHnZp-?1Ni+5`%~+(ocn?4wfjS6vl*C8~>X-!mO^wJS?}j&VyEA~;W?P~TE5wQZ3@-Fu`1jA(6VUE8 zWTFBls2~wskWB@KlQxu2F9<{?%0*1##IvCmRN+^<{F)$I7x4<>?IJ!wd|gBrWL@t< zJpw_byHooGftYtmKoE$2mjnfYb=V~#L10C8Nm!6@7l{ZG$#$WrK+!G|dtOfWHnqn~ z6=I)uj9!Udk;d2cB$RuWUAKByF6Y#$Rhzoma%qv;j=kh&7wvM6m`g^@acd{g!-oU<$P!9cqKwT*JA@{Di~ zDtg-y&!({)_`x<{!zQz-7?xbT)gEyBK0SMXrN)UHc7)p$UcC447)*nbNjV)qBO@Pm!P z;GZ#`ZG0R$hw*VXAGwKt$_9f8_SdAZQI9TQe5&zztb#FN$8R5Otn?0HToUr#z9hyK zA^+9ii?Q>^+r}|oW!Xfc@tfQKfbkmp;ovd0xTk;baoG7Z0p^zOxHMT$K5AD?`WUC& zm5#GF_q>q0gy;ZAecbTlEKC@La{!LV2HKHyk9T{Z@z@=A;DG8$wPd6QcO+1acajs5 z$AqT8ZZ!9`WaUS*rprDWd2jDLur#IyABCUAWPA9hKvHflHZJX-mGEEKPWlSFG`fkO zWGBZ?s84f$kzF1uc*PfL)L@ZJze+fFSvGSdQU`e%9_J#MvuHcaewq25?t>S&FmUT8 z`z-Y|_OL_gJ=sk@Gn6&i<$h6IrK3n-Q)=rqrLO!;XFE!a?Tp7~^g1Rw3D)IJPuq`? z8`|v^+CX*rA=EisojK^eu9(!{0c)PR!sfGSEVFPf-dFb!f9Fc0Qr)vA*AWS`KV@gy z4d9mRe9jz90Dbxs(KG$9p2;QKA|_3qF1gFeMfdrt>15e#E+wVC?73WO;8FS{d|U}Z zU`_Qj99GMsJTUfN?()&EKsY?T|3o*>q7U`q*B^L!>fEz09Xx;dm3uzWhre<7db}`@ z!1R6)v;-y{r0qO_ZmR7W+3zRZaaH8A*|X@Bh*ey)E3m5wZzM0&mgujzQb0{QDoA!B zzd!N@i1*=fw!uKMg6u+mU~nhmi>d#MB2E9r;BHBw;Vm{YSvyvNQC~yu_i0AR{XU@x{y3f0 zr0V}uK8JjWNCa8(8gjkRS(G_6gj}6zQ=>-+%<-RI4IKakMoW#^KgT0w-E`?Zv&Vqu7fx+kLEZVB|ZX C{Q=Sd diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py index 76527dda..afd3141c 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py @@ -1,21 +1,23 @@ """Android.""" + from __future__ import annotations import os import re import sys from functools import lru_cache -from typing import cast +from typing import TYPE_CHECKING, cast from .api import PlatformDirsABC class Android(PlatformDirsABC): """ - Follows the guidance `from here `_. Makes use of the - `appname `, - `version `, - `ensure_exists `. + Follows the guidance `from here `_. + + Makes use of the `appname `, `version + `, `ensure_exists `. + """ @property @@ -43,7 +45,7 @@ def site_config_dir(self) -> str: @property def user_cache_dir(self) -> str: - """:return: cache directory tied to the user, e.g. e.g. ``/data/user///cache/``""" + """:return: cache directory tied to the user, e.g.,``/data/user///cache/``""" return self._append_app_name_and_version(cast(str, _android_folder()), "cache") @property @@ -92,6 +94,11 @@ def user_music_dir(self) -> str: """:return: music directory tied to the user e.g. ``/storage/emulated/0/Music``""" return _android_music_folder() + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user e.g. ``/storage/emulated/0/Desktop``""" + return "/storage/emulated/0/Desktop" + @property def user_runtime_dir(self) -> str: """ @@ -103,18 +110,40 @@ def user_runtime_dir(self) -> str: path = os.path.join(path, "tmp") # noqa: PTH118 return path + @property + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users, same as `user_runtime_dir`""" + return self.user_runtime_dir + @lru_cache(maxsize=1) -def _android_folder() -> str | None: +def _android_folder() -> str | None: # noqa: C901, PLR0912 """:return: base folder for the Android OS or None if it cannot be found""" - try: - # First try to get path to android app via pyjnius - from jnius import autoclass - - context = autoclass("android.content.Context") - result: str | None = context.getFilesDir().getParentFile().getAbsolutePath() - except Exception: # noqa: BLE001 - # if fails find an android folder looking path on the sys.path + result: str | None = None + # type checker isn't happy with our "import android", just don't do this when type checking see + # https://stackoverflow.com/a/61394121 + if not TYPE_CHECKING: + try: + # First try to get a path to android app using python4android (if available)... + from android import mActivity # noqa: PLC0415 + + context = cast("android.content.Context", mActivity.getApplicationContext()) # noqa: F821 + result = context.getFilesDir().getParentFile().getAbsolutePath() + except Exception: # noqa: BLE001 + result = None + if result is None: + try: + # ...and fall back to using plain pyjnius, if python4android isn't available or doesn't deliver any useful + # result... + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + result = context.getFilesDir().getParentFile().getAbsolutePath() + except Exception: # noqa: BLE001 + result = None + if result is None: + # and if that fails, too, find an android folder looking at path on the sys.path + # warning: only works for apps installed under /data, not adopted storage etc. pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files") for path in sys.path: if pattern.match(path): @@ -122,6 +151,16 @@ def _android_folder() -> str | None: break else: result = None + if result is None: + # one last try: find an android folder looking at path on the sys.path taking adopted storage paths into + # account + pattern = re.compile(r"/mnt/expand/[a-fA-F0-9-]{36}/(data|user/\d+)/(.+)/files") + for path in sys.path: + if pattern.match(path): + result = path.split("/files")[0] + break + else: + result = None return result @@ -130,7 +169,7 @@ def _android_documents_folder() -> str: """:return: documents folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -146,7 +185,7 @@ def _android_downloads_folder() -> str: """:return: downloads folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -162,7 +201,7 @@ def _android_pictures_folder() -> str: """:return: pictures folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -178,7 +217,7 @@ def _android_videos_folder() -> str: """:return: videos folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -194,7 +233,7 @@ def _android_music_folder() -> str: """:return: music folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py index d64ebb9d..c50caa64 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py @@ -1,4 +1,5 @@ """Base API.""" + from __future__ import annotations import os @@ -7,18 +8,13 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - import sys - - if sys.version_info >= (3, 8): # pragma: no cover (py38+) - from typing import Literal - else: # pragma: no cover (py38+) - from pip._vendor.typing_extensions import Literal + from typing import Iterator, Literal -class PlatformDirsABC(ABC): +class PlatformDirsABC(ABC): # noqa: PLR0904 """Abstract base class for platform directories.""" - def __init__( # noqa: PLR0913 + def __init__( # noqa: PLR0913, PLR0917 self, appname: str | None = None, appauthor: str | None | Literal[False] = None, @@ -38,34 +34,47 @@ def __init__( # noqa: PLR0913 :param multipath: See `multipath`. :param opinion: See `opinion`. :param ensure_exists: See `ensure_exists`. + """ self.appname = appname #: The name of application. self.appauthor = appauthor """ - The name of the app author or distributing body for this application. Typically, it is the owning company name. - Defaults to `appname`. You may pass ``False`` to disable it. + The name of the app author or distributing body for this application. + + Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it. + """ self.version = version """ - An optional version path element to append to the path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this would typically be ``.``. + An optional version path element to append to the path. + + You might want to use this if you want multiple versions of your app to be able to run independently. If used, + this would typically be ``.``. + """ self.roaming = roaming """ - Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup - for roaming profiles, this user data will be synced on login (see - `here `_). + Whether to use the roaming appdata directory on Windows. + + That means that for users on a Windows network setup for roaming profiles, this user data will be synced on + login (see + `here `_). + """ self.multipath = multipath """ - An optional parameter only applicable to Unix/Linux which indicates that the entire list of data dirs should be - returned. By default, the first item would only be returned. + An optional parameter which indicates that the entire list of data dirs should be returned. + + By default, the first item would only be returned. + """ self.opinion = opinion #: A flag to indicating to use opinionated values. self.ensure_exists = ensure_exists """ Optionally create the directory (and any missing parents) upon access if it does not exist. + By default, no directories are created. + """ def _append_app_name_and_version(self, *base: str) -> str: @@ -147,11 +156,21 @@ def user_videos_dir(self) -> str: def user_music_dir(self) -> str: """:return: music directory tied to the user""" + @property + @abstractmethod + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user""" + @property @abstractmethod def user_runtime_dir(self) -> str: """:return: runtime directory tied to the user""" + @property + @abstractmethod + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users""" + @property def user_data_path(self) -> Path: """:return: data path tied to the user""" @@ -194,7 +213,7 @@ def user_log_path(self) -> Path: @property def user_documents_path(self) -> Path: - """:return: documents path tied to the user""" + """:return: documents a path tied to the user""" return Path(self.user_documents_dir) @property @@ -217,7 +236,57 @@ def user_music_path(self) -> Path: """:return: music path tied to the user""" return Path(self.user_music_dir) + @property + def user_desktop_path(self) -> Path: + """:return: desktop path tied to the user""" + return Path(self.user_desktop_dir) + @property def user_runtime_path(self) -> Path: """:return: runtime path tied to the user""" return Path(self.user_runtime_dir) + + @property + def site_runtime_path(self) -> Path: + """:return: runtime path shared by users""" + return Path(self.site_runtime_dir) + + def iter_config_dirs(self) -> Iterator[str]: + """:yield: all user and site configuration directories.""" + yield self.user_config_dir + yield self.site_config_dir + + def iter_data_dirs(self) -> Iterator[str]: + """:yield: all user and site data directories.""" + yield self.user_data_dir + yield self.site_data_dir + + def iter_cache_dirs(self) -> Iterator[str]: + """:yield: all user and site cache directories.""" + yield self.user_cache_dir + yield self.site_cache_dir + + def iter_runtime_dirs(self) -> Iterator[str]: + """:yield: all user and site runtime directories.""" + yield self.user_runtime_dir + yield self.site_runtime_dir + + def iter_config_paths(self) -> Iterator[Path]: + """:yield: all user and site configuration paths.""" + for path in self.iter_config_dirs(): + yield Path(path) + + def iter_data_paths(self) -> Iterator[Path]: + """:yield: all user and site data paths.""" + for path in self.iter_data_dirs(): + yield Path(path) + + def iter_cache_paths(self) -> Iterator[Path]: + """:yield: all user and site cache paths.""" + for path in self.iter_cache_dirs(): + yield Path(path) + + def iter_runtime_paths(self) -> Iterator[Path]: + """:yield: all user and site runtime paths.""" + for path in self.iter_runtime_dirs(): + yield Path(path) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py index a753e2a3..eb1ba5df 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py @@ -1,18 +1,23 @@ """macOS.""" + from __future__ import annotations import os.path +import sys from .api import PlatformDirsABC class MacOS(PlatformDirsABC): """ - Platform directories for the macOS operating system. Follows the guidance from `Apple documentation - `_. + Platform directories for the macOS operating system. + + Follows the guidance from + `Apple documentation `_. Makes use of the `appname `, `version `, `ensure_exists `. + """ @property @@ -22,8 +27,20 @@ def user_data_dir(self) -> str: @property def site_data_dir(self) -> str: - """:return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``""" - return self._append_app_name_and_version("/Library/Application Support") + """ + :return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``. + If we're using a Python binary managed by `Homebrew `_, the directory + will be under the Homebrew prefix, e.g. ``/opt/homebrew/share/$appname/$version``. + If `multipath ` is enabled, and we're in Homebrew, + the response is a multi-path string separated by ":", e.g. + ``/opt/homebrew/share/$appname/$version:/Library/Application Support/$appname/$version`` + """ + is_homebrew = sys.prefix.startswith("/opt/homebrew") + path_list = [self._append_app_name_and_version("/opt/homebrew/share")] if is_homebrew else [] + path_list.append(self._append_app_name_and_version("/Library/Application Support")) + if self.multipath: + return os.pathsep.join(path_list) + return path_list[0] @property def user_config_dir(self) -> str: @@ -42,8 +59,20 @@ def user_cache_dir(self) -> str: @property def site_cache_dir(self) -> str: - """:return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``""" - return self._append_app_name_and_version("/Library/Caches") + """ + :return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``. + If we're using a Python binary managed by `Homebrew `_, the directory + will be under the Homebrew prefix, e.g. ``/opt/homebrew/var/cache/$appname/$version``. + If `multipath ` is enabled, and we're in Homebrew, + the response is a multi-path string separated by ":", e.g. + ``/opt/homebrew/var/cache/$appname/$version:/Library/Caches/$appname/$version`` + """ + is_homebrew = sys.prefix.startswith("/opt/homebrew") + path_list = [self._append_app_name_and_version("/opt/homebrew/var/cache")] if is_homebrew else [] + path_list.append(self._append_app_name_and_version("/Library/Caches")) + if self.multipath: + return os.pathsep.join(path_list) + return path_list[0] @property def user_state_dir(self) -> str: @@ -80,11 +109,21 @@ def user_music_dir(self) -> str: """:return: music directory tied to the user, e.g. ``~/Music``""" return os.path.expanduser("~/Music") # noqa: PTH111 + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user, e.g. ``~/Desktop``""" + return os.path.expanduser("~/Desktop") # noqa: PTH111 + @property def user_runtime_dir(self) -> str: """:return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``""" return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) # noqa: PTH111 + @property + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users, same as `user_runtime_dir`""" + return self.user_runtime_dir + __all__ = [ "MacOS", diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py index 468b0ab4..9500ade6 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py @@ -1,16 +1,18 @@ """Unix.""" + from __future__ import annotations import os import sys from configparser import ConfigParser from pathlib import Path +from typing import Iterator, NoReturn from .api import PlatformDirsABC if sys.platform == "win32": - def getuid() -> int: + def getuid() -> NoReturn: msg = "should only be used on Unix" raise RuntimeError(msg) @@ -18,17 +20,17 @@ def getuid() -> int: from os import getuid -class Unix(PlatformDirsABC): +class Unix(PlatformDirsABC): # noqa: PLR0904 """ - On Unix/Linux, we follow the - `XDG Basedir Spec `_. The spec allows - overriding directories with environment variables. The examples show are the default values, alongside the name of - the environment variable that overrides them. Makes use of the - `appname `, - `version `, - `multipath `, - `opinion `, - `ensure_exists `. + On Unix/Linux, we follow the `XDG Basedir Spec `_. + + The spec allows overriding directories with environment variables. The examples shown are the default values, + alongside the name of the environment variable that overrides them. Makes use of the `appname + `, `version `, `multipath + `, `opinion `, `ensure_exists + `. + """ @property @@ -42,25 +44,25 @@ def user_data_dir(self) -> str: path = os.path.expanduser("~/.local/share") # noqa: PTH111 return self._append_app_name_and_version(path) + @property + def _site_data_dirs(self) -> list[str]: + path = os.environ.get("XDG_DATA_DIRS", "") + if not path.strip(): + path = f"/usr/local/share{os.pathsep}/usr/share" + return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)] + @property def site_data_dir(self) -> str: """ :return: data directories shared by users (if `multipath ` is - enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS - path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version`` + enabled and ``XDG_DATA_DIRS`` is set and a multi path the response is also a multi path separated by the + OS path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version`` """ # XDG default for $XDG_DATA_DIRS; only first, if multipath is False - path = os.environ.get("XDG_DATA_DIRS", "") - if not path.strip(): - path = f"/usr/local/share{os.pathsep}/usr/share" - return self._with_multi_path(path) - - def _with_multi_path(self, path: str) -> str: - path_list = path.split(os.pathsep) + dirs = self._site_data_dirs if not self.multipath: - path_list = path_list[0:1] - path_list = [self._append_app_name_and_version(os.path.expanduser(p)) for p in path_list] # noqa: PTH111 - return os.pathsep.join(path_list) + return dirs[0] + return os.pathsep.join(dirs) @property def user_config_dir(self) -> str: @@ -73,18 +75,25 @@ def user_config_dir(self) -> str: path = os.path.expanduser("~/.config") # noqa: PTH111 return self._append_app_name_and_version(path) + @property + def _site_config_dirs(self) -> list[str]: + path = os.environ.get("XDG_CONFIG_DIRS", "") + if not path.strip(): + path = "/etc/xdg" + return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)] + @property def site_config_dir(self) -> str: """ :return: config directories shared by users (if `multipath ` - is enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS - path separator), e.g. ``/etc/xdg/$appname/$version`` + is enabled and ``XDG_CONFIG_DIRS`` is set and a multi path the response is also a multi path separated by + the OS path separator), e.g. ``/etc/xdg/$appname/$version`` """ # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False - path = os.environ.get("XDG_CONFIG_DIRS", "") - if not path.strip(): - path = "/etc/xdg" - return self._with_multi_path(path) + dirs = self._site_config_dirs + if not self.multipath: + return dirs[0] + return os.pathsep.join(dirs) @property def user_cache_dir(self) -> str: @@ -99,8 +108,8 @@ def user_cache_dir(self) -> str: @property def site_cache_dir(self) -> str: - """:return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version``""" - return self._append_app_name_and_version("/var/tmp") # noqa: S108 + """:return: cache directory shared by users, e.g. ``/var/cache/$appname/$version``""" + return self._append_app_name_and_version("/var/cache") @property def user_state_dir(self) -> str: @@ -119,6 +128,7 @@ def user_log_dir(self) -> str: path = self.user_state_dir if self.opinion: path = os.path.join(path, "log") # noqa: PTH118 + self._optionally_create_directory(path) return path @property @@ -146,6 +156,11 @@ def user_music_dir(self) -> str: """:return: music directory tied to the user, e.g. ``~/Music``""" return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music") + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user, e.g. ``~/Desktop``""" + return _get_user_media_dir("XDG_DESKTOP_DIR", "~/Desktop") + @property def user_runtime_dir(self) -> str: """ @@ -166,19 +181,41 @@ def user_runtime_dir(self) -> str: path = f"/run/user/{getuid()}" return self._append_app_name_and_version(path) + @property + def site_runtime_dir(self) -> str: + """ + :return: runtime directory shared by users, e.g. ``/run/$appname/$version`` or \ + ``$XDG_RUNTIME_DIR/$appname/$version``. + + Note that this behaves almost exactly like `user_runtime_dir` if ``$XDG_RUNTIME_DIR`` is set, but will + fall back to paths associated to the root user instead of a regular logged-in user if it's not set. + + If you wish to ensure that a logged-in root user path is returned e.g. ``/run/user/0``, use `user_runtime_dir` + instead. + + For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/$appname/$version`` if ``$XDG_RUNTIME_DIR`` is not set. + """ + path = os.environ.get("XDG_RUNTIME_DIR", "") + if not path.strip(): + if sys.platform.startswith(("freebsd", "openbsd", "netbsd")): + path = "/var/run" + else: + path = "/run" + return self._append_app_name_and_version(path) + @property def site_data_path(self) -> Path: - """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" + """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" return self._first_item_as_path_if_multipath(self.site_data_dir) @property def site_config_path(self) -> Path: - """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``""" + """:return: config path shared by the users, returns the first item, even if ``multipath`` is set to ``True``""" return self._first_item_as_path_if_multipath(self.site_config_dir) @property def site_cache_path(self) -> Path: - """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" + """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" return self._first_item_as_path_if_multipath(self.site_cache_dir) def _first_item_as_path_if_multipath(self, directory: str) -> Path: @@ -187,6 +224,16 @@ def _first_item_as_path_if_multipath(self, directory: str) -> Path: directory = directory.split(os.pathsep)[0] return Path(directory) + def iter_config_dirs(self) -> Iterator[str]: + """:yield: all user and site configuration directories.""" + yield self.user_config_dir + yield from self._site_config_dirs + + def iter_data_dirs(self) -> Iterator[str]: + """:yield: all user and site data directories.""" + yield self.user_data_dir + yield from self._site_data_dirs + def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str: media_dir = _get_user_dirs_folder(env_var) @@ -199,7 +246,12 @@ def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str: def _get_user_dirs_folder(key: str) -> str | None: - """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/.""" + """ + Return directory from user-dirs.dirs config file. + + See https://freedesktop.org/wiki/Software/xdg-user-dirs/. + + """ user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs" if user_dirs_config_path.exists(): parser = ConfigParser() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py index dc8c44cf..6483ddce 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py @@ -1,4 +1,16 @@ # file generated by setuptools_scm # don't change, don't track in version control -__version__ = version = '3.8.1' -__version_tuple__ = version_tuple = (3, 8, 1) +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple, Union + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '4.2.2' +__version_tuple__ = version_tuple = (4, 2, 2) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py index b52c9c6e..d7bc9609 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py @@ -1,7 +1,7 @@ """Windows.""" + from __future__ import annotations -import ctypes import os import sys from functools import lru_cache @@ -15,15 +15,13 @@ class Windows(PlatformDirsABC): """ - `MSDN on where to store app data files - `_. - Makes use of the - `appname `, - `appauthor `, - `version `, - `roaming `, - `opinion `, - `ensure_exists `. + `MSDN on where to store app data files `_. + + Makes use of the `appname `, `appauthor + `, `version `, `roaming + `, `opinion `, `ensure_exists + `. + """ @property @@ -122,6 +120,11 @@ def user_music_dir(self) -> str: """:return: music directory tied to the user e.g. ``%USERPROFILE%\\Music``""" return os.path.normpath(get_win_folder("CSIDL_MYMUSIC")) + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user, e.g. ``%USERPROFILE%\\Desktop``""" + return os.path.normpath(get_win_folder("CSIDL_DESKTOPDIRECTORY")) + @property def user_runtime_dir(self) -> str: """ @@ -131,6 +134,11 @@ def user_runtime_dir(self) -> str: path = os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Temp")) # noqa: PTH118 return self._append_parts(path) + @property + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users, same as `user_runtime_dir`""" + return self.user_runtime_dir + def get_win_folder_from_env_vars(csidl_name: str) -> str: """Get folder from environment variables.""" @@ -154,7 +162,7 @@ def get_win_folder_from_env_vars(csidl_name: str) -> str: def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None: - """Get folder for a CSIDL name that does not exist as an environment variable.""" + """Get a folder for a CSIDL name that does not exist as an environment variable.""" if csidl_name == "CSIDL_PERSONAL": return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") # noqa: PTH118 @@ -178,6 +186,7 @@ def get_win_folder_from_registry(csidl_name: str) -> str: This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer for all CSIDL_* names. + """ shell_folder_name = { "CSIDL_APPDATA": "AppData", @@ -194,7 +203,7 @@ def get_win_folder_from_registry(csidl_name: str) -> str: raise ValueError(msg) if sys.platform != "win32": # only needed for mypy type checker to know that this code runs only on Windows raise NotImplementedError - import winreg + import winreg # noqa: PLC0415 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") directory, _ = winreg.QueryValueEx(key, shell_folder_name) @@ -207,6 +216,8 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str: # Use 'CSIDL_PROFILE' (40) and append the default folder 'Downloads' instead. # https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid + import ctypes # noqa: PLC0415 + csidl_const = { "CSIDL_APPDATA": 26, "CSIDL_COMMON_APPDATA": 35, @@ -216,6 +227,7 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str: "CSIDL_MYVIDEO": 14, "CSIDL_MYMUSIC": 13, "CSIDL_DOWNLOADS": 40, + "CSIDL_DESKTOPDIRECTORY": 16, }.get(csidl_name) if csidl_const is None: msg = f"Unknown CSIDL name: {csidl_name}" @@ -225,7 +237,7 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str: windll = getattr(ctypes, "windll") # noqa: B009 # using getattr to avoid false positive with mypy type checker windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - # Downgrade to short path name if it has highbit chars. + # Downgrade to short path name if it has high-bit chars. if any(ord(c) > 255 for c in buf): # noqa: PLR2004 buf2 = ctypes.create_unicode_buffer(1024) if windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): @@ -238,10 +250,15 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str: def _pick_get_win_folder() -> Callable[[str], str]: - if hasattr(ctypes, "windll"): - return get_win_folder_via_ctypes try: - import winreg # noqa: F401 + import ctypes # noqa: PLC0415 + except ImportError: + pass + else: + if hasattr(ctypes, "windll"): + return get_win_folder_via_ctypes + try: + import winreg # noqa: PLC0415, F401 except ImportError: return get_win_folder_from_env_vars else: diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py index 39c84aae..60ae9bb8 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py @@ -21,12 +21,12 @@ .. _Pygments master branch: https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ from io import StringIO, BytesIO -__version__ = '2.15.1' +__version__ = '2.18.0' __docformat__ = 'restructuredtext' __all__ = ['lex', 'format', 'highlight'] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py index 2f7f8cba..dcc6e5ad 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py @@ -4,7 +4,7 @@ Main entry point for ``python -m pygments``. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc index b99ee3ef63dfbc82cf596427ac0f50b3d128a984..70714a6b26cf75edb2a5c428051029e5aad530c5 100644 GIT binary patch delta 114 zcmdlieOj95G%qg~0}$9UGNy0jQDty;+*)G%qg~0}uq?|CY9qN1cVyc(MsgKC`Kw;pSy5j!XuH`k}?CMaBBriA9Nd rdPy0HC7Fr(E~&-YCHV#V1wfhnyu=*+jMSW*{PO&woRrP_>~q)v^}!wz diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc index f87f6697449e95864f8ee0f635234acbb627d359..9a14653f6048dd2f772e3664a0c47e5e7cb31737 100644 GIT binary patch delta 104 zcmey!+R4UqnwOW00SIgv8PhlNI50ArO!j5m>(QwnTAW%`te=vUSe}}dsPB@WT$-Dj zS5mC+no^paSdy8aryrc0n3Gzh;Fz44lA2qo@8jd54`k%KWF_XM=LZz!XQd{WOtxa$ F4gh#6BA);N delta 80 zcmeBV`^d_3nwOW00SJQce@olQWpWVHb^spp96100 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc index 0336da94de1eca537c4b5cea479dff200420ab9e..c6b88b2dffcc352b1a89a847c3ebfc4603c050c0 100644 GIT binary patch delta 4293 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 a^f%(#t{!$>B=i{PfadmITn?w&EB^&8F<|-t delta 4151 zcma(U3vg7`_1%5@cK7Y??KhjvZnD3G-A%Ha4f&7_2{8r;6g5Bq3#egXH_0ZO4{w)1 za09W@8Z2t!sRio~TB{&husdVh=~O|cqcd1dxlgWUb{D?5Up`Q>gmqf2h!oaryzp znAUWaQZczuEVatUjFzhu%jUvT>0%ikCs`~>?UVK(OY5|$TGL-Im}U&91yhFcfRC-G z$+($y>L?LK?WR~NNrh3nhobn~;UHTf-YTIexX9M4q*y>t3la)=g|%74Nl}}atnt?8 z77IqOn3GTu3#lZDW~4|8)e4U+EK5=Xt3zRHWDnvwkOxt#sb2YJY74!Z+Kjx4yT+MV zWJ`qKYFreFb=$i-?TOZiJuhw-xRv8v8D-3UHsxWa(<*Tcvk5!?%YIsg%((J%ny!%F0_QAUv z8=O=9yI4a}ebNNNUW6yiCZ%L24_@OSYL`w-^%6_Dkc7VqmJ7I9NC6L6^st?iAQcQ{ z7~of&8L44ep8oM1DZI-mAjRq7GUvdf1w5LN>j#8_Bbo-JCyr4WJYvd%dD)D|Abgd2zWNKRD$$T?cj5X2~=;&cqYFvB*|w zBN^hAUKM<+vw%|%^0hel-S~|M;0?W3miAO!rD!%AF6kQ!@Hi=>Sk+_fPIedml#Ev? z#1;(Hl0@rs_oES=_k=QkipEUnFt}xDz56O9#>Tr1tp#|Tl>b0uztJg68}dlxayVpk z7(AodMThBhb}2qbCzNGVQX=@d(Sfyczh5hL-guixvJ9_?Uk<*^9LF?D=rtIO%ddX~ zalS_2LM+oaWAI#NU15l*N%%;7Q!K$Z5|tGMtR!GL0rwKHn1D5)HkZhoG5Rom;|;LH zoGnY2Ex1ZCtQy+Q4w{UEX6y9UNHB58?5D|iiZIEN#hCckoa@FT-mh%OfMlR|L}orE zRSy=8NF8IGc0fE~a0&~*rc0ACmK8+*gcq{b;PZqm85y^p>RvQ}no*dBB1?)B&m1d6 zCFwRJJh0dRjP*`hvJ=74r3Q#vReEVy)*`y0*Gh$1*lDdrayV{v;BVoIHI0;TGmEdxU4Z}t_?O1>-p4-`u-GcLhY*R9`hvMs4Dopj6@ymuY1&$?|*%l&U zjG19>rX1db3ss*P>zH7*Yahyj;zFA$V@8UoUI{$l$bjlxEwZE3Gxl_D3EV&yvVCV=dh{&(BanA3UD?GP`aSrHP1oqA>sWTN zvdCL_m(U7qBDclT-j!*FHNCDEG|{%q~g2QyfJ(7OeZ# z1?sDQ>hBr#Pp;Y%+N=Fz=t#+*TYs@}B%>ZymE@r=NS3sk)9%XAjQX^`eweEtmeuoQ z$Hvhed6`#s1{HI*qFzYNxo6b|!ro4R0)uf`cPx}3*9%`qcuK;vbw|7XO+As$a2N02 z&=u?ALmeT1v@?qP*;q6l8JAuYj>~4Gu&^S824R1NBPT)pY$AT7A-<)FOu2)wItjQR z&Q}B^+X&hZ*}-3C=x01M-SE#p2CoNAiX_&GyD_k@gVRA5(3J-H7$#pM{4Q`*&eBa% zh|8ZSoP)1(uHtii(Fft)O0Oerz<0Wcwe6fgP&=@3oYRbHOuH3BiaoVYsBw$N+Thof z%iIU*-`AAxZ5-6^&Kk3~9t~Ta6*3=yq2ijT`Mbwx<87-m4@|0}_)YxogyNjCeDPuveEjDPIn!kP5Pv#nu0eOAw4{H%ou=Sk1n$;8fj*ocWfTWpQ!=yN&-Uu zrEH!@p9?4>)uMA%h~U+RX2W*o6RijnpXgDuf%(K>BltWeHaIW0wiM9k3mAfz7+Mwd z1vw&6&9=^CE|{#XLFPh`!T3eQMg#OkxiwlqUo2nE%AOiD@u}b=KHQQmOuSigbjk;n% z1h>)zw;4N1Q#A{5GqD*O>hm=(<1;)i!{0}Dh{yko-ZgdJx*FT9B?q3urJB1a5 z>LFAWK0wIv8NlGKAuhwz4(fA}l(`*ED~-dcMP@XX`g+keF?uQ0duO(Y^CuPI<+x92 zBo|(roAe*>PD8P1t0YA)^@`9C_?Gu$_`BspiqDAuDFTL4KWcnIgnkQCE9=ovD!A%- znj6A`acMZx93nmDRO<5T7Nq!sXbW~jsr%OA!nGNGcF%xOaB`E3Xl+Tk?%jh#xXJ&^ zebGz;vA2c}+{v7(CWwl#o5*JK?3K8uTaltjUDl0O`8<3ZcHp z@UIZx2&>lFxZOmJ01erdm8l);F3|aVbNBN5JTLn9`41b?&ho<>N1VYAoHZlPnzXa_ zh~tQJ*tuXtzhFeU0GgrT>BpHI9VCSV}}bs;CXP4v`=obKG^79gN^fOX(a`Mabi*iynA7svCWo1mc#h5eMjMIpTnQ?L!=d@rR z{t4VOVlMM&ePUo{hbU7e!Ss@~c9H eSy(#+8{HZmKd=M!e&AwYWoszxP@L??r3e6M2tfD% diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc index 482118e336d3ff0084da2d331eff3af53d4d0679..2bde6e73854aede89e7d1ade50571c6139591712 100644 GIT binary patch delta 249 zcmdlic|el)G%qg~0}$9UGNzYJB`Yy6JwKo*KPxr4Wby~5 zr%K8|^M5ojeBohaHGC{A)xmyKP<#ga0EQ*H~(Q?&pLT6rxx36rWB^R zOp|YOIx@;kmgj2Fw+3o%V7S9CHlbuj)D?b>J3`VkO6J$ith+96c2VB!f}G_A%g_rl wVV8x%FYtulnS6=s1f$F3+1wLYnOQYIb4@njDd87jw3`t2l>tZ<@d1qk0DgQ^{Qv*} delta 237 zcmX>gxml9;G%qg~0}uq?|CTmsBJW*BIb(3tbj5o63o;-ZL%(LnGNivt6PO`2ugot!y#Z{^J% z5)n+1LhOzyECfp-jm;I-*4Bb93Ko{Bl0vZZ&4n1mSN!;x_ue<(%-;Do7s{U;$I_^7 z19axyLHRRW8~pqRyYeF}-hbsk6dZ*gJz`IJm-)>!>?gdJ3IA@?4_UUE_WX9pVvdc~ zkVQP%@>{K@PaVcO+kChK||N;1{&z)d;S7fwz@<_@eEqwyVW-HHlCdrS9< z!#zDHfF)bj+G>eH&@TYW#3R??96jvpaCdXzj=6H5S&dFI^0gl{2Yi}{9re?2}md?6md=d&9#}4XY+b)T_$NEpx8{+X22?|SaoFVMrI$%KK@;lH8<=oQXpj0voNSt8r?MC#!0byY;40d$(j78+_u z7CUU1zc>#GPJ}E3-kyUc1SBaYfCIt}ji@t@MT)w)Dq{|Nd`%*$XR*fom6}JQB+Vlx zNqazeBwEq|&XDwgX2}2;BN+i>r6?)l0C^-%iiDbFuf}DfaUj`~ZWwGcIyA|F4!^@A zNiDcwkJsS|1ZYb`dq7r}L^5+^0(&>o#=eNK&)fsb0v0#$%2K35{g(LrbM|<=?eY@V z5Si|1_3U*td-lkGPoTjqcY0deyli)bb?{1LpOH9Oy(K<#Axw%EBP>F|)zifQVX;XL z&?Q)1&R(#j+E*aau%pErkf~b{p$2oI8SEF9RQ++NDKD~7%b}uA?MwUCjF@7MZ9KGb zV9jMy<_%FuSjLsuNPunP(?J1+jJ?RtTi0m>iS=){N1oJ3;!C<3K_cwkG8_AYH9kTB zidZAKv}|Mi%xsrP`9vbz?nbXiQQU4?2vW`wS_*#@904cw{rJ>vuOneCK(8*BMb5?}1R}SsDD1G34*Bh#+3)O86Ssn_R9=iUwT)RV-(vYcC zU4@37%1vVO`ZTuDcD8Ie3=r0P+S+8F1e3#A&@u#^=3O-*r34@tQzduGG#|Fpt?Kd( zw%EQ%i>AkZQs@|b&i4%6d?p6 z)K&r1Kf$@5bg}wm8{4`zp0%bJwcVtPFi)*@wxpk6q4`}TV4mzcNtbjhk8DGKW!N&&$Vw@Cl4^h~e#7a}G+Agv)mF-)VWQ5^TyM&!-cd5=a zi`h6aQ;;LscwmW?JKJEw0Z)U%V@}uzvrsx(0?jU?>OUJ$3UP;t95(R9%Ticu@VD}D!=mhK zR8Z9z3#$=$7!TXsch%?iqL;b3u7atm!#tq*W00g&f;03AxAd$ev&e3UttGegLUMK} zd-bKHH6iPo(M%yBg=w;WX1s2;^hMpiwU&LAmDgj3uJ1%u#0c-jL{#L8?Sa{^2c4YOM8fUO5)j}v?znNOADb=Gk7^|r-t2d9(2-gK({angvp+}x>ayOpts&$ z2$j#L&+Re8TogPSZ~v!o8^UGs%qz(Yhm#kc4}6-u?6{$y^v~`0jM(f0vHcQ@govK9 z{D1hF`$T#cfvDF2T`8`ZVmNf^?hX}>Z1<^gPL^m3G=}wH53;9~&!N7a?;eZIbf*0k z8WrsRKfS_eiV$PHV$K^j=bbITWS-lnWglhD(((8^xIFtsVlM?oigv=o-na?S9c(nm zInR!(!6XEBG)^$5hm20%(?wQ;72|P1=OPp#%tM&N%4d}|g`@8|Y{SO!BU7fUkf{=( z1Odaax@Iqyb|5$rFp6_yjH7$lFJ~1l7}X2$iM<;}jj+((%A490 zUDnNIT3s2rY0^V6#;h~lOfS$`#~O%DXB#Vw(52I?L8mK91LyXfyaFRm2^Gzxyu5k* ztQp_b30)vVFri%b%1w|}`I^R^0DPh);C9bp|C(0@Inj;Btb>WOyUBtsU{_btjivPn zTLHq+k{|j&&W4$aLLUR#q@S{n=D1RukhK|L(kWq6RiA_niOtW`&%+J*5i85j50bdmRZu(Ue%m~4 zkI;Q7!a6pyFkTg4pU59sTVZ<-@300qrXIp*2fu`~{2jD;E z1a1n|utE2m2e+hYlX)6?QiRPYM@>RwZ)h}-h3bheQ8lfn`RtC)yuw-WHsz<3IVrw-KA2qA*B zNsC;?y5}b)x8f)POA)yg?o0G};G-u2rV7FXO$x@iHz{(v4 zG&bi0CBUvPNCyx7ZB-&mS-36kZ~L-?3)4sk`|iRFVEea)OA^Ls%{ix9ElVkOK<>7@ z*ba{iPP&~Z=z&EabJh~+!72ydS1=C(QJij!?>C#8D1(UUR zBiKRzvJ>+UA>TAj3?dETCG3j|KOo%1OQ))>!NIM|Z-{k4pu@8D?QN0=?p+w?>1qV7 za2^%UV3n)>`^X$gUqQmF2(JNzHQvrJQRqP=G$Ayz7fZ9%oACuUyF5kzHqPJ(`(x=g z@ss3D?B((#t&p;ru(!)o2cImU!1oTf4^tCtL7lUL@urH7qaOt% z13(yl2g^8&IvEtphgNh@!Zf5r9WMzR5WdUiRrtVN)aQhh!7CLyG7%QufcA+fiRG!@ zOjj|oCcg1HP8Sn23@}L$St9wqKIlZ?PUHmkDZY||RfG|grJe{kG|jIv8>vzySht3en0;V%c*{UbkLAWE3-2Yk{9zsFU^K>-85 z4pwOrb*W>KM7M#!TI<(+OjfVM{^(}vJwrp`egMZ&TMHb4Xz;L*@Z|M0cx70TDk+I_ox{th4B>>O~k1!PCi z;10C5xw9mC7Gwl1jV-jX-Rq&_%~amufK^<9Hu@Pd*qC{<%>t<#*Wwl+g~b+MfF5N_ zHfI~rS0D>J&YCxGBpGaI^Af!t*IB`CZ~msiQFMOs`8gr>=$4{{t4SIC`Vo8T>BL{z zb3-vzq5RT|*%y;S?A(^wqL7@)KHHKe{w^tl{dLRi9;ic#YfTNAQm&gyLMf`8q>@Xf zlKutU)*EqSCO$NB5&n-o4*0wfKBUOcSY(0dX`w59y6`Kmi5@;895x!+H2?B!){`)*T&yNnZbr@<5@$p zRn+f{V;9!jqj2`{bsM_0Y;Loag%3w+b|&y=hRMeec&UJw1lCp;M^f1nb=j(6yjJ%l zN@AeurcPEiFEH2W*k1HU<;_))Zt4 zmuBdPZdx5Qs{(1eSBA%h9S+v{(Ci+xqAyU%uJ|b?qElVS4s`l!gx?@Mjlkp6AFzZD zrrsESfhD|As|OJGEFOl3ffkOa=xmhR@E#G4+=|ba6_olZy^Q=T@Ur2G;%-N;Bjs}h z6dl&9UPwb&(FS13^tV_PDR{XEhY0q~vxkeF zm#x`-<=3Ed=64LAm}gzLCl9or=nloK56vpQm~}BR#O7~1QE;|kD03(wG^^~AsVrp4 z9@UD`l#JLCuh?b{+h(1$p7orwpU)o3x@0Tq7e|fk*0!xZr9_C&87(71jIA&F_N_#4 zm74;*xR7f$M<@gC-$SJrI?nI9nDk-Ahl@kC4~MpG4?XM-xjmr zy=PtL>n@v?j*5aU>$*81WQ1$c;Lh!T6b(3LH9gB7txwFwQz5Kt3COJq{P9V0C&eYu zKOtNMfSiU;>Cfy`eUhFV+t=(T^~DgUzN#-w!v{=7&o_89L5Q>V=|^k{eNiK^*5{L- zO=jynshaPanBQ~KC^+Yg8icsiL2JXCq+!1*`YRmf2EsLfu%X$b;A1@1fJ8cm^uHny ztfD=`vw$0q3AY>W8hl=u9EP>KIwVCw_vf0yE?PE6N+CzsI%)TIJSV9P0483D<+%t& z2=fqz5x668kK$f-cW^BZ?nD+Yhuir_SVg$S>~eat3tkDf61^_*W=sJT8%Wf|PZuBI zjcKq|J}mM;Gx(S064En*z0u{X?;a6%?g=!o>q{JT6Y{+Y;EGXI@GcT2PfRseKZP`Y ztZ-jPPv#q^#)PX-h1(On_F+Cm^$01a0pTZ+Qmo)J4*eH|?<3q~BRg~Qe}F~q<)l?T z!SQea-A;aLUV}Ms(8+#t#Hs%Y8p5ww?XDv6TEP-_bXSvj)m6m)Z`WE;$eqX5dN&$o zFCS_d`bLPo7Ks*!S^zK8#LXEMF&A6IUIs9p7@WKUW5C=NiHGsUC+ctJo%gl7@)P z>t6^d%(wl=9MgJDPu(h^hqXt2r!atxDlU)%nQ3g=K;Y%QFYFy?JzI2EdcFBv^V#h~ zaYNO^vfZyH9eE@#X{ z;5Rzeq;1?tV|I6IRUaRzLj0<+{o?IzV{fn&mZjF&h0Zg=y8qPXYTq-DeF%!7|AX;FTNRZAz~=~LiBL< zih-!ltcjy*2w3jmb3p^yWQB1a@WymM1GVCO5im_rqM^giNkf->gF*z!w+ z5CT7s=HiAIBH(cRI$!T_)H_PXuay|ygW2%YHN1txTkIB@y>&2|e2ZN<*jS4*dCol*4+x)WE621kxP{mui?E(G39QN$H#pSywwU(_61M@kbYV??A-@8L z2@Mk;e-W4(U)amfY)JTL6zlQ zUbCP~R|1v2_RPxEAEK0aAo0nB?0ILT)3F0&!1$r+LEdRJC{nef^9cpw8 zeqvfal9qleLK~CWr@a*^#3u~n@-DFp$7>R<#>V%RUNgmp;tI|?hvVj5HqD1bD$d57 zCtRy$z_K3jXwFw$ip#!V2v~p(2+A| z9786lN!_%h$!_dA+d84$X1DuGoNbe~*~EpCtQEycXgB+7w&`v;oTKTr@6Cs}O8Wiq zU-QkpdGp?zH*em|=d;hsUcV-b_z#0YE5OtE{wGJ*Jn&q^J2Fx_{9D;~3Hh8ot~g)h zDctLGQD5On2X%M~jvRORn;nH4UA~ikZ);&Iw0J!Zcj0lD+wDE=rEVuXDb_`20YfYN zo0b8b5vB!}y18ul&tg4MW}J0zie>B6=3>QJ;h@eb0_vSgK!Z~S7~#}9)o01UNT&wgqB>+Y z9gP8gjyC1+pxPpnIXujvi({kOqTy$Cz3Me6NrO!vQh8hb&0dd>>Y#$ILRgKk1_33a z6#yamF_)iK;_G_mF{Z4k!b;WAX1Cu(?LIlYSu7T=R7h>NH+!1>c6%UVyQ|$r3&QVT z0V>~<>=k2Q`IxCKnas9*hH2dpVl2PR9d^q-;F4WaZ=j$T9KZ%4@06jub7kRPr z!OCFS>L1?o+&#C-wvUx<$CpFHhjJ(6#8^Wn1Y!VG3dYA1rFVp^p@ zCu1KeEW-yAekN{*vkjTm%nsla!Tg4R0bQh5 z=p{#G&d9UsF0D-H)LxtE-=*u6`AmLvS^jkDV7Pp?&6=`7*Qsk1G6X-yEB<5(G`dUl z13&3;ieXhc#rtL8XX2N|)8w?!E z^5NovK-tqnGufG};_g3SWf8z<9}1sAC^4tqGOrvpue|ObGgm@{G?)ie{iMIR-w}*A z4Mz7nnHGYi!TbjwNFaR0nni3Tx*dukxzA4}k)rTb*V^1#V80h)h?jB=Lb}?PRxkB$ zqSQ-62D{7CesoT3FNMlPFvPTP>S%_D^*my_Ow6lls2afMV)7mV(5hU7=Qc`aP*kQ^kU zUqS*U4D52W@cr=cVKCRs12!wpPLFsQXng+-QRNRk!kuJxpQWT*jNU`uHI`231#?=z z>ULJilpv2z9jNcG8B7S8%$K?cx`%vkneu|x?5BNKN}p;U>KH1#WnDFDUG+l3jn!k; z`a#v(2`LjQ=ry4gjOPCJ!KCzW6+B*W#dyVa#ec;-mQ>bX6HK*!>*V7nuVj2L=W5RN z+_BuXzs%iw!xW6pEuEH=w6gv!seasmkbGEr_R z5q?^t*{YZSv_ijCCI6X9g!1qc+20^09_YD~px@1GrgT5sxh%bufVMtNUqIs+A<{ac zPUnHyMmF1``QAlKp_Q&cC_^Y@PcN&krJJx^hfs}xYlpTV>_@O7%w;2(FYu(H7z(}v z0GN#wi|UEvtlm~+ol+!=SyPpwxRFdnD4`e?De9-K>%{o!Dw#&K(wyPvZ8{mTvKR9T z)i|_Gq&4j0yu8vXcP-j!mcpy7eU`s(Q=s^IV8eqneq|F^{`|W}}WeVE%MK)HD zr5-bFnG#f*CPO#`n8Avv*Bx0f@*?F$6 zx#YQ;eL!iGg+zZ_tJ_7FOK^ps~HmA4V z;cq%#05$ipmX%hL!}?d!;-&kE$EdfhH4w9)C$Dp`(((-GyT5!*!i+kc#eBzQSIaGl zM^OVz2tk7=<0b8Ywzq3UoeVnsx;!%;yK*O>3pysR%0AwV9aU1t$mrggb;8HeE;;)c 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 Rd}@>HSrZu*CO>2i0szJKMt%SQ delta 202 zcmX@avzdqYG%qg~0}uq?|CV-ZBQFahqw!`T#%e}`LjBO<)S_bj?8KtPJiVlh#FETJ zeV5eY?2`Nf{Q{s&eqLgZenx6ePJVfQQBKO{t4tzHtVNtavnIc1QIBc{G8z~@a4_%+ z^!s)CUFMN#aJ|7RG{I;><%FySf)jHV7+nxny~wNfiGi6_yo2!$pUQ&3%Y5n`%(uAt xZU~EYd3|69N_^p9;1ix;IU{L-(q&%NPYf)q(v#CzRhdC_A8R6`{NxX;K>!)8Ky&~A diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc index 3693ed11101cb18d0ed970cf6030b8f2b5d16a67..95262a9d2f00cab415fc6b26cacbf52ac8c3648d 100644 GIT binary patch delta 1056 zcmaJ<&rcIk5Pom_W7};DwzQ=vu|-3$3N9oV1qz5MCMH;kMH1>^v-WLjo3`7$-Kteg zJ(#HRV9bV~C(nkXcmDwoHmO0fdNA>#o`l9ki3jJEA`#R{=G&P!Z|0ksw{Q2q^H*Pa zJOTn4$2gPb5&FoSZQ)u*;|v(fh@ccAm~eSq;8Gk$#FDZQYsyM&DI2k;?1aCIQao`0 zI*1d{Nd!QFxBy)hchn=lgpxu8q*Tcil%oDvi@o@XdpSI89J0;^J~P57Hr)`S6{)0V zi@Ih|>-?k@0v6E5HGpNLWB4>>rS-jybrx^RA|`mH)jahr;+)NBw*{))N-Hag;0%V{ zEsH3Fw)2uGYDt)OP01^19a^$ws9G*Xt(38t{8d?#b)8Zh^DG%fk8-Baydo9lf@0d6 zwx+QzB9YB|;w3GvP)#IP|}FdELer zXOGtl4)w7LY=;r*GP;HCQz5Wp?64nTr|kG@aN>8_CpVu}pH}PP!CKp3-7(1OPa0)m z>BM$@NHx95xrLc&X*w}?aY35Ba4s=NJK>z}rJZzzCb}Us1-gs&k7@owJNAQiL6%V! z9_|b`;0^`PRSiSJ*}YVwtHH7VO&HsvN<`fzFG)mAOOol!7D_7B^VuuM3yLli zS(lqX6Ws^(X^_DI1_v3i*QI`R3y>|DvXLok<~gDsX1f439kGH+%6VmivUg=Kqp`hw zwP1|bxgKo&7RLzpfAII#kasOKP(y*WEj!RxL%t2W6Cd3OaX7LeaCoQ*4Q4edegR@+ B{O14w literal 3415 zcmd5;&2JM&6rbJoH{=syAZ?Wqln*1bPWUP{g(`uBMok07p(UxPv+<7Yh4rpAvmtSm z6ogs{R3v%=dMbw=ifI3aDqMSsWDb!9?V*?UmJd`xPJJ`$brOSsBO~qe+c)oPe)Ha2 z|IyG8L9kMP{g>?k?r;9$Evd>Z9|qRi~4X_-qrF3y53(Wq$< ziZ2t&4BKMZ&Q=4exF1wB(`1-iVB5uEbhLOWm!^c-<1|Cq=qNU_*s{5|aZ6WmpJ9Pb zDbB?&=!*DovYI|71{{&bK~lw#VT}@O+L}&utT`B*sV>+inS?}Lq**fQ3i)+?Rl6^t z!Y+s~e5V9Sx@N}&U$FIYlO%^hJixuVJ^+V;=D^Lp+IdZ_E8Y1Q;<%#(_5v;qn9*8} zumohCsAdgHZYw0*si{Ky@YDrK0K@J9xr!F#4gNzRd=&2yxNWjj6kP?~Rq4VsoL`v!^@J#w|-I>_4<1hr);c z-1xz>$4%`^C=dpLzv0l6=2MFyv^DlidwI*jN6iPHJq@BZ{PUK%O|c~;HMGxf*>*d; zpa8eB5Co%@MFlk+S@46y74{`0c`fiU`aRs!sLX}~-OciBlf?Pva8JlT+aBnS`(|;7 z^Lu12kGJ&rg0shDF8P>C9x4(@9{PMBc^Fc-q=9?Lfa}`gZMg%U?nsi78Q^^7X^52&t7RA0K6&%07YQl2mo9KfLqor zfF)Qbf>#fgtXu_Vy9W&A^D5?Zp=s+oefG2Np`m(sL_4*CB8>uJYoLj)g=Td;(|18{ zfa`VvS%v3VIeMJK(^Z4#?$l3Le!Nod=$vcpEQdNdPF>HJ`N6IoJp8ue)RGz+9_U?L zLi8QTn7$OEb=Bj3tSAQU&*7yQTKoD3>gwke*lb!?KJIs$@?QAj zMR1bk=+QT*9RbcDe1d}Mv~Fk8X$s>4(RNNcIN8pLn8&<_MWu@S5OMFLWe_6K_bZ`~ z+<&ge>28qms%OW6z`&HGMR}LxTR0=3wq0|mWq#|vIn*}4c_-)FcF&>Kr9hjscd1jB R@KQvUx&&F~9Nh&j{s(>HXNdp+ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc index 95dc13ffa4f53569d3ab0564554c9a1918fb54d6..878f5d71ad52bda1a2b5212cfb63e4a4ce53d471 100644 GIT binary patch delta 328 zcmZosn4!RPnwOW00SIgv8PhlNBrr0XY|drOWAy0M4=qkDD%MX)N-R&!O4N7BPcF?( z%_}L^cTFixPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD1zO z7Yg$OEofj^A+mvSJNriV&77AsEjLeO7G#x`0!sXN!SJJj;ev|8PWBCk3j!CEtq@tk zx+HQZ`{aEbceFKtD!>XpFfa=GFy55&nh^ShnL$W#iO7P~6^;ut7RzlAx-Mt}l$d;s zbCQ@4$ixPQ9fCUycZwVkJy3X1;*zE3<^nEXM&{ds5|fW|YXEgiPX54ME3#4ivYh2c z@fD6U3Kxhh5S>-ALHy$6S{^Bhj~ooDI+ulX7P`+UoM1RHWJ1w|kjdr?+$XQ&QDff8 VetGhB9v_w~a$cV|tMlGv0s!Jwa)$r_ delta 308 zcmbQC(4xR|nwOW00SJQce@olQlfcMmyg8RKkI|q|KeRZts8~Ncu_!T5FDWCjBr{Rp zCAB!aB)>qv04S56mzblUk(!f}U!Gr-lQLPExlmLPXix*g3Xu(r+u1j=Z|1zHY1zQA zc{#HntBfR2>cypTeDh`vca@^6;1S$Z_e_~)1^kKXq zD)oh#K}d0l$b!@rjtesu%WV+4E@<)*EIIiO=OhUckckZpI|O$a?i4v7dZ6&2#6?R_ zpnWY|zKk3<1SLK(uyD#xzQV1+45I&Y*9vS9zb0q7!f{670+9uxvnno4p1>m|{(*x* wRp*+J&Wyqdh7&_36io=3Y<@vVXYwH)HRc`cS0=ya@nN|v=k;Z?HSb*}0K5@vWdHyG diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc index 474beb313af8b4c93beed022d9064bc0b8de2229..a581f709db389f3fc1cbc5fa87a5ad9d423a3884 100644 GIT binary patch delta 106 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 iS8kY;se#PU%Encju3q&jc delta 2082 zcmah}drVVj6#u^V-rIXy`hb@5>xjrkU>FWeY>H*I)Zi>(yod>?Zej&Ue0Z z&Ub$2d;Idu)K1f7qfw9O_vDYi_xx1)iRp2S8^~7tA?`e>>73l7>0#@n&t3@krk7nuq?-;?l;9 z)4QZaWzNr6UUxq6am#eeCGO&;bMi#P#NqR+=3JrgoKMV^ZoP}hSA}hS##+3HSfQ4f z>}#|jJM7(>6hqE?ZG0a}YU$6A&%8~IY2399p{F$nCD|mWa3U_D6(@BGfr{*>=tLwU zh3&-`n4Bfa6Hiru1oefaYnh%Ls50d93VVU(fG;U1LbQO)6j?o{L}AW`kjN_RFo)0u zoU>q*^}17KHR}^as+Xcq6cbOGwMri?Q*95V$f?muy`qge$ej|aQP+#qm7^}OXjxH5 z@&kohPUK0w&#D#fkM$(%^N^c*!?I}QgS4t98byRBvnFcKexnjw`-Q1m^lS_Gw_ zQ<%flGmT&KC_E(%bPWHZW6052WB4CB2F0K-if%P6h34A9paiQ{rD(~F*Rjd+68eBq zt7}DFqxUvVm&}7m*tC=>QKd$S`HJo=ep{o~dJL;x(P}cml=7k(LZW^cc%uO|?tv5w z)Yzm^(a_e8mRrk$>O5s`6s?KS{jrhsmOG4jw6aoq1UNOqPnr@ zQVQMTAIXpbPdUBM8}1^Tu!5ZQv>RsaYo|-D*f(CYY$CsUDshJ7S0?fn3~WQ$5@LA`dtK+d-U(0DUUP0(M4S*j-Z9daZp)Zm6WkSZ^{hE`%kG-$ znRT~awXdJGtS35eyDwAhq_3kfm}W8->uLR{{#?_9IQGb#CGeY;nimW-&w_<0e)r^? zUP+Vfnv+yluW0xJ2;^FS319Mj!=(PzdZ~}j-s?7Kj{-!=E7grnFN2!vENF26D}WoI zA7B7r5I_b<030HJR#&WqE%57e?ad~FODW}A4BGPmM*&g*F95tqw$!W%Oi@+-ivsj} z?QN4~M0=AqEqcS(c*WOv)z>r?zvgORLcLuvU{WtK0? zUWyKSFtdxkL37OKg~Nk~BC&YnAXGg_eh8k#%_P3OnX6>W7dK+^;qr6rThuc{w$xT| zSw^puq1wGo!_+7p0XPnD0)PhqZwan%?haN{?Qec{t}|<;agraZ3krEmieIqvSz*%| YnUt_(drE`L)BYs{@~*;Qyds<7ALG09=Kufz diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc index 71188a89536d194b87dc008790793f68340d9391..3b6c5541390b749081f5afb859076afa3349e226 100644 GIT binary patch delta 402 zcmZ2#a>0b}G%qg~0}$9UGNy}2Zsc3Y$Y`>81LJabmf1{mnI=bbT8Rjk7v<-rDUv>%8{Oplrx)!}+WQf|KVOzHWulQnoJGG9}0oP3b?7axP76XPdI z1}XIq%nV`*n@{lFV-?T>2Ehx49}NsQfO?~+L{Hu=A_bIH+4&l$fWNl#y7HnW*oQTAW>yU!Y$Al*!La z%+b$C&B@6x&o9bJnXJlH$+&Rxe6AU+QidB`E^fBtp1{Z`Hu*e{B*z_5iN4Qp`Yl^9_+8Mn;{< z+G4sal^mL!lT*YTS={_IxhHQDTRAyX+>+5@@?vqD$*;wG8Jjj&N}OQimu6I(kok=P KNEKNCjRpY1&17c) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc index adbd9bf847e12c60002b294fd4ba8fcf9eb84494..a4c7f066b15283f832657b33804fbe634d705814 100644 GIT binary patch delta 1462 zcmYk+OK%cU7zW@OI;h-QTcKQRi>a52)}p0Yt=8Tkp@q`gdy7^nj9e^WxL8pmnZ$V6 znP7}NNsNhG!w+!fN;l|&#<(%A+)ecl_?_Q(?W$g}J^r$Os_{R(7}LJvH@x{J+j4PI^^hMbe^ljp&lCG{ zMoeey;jQ3~7!TTAsZcHPN{~V!_dltLvF*+!6~&64q?zks0#Xupf3%{2Bc0TV?{6m z8F7Bugl4D+1~4<$EI?2Fk{{qOLRa%p-AFyGQu_E-c#XIDq7>+@xjc^>{1Ouw~ zA)Mrt1(d2l>)ErRpJK%sX$HnUjnL0vR+pacBiACC&8&tfBL^l~E+G?T@Q5cCfP$asA zMC*tUMUm)zi4nzXRA8^%ZL)1NnleF@Y@!rVno-H|Cqprd4O)7R=q?gXw?lNVsg)M_OeVLfUp7pOd`;FLPp{wW1ETrAdJV>gip=pZzvDbBE16*?WIqglpKNdsrvhXk5A%fQh13 Y(TdA(?h5eaX`a0tmZjEoEBt`{16eDi0ssI2 delta 1407 zcmYk+OHUI~6bJB`GK03IRB`&Cf*4Q%MT)fezz1(FEwm8IYe>){)Bq zWHv0j(8R6jM{ubN8y0n8VvJv4z{IuZo-;U|q)Gq3bLQSVcOD-He+{&MvDqvf95X-v zu64LM?l%j^hfDwS$N8!KwAr$0{lLq?{7h$5mCZZ6uT(MT`JR+_HXF}my@^;Rmg-*F zh~+k8-qCnAkxOrRx1f?v#gg8QcruyZPG^#-MN?B zj~>`t-w9d`P)Tz3^R=e+T(~n-T68U&)X$B6%QsjM55KIW@}92+nQt(C7tF<8t%m*8 zYB`aG6Btf%qP^(T%or@3Xf5_>Rt$BVXn|nEP|t!-vtwxB#5xFPFh~$8f>aiyqF-|$ zIgwmt!3E^P`87A1qbxYU8nMj-v>R5!0A~@Js)uSuI>&k@lnLl*L1<-*_i1eyEAPn+M0!jduF~lPcBhlJN zh(?b|zw8@+ZHy}Sjf%T0xM7qBR0tRaPg(FlVVsv$TeCZXlZ2tnZhC~er&!c?dYUK- zWQC4digPUL9rHvBND(ChgD(=vNVKaT21=^d3)cXjDt}{loQbmu6R*`5A z<3wvnH19gm1`<6fn?z4^DzJwwL6$_LDW4LhswhpAVN~=TWhv&cgO>h`=s6Niw@vh- zsw+?Q5~)CIe?_)~26X%YYp<#Brt16x(XfdVZEy!hOnA#iS=68DF`@v_Dd-rd7-X>` zILm?)t~o?_J`9Stn(`Ej|KIRwldKN4ND-VN%1XPmv9r`YN8R|c^=b2j3)n~3wMZlz ZryefBnD1NS5`7&Gv)G~3XX@b__7A-Tl!^cV diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc index f1b457ab9abb111bd15322ed7876ca068909aed4..3bef7c5b6c7d4528b814a56f23610b80cdd2478f 100644 GIT binary patch delta 617 zcmaFg$n?FDiT5-wFBbz4*fKJvznI7?$vADI`Z~tj8?UWpVq}=y!raC-n<>S7F7sqQ z7E4wJC`(~-4vR74uFVTrtQZ+hHs5BoEb!>k4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^ zcTFixPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOD4ON85#>zE(oe$;m~*hG2w!+&Wh;kx*ivGJuc{Yo)Ebp=y!#~ zA1Vnp{<|y#m;MD#y${w5EK=XOfNs0Usrl=>0Yvmyu_Q2z4r&T|7%?B!bh7ubXFg%X O>S4ov!k*QWgB<|$RnJ=h delta 605 zcmey~$n?IEiT5-wFBbz41mFLb_I)C+B;%Bc>gyP9ZM?RYiIH(~3v(Mw6&nM?WC0dS zAeV z&@TYWFq_W;(g4BFNktXh;LY9X_Fnh8^h*?l<^_KQS<}%5*T_;Nb7) z>*SkIe3e7`12a(Q0XJ{Id8heBA=4G%S2nX%8Zfdmrm)no%x0WyTh%1C1m>C>Ts#fV zH+aQ9F|f1BPrguRqkZzVC*ow!Ob&)vCHg+kZ`yABU!nHj2DEI zF7qgT&TeFydeDwr``t! zK32&MN;f#T`Z+o|CWu|(ka#F8IYaBRu<9oUCQif2iVX_6(knX zppz@Vz~rK!`V|h12OzCo92>H)n+0Ar3%np0e1#(fEC@C4yDZQOust8F8Cayga{(Rp r5#-)q-wj|gzltS+L3U76(8G}VsHT&hhaK|?Lsk!K_7irjp6u)Z&_%;< diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc index 79cc8895b1db1c71ee779c27a66254c31a5d4f86..77bbc74c0ce8c11108b148e658d9b48f3e6189fb 100644 GIT binary patch delta 1961 zcmZuyeN0nV6o2=%ue7DFrKM1)B98(>OSK>cae@me5|Dz5sEhcq3I$;;#oJcn$09Cn z(YZw3T^!N4;WB3pF=1&;SmqyoOs7$k5_GuA5)+My?jN*fb7s+l|PN>UuqW-GLP}(Ch68MX$*HgulwM zBg!1MQc)>Zg#>&dKAq&_G-JVT(#iL#rkTHED0OBO(y;RibJj3FO$?Li{ynl=SjAao z?1^GvY2g}=FYJ}N0#pk0qdIBVyOKW~3`v{4QlJl77ce_{yJSs?%euXxxZn$H_fo2Z zWN`(|^Ls+WbjCgUyk-5%Wm(g_O}9Qygg|)qu0A6CBaifTgOruhOx#VqU>R zh;4~fMro8@mK7>rO(8QGr?0b$jT1s9)a|2Y1d|?*XgaLHc&=!f#X83-`5k0 z%Y8jT*xOLJA4(JV*7}e2W+(K8>MEc&LJM}WoBE~6qNay)?=9!bs3fuVq`4+O|=WA_hAY@n@qRKen=~2T4Rxn)0ai7jOU1=41BbdB{JH` zZq|_bg~E+QGn>lH6PAOylVzIf$W3-wIg1^)r?S1K5P6^dVj49Z=Q`CVWFajCC7)gc z+p9`vV_9~R%3fua5KYvUZIBBu$;O=~R-03+a6%ldX8Uu>$uf36r%~Mj#6f7m2TV7o zd&O<32|gsFVoYipEc-DldnoU;{iHn-ylp9eCgU0#IMOA5MhN;177^O%ii(spuOmAVx|I%upP`> z(Io{R5MdXXKSi$>UM1Cw!F(*oC@;WHxl|(+za;jT#M1Kk)$7-3I;Oqz)%eF>bW7&>7n$o8- z&XAE%0I+Y1D{&BgUR+AZ5>{v{CLgjETaok$Wcm%WH2@57QyMN+9B@shY7bTn)ZG(x z?3k@Y#%a@{*K8Gp=-8{0+QOp{N)c3W9R@XE?BkyDazU9;6Tw1}phu&f_Qkv+xxPc} z)ckqEmq4dSC+2VCO`l=JR|uaYpvTI?dUuvB5YE7$IC{LyNvs&rLhgurtbF~n9+J#rEu?CkjRh9xdjeF3Bdj#~7E+436u;kXZ|P%QA9O8yus+z>?%J*$qXV5hH-?2VNEk$zk(8}_z_yO>b`mBD zlPpH%572{zh=Z}Hlguc3)sXmzfUiJEAe#vkP{jBL>K}C@#LVbCr*jE^s5kk3=lPv` z?)lDl?ojvHF7sux*(l(%`TGa058g8mimXx{6@O;ouFw`G&Xv&a7>{+A?`)4HJ7S^Q zxUxH$=n3_pCD9%047JBQI}>{oyt75Ut?gp$eehTdp+i^IT%MFDEgnoLlAfJ$Pof)FtEW#4cw}8l(-u#rB+NI?xdp?*%{d*$0%S^YDchhyAN1eO z&Q0a}hH6Kmr=xE-f3V=}-m&r(<3%ge8kWDBO$y9X!_opX)UZ1+s=v+{3>XrOsrL<& zVo?sp$wcOM&>(Zh@3g5EWk5nCc=BhsL_gf~%grJea z|B>Q-osi}HKZmpiH%}>a&PR=I;S@;Lo0#km)^BE$eb*-IWHj>}_|E1wJybT(+l!4$ z(A10z&uEE#%}gb{!%L`C0V-9HN)=Rx?7JA73ns@3<7)Iy(hd%djxzn2H9R3`B|ALp zDA6EQM;#wBT^JpB2wI(u>>zyX9M-KTMLjgTyixV+<89;ZknE zKw(?qm}mV1f#pPwSKOGFJLDY+oDRIDjQc7lG=kGL0T#E*b~S(LxyZHrm0$S24xSH= zSvNtod#T4MoR1XL*t8dHx*Df&(Iyc(4K+T^MK42yBeGLHO$eNdd=6%SR1S@ z@)xzxmP~kEGS;?($NveF((I1!0Q_R|KSj4z_%S6s>! z__DN4f5(RH$qW^cE$5k$;+3)IU_Tm`Ls+iTAXPi$Fk{Q$)v{9dJX|a*DSjEZPg95u z2>n7jOE8)HYi^mc4@LTGubVB@Ee&u8H%9BD@JJ-PJPO$KlvU4>NifE#;HX(9dhQZGF9dyf&pbJ6(5Bw hk@-x8Um_PACT5>3C}82q= 3: # extract relevant file and position info - msg += '\n (f%s)' % info[-2].split('\n')[0].strip()[1:] + msg += '\n (f{})'.format(info[-2].split('\n')[0].strip()[1:]) print(file=sys.stderr) print('*** Error while highlighting:', file=sys.stderr) print(msg, file=sys.stderr) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py index deb4937f..4c1a0621 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py @@ -4,7 +4,7 @@ Format colored console output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -27,12 +27,12 @@ "brightmagenta", "brightcyan", "white"] x = 30 -for d, l in zip(dark_colors, light_colors): - codes[d] = esc + "%im" % x - codes[l] = esc + "%im" % (60 + x) +for dark, light in zip(dark_colors, light_colors): + codes[dark] = esc + "%im" % x + codes[light] = esc + "%im" % (60 + x) x += 1 -del d, l, x +del dark, light, x codes["white"] = codes["bold"] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py index dafa08d1..aa6f7604 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py @@ -4,7 +4,7 @@ Module that implements the default filter. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -62,8 +62,7 @@ class FunctionFilter(Filter): def __init__(self, **options): if not hasattr(self, 'function'): - raise TypeError('%r used without bound function' % - self.__class__.__name__) + raise TypeError(f'{self.__class__.__name__!r} used without bound function') Filter.__init__(self, **options) def filter(self, lexer, stream): diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py index 5aa9ecbb..9255ca22 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py @@ -5,7 +5,7 @@ Module containing filter lookup functions and default filters. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -39,7 +39,7 @@ def get_filter_by_name(filtername, **options): if cls: return cls(**options) else: - raise ClassNotFound('filter %r not found' % filtername) + raise ClassNotFound(f'filter {filtername!r} not found') def get_all_filters(): @@ -79,9 +79,9 @@ def __init__(self, **options): Filter.__init__(self, **options) tags = get_list_opt(options, 'codetags', ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE']) - self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([ + self.tag_re = re.compile(r'\b({})\b'.format('|'.join([ re.escape(tag) for tag in tags if tag - ])) + ]))) def filter(self, lexer, stream): regex = self.tag_re diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc index 68b7bcba2c1dc28985b54a1235d9918a365e022c..9cf12513d42e9728cd7d987d983d5c8b0f4dfd4f 100644 GIT binary patch delta 1968 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 IpbqZ-3tX%kmH+?% diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py index 3ca4892f..d2666037 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py @@ -4,7 +4,7 @@ Base formatter class. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -122,3 +122,8 @@ def format(self, tokensource, outfile): # wrap the outfile in a StreamWriter outfile = codecs.lookup(self.encoding)[3](outfile) return self.format_unencoded(tokensource, outfile) + + # Allow writing Formatter[str] or Formatter[bytes]. That's equivalent to + # Formatter. This helps when using third-party type stubs from typeshed. + def __class_getitem__(cls, name): + return cls diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py index 39db8426..f19e9931 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py @@ -4,7 +4,7 @@ Pygments formatters. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -77,7 +77,7 @@ def get_formatter_by_name(_alias, **options): """ cls = find_formatter_class(_alias) if cls is None: - raise ClassNotFound("no formatter found for name %r" % _alias) + raise ClassNotFound(f"no formatter found for name {_alias!r}") return cls(**options) @@ -103,17 +103,16 @@ def load_formatter_from_file(filename, formattername="CustomFormatter", **option exec(f.read(), custom_namespace) # Retrieve the class `formattername` from that namespace if formattername not in custom_namespace: - raise ClassNotFound('no valid %s class found in %s' % - (formattername, filename)) + raise ClassNotFound(f'no valid {formattername} class found in {filename}') formatter_class = custom_namespace[formattername] # And finally instantiate it with the options return formatter_class(**options) except OSError as err: - raise ClassNotFound('cannot read %s: %s' % (filename, err)) + raise ClassNotFound(f'cannot read {filename}: {err}') except ClassNotFound: raise except Exception as err: - raise ClassNotFound('error when loading custom formatter: %s' % err) + raise ClassNotFound(f'error when loading custom formatter: {err}') def get_formatter_for_filename(fn, **options): @@ -131,11 +130,11 @@ def get_formatter_for_filename(fn, **options): if name not in _formatter_cache: _load_formatters(modname) return _formatter_cache[name](**options) - for cls in find_plugin_formatters(): + for _name, cls in find_plugin_formatters(): for filename in cls.filenames: if _fn_matches(fn, filename): return cls(**options) - raise ClassNotFound("no formatter found for file name %r" % fn) + raise ClassNotFound(f"no formatter found for file name {fn!r}") class _automodule(types.ModuleType): diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc index 2e1a7c290ad7acc1a5de049ce309aec93a4b5c1d..5df4f879773b5aa00d7ca8d026083ab4cc2c6561 100644 GIT binary patch delta 861 zcmXw&Ur19?9LLYuzkA*8o%?_9-KK7(mfQ52mHDS-xdr(Tl28lIUZLO4+Hf>z4lskBixDZBK9?}`c07$3S8xFrk)cz+}~9u`K&V*JI>crY+F7#ZcS z1Op>N)Nvsg2npc{zP;VgV-fKW1x5!Vm!pv(Avl(PqbQY?cyWp;@Lg?6^e&es70HR@ z@P@i!%9phkEx8xmh#*Sjz*e5FAcBzT#qbaCXA0z1KyTa9IoEa0jP58(k{%n-m*z>p z@fo&ynu^1CeOAjnDBP6;?nF9Irl4u~AX8oqD$i_ryz3rs#?ypet4~s(@;t=H#)^!= z^;pBnfzgfZnij>pY*CgT)RaSLM+wS~o>9%P2JKQ-qPStTcGV>!9i1XTNHGcK0eVOG zW38H0VO^>9E9L=?9@kFDU>W+UD?=9j;?;KtCF~UIlx^^vtwBs-E#Vngd%-I_~ubZr>AMXEcC z3Jq*eA*Myzxu4eo%D4xh@?1`9n;S{iC0(iJR4gTk_OlyWuSk0La~f6xv{{nQX-txA zgBTWzeQ$klPmA`J4Q;DPw(jr9@eR6d=!QM$gW(HZ1wfw+fIGw;a*{+ZjrEX3ca4m> zS^>uNxVZxhK|By?c2*Mup%c%JQC}Y%5gem|u;4&l=0;e6X3WRqKTtO%dRZ?8t%pT%H0u`Fv_q8Dg1WU-n7SB?pW$FD@giq^)}=G9s;J!^Ri;Um<<-apeKrNbS9C?mOp z5`2=9+(W!#(ucSQJ}O+l6om5Vf6RyevK;I{4EMQE0=J29Bs4xE#G!B>qG_a4^-DNGMcW5G55k zm{?;>igTdE81bYB4`LIei6$Bknt0jGYWPX<=jO#&3Q-d@aTen{eDA$^zw_qJz0P}` z+&hk|2AGb0`Y{q(<|qPo6s<&-2xWuEGl_I2I2KFCCfZJ)jZKcmg8hli*ktNl@Eo?J zCSu9p*+ep#nogyY@#2bZF9D+M>S~e zS_wpyKtv7nR)CK3qgT}(Jm%PB^{E!W)`D=$;J_US$YnUFo6!SM95r|$tV4O$MKq?- zLpBOS=sPP>uAZkC6vT6nXc*UJ!EK1%aHp`W&+4(J%5`RH2!3|f%8Xdz%=zX*zsh;a09Lgw9VxMV-n?L+w5HjOG5MAR3^L>UY1YEE+&kL` zEP%CYVABUeS|U2c)XZ(HTf4U|k$p}lbNgQ|+@k1@=zxPraBP?~?{#`S6`x8bGUXXLxZa4%h2hbB~ F>@UDR^vVDL diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc index 7d294d392290500c8d6248f64ee155c13939b63c..ba67314c91139852eed129467ae7726a8597d3e6 100644 GIT binary patch delta 99 zcmeBDT%^cznwOW00SIgv8PhlN?C0~Cq90nET2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Yqn7^M90Lg?Jt^fc4 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc index 8829c9bd379b475b0220882db22361914e3dff38..e77a9a1df03452d5ea5c1fad9182f903532f82e4 100644 GIT binary patch delta 363 zcmeyWuu_rtG%qg~0}$9UGN%8S$a{^^WaE=RtR9o}LyJ?3iuF^H63bJw67^m3lS^|` z^Gb^KT~kVv6H7Al^Ynw06LV6F6daQiQ&Mv)^?iI?^nr|gm#oCR^!$LL{H)aElF0(> zXSvyc<}(BF=T8ii{kWu5To__A7#L!h7#M09Ynf6QD;R5;YguZTQkW!xs)}T4m{XW1 z7jTR4!Gu;b0>v378*r3PHslfJsA04La(l8SAK;K;s;-@Uhr>;P`4($&No7vzEw;4$ zqTIxi$y%H-yeojp8W?U!%g?u(V>NjOr;N~bN!^Q*x+_vPn6J#eENOF5z-ICR&OBxY z8MV!ZT%pWDazGuoSj!S~N`XEDvWpZa&*1fE)R_E&*NpkGjQV6Xz6xdrS&hjH`7Sc* oOfKdRXEd06nm=611f*CLM2G;1UmP~M`6;D2sdhyclWhbn0cSgD8vp>`E97kT{|btfzGnQ=UjQUAoi#i=+sim!qhL|^5*$f!MeIe$2# j{^bAs;ZnvR9ikvY1W5eiu*uC&Da}c>D>9#4AYcgqD>7O2 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc index 4ac79dbbc9e3cc41edd00a79ef59b21d5fe1a8d4..486adcce5772e024adcc8abc521725bf0d93156a 100644 GIT binary patch delta 731 zcmYLFPfXKb9R0p^?K-x)&26x<3NjXS5>|+)6Ng3x)W{#>pO`2R%i19e(9jKVqfI>G zpG3&d2nP=yA;uW9izZ$;Xw+RG7+BE61I9!T#)t|x_xj$;_ie=H4sr#K zD?#LI#<>6cH1`EJKKWU&o}3mhq!leK%6-zfl9I$0H8DD*3}@0}t2~;JG6U+ccrGCg zD%#GY2}xFlvSNFCi%5vtl9Gn|)iau!QW6>1pg(&U(od1IF@_PEK{|perw_0#QJq7m z+k%i`HE7v(4I7MM(`lLI$vN zq>+(bx{cH$(#YtxBz)k?Slt>Y%55EL*<+Ro15~!Ua>D4zS-U$f_e89klelYiI+Gn# z)|jNK4M`c8XGicm2-+L!?>F5zJ=r?dSS%M7odRLUi!SffiJL~z?VsgW`N$FsXg1iNt`R0si_gabnSH~6H(9RL6T delta 669 zcmYLFOK1~O6rDHu%_Nz2qLa@gLz||CkkDje+Tw?_iy*s#(hEK&-U8pWL-XQsJbDS6Vst={lL)el&Jjqiiy_A}VP^=8 zLtKoH#0U*y=vuBS+N!FDh%idv5P?~^E}lkn@LHT?cBIHI<-s3A`?JipFVUl1TntY7 zUog0Sbr8oHD7pKwNpksr*af%~xZ=nYaS}s!2!fIucq!voh~_2W!SItwFI9@GnmVnk Hph@Z9>#eFW diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc index 7bf8906703366f3650850bb207f9af5d6aaedf24..2971536774efdfcb3e9e8c4e9f11c9c8f503f8fc 100644 GIT binary patch delta 4430 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 KWZY0Xy7X^!d7Z@o diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc index 0d49d92921c34ee9b49ab4b4a088b84653cf85c5..2a07c40bd891980ef6d522437e9bb0cdaffac599 100644 GIT binary patch delta 5729 zcmb7I3s4+KdY<0d8TJVayUSxi%OLSu350d%Ez4qgNk|Bv1;!S(j232q#jwlu3_{?= zD2|pL7wr^+Qg|u@om2S0%B*s4O&6BqilL$Co=FdR$`5cjf&5 zEFj5sNhJgOP50k_|NZzM{r9{zLylh}$^Ynd+BkSN6Vmx#Ehm!mO=NYv+|+2=_Eg!u zszTK=xh*uHbcf2SqwW2@N<>r3YUKX*kQR5P7tM!S`EjlE^wMOHJb@TX)wdqpVqG{bO*IfZK>GS^~~NeeG0v!4mMffPCEanfRy zEst|8HrWbjmu-L!*$(KG9e~M$&VY**i7o7Fm({e(#14vgR>>sBwVH7m_-OXTo8w|c zHXSu3YHF_LSfF<&FO(MFEHBB+?$}{7(Moo)C6^F(`Mz{E;kM)t^D=*%`1FNN)!d#` zjvF?|csA)wXOkYW@Sxkw4RTuM0!z1Vp>*@zy@Z{xx{J(5NrFcGF{0Wv{{jaLwov3^ z9NW9b!zPm)(*H$hK=_u>r3;d77usFG?nw15B`{ZG?85(nEr4u(WDAH5wYr%qA-PHC z2f`6ultUEW0WY&ziZ@yIg=jd`)}!c2T_H83X;e2wRo&bd(z`_z!D3ZiJvJ{I!D5@9P z?<{!_%w{ebH6L_du&0e}81Fb^FF2NVJmd9@+4CJY>Jtl z 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc index 76274debc12e0f9bfade84ad4bf23d1304ff7548..20b949c16ad22f9020772a44587259fb5dd23618 100644 GIT binary patch delta 158 zcmX@2e@UO`G%qg~0}$9UGNy0jsbFR_+1$!p#^TYhA6lGRRIHzplvtjcm8kEMpIn-o znpaY+@0wDYoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}l{)SIizNoU*S-GETcZzQmBw=w#Vd+LMF@%vZ|9`2G%qg~0}uq?|CY9qr-GT$cylXr8H+)=erR!OQL%n@Vo_qAUQ$M4NoJzH zOKNd;Nq&KT0Z=ACFEK|yBQ+-{zdXMvCuOrU$0tsiA3&2D7;bRzT<4Iw$RRbu{0fKi r0~z&C3<8|0lYN8=*=KlsVqg(8n7m)egc(GC6VhV_%57E`Ud;jk+5s-@ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc index 315126bd0914f5dff411c59d2c1eb96b7c67750f..ba75df0e425eab83eff503b212c8cc01ecefe1a9 100644 GIT binary patch delta 2544 zcmbtVdrVu`9lpoczBUBM7cjPKY%s=P45J2^A>ub<=(>pEW7^IFI22BaSfb@QULo^UiC5uFWr zN`n^-&%pOl!0V32i(nM78C3BMG$ZDo#_T9!0S>bl5F0PCM#RDsIM#&NMK5Ls#C!qF z+7X+W!_0{5E@7s}SxJe$8WF+kBC})Bd^*gqVYAQUzRdXD=Khd(W||3dVYAIQ<8^bB zp`dxh>kcri?zq?OW2WcK!^8b%L_+<3cW^xPT{h%ryd3gSm8N4s326A|_u|fO~ zAu&goYSMpcv;*yVWORktkX03w>ZRGm*^Sn&rzB`Nh{ohe*wJJZ6;q?#>UQQ)WtEgoHrB*vFF%v&-rLH8jr`LQItbtyhwRMtdC(M{@pguP8(_r zGhBcPj&l=;k9k6~Vdf(4bcH!~GB~blF9q3|027b9#!3#TXnv2&ju-Bj;dHzuG8KEq zOZAacU)ir1l`-Dpz`n{wM7wCip1p4>iKpX*t8AZfB6GP_Vk(T zS#R#NFF!0}^0u*U5>!rr1ocE#13zkM69Y?QI_%fVpGjy!$4&*8{3;l`KLPgb2oo_mq&!wtT!jx^z zu%=k!GJ~0;_t>m@@KMFk7D+T5Oh0J5N>viRs+b%ZRmT(v<*Q<-eZB$eEM@R5i@ExL z*_xe;f)?}GvMH#ULN6q1#DMM*!OAfB;lqOwFbeI5RzMJbbVv`PP}Kb`DuR;+UMKXLbP!t9xgA5ymo87NaPQ0CA*n9X(@}C+b?6-E3>)K8jw>FVP zodv#Yb&%_gUGOujo+Jzh((0a8Fu&qR^lvC@3#$6-(w|FHf|Mm?NO{&&Yvmb3hRclI z>&rF|{8i;B$ZMCJi_WCsk=(c?CbUgk5<;#_uvfcxGkr-m=}YNTucQXoe3`Bc`@8Op z>7FI4x39|wp3urA>7sO*S*HzKmjR(|*@^&ymZyJnWDrm+-s1}V;^?5LMO6RvRC=iQ z69Kph4;-_Cd+Fe@JAe-25<3R`pPRi2Eq#7)3$FG(Pd&ifz72DI4dlAA2R`c?A_>)z zwBtLEfaX`I*hI2o+;as%ks2voKNDbYL#yq3)ZcJ(9emqXSC>`vvIbOh!Xzw~kB&_S zIEEeNLhMc4d<*7mt<-Hye+z+KPyHIvNE_5S6!6>j8fpX2!@;w5gZ^_7sVaYSVBz?} zr9=ZdCc1KAuApyztnbO`dorEt`d)a;u2v9@FQ7MFsalpVUrPA%v~If+^}(Y3OK<}g z2MpRBGh`E%Akgs-tH*1&18W_6^}n#`G}50C|Gq*z*-tN!h5fPx@cA_bF^)Ld=X>ekk$BoQcu+XIRmKCSx(i8KdDt7v+zh)7wS%OQYU|=e*DR zocB5JJ@+l2T!hbGfU?hIvJ`-y{kQHm54|I+hOh$dg)^yQoTKsI(l7(oE6GiPM2gKV#Sb*e-P>WSx27lpvxBs^(7*&>t57^qh)wl zNH;kHp;_1{kfV6_GRzl*(#8h1j!YMuaziy0_kcZ#6-vj-$Bkp*g8RK z?IpyVEb1o2C=f0|jwc8Ti%ZLTOCRyMd0%O}lXrHOxLTe5HfO2L?Q8dYyGpyT;_Y;L zN?Y9?kN23D_i#wUJOztUD^te6B)lT>{Z*$*yc_9wNQ59bQK-8AtmSL6%FUKu{E9xHVaL(%*y_@I%JC zPX<7U#fqFLybkYGB=;sV_x7HLTv{@pzS0Bdl^4Z=OQ#C^BvhW9nIY^i5K{MyRvgN5 zu)P2u3SSxxvPWd-_PTVaLM0}H!uW{1hN-QSd(TOM%u-97#$ugA+D;#*u#2J(EN0M3U( zvy98jb8fz`_FjQ2Q4nzW+Z|()zJanXf5>saE$Q%nC(2~9NO&}EE<|6Odte7TP*5c~Yh467 zsScegIMx5qj3#&3Hl`l2$21Qt&`?{k0H9)hn3+pW57(VMJ|kD%)|!S7j1`O=p4P6P zNyL_s#%b+_c?qqpTmZD9YLJ;{L7FPuc3KygtL6dJZo8eZ%^KMo)2v?*Q`!v+fKqG> zGxH3Pt0HM9gK>FgJVS#fEPBy4(oEbEkwK0Mits$pLGgJQ4Hd42V*W7xcIf3I9dx2= zMVnwd`o3sCW5e_3>q6U$O_rE`{UU(UeQ;{EcEA=cjIU06#eUL0nKpUghV^Flp6S(l z=V_ux&lI0w6nF@ON_<3mP?Z=w3Hq_bfPQ{Jikd1))BjR4gmK1gj8@#DGLDeZHWR?p z4)|08htb)MeefxytUQk|_U%d|>_f52Vy2gf-AG*ZvZft}v#ihG>v2Er^vu$}F3+sU z)7FV+2VJXroY_a-!-iIE`h%U*nwP+X(mW)ymb0;(@Io?CAX{n(;C~B%zlzwMN8mW}?JQwF zB`+F9Z|pR%F*P1PiL?xTwzGl8Yc$I?4Yi}V!b0;BQrM4Smf7#;+d5k;kiUjfY93?e zh(iu)saczI0`MlhWsgNPo6^|a=JC7vM!%Q8N@~Z^m6}548VTP*u^J;BLw9S+m~Tk+ zaa3Guax97I%#=mIN)0d84pa|xhYk2j^;68jT z27U73jij?E`nJxfyF+^7F~0+TI|1g_$Oq{7np6zxtVJM|BHgYXv{afE<#rWO@L3dY z$b`?K@rJeehB`L8yH7ilyB|o_| zH#M)MSl>0JG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i=I znK@U;7HC5Q!wo*6{@l*o4(8i3>XXY^beI`rH8w9}S#9(qO$4f@3$@!cr zQnQ&-IOj62W&}BnfuV`9oS}j_lA)YYlWX#7PCG$9&%Cn4oXix3iedQt+#o2Wa#` z9Wf^shC?jMPU@QjxqF!z<0s$e`^T8H`5r$DBbz@^MX~(k7Xnk5Z!2g|ZV|NOU{KWg z%m*YUpBI#52GOqtr!neJZW7XD<7W+G{H(NjgHQ?+TNg;D{p21liOEKyi`W@bm}=N& zGi<&sI+01XA0&4RNC1OGOs<3bhM;f<8<+qEOuvMr?2PCczAFS*n66OYAhf}CgXIpF s3sR0(d7M750)uSwE{U6rjhm-PnltkGGcpRy;QYb>qCccez9}UK076NS6aWAK delta 504 zcmeA$`)KQA#yKO;3KC%-(uC?{nyH%qR#6VRjvh8uiB{kfgF9n3dm)ITw> zaH>x3V$op+(wld(tYu~l+MLcI#mFc*xrtLnqKb`yVKpPj1q=*LjO7d!%#jS`jGCO2 z4{+KEN_pm$CFW$NC?x0STL4f+vF7Bz0#i6{C}@9TVC7YqJVnq> z6G(sHV^Gxj#K6dFGLdHj>x9yq0-_VL7lf{GUEp_74Co}FB|y2!-vp;I>P_wy(qt82 zHU6x!d5=&E6Jz&eMbZ82j44btY_l0RKNp?IEir%GqNc4h~`&Ax~53C@ilTSB`L8yH7ilyB|o_| zH#M)MSl>0JG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lA- z#8k}4#Rjy38;C#aOuo+?p`5|M5W~d4P|H-yoWfYk0>rE}%qdKgKovzYH7qI2S)7v> zvJ3M<#a1%{B^V|rvGg-$P5#89#8h27S&Y? delta 289 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 Z)v$-RrSOvQm_KiUk+rj50Xmzp{sZ&_Ft7js diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc index f3cae6ae3ea0b0f8df51298f2f2e800e4c07618d..b1a262debc41d3b6102c9ff815b879e331ea7bec 100644 GIT binary patch delta 1184 zcmZuwYiOHQ7(OT0Ce4>Gx9^fPiAhsyZ}VGNqZS%jw`NU8TgKK72JO0-WV5%#eo3~b ze%TcK;V!UtFWAAD6!#}nhTY(gKEOZX_;qO{mzHx<>b1m$^khQn%_a*o=}bN+ z#ZrZ2B0rJMNGFns>9ic^NhVV1nW8i>&?`}p?VU_y&Sj6u*~xS=UvX+N#;yvddtV2i z)jh!G%ADyJE&il(mU#zb2Hs}58>|anVR>j{tuV@(;SlSAw^$xKV2KUEd#sfr8fN5D zyn-gZ@C6%;I91N-m_P~|ckN+>iYSEgVohs8vL2&UeMx%?UAuDufzh^tIasyDEnDW3 ziRnT*Cd*m*hF!s(P_ob4H|@@a!wbh3geBji51xDX5Evaxhktb#YiQi=&7`VhU>#D9OZnBS*fFzy%-zhx&BtWQa?{~rW~rA!#NGTJZH(GSmv;- zVpq)uKXFMdeGVAlgLdH~tTI8UWL2ywG3ADf{0#QM&wTrTSv_B?*s#mWvB&DRsg?sH zMW6aVejfe zAKYGv3%t6T|Ge~RX*IhxLi{Hl+lHUo1UTcBnl29#Z%29fqi_EgA94z-f>F8dkv#p!7Mps9w;cBRQe2uAIA}1%v8fo51**J(roArsd{kvCNfc%SjTB6TW|=?&$a47og8q(%dq`*S>gSad5f6 zoLJF4*?(}I&KD1oeLYpKI$KSW{xNcTii}N@=^2tKkeT!3e2Fw(+;Cl@J=_d0S{96( zHerd`CD>dRSGbkgl_cpJCjQ~awvlZ+a)-7ZFzRnGgpjXgyQxz0-^chRkOCuy{q&CH zez+3Y*A=F4%aqSf(cfNtBfVwL{)OeZ>NCjcTwyw&(^Dm&4%w!j?uPAv7k^k`f&pw8 z+Or&J>=9jh|4v6l-}WqnSv@bS-)5-QB9Fqg#_RYDctavS3z5*v_E8Py7rK5!>b@KH ECl2LH^8f$< delta 1071 zcmZuwT})eL82;Xt9$MPd)5GccX-|KtfTd!Yx-c?HgQ0*Iog)Tx5fvg4re*O{Nf|u6IjJ<`QotF&k)Tb}>ziS7u2E&I=P0ztgVjh2O>Vp7;Hp z^SsaZ=KF3B{x!gEvuqQg>*=5Vc;WInb{`(S0>41l+2lwerx%h_Sv@=R@WjdN+^KA` zKUbKVn?0R8O?PHzviao6Ts}X0c2>`8rGym#+De@bA2!${_ZM#4uQ(%-rg~m_*>T4T zpOo_K8vri6>y879DNe*L&W(Of;&{!nWi{OpVvuo;GDMuGdlQ_57ioNp#%mmd70HXY zICpDvjZ4TWlP}b>1rj4bG-uIzg1mDPgPt$Ji{E>Ou!T1uj_drQXXBBL$qjv@`*QC` zy&tF6Ca|M<^+-hkhf)^hrGY;SE-H5YL1)@QzI8ODIqT$oU)3HgMKeE`w-K^RFcp?C zEF6L*92R5ih#2Kx44aD_cQp#4+#N zV8@Ic1P4yZK@qejqk%GSuHd_@eh4#Q3>H4cZLiBHBohI5f>YrKi` zP_WQxG#6clYaVp-Td3Dil_srTO~luvs48ti%}~*8xHVZ*{G^{ef1Z#cM^7Z-u9N{E zM&-nR-L=*``>XEwn!8Jmx)u<_rv0DKJ*uOiRXI%WK#$VHtN;G7ATP-A0KTs5zymny z3t3tVr87Rp0$o^Cw;7$fEWC-w0!by5E{9syr$3m!YlZMb_XzNv6^8H%t^|^yrA%23 zuct1gKJEV^vz4h>K|T6A0rqi95oG)|&>LG}%c8VAwF9+HWNVDSzo(~r7Yfbya!HxlXLqkI=nX=En_Sl}9 zxTz*~eTmJ!&FQOyR4tY^)x-g)np-<`&b8cF_QXD15?NpU=oQUAoi!>Kb_S4f`Y cvV`6z22Ng`$^JsA96|>N@1-hky z;fAnG2geNo!4B3Zf?_~r%F`ytDW?Nf$!|WP{GXMVnGvi?T7JIOT&u~qG`}-5$f!*| zuPnX!gH{-;oCHLgo4?>GPiADFEcJv zxr;n^~A3~ZP|^lJl0W}w_=eZw8>!e@Zq Xhg -Copyright 2006-2023 by the Pygments team. +Copyright 2006-2024 by the Pygments team. Licensed under the BSD license, see LICENSE for details. */ %(styledefs)s @@ -73,7 +73,7 @@ def _get_ttype_class(ttype): "http://www.w3.org/TR/html4/strict.dtd"> @@ -323,6 +323,7 @@ class ``"special"`` (default: ``0``). If set to the path of a ctags file, wrap names in anchor tags that link to their definitions. `lineanchors` should be used, and the tags file should specify line numbers (see the `-n` option to ctags). + The tags file is assumed to be encoded in UTF-8. .. versionadded:: 1.6 @@ -487,7 +488,7 @@ def _create_stylesheet(self): name = self._get_css_class(ttype) style = '' if ndef['color']: - style += 'color: %s; ' % webify(ndef['color']) + style += 'color: {}; '.format(webify(ndef['color'])) if ndef['bold']: style += 'font-weight: bold; ' if ndef['italic']: @@ -495,9 +496,9 @@ def _create_stylesheet(self): if ndef['underline']: style += 'text-decoration: underline; ' if ndef['bgcolor']: - style += 'background-color: %s; ' % webify(ndef['bgcolor']) + style += 'background-color: {}; '.format(webify(ndef['bgcolor'])) if ndef['border']: - style += 'border: 1px solid %s; ' % webify(ndef['border']) + style += 'border: 1px solid {}; '.format(webify(ndef['border'])) if style: t2c[ttype] = name # save len(ttype) to enable ordering the styles by @@ -529,7 +530,7 @@ def get_token_style_defs(self, arg=None): styles.sort() lines = [ - '%s { %s } /* %s */' % (prefix(cls), style, repr(ttype)[6:]) + f'{prefix(cls)} {{ {style} }} /* {repr(ttype)[6:]} */' for (level, ttype, cls, style) in styles ] @@ -547,24 +548,24 @@ def get_background_style_defs(self, arg=None): if Text in self.ttype2class: text_style = ' ' + self.class2style[self.ttype2class[Text]][0] lines.insert( - 0, '%s{ background: %s;%s }' % ( + 0, '{}{{ background: {};{} }}'.format( prefix(''), bg_color, text_style ) ) if hl_color is not None: lines.insert( - 0, '%s { background-color: %s }' % (prefix('hll'), hl_color) + 0, '{} {{ background-color: {} }}'.format(prefix('hll'), hl_color) ) return lines def get_linenos_style_defs(self): lines = [ - 'pre { %s }' % self._pre_style, - 'td.linenos .normal { %s }' % self._linenos_style, - 'span.linenos { %s }' % self._linenos_style, - 'td.linenos .special { %s }' % self._linenos_special_style, - 'span.linenos.special { %s }' % self._linenos_special_style, + f'pre {{ {self._pre_style} }}', + f'td.linenos .normal {{ {self._linenos_style} }}', + f'span.linenos {{ {self._linenos_style} }}', + f'td.linenos .special {{ {self._linenos_special_style} }}', + f'span.linenos.special {{ {self._linenos_special_style} }}', ] return lines @@ -593,17 +594,15 @@ def _pre_style(self): @property def _linenos_style(self): - return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % ( - self.style.line_number_color, - self.style.line_number_background_color - ) + color = self.style.line_number_color + background_color = self.style.line_number_background_color + return f'color: {color}; background-color: {background_color}; padding-left: 5px; padding-right: 5px;' @property def _linenos_special_style(self): - return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % ( - self.style.line_number_special_color, - self.style.line_number_special_background_color - ) + color = self.style.line_number_special_color + background_color = self.style.line_number_special_background_color + return f'color: {color}; background-color: {background_color}; padding-left: 5px; padding-right: 5px;' def _decodeifneeded(self, value): if isinstance(value, bytes): @@ -684,9 +683,9 @@ def _wrap_tablelinenos(self, inner): if nocls: if special_line: - style = ' style="%s"' % self._linenos_special_style + style = f' style="{self._linenos_special_style}"' else: - style = ' style="%s"' % self._linenos_style + style = f' style="{self._linenos_style}"' else: if special_line: style = ' class="special"' @@ -694,7 +693,7 @@ def _wrap_tablelinenos(self, inner): style = ' class="normal"' if style: - line = '%s' % (style, line) + line = f'{line}' lines.append(line) @@ -743,9 +742,9 @@ def _wrap_inlinelinenos(self, inner): if nocls: if special_line: - style = ' style="%s"' % self._linenos_special_style + style = f' style="{self._linenos_special_style}"' else: - style = ' style="%s"' % self._linenos_style + style = f' style="{self._linenos_style}"' else: if special_line: style = ' class="linenos special"' @@ -753,7 +752,7 @@ def _wrap_inlinelinenos(self, inner): style = ' class="linenos"' if style: - linenos = '%s' % (style, line) + linenos = f'{line}' else: linenos = line @@ -790,13 +789,13 @@ def _wrap_div(self, inner): style = [] if (self.noclasses and not self.nobackground and self.style.background_color is not None): - style.append('background: %s' % (self.style.background_color,)) + style.append(f'background: {self.style.background_color}') if self.cssstyles: style.append(self.cssstyles) style = '; '.join(style) - yield 0, ('') + yield 0, ('') yield from inner yield 0, '\n' @@ -813,7 +812,7 @@ def _wrap_pre(self, inner): # the empty span here is to keep leading empty lines from being # ignored by HTML parsers - yield 0, ('') + yield 0, ('') yield from inner yield 0, '

    ' @@ -842,18 +841,18 @@ def _format_lines(self, tokensource): try: cspan = self.span_element_openers[ttype] except KeyError: - title = ' title="%s"' % '.'.join(ttype) if self.debug_token_types else '' + title = ' title="{}"'.format('.'.join(ttype)) if self.debug_token_types else '' if nocls: css_style = self._get_css_inline_styles(ttype) if css_style: css_style = self.class2style[css_style][0] - cspan = '' % (css_style, title) + cspan = f'' else: cspan = '' else: css_class = self._get_css_classes(ttype) if css_class: - cspan = '' % (css_class, title) + cspan = f'' else: cspan = '' self.span_element_openers[ttype] = cspan @@ -908,7 +907,7 @@ def _format_lines(self, tokensource): def _lookup_ctag(self, token): entry = ctags.TagEntry() if self._ctags.find(entry, token.encode(), 0): - return entry['file'], entry['lineNumber'] + return entry['file'].decode(), entry['lineNumber'] else: return None, None @@ -926,11 +925,10 @@ def _highlight_lines(self, tokensource): if self.noclasses: style = '' if self.style.highlight_color is not None: - style = (' style="background-color: %s"' % - (self.style.highlight_color,)) - yield 1, '%s' % (style, value) + style = (f' style="background-color: {self.style.highlight_color}"') + yield 1, f'{value}' else: - yield 1, '%s' % value + yield 1, f'{value}' else: yield 1, value diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py index a338c158..7542cfad 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py @@ -4,10 +4,9 @@ Formatter for Pixmap output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ - import os import sys @@ -68,6 +67,15 @@ def __init__(self, font_name, font_size=14): self.font_size = font_size self.fonts = {} self.encoding = None + self.variable = False + if hasattr(font_name, 'read') or os.path.isfile(font_name): + font = ImageFont.truetype(font_name, self.font_size) + self.variable = True + for style in STYLES: + self.fonts[style] = font + + return + if sys.platform.startswith('win'): if not font_name: self.font_name = DEFAULT_FONT_NAME_WIN @@ -82,7 +90,7 @@ def __init__(self, font_name, font_size=14): self._create_nix() def _get_nix_font_path(self, name, style): - proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'], + proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'], stdout=subprocess.PIPE, stderr=None) stdout, _ = proc.communicate() if proc.returncode == 0: @@ -102,8 +110,7 @@ def _create_nix(self): self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size) break else: - raise FontNotFound('No usable fonts named: "%s"' % - self.font_name) + raise FontNotFound(f'No usable fonts named: "{self.font_name}"') for style in ('ITALIC', 'BOLD', 'BOLDITALIC'): for stylename in STYLES[style]: path = self._get_nix_font_path(self.font_name, stylename) @@ -134,8 +141,7 @@ def _create_mac(self): self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size) break else: - raise FontNotFound('No usable fonts named: "%s"' % - self.font_name) + raise FontNotFound(f'No usable fonts named: "{self.font_name}"') for style in ('ITALIC', 'BOLD', 'BOLDITALIC'): for stylename in STYLES[style]: path = self._get_mac_font_path(font_map, self.font_name, stylename) @@ -152,15 +158,14 @@ def _lookup_win(self, key, basename, styles, fail=False): for suffix in ('', ' (TrueType)'): for style in styles: try: - valname = '%s%s%s' % (basename, style and ' '+style, suffix) + valname = '{}{}{}'.format(basename, style and ' '+style, suffix) val, _ = _winreg.QueryValueEx(key, valname) return val except OSError: continue else: if fail: - raise FontNotFound('Font %s (%s) not found in registry' % - (basename, styles[0])) + raise FontNotFound(f'Font {basename} ({styles[0]}) not found in registry') return None def _create_win(self): @@ -223,14 +228,43 @@ def get_font(self, bold, oblique): Get the font based on bold and italic flags. """ if bold and oblique: + if self.variable: + return self.get_style('BOLDITALIC') + return self.fonts['BOLDITALIC'] elif bold: + if self.variable: + return self.get_style('BOLD') + return self.fonts['BOLD'] elif oblique: + if self.variable: + return self.get_style('ITALIC') + return self.fonts['ITALIC'] else: + if self.variable: + return self.get_style('NORMAL') + return self.fonts['NORMAL'] + def get_style(self, style): + """ + Get the specified style of the font if it is a variable font. + If not found, return the normal font. + """ + font = self.fonts[style] + for style_name in STYLES[style]: + try: + font.set_variation_by_name(style_name) + return font + except ValueError: + pass + except OSError: + return font + + return font + class ImageFormatter(Formatter): """ @@ -258,6 +292,8 @@ class ImageFormatter(Formatter): The font name to be used as the base font from which others, such as bold and italic fonts will be generated. This really should be a monospace font to look sane. + If a filename or a file-like object is specified, the user must + provide different styles of the font. Default: "Courier New" on Windows, "Menlo" on Mac OS, and "DejaVu Sans Mono" on \\*nix @@ -594,7 +630,11 @@ def format(self, tokensource, outfile): fill=self.hl_color) for pos, value, font, text_fg, text_bg in self.drawables: if text_bg: - text_size = draw.textsize(text=value, font=font) + # see deprecations https://pillow.readthedocs.io/en/stable/releasenotes/9.2.0.html#font-size-and-offset-methods + if hasattr(draw, 'textsize'): + text_size = draw.textsize(text=value, font=font) + else: + text_size = font.getbbox(value)[2:] draw.rectangle([pos[0], pos[1], pos[0] + text_size[0], pos[1] + text_size[1]], fill=text_bg) draw.text(pos, value, font=font, fill=text_fg) im.save(outfile, self.image_format.upper()) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py index 2144d439..468c2876 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py @@ -4,7 +4,7 @@ Formatter for IRC output - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py index ca539b40..0ec9089b 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py @@ -4,7 +4,7 @@ Formatter for LaTeX fancyvrb output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,21 +23,21 @@ def escape_tex(text, commandprefix): return text.replace('\\', '\x00'). \ replace('{', '\x01'). \ replace('}', '\x02'). \ - replace('\x00', r'\%sZbs{}' % commandprefix). \ - replace('\x01', r'\%sZob{}' % commandprefix). \ - replace('\x02', r'\%sZcb{}' % commandprefix). \ - replace('^', r'\%sZca{}' % commandprefix). \ - replace('_', r'\%sZus{}' % commandprefix). \ - replace('&', r'\%sZam{}' % commandprefix). \ - replace('<', r'\%sZlt{}' % commandprefix). \ - replace('>', r'\%sZgt{}' % commandprefix). \ - replace('#', r'\%sZsh{}' % commandprefix). \ - replace('%', r'\%sZpc{}' % commandprefix). \ - replace('$', r'\%sZdl{}' % commandprefix). \ - replace('-', r'\%sZhy{}' % commandprefix). \ - replace("'", r'\%sZsq{}' % commandprefix). \ - replace('"', r'\%sZdq{}' % commandprefix). \ - replace('~', r'\%sZti{}' % commandprefix) + replace('\x00', rf'\{commandprefix}Zbs{{}}'). \ + replace('\x01', rf'\{commandprefix}Zob{{}}'). \ + replace('\x02', rf'\{commandprefix}Zcb{{}}'). \ + replace('^', rf'\{commandprefix}Zca{{}}'). \ + replace('_', rf'\{commandprefix}Zus{{}}'). \ + replace('&', rf'\{commandprefix}Zam{{}}'). \ + replace('<', rf'\{commandprefix}Zlt{{}}'). \ + replace('>', rf'\{commandprefix}Zgt{{}}'). \ + replace('#', rf'\{commandprefix}Zsh{{}}'). \ + replace('%', rf'\{commandprefix}Zpc{{}}'). \ + replace('$', rf'\{commandprefix}Zdl{{}}'). \ + replace('-', rf'\{commandprefix}Zhy{{}}'). \ + replace("'", rf'\{commandprefix}Zsq{{}}'). \ + replace('"', rf'\{commandprefix}Zdq{{}}'). \ + replace('~', rf'\{commandprefix}Zti{{}}') DOC_TEMPLATE = r''' @@ -304,17 +304,14 @@ def rgbcolor(col): if ndef['mono']: cmndef += r'\let\$$@ff=\textsf' if ndef['color']: - cmndef += (r'\def\$$@tc##1{\textcolor[rgb]{%s}{##1}}' % - rgbcolor(ndef['color'])) + cmndef += (r'\def\$$@tc##1{{\textcolor[rgb]{{{}}}{{##1}}}}'.format(rgbcolor(ndef['color']))) if ndef['border']: - cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}' - r'\fcolorbox[rgb]{%s}{%s}{\strut ##1}}}' % - (rgbcolor(ndef['border']), + cmndef += (r'\def\$$@bc##1{{{{\setlength{{\fboxsep}}{{\string -\fboxrule}}' + r'\fcolorbox[rgb]{{{}}}{{{}}}{{\strut ##1}}}}}}'.format(rgbcolor(ndef['border']), rgbcolor(ndef['bgcolor']))) elif ndef['bgcolor']: - cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{0pt}' - r'\colorbox[rgb]{%s}{\strut ##1}}}' % - rgbcolor(ndef['bgcolor'])) + cmndef += (r'\def\$$@bc##1{{{{\setlength{{\fboxsep}}{{0pt}}' + r'\colorbox[rgb]{{{}}}{{\strut ##1}}}}}}'.format(rgbcolor(ndef['bgcolor']))) if cmndef == '': continue cmndef = cmndef.replace('$$', cp) @@ -329,7 +326,7 @@ def get_style_defs(self, arg=''): cp = self.commandprefix styles = [] for name, definition in self.cmd2def.items(): - styles.append(r'\@namedef{%s@tok@%s}{%s}' % (cp, name, definition)) + styles.append(rf'\@namedef{{{cp}@tok@{name}}}{{{definition}}}') return STYLE_TEMPLATE % {'cp': self.commandprefix, 'styles': '\n'.join(styles)} @@ -410,10 +407,10 @@ def format_unencoded(self, tokensource, outfile): spl = value.split('\n') for line in spl[:-1]: if line: - outfile.write("\\%s{%s}{%s}" % (cp, styleval, line)) + outfile.write(f"\\{cp}{{{styleval}}}{{{line}}}") outfile.write('\n') if spl[-1]: - outfile.write("\\%s{%s}{%s}" % (cp, styleval, spl[-1])) + outfile.write(f"\\{cp}{{{styleval}}}{{{spl[-1]}}}") else: outfile.write(value) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py index 990ead48..de8d9dcf 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py @@ -4,7 +4,7 @@ Other formatters: NullFormatter, RawTokenFormatter. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -74,8 +74,7 @@ def __init__(self, **options): try: colorize(self.error_color, '') except KeyError: - raise ValueError("Invalid color %r specified" % - self.error_color) + raise ValueError(f"Invalid color {self.error_color!r} specified") def format(self, tokensource, outfile): try: @@ -147,7 +146,7 @@ def format(self, tokensource, outfile): outbuf = [] for ttype, value in tokensource: rawbuf.append(value) - outbuf.append('%s(%s, %r),\n' % (indentation, ttype, value)) + outbuf.append(f'{indentation}({ttype}, {value!r}),\n') before = TESTCASE_BEFORE % (''.join(rawbuf),) during = ''.join(outbuf) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py index 6bb325d0..dfed53ab 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py @@ -4,7 +4,7 @@ Formatter for Pango markup output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -45,7 +45,7 @@ def __init__(self, **options): start = '' end = '' if style['color']: - start += '' % style['color'] + start += ''.format(style['color']) end = '' + end if style['bold']: start += '' diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py index 125189c6..eca2a41a 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py @@ -4,12 +4,14 @@ A formatter that generates RTF files. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +from collections import OrderedDict from pip._vendor.pygments.formatter import Formatter -from pip._vendor.pygments.util import get_int_opt, surrogatepair +from pip._vendor.pygments.style import _ansimap +from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt, surrogatepair __all__ = ['RtfFormatter'] @@ -42,6 +44,59 @@ class RtfFormatter(Formatter): default is 24 half-points, giving a size 12 font. .. versionadded:: 2.0 + + `linenos` + Turn on line numbering (default: ``False``). + + .. versionadded:: 2.18 + + `lineno_fontsize` + Font size for line numbers. Size is specified in half points + (default: `fontsize`). + + .. versionadded:: 2.18 + + `lineno_padding` + Number of spaces between the (inline) line numbers and the + source code (default: ``2``). + + .. versionadded:: 2.18 + + `linenostart` + The line number for the first line (default: ``1``). + + .. versionadded:: 2.18 + + `linenostep` + If set to a number n > 1, only every nth line number is printed. + + .. versionadded:: 2.18 + + `lineno_color` + Color for line numbers specified as a hex triplet, e.g. ``'5e5e5e'``. + Defaults to the style's line number color if it is a hex triplet, + otherwise ansi bright black. + + .. versionadded:: 2.18 + + `hl_lines` + Specify a list of lines to be highlighted, as line numbers separated by + spaces, e.g. ``'3 7 8'``. The line numbers are relative to the input + (i.e. the first line is line 1) unless `hl_linenostart` is set. + + .. versionadded:: 2.18 + + `hl_color` + Color for highlighting the lines specified in `hl_lines`, specified as + a hex triplet (default: style's `highlight_color`). + + .. versionadded:: 2.18 + + `hl_linenostart` + If set to ``True`` line numbers in `hl_lines` are specified + relative to `linenostart` (default ``False``). + + .. versionadded:: 2.18 """ name = 'RTF' aliases = ['rtf'] @@ -62,6 +117,40 @@ def __init__(self, **options): Formatter.__init__(self, **options) self.fontface = options.get('fontface') or '' self.fontsize = get_int_opt(options, 'fontsize', 0) + self.linenos = get_bool_opt(options, 'linenos', False) + self.lineno_fontsize = get_int_opt(options, 'lineno_fontsize', + self.fontsize) + self.lineno_padding = get_int_opt(options, 'lineno_padding', 2) + self.linenostart = abs(get_int_opt(options, 'linenostart', 1)) + self.linenostep = abs(get_int_opt(options, 'linenostep', 1)) + self.hl_linenostart = get_bool_opt(options, 'hl_linenostart', False) + + self.hl_color = options.get('hl_color', '') + if not self.hl_color: + self.hl_color = self.style.highlight_color + + self.hl_lines = [] + for lineno in get_list_opt(options, 'hl_lines', []): + try: + lineno = int(lineno) + if self.hl_linenostart: + lineno = lineno - self.linenostart + 1 + self.hl_lines.append(lineno) + except ValueError: + pass + + self.lineno_color = options.get('lineno_color', '') + if not self.lineno_color: + if self.style.line_number_color == 'inherit': + # style color is the css value 'inherit' + # default to ansi bright-black + self.lineno_color = _ansimap['ansibrightblack'] + else: + # style color is assumed to be a hex triplet as other + # colors in pygments/style.py + self.lineno_color = self.style.line_number_color + + self.color_mapping = self._create_color_mapping() def _escape(self, text): return text.replace('\\', '\\\\') \ @@ -90,43 +179,145 @@ def _escape_text(self, text): # Force surrogate pairs buf.append('{\\u%d}{\\u%d}' % surrogatepair(cn)) - return ''.join(buf).replace('\n', '\\par\n') + return ''.join(buf).replace('\n', '\\par') - def format_unencoded(self, tokensource, outfile): - # rtf 1.8 header - outfile.write('{\\rtf1\\ansi\\uc0\\deff0' - '{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}' - '{\\colortbl;' % (self.fontface and - ' ' + self._escape(self.fontface) or - '')) - - # convert colors and save them in a mapping to access them later. - color_mapping = {} + @staticmethod + def hex_to_rtf_color(hex_color): + if hex_color[0] == "#": + hex_color = hex_color[1:] + + return '\\red%d\\green%d\\blue%d;' % ( + int(hex_color[0:2], 16), + int(hex_color[2:4], 16), + int(hex_color[4:6], 16) + ) + + def _split_tokens_on_newlines(self, tokensource): + """ + Split tokens containing newline characters into multiple token + each representing a line of the input file. Needed for numbering + lines of e.g. multiline comments. + """ + for ttype, value in tokensource: + if value == '\n': + yield (ttype, value) + elif "\n" in value: + lines = value.split("\n") + for line in lines[:-1]: + yield (ttype, line+"\n") + if lines[-1]: + yield (ttype, lines[-1]) + else: + yield (ttype, value) + + def _create_color_mapping(self): + """ + Create a mapping of style hex colors to index/offset in + the RTF color table. + """ + color_mapping = OrderedDict() offset = 1 + + if self.linenos: + color_mapping[self.lineno_color] = offset + offset += 1 + + if self.hl_lines: + color_mapping[self.hl_color] = offset + offset += 1 + for _, style in self.style: for color in style['color'], style['bgcolor'], style['border']: if color and color not in color_mapping: color_mapping[color] = offset - outfile.write('\\red%d\\green%d\\blue%d;' % ( - int(color[0:2], 16), - int(color[2:4], 16), - int(color[4:6], 16) - )) offset += 1 - outfile.write('}\\f0 ') + + return color_mapping + + @property + def _lineno_template(self): + if self.lineno_fontsize != self.fontsize: + return '{{\\fs{} \\cf{} %s{}}}'.format(self.lineno_fontsize, + self.color_mapping[self.lineno_color], + " " * self.lineno_padding) + + return '{{\\cf{} %s{}}}'.format(self.color_mapping[self.lineno_color], + " " * self.lineno_padding) + + @property + def _hl_open_str(self): + return rf'{{\highlight{self.color_mapping[self.hl_color]} ' + + @property + def _rtf_header(self): + lines = [] + # rtf 1.8 header + lines.append('{\\rtf1\\ansi\\uc0\\deff0' + '{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}' + % (self.fontface and ' ' + + self._escape(self.fontface) or '')) + + # color table + lines.append('{\\colortbl;') + for color, _ in self.color_mapping.items(): + lines.append(self.hex_to_rtf_color(color)) + lines.append('}') + + # font and fontsize + lines.append('\\f0\\sa0') if self.fontsize: - outfile.write('\\fs%d' % self.fontsize) + lines.append('\\fs%d' % self.fontsize) + + # ensure Libre Office Writer imports and renders consecutive + # space characters the same width, needed for line numbering. + # https://bugs.documentfoundation.org/show_bug.cgi?id=144050 + lines.append('\\dntblnsbdb') + + return lines + + def format_unencoded(self, tokensource, outfile): + for line in self._rtf_header: + outfile.write(line + "\n") + + tokensource = self._split_tokens_on_newlines(tokensource) + + # first pass of tokens to count lines, needed for line numbering + if self.linenos: + line_count = 0 + tokens = [] # for copying the token source generator + for ttype, value in tokensource: + tokens.append((ttype, value)) + if value.endswith("\n"): + line_count += 1 + + # width of line number strings (for padding with spaces) + linenos_width = len(str(line_count+self.linenostart-1)) + + tokensource = tokens # highlight stream + lineno = 1 + start_new_line = True for ttype, value in tokensource: + if start_new_line and lineno in self.hl_lines: + outfile.write(self._hl_open_str) + + if start_new_line and self.linenos: + if (lineno-self.linenostart+1)%self.linenostep == 0: + current_lineno = lineno + self.linenostart - 1 + lineno_str = str(current_lineno).rjust(linenos_width) + else: + lineno_str = "".rjust(linenos_width) + outfile.write(self._lineno_template % lineno_str) + while not self.style.styles_token(ttype) and ttype.parent: ttype = ttype.parent style = self.style.style_for_token(ttype) buf = [] if style['bgcolor']: - buf.append('\\cb%d' % color_mapping[style['bgcolor']]) + buf.append('\\cb%d' % self.color_mapping[style['bgcolor']]) if style['color']: - buf.append('\\cf%d' % color_mapping[style['color']]) + buf.append('\\cf%d' % self.color_mapping[style['color']]) if style['bold']: buf.append('\\b') if style['italic']: @@ -135,12 +326,24 @@ def format_unencoded(self, tokensource, outfile): buf.append('\\ul') if style['border']: buf.append('\\chbrdr\\chcfpat%d' % - color_mapping[style['border']]) + self.color_mapping[style['border']]) start = ''.join(buf) if start: - outfile.write('{%s ' % start) + outfile.write(f'{{{start} ') outfile.write(self._escape_text(value)) if start: outfile.write('}') + start_new_line = False + + # complete line of input + if value.endswith("\n"): + # close line highlighting + if lineno in self.hl_lines: + outfile.write('}') + # newline in RTF file after closing } + outfile.write("\n") + + start_new_line = True + lineno += 1 - outfile.write('}') + outfile.write('}\n') diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py index a8727ed8..d3e018ff 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py @@ -4,7 +4,7 @@ Formatter for SVG output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -60,11 +60,11 @@ class SvgFormatter(Formatter): `linenostep` If set to a number n > 1, only every nth line number is printed. - + `linenowidth` Maximum width devoted to line numbers (default: ``3*ystep``, sufficient - for up to 4-digit line numbers. Increase width for longer code blocks). - + for up to 4-digit line numbers. Increase width for longer code blocks). + `xoffset` Starting offset in X direction, defaults to ``0``. @@ -97,10 +97,11 @@ def __init__(self, **options): self.fontsize = options.get('fontsize', '14px') self.xoffset = get_int_opt(options, 'xoffset', 0) fs = self.fontsize.strip() - if fs.endswith('px'): fs = fs[:-2].strip() + if fs.endswith('px'): + fs = fs[:-2].strip() try: int_fs = int(fs) - except: + except ValueError: int_fs = 20 self.yoffset = get_int_opt(options, 'yoffset', int_fs) self.ystep = get_int_opt(options, 'ystep', int_fs + 5) @@ -122,30 +123,27 @@ def format_unencoded(self, tokensource, outfile): y = self.yoffset if not self.nowrap: if self.encoding: - outfile.write('\n' % - self.encoding) + outfile.write(f'\n') else: outfile.write('\n') outfile.write('\n') outfile.write('\n') - outfile.write('\n' % - (self.fontfamily, self.fontsize)) - - counter = self.linenostart + outfile.write(f'\n') + + counter = self.linenostart counter_step = self.linenostep counter_style = self._get_style(Comment) line_x = x - + if self.linenos: if counter % counter_step == 0: - outfile.write('%s' % - (x+self.linenowidth,y,counter_style,counter)) + outfile.write(f'{counter}') line_x += self.linenowidth + self.ystep counter += 1 - outfile.write('' % (line_x, y)) + outfile.write(f'') for ttype, value in tokensource: style = self._get_style(ttype) tspan = style and '' or '' @@ -159,11 +157,10 @@ def format_unencoded(self, tokensource, outfile): y += self.ystep outfile.write('\n') if self.linenos and counter % counter_step == 0: - outfile.write('%s' % - (x+self.linenowidth,y,counter_style,counter)) - + outfile.write(f'{counter}') + counter += 1 - outfile.write('' % (line_x,y)) + outfile.write(f'') outfile.write(tspan + parts[-1] + tspanend) outfile.write('') diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py index abb87708..51b902d3 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py @@ -4,7 +4,7 @@ Formatter for terminal output with ANSI sequences. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py index 0cfe5d16..5f254051 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py @@ -10,7 +10,7 @@ Formatter version 1. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py index eb2c1b46..1348be58 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py @@ -4,7 +4,7 @@ Base lexer classes. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -67,10 +67,17 @@ class Lexer(metaclass=LexerMeta): :no-value: .. autoattribute:: priority - Lexers included in Pygments should have an additional attribute: + Lexers included in Pygments should have two additional attributes: .. autoattribute:: url :no-value: + .. autoattribute:: version_added + :no-value: + + Lexers included in Pygments may have additional attributes: + + .. autoattribute:: _example + :no-value: You can pass options to the constructor. The basic options recognized by all lexers and processed by the base `Lexer` class are: @@ -125,9 +132,16 @@ class Lexer(metaclass=LexerMeta): priority = 0 #: URL of the language specification/definition. Used in the Pygments - #: documentation. + #: documentation. Set to an empty string to disable. url = None + #: Version of Pygments in which the lexer was added. + version_added = None + + #: Example file name. Relative to the ``tests/examplefiles`` directory. + #: This is used by the documentation generator to show an example. + _example = None + def __init__(self, **options): """ This constructor takes arbitrary options as keyword arguments. @@ -160,10 +174,9 @@ def __init__(self, **options): def __repr__(self): if self.options: - return '' % (self.__class__.__name__, - self.options) + return f'' else: - return '' % self.__class__.__name__ + return f'' def add_filter(self, filter_, **options): """ @@ -190,26 +203,17 @@ def analyse_text(text): it's the same as if the return values was ``0.0``. """ - def get_tokens(self, text, unfiltered=False): - """ - This method is the basic interface of a lexer. It is called by - the `highlight()` function. It must process the text and return an - iterable of ``(tokentype, value)`` pairs from `text`. - - Normally, you don't need to override this method. The default - implementation processes the options recognized by all lexers - (`stripnl`, `stripall` and so on), and then yields all tokens - from `get_tokens_unprocessed()`, with the ``index`` dropped. + def _preprocess_lexer_input(self, text): + """Apply preprocessing such as decoding the input, removing BOM and normalizing newlines.""" - If `unfiltered` is set to `True`, the filtering mechanism is - bypassed even if filters are defined. - """ if not isinstance(text, str): if self.encoding == 'guess': text, _ = guess_decode(text) elif self.encoding == 'chardet': try: - from pip._vendor import chardet + # pip vendoring note: this code is not reachable by pip, + # removed import of chardet to make it clear. + raise ImportError('chardet is not vendored by pip') except ImportError as e: raise ImportError('To enable chardet encoding guessing, ' 'please install the chardet library ' @@ -246,6 +250,24 @@ def get_tokens(self, text, unfiltered=False): if self.ensurenl and not text.endswith('\n'): text += '\n' + return text + + def get_tokens(self, text, unfiltered=False): + """ + This method is the basic interface of a lexer. It is called by + the `highlight()` function. It must process the text and return an + iterable of ``(tokentype, value)`` pairs from `text`. + + Normally, you don't need to override this method. The default + implementation processes the options recognized by all lexers + (`stripnl`, `stripall` and so on), and then yields all tokens + from `get_tokens_unprocessed()`, with the ``index`` dropped. + + If `unfiltered` is set to `True`, the filtering mechanism is + bypassed even if filters are defined. + """ + text = self._preprocess_lexer_input(text) + def streamer(): for _, t, v in self.get_tokens_unprocessed(text): yield t, v @@ -490,7 +512,7 @@ def _process_regex(cls, regex, rflags, state): def _process_token(cls, token): """Preprocess the token component of a token definition.""" assert type(token) is _TokenType or callable(token), \ - 'token type must be simple type or callable, not %r' % (token,) + f'token type must be simple type or callable, not {token!r}' return token def _process_new_state(cls, new_state, unprocessed, processed): @@ -506,14 +528,14 @@ def _process_new_state(cls, new_state, unprocessed, processed): elif new_state[:5] == '#pop:': return -int(new_state[5:]) else: - assert False, 'unknown new state %r' % new_state + assert False, f'unknown new state {new_state!r}' elif isinstance(new_state, combined): # combine a new state from existing ones tmp_state = '_tmp_%d' % cls._tmpname cls._tmpname += 1 itokens = [] for istate in new_state: - assert istate != new_state, 'circular state ref %r' % istate + assert istate != new_state, f'circular state ref {istate!r}' itokens.extend(cls._process_state(unprocessed, processed, istate)) processed[tmp_state] = itokens @@ -526,12 +548,12 @@ def _process_new_state(cls, new_state, unprocessed, processed): 'unknown new state ' + istate return new_state else: - assert False, 'unknown new state def %r' % new_state + assert False, f'unknown new state def {new_state!r}' def _process_state(cls, unprocessed, processed, state): """Preprocess a single state definition.""" - assert type(state) is str, "wrong state name %r" % state - assert state[0] != '#', "invalid state name %r" % state + assert isinstance(state, str), f"wrong state name {state!r}" + assert state[0] != '#', f"invalid state name {state!r}" if state in processed: return processed[state] tokens = processed[state] = [] @@ -539,7 +561,7 @@ def _process_state(cls, unprocessed, processed, state): for tdef in unprocessed[state]: if isinstance(tdef, include): # it's a state reference - assert tdef != state, "circular state reference %r" % state + assert tdef != state, f"circular state reference {state!r}" tokens.extend(cls._process_state(unprocessed, processed, str(tdef))) continue @@ -553,13 +575,12 @@ def _process_state(cls, unprocessed, processed, state): tokens.append((re.compile('').match, None, new_state)) continue - assert type(tdef) is tuple, "wrong rule def %r" % tdef + assert type(tdef) is tuple, f"wrong rule def {tdef!r}" try: rex = cls._process_regex(tdef[0], rflags, state) except Exception as err: - raise ValueError("uncompilable regex %r in state %r of %r: %s" % - (tdef[0], state, cls, err)) from err + raise ValueError(f"uncompilable regex {tdef[0]!r} in state {state!r} of {cls!r}: {err}") from err token = cls._process_token(tdef[1]) @@ -720,7 +741,7 @@ def get_tokens_unprocessed(self, text, stack=('root',)): elif new_state == '#push': statestack.append(statestack[-1]) else: - assert False, "wrong state def: %r" % new_state + assert False, f"wrong state def: {new_state!r}" statetokens = tokendefs[statestack[-1]] break else: @@ -752,8 +773,7 @@ def __init__(self, text, pos, stack=None, end=None): self.stack = stack or ['root'] def __repr__(self): - return 'LexerContext(%r, %r, %r)' % ( - self.text, self.pos, self.stack) + return f'LexerContext({self.text!r}, {self.pos!r}, {self.stack!r})' class ExtendedRegexLexer(RegexLexer): @@ -808,7 +828,7 @@ def get_tokens_unprocessed(self, text=None, context=None): elif new_state == '#push': ctx.stack.append(ctx.stack[-1]) else: - assert False, "wrong state def: %r" % new_state + assert False, f"wrong state def: {new_state!r}" statetokens = tokendefs[ctx.stack[-1]] break else: diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py index d97c3e39..ac88645a 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py @@ -4,7 +4,7 @@ Pygments lexers. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,6 +22,7 @@ COMPAT = { 'Python3Lexer': 'PythonLexer', 'Python3TracebackLexer': 'PythonTracebackLexer', + 'LeanLexer': 'Lean3Lexer', } __all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class', @@ -92,7 +93,7 @@ def find_lexer_class_by_name(_alias): .. versionadded:: 2.2 """ if not _alias: - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') # lookup builtin lexers for module_name, name, aliases, _, _ in LEXERS.values(): if _alias.lower() in aliases: @@ -103,7 +104,7 @@ def find_lexer_class_by_name(_alias): for cls in find_plugin_lexers(): if _alias.lower() in cls.aliases: return cls - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') def get_lexer_by_name(_alias, **options): @@ -116,7 +117,7 @@ def get_lexer_by_name(_alias, **options): found. """ if not _alias: - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') # lookup builtin lexers for module_name, name, aliases, _, _ in LEXERS.values(): @@ -128,7 +129,7 @@ def get_lexer_by_name(_alias, **options): for cls in find_plugin_lexers(): if _alias.lower() in cls.aliases: return cls(**options) - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') def load_lexer_from_file(filename, lexername="CustomLexer", **options): @@ -153,17 +154,16 @@ def load_lexer_from_file(filename, lexername="CustomLexer", **options): exec(f.read(), custom_namespace) # Retrieve the class `lexername` from that namespace if lexername not in custom_namespace: - raise ClassNotFound('no valid %s class found in %s' % - (lexername, filename)) + raise ClassNotFound(f'no valid {lexername} class found in {filename}') lexer_class = custom_namespace[lexername] # And finally instantiate it with the options return lexer_class(**options) except OSError as err: - raise ClassNotFound('cannot read %s: %s' % (filename, err)) + raise ClassNotFound(f'cannot read {filename}: {err}') except ClassNotFound: raise except Exception as err: - raise ClassNotFound('error when loading custom lexer: %s' % err) + raise ClassNotFound(f'error when loading custom lexer: {err}') def find_lexer_class_for_filename(_fn, code=None): @@ -224,7 +224,7 @@ def get_lexer_for_filename(_fn, code=None, **options): """ res = find_lexer_class_for_filename(_fn, code) if not res: - raise ClassNotFound('no lexer for filename %r found' % _fn) + raise ClassNotFound(f'no lexer for filename {_fn!r} found') return res(**options) @@ -244,7 +244,7 @@ def get_lexer_for_mimetype(_mime, **options): for cls in find_plugin_lexers(): if _mime in cls.mimetypes: return cls(**options) - raise ClassNotFound('no lexer for mimetype %r found' % _mime) + raise ClassNotFound(f'no lexer for mimetype {_mime!r} found') def _iter_lexerclasses(plugins=True): @@ -279,7 +279,7 @@ def guess_lexer_for_filename(_fn, _text, **options): matching_lexers.add(lexer) primary[lexer] = False if not matching_lexers: - raise ClassNotFound('no lexer for filename %r found' % fn) + raise ClassNotFound(f'no lexer for filename {fn!r} found') if len(matching_lexers) == 1: return matching_lexers.pop()(**options) result = [] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc index 0bd22c9dce4728b04ac65964c74be9bf8b7dfb18..25eb23621f21ea959a5a6b8b4f409a5f178a309a 100644 GIT binary patch delta 3252 zcmai0YitzP6`tAIm-oGE?|Rqk-5q<`UB>o$@dI!Go7gy*QX9e}p(UZt#GAW^ka70Cn?8mOwCGlON^ zwCPCm&AIoUxpU6B-#KUgL_Q|=KiKUS2Ci0?-M{OUJ;2JR5;==#J5Z z?Z=tDUeN*Q6DvjMadvOH=z@`7bOQ!N4`78D5=&tvD2Bx{cviyG3(t_~gViv+R}Q0y z=!X$61^}ycOcx_o9B0HJUB!OFM(9IUWSeQP?v_KbbZ62-P2HKp86t4Bor@Wj5}Ycg zxxcVmCR5Kz86u^`m(#Ch4y03^xxSIX%urrRJtL0vrSk*1q13LvbT&iy_P(^385~V@ zcXy^h$aNk_5ADxAOL7M?eR+Dwu*VPq@1w=*hAk{xO@pTG>%%ai*m|?MwAhJ=coVo8{+~sHNr|j=LC-id;&t$`7t^{#<&tsp$DHwMCOEW?~(jxmxm50Z9?>@nt?PSjoC=z^<>zG%Pg(T2Z%tnwBs zaK#=+4Lepkl;hQ?^Zhx(r?UfTiGOH>!N`z!$xKYJ;gZAPRqnM6A!-^O9{}q4#0R75Y-nbDocEK%O02pWP`Wc&N-Vv0;4TX52;_4c?vSZe< zNj7h~Q`dN<=Tgt*?et=4lk2)Iwot+(H{7>rfueUy%c5$07BD{djf~YVS0tzVr}q{P z$^N!k%SKth5yJL*eIUI1|Ap-$%h7|;3i=!Oc98z*4u3O*dRpUoFt!f;TMuxFA;?$3 zMB3n?m~z9I8Q&5Q46eopUL%APCJ4e1+|p$Lh=%8XMFSj6HeE3+2IOh$@>orq zT8i*PwDk9?r3+z~p^Lp049RByyxl#y@@(e~d)3sAd7Ep}ea3gnNBwfJ_J*zQ0mnG1 z7mSR}D_7RdSnK9Jktt#NJJajsHJh&;zIH(7cg%Wr%C?fGOVEu2y-?&-7;NM=qN~qj9j^4*3l}PTOZ9^{ixuW zGu!8_Whi#BD!Vpb3rWS8Hoh7QBG9r0oDmEBUYib6+!*l z_d$}Z0Q^gjDZv9N=gD* z4V9~Q-C{OC+3*KHu%EZnqmi(g3B+O5wSr!ZbOd?WtWO89co{&zZ{O>t|BCPp&OEoc zvQ$ZyN{5a)#);ejb4>RO_C0nNBj}4g{CPI*TUJW?2eKJ-nOAdzw8M^qj-W4UQ4#bc zjWPy{bO0zE$w-nOB=ld)2Ny0P+<;qZrajdak#KWiSE1{PqVSp3aiVRq{6w3q4`|8F zKBTWUN9jk^`yg{e(H=FE!)4znf%+p~&>_Boej5Gl*mC0s2L?0w(cxvro0jU}()nxW z-hg&uHVY=j(2FmtE|ET*UpjJCO|69gnfXei5Brr`h240igv`-S@FOh_X+x=SmhHbzpCIZlw9@6{-BORhS-5bg|vVYl%4Pb>^{x zsh7wd;~?sK=tEzxjIah85E86~whOIx_d17K(ML=hV#y64(GM=4$_b6 zyp_$UvK2rv0;NZ?c|}JKkrABD(}lV+LH$AT?;ioaKXK%X2}8y}(*W&BT2GTn-geU+ zn=s7zLmxQLJL$P(B^^taIGDi71xV`fpZ&=j{v=GtDwsh1f|c>av0((&0@qyFS=f9v zF4LRIChl`LPu=xTag3*m_SC0XzW93m`yl&1#-n$PZ|DBcDiGbGDWj5Nz*LoppI%=xJ@#Xq)@KK#JgG)CHQ~G{sjWlx0sls|-#`5K zQCq&+O||-n6;DlkE$qk#HC~FPCnt_%GrO@cpq0>N)Co!Dx?;>_#X>7C;hnPZ9NZa{{~(0CRzXh delta 3398 zcmaJ^ZA@F&8NSEY*WWg_!Nv}@F?I~xfFVFWXqto&vOvDWk~Uk`jyPPCcoHm zAnTdK)LUAKKT3qBd_*29Edx5bTEnf;CJMe=MM7NSOkdIa1OH6g4AkWIXx38-sQb}%)N zrb(=m9$E{fiX)@^q39niS%F&Tq6YN2951CZ$Fb6dJ>W%Cv==VbxWC!KvH}X-YW@tG=U;vPm=b@af!r zod`70EeMZuUkmhQnA=_6vK>Zz9bWYYz?g6^AUM3YT@~}8C+7ARLc14S9rKoskL#P? zJ~Vx3=E#y@1bW^nZSnotktkZBvFv!5qwDU9L%`9pNw5dz1Doeeg}}}QTid*`jYeSo z-Un1c13!oz-up+P_p7L6?amgq!!t+>>@82mYRCv9Rkj?Z-C^U0!D4)p3hXVY&;_vTDnHfs}5Ana-_u z{MA$E3;w2Y``watg_6WoRuZ%%JUAB@{$d#@D#hg9Lq2d-{G#iZz4I$E#M*kG{MeY3gXCt?gEm39JX(&^mbu&Nn*b4ps3pa;Ls7!9!t;hUg- zHIZ11ivViZYD#FP)X-3RP|;{=7Chc_iS3FLA{kzxImzA=sD7WHT-3s zE%a%qsTiEmQ~1ODfgk@U61SzGcN)#h%uyK*%``3vlGIkPRF9h{$|jz>Do=GU2C5)Y ztZnSc%1v=7iz19z4F^%$I4&**DsDKhIYC;i8`*ee!~$he1QYvN|C3y3n1lo@}7#4A&Xi zNWYDBWQ(=|Xd+Fksu61Fyq**;G$OnUueuQcM17rLue~YWJicIS9_x7D?&2SK)Al*_ zfqFpaD?2C3U)ect4E`S(_>8?38-qMg#t-pqUsv|O?#d#Yi5DO7ZXh#|&YvH8)I0O4 zcCJQ<9vO}32ZZslNcu;3hZEF8yAO%j+PjkOoSd1ht|2xg}|-_Tl>7R9ZuHYC&FZO zt?I+qLiXu55b(s~n_m01G;dEPpQidAd$TE3h4Al(v7f`M;)myl^2a5<%YCn2z|B>S zi?>6usg`R8ZW?ZSt{y2^g5&my_WYqIf|oBB0LKq+j(|CtmM<@@_MXrB`M*$ zk{LX+a!JYt%z;8Zrc676EOAOkYt398mnbX7h^w%iO zQQ4>&)pWK`&*Eb^gC{U9fO`PK-`ITFis5irmS{I?-BL69LmY-~b9K_U_%b#TPT&^t zFTo|@ePi`~qg9IQ!_X*`<1*3g9m8rqH*gTI$}%}DZ=e%6y9@xL>%6K-C=Dw0V~07X zHVmcmXZ7G)Ka?3_A8z^4=nv3l%x2U)jY3sdtWvD;BaXX`S8DyjRmF5_IC z&!7RboMKFIjy2n%oHCqEA4hq@O~Yx(J5-)Enkko62G~EghU04~_}sExAGecE!7QKw kF1xI;wb^=45^aVt(~^x1v>rA^$v$#_FMFr;yGEq-zs*}7jQ{`u diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc index 7b68f7044e7a256b7826e69b05fed6c06712d931..3ee55b5ae33d8fcded501c026b69ecd77684e9ea 100644 GIT binary patch delta 15621 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 OA$jtKVih0Xi~c`OzAKji delta 12490 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc index 524b8bb515ee36c7b9f3c8b7f029f3588919efc8..7f57b378f8886f4b627212f96804753ca0e744a0 100644 GIT binary patch delta 13558 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 chh*7wH|gW=)vfx&vbh($ delta 13306 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py index de6a0153..f3e5c460 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py @@ -31,7 +31,8 @@ 'ArduinoLexer': ('pip._vendor.pygments.lexers.c_like', 'Arduino', ('arduino',), ('*.ino',), ('text/x-arduino',)), 'ArrowLexer': ('pip._vendor.pygments.lexers.arrow', 'Arrow', ('arrow',), ('*.arw',), ()), 'ArturoLexer': ('pip._vendor.pygments.lexers.arturo', 'Arturo', ('arturo', 'art'), ('*.art',), ()), - 'AscLexer': ('pip._vendor.pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature')), + 'AscLexer': ('pip._vendor.pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature', 'application/pem-certificate-chain')), + 'Asn1Lexer': ('pip._vendor.pygments.lexers.asn1', 'ASN.1', ('asn1',), ('*.asn1',), ()), 'AspectJLexer': ('pip._vendor.pygments.lexers.jvm', 'AspectJ', ('aspectj',), ('*.aj',), ('text/x-aspectj',)), 'AsymptoteLexer': ('pip._vendor.pygments.lexers.graphics', 'Asymptote', ('asymptote', 'asy'), ('*.asy',), ('text/x-asymptote',)), 'AugeasLexer': ('pip._vendor.pygments.lexers.configs', 'Augeas', ('augeas',), ('*.aug',), ()), @@ -41,10 +42,11 @@ 'BBCBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BBC Basic', ('bbcbasic',), ('*.bbc',), ()), 'BBCodeLexer': ('pip._vendor.pygments.lexers.markup', 'BBCode', ('bbcode',), (), ('text/x-bbcode',)), 'BCLexer': ('pip._vendor.pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()), + 'BQNLexer': ('pip._vendor.pygments.lexers.bqn', 'BQN', ('bqn',), ('*.bqn',), ()), 'BSTLexer': ('pip._vendor.pygments.lexers.bibtex', 'BST', ('bst', 'bst-pybtex'), ('*.bst',), ()), 'BareLexer': ('pip._vendor.pygments.lexers.bare', 'BARE', ('bare',), ('*.bare',), ()), 'BaseMakefileLexer': ('pip._vendor.pygments.lexers.make', 'Base Makefile', ('basemake',), (), ()), - 'BashLexer': ('pip._vendor.pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript', 'text/x-shellscript')), + 'BashLexer': ('pip._vendor.pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell', 'openrc'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript', 'text/x-shellscript')), 'BashSessionLexer': ('pip._vendor.pygments.lexers.shell', 'Bash Session', ('console', 'shell-session'), ('*.sh-session', '*.shell-session'), ('application/x-shell-session', 'application/x-sh-session')), 'BatchLexer': ('pip._vendor.pygments.lexers.shell', 'Batchfile', ('batch', 'bat', 'dosbatch', 'winbatch'), ('*.bat', '*.cmd'), ('application/x-dos-batch',)), 'BddLexer': ('pip._vendor.pygments.lexers.bdd', 'Bdd', ('bdd',), ('*.feature',), ('text/x-bdd',)), @@ -53,6 +55,7 @@ 'BibTeXLexer': ('pip._vendor.pygments.lexers.bibtex', 'BibTeX', ('bibtex', 'bib'), ('*.bib',), ('text/x-bibtex',)), 'BlitzBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzBasic', ('blitzbasic', 'b3d', 'bplus'), ('*.bb', '*.decls'), ('text/x-bb',)), 'BlitzMaxLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzMax', ('blitzmax', 'bmax'), ('*.bmx',), ('text/x-bmx',)), + 'BlueprintLexer': ('pip._vendor.pygments.lexers.blueprint', 'Blueprint', ('blueprint',), ('*.blp',), ('text/x-blueprint',)), 'BnfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'BNF', ('bnf',), ('*.bnf',), ('text/x-bnf',)), 'BoaLexer': ('pip._vendor.pygments.lexers.boa', 'Boa', ('boa',), ('*.boa',), ()), 'BooLexer': ('pip._vendor.pygments.lexers.dotnet', 'Boo', ('boo',), ('*.boo',), ('text/x-boo',)), @@ -125,10 +128,12 @@ 'DaxLexer': ('pip._vendor.pygments.lexers.dax', 'Dax', ('dax',), ('*.dax',), ()), 'DebianControlLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Control file', ('debcontrol', 'control'), ('control',), ()), 'DelphiLexer': ('pip._vendor.pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)), + 'DesktopLexer': ('pip._vendor.pygments.lexers.configs', 'Desktop file', ('desktop',), ('*.desktop',), ('application/x-desktop',)), 'DevicetreeLexer': ('pip._vendor.pygments.lexers.devicetree', 'Devicetree', ('devicetree', 'dts'), ('*.dts', '*.dtsi'), ('text/x-c',)), 'DgLexer': ('pip._vendor.pygments.lexers.python', 'dg', ('dg',), ('*.dg',), ('text/x-dg',)), 'DiffLexer': ('pip._vendor.pygments.lexers.diff', 'Diff', ('diff', 'udiff'), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')), 'DjangoLexer': ('pip._vendor.pygments.lexers.templates', 'Django/Jinja', ('django', 'jinja'), (), ('application/x-django-templating', 'application/x-jinja')), + 'DnsZoneLexer': ('pip._vendor.pygments.lexers.dns', 'Zone', ('zone',), ('*.zone',), ('text/dns',)), 'DockerLexer': ('pip._vendor.pygments.lexers.configs', 'Docker', ('docker', 'dockerfile'), ('Dockerfile', '*.docker'), ('text/x-dockerfile-config',)), 'DtdLexer': ('pip._vendor.pygments.lexers.html', 'DTD', ('dtd',), ('*.dtd',), ('application/xml-dtd',)), 'DuelLexer': ('pip._vendor.pygments.lexers.webmisc', 'Duel', ('duel', 'jbst', 'jsonml+bst'), ('*.duel', '*.jbst'), ('text/x-duel', 'text/x-jbst')), @@ -190,6 +195,7 @@ 'GoodDataCLLexer': ('pip._vendor.pygments.lexers.business', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)), 'GosuLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp', '*.vark'), ('text/x-gosu',)), 'GosuTemplateLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)), + 'GraphQLLexer': ('pip._vendor.pygments.lexers.graphql', 'GraphQL', ('graphql',), ('*.graphql',), ()), 'GraphvizLexer': ('pip._vendor.pygments.lexers.graphviz', 'Graphviz', ('graphviz', 'dot'), ('*.gv', '*.dot'), ('text/x-graphviz', 'text/vnd.graphviz')), 'GroffLexer': ('pip._vendor.pygments.lexers.markup', 'Groff', ('groff', 'nroff', 'man'), ('*.[1-9]', '*.man', '*.1p', '*.3pm'), ('application/x-troff', 'text/troff')), 'GroovyLexer': ('pip._vendor.pygments.lexers.jvm', 'Groovy', ('groovy',), ('*.groovy', '*.gradle'), ('text/x-groovy',)), @@ -210,8 +216,8 @@ 'HtmlSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Smarty', ('html+smarty',), (), ('text/html+smarty',)), 'HttpLexer': ('pip._vendor.pygments.lexers.textfmts', 'HTTP', ('http',), (), ()), 'HxmlLexer': ('pip._vendor.pygments.lexers.haxe', 'Hxml', ('haxeml', 'hxml'), ('*.hxml',), ()), - 'HyLexer': ('pip._vendor.pygments.lexers.lisp', 'Hy', ('hylang',), ('*.hy',), ('text/x-hy', 'application/x-hy')), - 'HybrisLexer': ('pip._vendor.pygments.lexers.scripting', 'Hybris', ('hybris', 'hy'), ('*.hy', '*.hyb'), ('text/x-hybris', 'application/x-hybris')), + 'HyLexer': ('pip._vendor.pygments.lexers.lisp', 'Hy', ('hylang', 'hy'), ('*.hy',), ('text/x-hy', 'application/x-hy')), + 'HybrisLexer': ('pip._vendor.pygments.lexers.scripting', 'Hybris', ('hybris',), ('*.hyb',), ('text/x-hybris', 'application/x-hybris')), 'IDLLexer': ('pip._vendor.pygments.lexers.idl', 'IDL', ('idl',), ('*.pro',), ('text/idl',)), 'IconLexer': ('pip._vendor.pygments.lexers.unicon', 'Icon', ('icon',), ('*.icon', '*.ICON'), ()), 'IdrisLexer': ('pip._vendor.pygments.lexers.haskell', 'Idris', ('idris', 'idr'), ('*.idr',), ('text/x-idris',)), @@ -219,7 +225,7 @@ 'Inform6Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6', ('inform6', 'i6'), ('*.inf',), ()), 'Inform6TemplateLexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6 template', ('i6t',), ('*.i6t',), ()), 'Inform7Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 7', ('inform7', 'i7'), ('*.ni', '*.i7x'), ()), - 'IniLexer': ('pip._vendor.pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf', '.editorconfig', '*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope'), ('text/x-ini', 'text/inf')), + 'IniLexer': ('pip._vendor.pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf', '.editorconfig'), ('text/x-ini', 'text/inf')), 'IoLexer': ('pip._vendor.pygments.lexers.iolang', 'Io', ('io',), ('*.io',), ('text/x-iosrc',)), 'IokeLexer': ('pip._vendor.pygments.lexers.jvm', 'Ioke', ('ioke', 'ik'), ('*.ik',), ('text/x-iokesrc',)), 'IrcLogsLexer': ('pip._vendor.pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)), @@ -228,6 +234,7 @@ 'JMESPathLexer': ('pip._vendor.pygments.lexers.jmespath', 'JMESPath', ('jmespath', 'jp'), ('*.jp',), ()), 'JSLTLexer': ('pip._vendor.pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)), 'JagsLexer': ('pip._vendor.pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()), + 'JanetLexer': ('pip._vendor.pygments.lexers.lisp', 'Janet', ('janet',), ('*.janet', '*.jdn'), ('text/x-janet', 'application/x-janet')), 'JasminLexer': ('pip._vendor.pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()), 'JavaLexer': ('pip._vendor.pygments.lexers.jvm', 'Java', ('java',), ('*.java',), ('text/x-java',)), 'JavascriptDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Django/Jinja', ('javascript+django', 'js+django', 'javascript+jinja', 'js+jinja'), ('*.js.j2', '*.js.jinja2'), ('application/x-javascript+django', 'application/x-javascript+jinja', 'text/x-javascript+django', 'text/x-javascript+jinja', 'text/javascript+django', 'text/javascript+jinja')), @@ -241,9 +248,10 @@ 'JsgfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'JSGF', ('jsgf',), ('*.jsgf',), ('application/jsgf', 'application/x-jsgf', 'text/jsgf')), 'JsonBareObjectLexer': ('pip._vendor.pygments.lexers.data', 'JSONBareObject', (), (), ()), 'JsonLdLexer': ('pip._vendor.pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)), - 'JsonLexer': ('pip._vendor.pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', 'Pipfile.lock'), ('application/json', 'application/json-object')), + 'JsonLexer': ('pip._vendor.pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', '*.jsonl', '*.ndjson', 'Pipfile.lock'), ('application/json', 'application/json-object', 'application/x-ndjson', 'application/jsonl', 'application/json-seq')), 'JsonnetLexer': ('pip._vendor.pygments.lexers.jsonnet', 'Jsonnet', ('jsonnet',), ('*.jsonnet', '*.libsonnet'), ()), 'JspLexer': ('pip._vendor.pygments.lexers.templates', 'Java Server Page', ('jsp',), ('*.jsp',), ('application/x-jsp',)), + 'JsxLexer': ('pip._vendor.pygments.lexers.jsx', 'JSX', ('jsx', 'react'), ('*.jsx', '*.react'), ('text/jsx', 'text/typescript-jsx')), 'JuliaConsoleLexer': ('pip._vendor.pygments.lexers.julia', 'Julia console', ('jlcon', 'julia-repl'), (), ()), 'JuliaLexer': ('pip._vendor.pygments.lexers.julia', 'Julia', ('julia', 'jl'), ('*.jl',), ('text/x-julia', 'application/x-julia')), 'JuttleLexer': ('pip._vendor.pygments.lexers.javascript', 'Juttle', ('juttle',), ('*.juttle',), ('application/juttle', 'application/x-juttle', 'text/x-juttle', 'text/juttle')), @@ -254,13 +262,17 @@ 'KokaLexer': ('pip._vendor.pygments.lexers.haskell', 'Koka', ('koka',), ('*.kk', '*.kki'), ('text/x-koka',)), 'KotlinLexer': ('pip._vendor.pygments.lexers.jvm', 'Kotlin', ('kotlin',), ('*.kt', '*.kts'), ('text/x-kotlin',)), 'KuinLexer': ('pip._vendor.pygments.lexers.kuin', 'Kuin', ('kuin',), ('*.kn',), ()), + 'KustoLexer': ('pip._vendor.pygments.lexers.kusto', 'Kusto', ('kql', 'kusto'), ('*.kql', '*.kusto', '.csl'), ()), 'LSLLexer': ('pip._vendor.pygments.lexers.scripting', 'LSL', ('lsl',), ('*.lsl',), ('text/x-lsl',)), 'LassoCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Lasso', ('css+lasso',), (), ('text/css+lasso',)), 'LassoHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Lasso', ('html+lasso',), (), ('text/html+lasso', 'application/x-httpd-lasso', 'application/x-httpd-lasso[89]')), 'LassoJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Lasso', ('javascript+lasso', 'js+lasso'), (), ('application/x-javascript+lasso', 'text/x-javascript+lasso', 'text/javascript+lasso')), 'LassoLexer': ('pip._vendor.pygments.lexers.javascript', 'Lasso', ('lasso', 'lassoscript'), ('*.lasso', '*.lasso[89]'), ('text/x-lasso',)), 'LassoXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Lasso', ('xml+lasso',), (), ('application/xml+lasso',)), - 'LeanLexer': ('pip._vendor.pygments.lexers.theorem', 'Lean', ('lean',), ('*.lean',), ('text/x-lean',)), + 'LdaprcLexer': ('pip._vendor.pygments.lexers.ldap', 'LDAP configuration file', ('ldapconf', 'ldaprc'), ('.ldaprc', 'ldaprc', 'ldap.conf'), ('text/x-ldapconf',)), + 'LdifLexer': ('pip._vendor.pygments.lexers.ldap', 'LDIF', ('ldif',), ('*.ldif',), ('text/x-ldif',)), + 'Lean3Lexer': ('pip._vendor.pygments.lexers.lean', 'Lean', ('lean', 'lean3'), ('*.lean',), ('text/x-lean', 'text/x-lean3')), + 'Lean4Lexer': ('pip._vendor.pygments.lexers.lean', 'Lean4', ('lean4',), ('*.lean',), ('text/x-lean4',)), 'LessCssLexer': ('pip._vendor.pygments.lexers.css', 'LessCss', ('less',), ('*.less',), ('text/x-less-css',)), 'LighttpdConfLexer': ('pip._vendor.pygments.lexers.configs', 'Lighttpd configuration file', ('lighttpd', 'lighty'), ('lighttpd.conf',), ('text/x-lighttpd-conf',)), 'LilyPondLexer': ('pip._vendor.pygments.lexers.lilypond', 'LilyPond', ('lilypond',), ('*.ly',), ()), @@ -277,6 +289,7 @@ 'LogosLexer': ('pip._vendor.pygments.lexers.objective', 'Logos', ('logos',), ('*.x', '*.xi', '*.xm', '*.xmi'), ('text/x-logos',)), 'LogtalkLexer': ('pip._vendor.pygments.lexers.prolog', 'Logtalk', ('logtalk',), ('*.lgt', '*.logtalk'), ('text/x-logtalk',)), 'LuaLexer': ('pip._vendor.pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')), + 'LuauLexer': ('pip._vendor.pygments.lexers.scripting', 'Luau', ('luau',), ('*.luau',), ()), 'MCFunctionLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)), 'MCSchemaLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCSchema', ('mcschema',), ('*.mcschema',), ('text/mcschema',)), 'MIMELexer': ('pip._vendor.pygments.lexers.mime', 'MIME', ('mime',), (), ('multipart/mixed', 'multipart/related', 'multipart/alternative')), @@ -304,6 +317,7 @@ 'ModelicaLexer': ('pip._vendor.pygments.lexers.modeling', 'Modelica', ('modelica',), ('*.mo',), ('text/x-modelica',)), 'Modula2Lexer': ('pip._vendor.pygments.lexers.modula2', 'Modula-2', ('modula2', 'm2'), ('*.def', '*.mod'), ('text/x-modula2',)), 'MoinWikiLexer': ('pip._vendor.pygments.lexers.markup', 'MoinMoin/Trac Wiki markup', ('trac-wiki', 'moin'), (), ('text/x-trac-wiki',)), + 'MojoLexer': ('pip._vendor.pygments.lexers.mojo', 'Mojo', ('mojo', '🔥'), ('*.mojo', '*.🔥'), ('text/x-mojo', 'application/x-mojo')), 'MonkeyLexer': ('pip._vendor.pygments.lexers.basic', 'Monkey', ('monkey',), ('*.monkey',), ('text/x-monkey',)), 'MonteLexer': ('pip._vendor.pygments.lexers.monte', 'Monte', ('monte',), ('*.mt',), ()), 'MoonScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'MoonScript', ('moonscript', 'moon'), ('*.moon',), ('text/x-moonscript', 'application/x-moonscript')), @@ -351,6 +365,8 @@ 'OocLexer': ('pip._vendor.pygments.lexers.ooc', 'Ooc', ('ooc',), ('*.ooc',), ('text/x-ooc',)), 'OpaLexer': ('pip._vendor.pygments.lexers.ml', 'Opa', ('opa',), ('*.opa',), ('text/x-opa',)), 'OpenEdgeLexer': ('pip._vendor.pygments.lexers.business', 'OpenEdge ABL', ('openedge', 'abl', 'progress'), ('*.p', '*.cls'), ('text/x-openedge', 'application/x-openedge')), + 'OpenScadLexer': ('pip._vendor.pygments.lexers.openscad', 'OpenSCAD', ('openscad',), ('*.scad',), ('application/x-openscad',)), + 'OrgLexer': ('pip._vendor.pygments.lexers.markup', 'Org Mode', ('org', 'orgmode', 'org-mode'), ('*.org',), ('text/org',)), 'OutputLexer': ('pip._vendor.pygments.lexers.special', 'Text output', ('output',), (), ()), 'PacmanConfLexer': ('pip._vendor.pygments.lexers.configs', 'PacmanConf', ('pacmanconf',), ('pacman.conf',), ()), 'PanLexer': ('pip._vendor.pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()), @@ -379,16 +395,19 @@ 'ProcfileLexer': ('pip._vendor.pygments.lexers.procfile', 'Procfile', ('procfile',), ('Procfile',), ()), 'PrologLexer': ('pip._vendor.pygments.lexers.prolog', 'Prolog', ('prolog',), ('*.ecl', '*.prolog', '*.pro', '*.pl'), ('text/x-prolog',)), 'PromQLLexer': ('pip._vendor.pygments.lexers.promql', 'PromQL', ('promql',), ('*.promql',), ()), + 'PromelaLexer': ('pip._vendor.pygments.lexers.c_like', 'Promela', ('promela',), ('*.pml', '*.prom', '*.prm', '*.promela', '*.pr', '*.pm'), ('text/x-promela',)), 'PropertiesLexer': ('pip._vendor.pygments.lexers.configs', 'Properties', ('properties', 'jproperties'), ('*.properties',), ('text/x-java-properties',)), 'ProtoBufLexer': ('pip._vendor.pygments.lexers.dsls', 'Protocol Buffer', ('protobuf', 'proto'), ('*.proto',), ()), + 'PrqlLexer': ('pip._vendor.pygments.lexers.prql', 'PRQL', ('prql',), ('*.prql',), ('application/prql', 'application/x-prql')), 'PsyshConsoleLexer': ('pip._vendor.pygments.lexers.php', 'PsySH console session for PHP', ('psysh',), (), ()), + 'PtxLexer': ('pip._vendor.pygments.lexers.ptx', 'PTX', ('ptx',), ('*.ptx',), ('text/x-ptx',)), 'PugLexer': ('pip._vendor.pygments.lexers.html', 'Pug', ('pug', 'jade'), ('*.pug', '*.jade'), ('text/x-pug', 'text/x-jade')), 'PuppetLexer': ('pip._vendor.pygments.lexers.dsls', 'Puppet', ('puppet',), ('*.pp',), ()), 'PyPyLogLexer': ('pip._vendor.pygments.lexers.console', 'PyPy Log', ('pypylog', 'pypy'), ('*.pypylog',), ('application/x-pypylog',)), 'Python2Lexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')), 'Python2TracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)), - 'PythonConsoleLexer': ('pip._vendor.pygments.lexers.python', 'Python console session', ('pycon',), (), ('text/x-python-doctest',)), - 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), + 'PythonConsoleLexer': ('pip._vendor.pygments.lexers.python', 'Python console session', ('pycon', 'python-console'), (), ('text/x-python-doctest',)), + 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), 'PythonTracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')), 'PythonUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()), 'QBasicLexer': ('pip._vendor.pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)), @@ -460,6 +479,7 @@ 'SnobolLexer': ('pip._vendor.pygments.lexers.snobol', 'Snobol', ('snobol',), ('*.snobol',), ('text/x-snobol',)), 'SnowballLexer': ('pip._vendor.pygments.lexers.dsls', 'Snowball', ('snowball',), ('*.sbl',), ()), 'SolidityLexer': ('pip._vendor.pygments.lexers.solidity', 'Solidity', ('solidity',), ('*.sol',), ()), + 'SoongLexer': ('pip._vendor.pygments.lexers.soong', 'Soong', ('androidbp', 'bp', 'soong'), ('Android.bp',), ()), 'SophiaLexer': ('pip._vendor.pygments.lexers.sophia', 'Sophia', ('sophia',), ('*.aes',), ()), 'SourcePawnLexer': ('pip._vendor.pygments.lexers.pawn', 'SourcePawn', ('sp',), ('*.sp',), ('text/x-sourcepawn',)), 'SourcesListLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Sourcelist', ('debsources', 'sourceslist', 'sources.list'), ('sources.list',), ()), @@ -477,9 +497,11 @@ 'SwiftLexer': ('pip._vendor.pygments.lexers.objective', 'Swift', ('swift',), ('*.swift',), ('text/x-swift',)), 'SwigLexer': ('pip._vendor.pygments.lexers.c_like', 'SWIG', ('swig',), ('*.swg', '*.i'), ('text/swig',)), 'SystemVerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'systemverilog', ('systemverilog', 'sv'), ('*.sv', '*.svh'), ('text/x-systemverilog',)), + 'SystemdLexer': ('pip._vendor.pygments.lexers.configs', 'Systemd', ('systemd',), ('*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope'), ()), 'TAPLexer': ('pip._vendor.pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()), 'TNTLexer': ('pip._vendor.pygments.lexers.tnt', 'Typographic Number Theory', ('tnt',), ('*.tnt',), ()), - 'TOMLLexer': ('pip._vendor.pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ()), + 'TOMLLexer': ('pip._vendor.pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ('application/toml',)), + 'TactLexer': ('pip._vendor.pygments.lexers.tact', 'Tact', ('tact',), ('*.tact',), ()), 'Tads3Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()), 'TalLexer': ('pip._vendor.pygments.lexers.tal', 'Tal', ('tal', 'uxntal'), ('*.tal',), ('text/x-uxntal',)), 'TasmLexer': ('pip._vendor.pygments.lexers.asm', 'TASM', ('tasm',), ('*.asm', '*.ASM', '*.tasm'), ('text/x-tasm',)), @@ -498,6 +520,7 @@ 'ThriftLexer': ('pip._vendor.pygments.lexers.dsls', 'Thrift', ('thrift',), ('*.thrift',), ('application/x-thrift',)), 'TiddlyWiki5Lexer': ('pip._vendor.pygments.lexers.markup', 'tiddler', ('tid',), ('*.tid',), ('text/vnd.tiddlywiki',)), 'TlbLexer': ('pip._vendor.pygments.lexers.tlb', 'Tl-b', ('tlb',), ('*.tlb',), ()), + 'TlsLexer': ('pip._vendor.pygments.lexers.tls', 'TLS Presentation Language', ('tls',), (), ()), 'TodotxtLexer': ('pip._vendor.pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)), 'TransactSqlLexer': ('pip._vendor.pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)), 'TreetopLexer': ('pip._vendor.pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()), @@ -508,11 +531,13 @@ 'TypoScriptCssDataLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScriptCssData', ('typoscriptcssdata',), (), ()), 'TypoScriptHtmlDataLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScriptHtmlData', ('typoscripthtmldata',), (), ()), 'TypoScriptLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScript', ('typoscript',), ('*.typoscript',), ('text/x-typoscript',)), + 'TypstLexer': ('pip._vendor.pygments.lexers.typst', 'Typst', ('typst',), ('*.typ',), ('text/x-typst',)), 'UL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'UL4', ('ul4',), ('*.ul4',), ()), 'UcodeLexer': ('pip._vendor.pygments.lexers.unicon', 'ucode', ('ucode',), ('*.u', '*.u1', '*.u2'), ()), 'UniconLexer': ('pip._vendor.pygments.lexers.unicon', 'Unicon', ('unicon',), ('*.icn',), ('text/unicon',)), 'UnixConfigLexer': ('pip._vendor.pygments.lexers.configs', 'Unix/Linux config files', ('unixconfig', 'linuxconfig'), (), ()), 'UrbiscriptLexer': ('pip._vendor.pygments.lexers.urbi', 'UrbiScript', ('urbiscript',), ('*.u',), ('application/x-urbiscript',)), + 'UrlEncodedLexer': ('pip._vendor.pygments.lexers.html', 'urlencoded', ('urlencoded',), (), ('application/x-www-form-urlencoded',)), 'UsdLexer': ('pip._vendor.pygments.lexers.usd', 'USD', ('usd', 'usda'), ('*.usd', '*.usda'), ()), 'VBScriptLexer': ('pip._vendor.pygments.lexers.basic', 'VBScript', ('vbscript',), ('*.vbs', '*.VBS'), ()), 'VCLLexer': ('pip._vendor.pygments.lexers.varnish', 'VCL', ('vcl',), ('*.vcl',), ('text/x-vclsrc',)), @@ -521,13 +546,17 @@ 'VGLLexer': ('pip._vendor.pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()), 'ValaLexer': ('pip._vendor.pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)), 'VbNetAspxLexer': ('pip._vendor.pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()), - 'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), + 'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas', 'visual-basic', 'visualbasic'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), 'VelocityHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)), 'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()), 'VelocityXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)), + 'VerifpalLexer': ('pip._vendor.pygments.lexers.verifpal', 'Verifpal', ('verifpal',), ('*.vp',), ('text/x-verifpal',)), 'VerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'verilog', ('verilog', 'v'), ('*.v',), ('text/x-verilog',)), 'VhdlLexer': ('pip._vendor.pygments.lexers.hdl', 'vhdl', ('vhdl',), ('*.vhdl', '*.vhd'), ('text/x-vhdl',)), 'VimLexer': ('pip._vendor.pygments.lexers.textedit', 'VimL', ('vim',), ('*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'), ('text/x-vim',)), + 'VisualPrologGrammarLexer': ('pip._vendor.pygments.lexers.vip', 'Visual Prolog Grammar', ('visualprologgrammar',), ('*.vipgrm',), ()), + 'VisualPrologLexer': ('pip._vendor.pygments.lexers.vip', 'Visual Prolog', ('visualprolog',), ('*.pro', '*.cl', '*.i', '*.pack', '*.ph'), ()), + 'VyperLexer': ('pip._vendor.pygments.lexers.vyper', 'Vyper', ('vyper',), ('*.vy',), ()), 'WDiffLexer': ('pip._vendor.pygments.lexers.diff', 'WDiff', ('wdiff',), ('*.wdiff',), ()), 'WatLexer': ('pip._vendor.pygments.lexers.webassembly', 'WebAssembly', ('wast', 'wat'), ('*.wat', '*.wast'), ()), 'WebIDLLexer': ('pip._vendor.pygments.lexers.webidl', 'Web IDL', ('webidl',), ('*.webidl',), ()), @@ -552,6 +581,7 @@ 'YamlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'YAML+Jinja', ('yaml+jinja', 'salt', 'sls'), ('*.sls', '*.yaml.j2', '*.yml.j2', '*.yaml.jinja2', '*.yml.jinja2'), ('text/x-yaml+jinja', 'text/x-sls')), 'YamlLexer': ('pip._vendor.pygments.lexers.data', 'YAML', ('yaml',), ('*.yaml', '*.yml'), ('text/x-yaml',)), 'YangLexer': ('pip._vendor.pygments.lexers.yang', 'YANG', ('yang',), ('*.yang',), ('application/yang',)), + 'YaraLexer': ('pip._vendor.pygments.lexers.yara', 'YARA', ('yara', 'yar'), ('*.yar',), ('text/x-yara',)), 'ZeekLexer': ('pip._vendor.pygments.lexers.dsls', 'Zeek', ('zeek', 'bro'), ('*.zeek', '*.bro'), ()), 'ZephirLexer': ('pip._vendor.pygments.lexers.php', 'Zephir', ('zephir',), ('*.zep',), ()), 'ZigLexer': ('pip._vendor.pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)), diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py index e9bf2d33..b2d07f20 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py @@ -4,15 +4,14 @@ Lexers for Python and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import re import keyword -from pip._vendor.pygments.lexer import DelegatingLexer, Lexer, RegexLexer, include, \ - bygroups, using, default, words, combined, do_insertions, this, line_re +from pip._vendor.pygments.lexer import DelegatingLexer, RegexLexer, include, \ + bygroups, using, default, words, combined, this from pip._vendor.pygments.util import get_bool_opt, shebang_matches from pip._vendor.pygments.token import Text, Comment, Operator, Keyword, Name, String, \ Number, Punctuation, Generic, Other, Error, Whitespace @@ -27,16 +26,14 @@ class PythonLexer(RegexLexer): """ For Python source code (version 3.x). - .. versionadded:: 0.10 - .. versionchanged:: 2.5 This is now the default ``PythonLexer``. It is still available as the alias ``Python3Lexer``. """ name = 'Python' - url = 'http://www.python.org' - aliases = ['python', 'py', 'sage', 'python3', 'py3'] + url = 'https://www.python.org' + aliases = ['python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark'] filenames = [ '*.py', '*.pyw', @@ -61,8 +58,9 @@ class PythonLexer(RegexLexer): ] mimetypes = ['text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3'] + version_added = '0.10' - uni_name = "[%s][%s]*" % (uni.xid_start, uni.xid_continue) + uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*" def innerstring_rules(ttype): return [ @@ -224,7 +222,8 @@ def fstring_rules(ttype): r'(match|case)\b' # a possible keyword r'(?![ \t]*(?:' # not followed by... r'[:,;=^&|@~)\]}]|(?:' + # characters and keywords that mean this isn't - r'|'.join(keyword.kwlist) + r')\b))', # pattern matching + # pattern matching (but None/True/False is ok) + r'|'.join(k for k in keyword.kwlist if k[0].islower()) + r')\b))', bygroups(Text, Keyword), 'soft-keywords-inner'), ], 'soft-keywords-inner': [ @@ -425,10 +424,11 @@ class Python2Lexer(RegexLexer): """ name = 'Python 2.x' - url = 'http://www.python.org' + url = 'https://www.python.org' aliases = ['python2', 'py2'] filenames = [] # now taken over by PythonLexer (3.x) mimetypes = ['text/x-python2', 'application/x-python2'] + version_added = '' def innerstring_rules(ttype): return [ @@ -637,7 +637,7 @@ def analyse_text(text): class _PythonConsoleLexerBase(RegexLexer): name = 'Python console session' - aliases = ['pycon'] + aliases = ['pycon', 'python-console'] mimetypes = ['text/x-python-doctest'] """Auxiliary lexer for `PythonConsoleLexer`. @@ -696,8 +696,10 @@ class PythonConsoleLexer(DelegatingLexer): """ name = 'Python console session' - aliases = ['pycon'] + aliases = ['pycon', 'python-console'] mimetypes = ['text/x-python-doctest'] + url = 'https://python.org' + version_added = '' def __init__(self, **options): python3 = get_bool_opt(options, 'python3', True) @@ -721,8 +723,6 @@ class PythonTracebackLexer(RegexLexer): """ For Python 3.x tracebacks, with support for chained exceptions. - .. versionadded:: 1.0 - .. versionchanged:: 2.5 This is now the default ``PythonTracebackLexer``. It is still available as the alias ``Python3TracebackLexer``. @@ -732,6 +732,8 @@ class PythonTracebackLexer(RegexLexer): aliases = ['pytb', 'py3tb'] filenames = ['*.pytb', '*.py3tb'] mimetypes = ['text/x-python-traceback', 'text/x-python3-traceback'] + url = 'https://python.org' + version_added = '1.0' tokens = { 'root': [ @@ -778,8 +780,6 @@ class Python2TracebackLexer(RegexLexer): """ For Python tracebacks. - .. versionadded:: 0.7 - .. versionchanged:: 2.5 This class has been renamed from ``PythonTracebackLexer``. ``PythonTracebackLexer`` now refers to the Python 3 variant. @@ -789,6 +789,8 @@ class Python2TracebackLexer(RegexLexer): aliases = ['py2tb'] filenames = ['*.py2tb'] mimetypes = ['text/x-python2-traceback'] + url = 'https://python.org' + version_added = '0.7' tokens = { 'root': [ @@ -825,15 +827,14 @@ class Python2TracebackLexer(RegexLexer): class CythonLexer(RegexLexer): """ For Pyrex and Cython source code. - - .. versionadded:: 1.1 """ name = 'Cython' - url = 'http://cython.org' + url = 'https://cython.org' aliases = ['cython', 'pyx', 'pyrex'] filenames = ['*.pyx', '*.pxd', '*.pxi'] mimetypes = ['text/x-cython', 'application/x-cython'] + version_added = '1.1' tokens = { 'root': [ @@ -1007,13 +1008,13 @@ class DgLexer(RegexLexer): Lexer for dg, a functional and object-oriented programming language running on the CPython 3 VM. - - .. versionadded:: 1.6 """ name = 'dg' aliases = ['dg'] filenames = ['*.dg'] mimetypes = ['text/x-dg'] + url = 'http://pyos.github.io/dg' + version_added = '1.6' tokens = { 'root': [ @@ -1104,13 +1105,12 @@ class DgLexer(RegexLexer): class NumPyLexer(PythonLexer): """ A Python lexer recognizing Numerical Python builtins. - - .. versionadded:: 0.10 """ name = 'NumPy' url = 'https://numpy.org/' aliases = ['numpy'] + version_added = '0.10' # override the mimetypes to not inherit them from python mimetypes = [] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py index 7b6f6a32..e4d9fe16 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py @@ -4,7 +4,7 @@ A simple modeline parser (based on pymodeline). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,7 +19,7 @@ ''', re.VERBOSE) -def get_filetype_from_line(l): +def get_filetype_from_line(l): # noqa: E741 m = modeline_re.search(l) if m: return m.group(1) @@ -30,8 +30,8 @@ def get_filetype_from_buffer(buf, max_lines=5): Scan the buffer for modelines and return filetype if one is found. """ lines = buf.splitlines() - for l in lines[-1:-max_lines-1:-1]: - ret = get_filetype_from_line(l) + for line in lines[-1:-max_lines-1:-1]: + ret = get_filetype_from_line(line) if ret: return ret for i in range(max_lines, -1, -1): diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py index 7b722d58..2e462f2c 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py @@ -2,12 +2,7 @@ pygments.plugin ~~~~~~~~~~~~~~~ - Pygments plugin interface. By default, this tries to use - ``importlib.metadata``, which is in the Python standard - library since Python 3.8, or its ``importlib_metadata`` - backport for earlier versions of Python. It falls back on - ``pkg_resources`` if not found. Finally, if ``pkg_resources`` - is not found either, no plugins are loaded at all. + Pygments plugin interface. lexer plugins:: @@ -34,9 +29,10 @@ yourfilter = yourfilter:YourFilter - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +from importlib.metadata import entry_points LEXER_ENTRY_POINT = 'pygments.lexers' FORMATTER_ENTRY_POINT = 'pygments.formatters' @@ -45,18 +41,6 @@ def iter_entry_points(group_name): - try: - from importlib.metadata import entry_points - except ImportError: - try: - from importlib_metadata import entry_points - except ImportError: - try: - from pip._vendor.pkg_resources import iter_entry_points - except (ImportError, OSError): - return [] - else: - return iter_entry_points(group_name) groups = entry_points() if hasattr(groups, 'select'): # New interface in Python 3.10 and newer versions of the diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py index 45223ecc..c44eedbf 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py @@ -5,7 +5,7 @@ An algorithm that generates optimized regexes for matching long lists of literal strings. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py index 32a2f303..112da349 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py @@ -11,7 +11,7 @@ Have a look at the `DelphiLexer` to get an idea of how to use this scanner. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py index 2c7facde..34077a2a 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py @@ -5,7 +5,7 @@ Sphinx extension to generate automatic documentation of lexers, formatters and filters. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -33,6 +33,8 @@ %s + %s + ''' FMTERDOC = ''' @@ -119,11 +121,11 @@ def format_link(name, url): def write_row(*columns): """Format a table row""" out = [] - for l, c in zip(column_lengths, columns): - if c: - out.append(c.ljust(l)) + for length, col in zip(column_lengths, columns): + if col: + out.append(col.ljust(length)) else: - out.append(' '*l) + out.append(' '*length) return ' '.join(out) @@ -147,6 +149,10 @@ def write_seperator(): def document_lexers(self): from pip._vendor.pygments.lexers._mapping import LEXERS + from pip._vendor import pygments + import inspect + import pathlib + out = [] modules = {} moduledocstrings = {} @@ -156,16 +162,40 @@ def document_lexers(self): self.filenames.add(mod.__file__) cls = getattr(mod, classname) if not cls.__doc__: - print("Warning: %s does not have a docstring." % classname) + print(f"Warning: {classname} does not have a docstring.") docstring = cls.__doc__ if isinstance(docstring, bytes): docstring = docstring.decode('utf8') + + example_file = getattr(cls, '_example', None) + if example_file: + p = pathlib.Path(inspect.getabsfile(pygments)).parent.parent /\ + 'tests' / 'examplefiles' / example_file + content = p.read_text(encoding='utf-8') + if not content: + raise Exception( + f"Empty example file '{example_file}' for lexer " + f"{classname}") + + if data[2]: + lexer_name = data[2][0] + docstring += '\n\n .. admonition:: Example\n' + docstring += f'\n .. code-block:: {lexer_name}\n\n' + for line in content.splitlines(): + docstring += f' {line}\n' + + if cls.version_added: + version_line = f'.. versionadded:: {cls.version_added}' + else: + version_line = '' + modules.setdefault(module, []).append(( classname, ', '.join(data[2]) or 'None', ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None', ', '.join(data[4]) or 'None', - docstring)) + docstring, + version_line)) if module not in moduledocstrings: moddoc = mod.__doc__ if isinstance(moddoc, bytes): @@ -174,7 +204,7 @@ def document_lexers(self): for module, lexers in sorted(modules.items(), key=lambda x: x[0]): if moduledocstrings[module] is None: - raise Exception("Missing docstring for %s" % (module,)) + raise Exception(f"Missing docstring for {module}") heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.') out.append(MODULEDOC % (module, heading, '-'*len(heading))) for data in lexers: diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/style.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/style.py index edc19627..076e63f8 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/style.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/style.py @@ -4,7 +4,7 @@ Basic style object. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -76,7 +76,7 @@ def colorformat(text): return '' elif text.startswith('var') or text.startswith('calc'): return text - assert False, "wrong color format %r" % text + assert False, f"wrong color format {text!r}" _styles = obj._styles = {} @@ -190,6 +190,12 @@ class Style(metaclass=StyleMeta): #: Style definitions for individual token types. styles = {} + #: user-friendly style name (used when selecting the style, so this + # should be all-lowercase, no spaces, hyphens) + name = 'unnamed' + + aliases = [] + # Attribute for lexers defined within Pygments. If set # to True, the style is not shown in the style gallery # on the website. This is intended for language-specific diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py index 7401cf5d..712f6e69 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py @@ -4,65 +4,21 @@ Contains built-in styles. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ from pip._vendor.pygments.plugin import find_plugin_styles from pip._vendor.pygments.util import ClassNotFound +from pip._vendor.pygments.styles._mapping import STYLES #: A dictionary of built-in styles, mapping style names to #: ``'submodule::classname'`` strings. -STYLE_MAP = { - 'default': 'default::DefaultStyle', - 'emacs': 'emacs::EmacsStyle', - 'friendly': 'friendly::FriendlyStyle', - 'friendly_grayscale': 'friendly_grayscale::FriendlyGrayscaleStyle', - 'colorful': 'colorful::ColorfulStyle', - 'autumn': 'autumn::AutumnStyle', - 'murphy': 'murphy::MurphyStyle', - 'manni': 'manni::ManniStyle', - 'material': 'material::MaterialStyle', - 'monokai': 'monokai::MonokaiStyle', - 'perldoc': 'perldoc::PerldocStyle', - 'pastie': 'pastie::PastieStyle', - 'borland': 'borland::BorlandStyle', - 'trac': 'trac::TracStyle', - 'native': 'native::NativeStyle', - 'fruity': 'fruity::FruityStyle', - 'bw': 'bw::BlackWhiteStyle', - 'vim': 'vim::VimStyle', - 'vs': 'vs::VisualStudioStyle', - 'tango': 'tango::TangoStyle', - 'rrt': 'rrt::RrtStyle', - 'xcode': 'xcode::XcodeStyle', - 'igor': 'igor::IgorStyle', - 'paraiso-light': 'paraiso_light::ParaisoLightStyle', - 'paraiso-dark': 'paraiso_dark::ParaisoDarkStyle', - 'lovelace': 'lovelace::LovelaceStyle', - 'algol': 'algol::AlgolStyle', - 'algol_nu': 'algol_nu::Algol_NuStyle', - 'arduino': 'arduino::ArduinoStyle', - 'rainbow_dash': 'rainbow_dash::RainbowDashStyle', - 'abap': 'abap::AbapStyle', - 'solarized-dark': 'solarized::SolarizedDarkStyle', - 'solarized-light': 'solarized::SolarizedLightStyle', - 'sas': 'sas::SasStyle', - 'staroffice' : 'staroffice::StarofficeStyle', - 'stata': 'stata_light::StataLightStyle', - 'stata-light': 'stata_light::StataLightStyle', - 'stata-dark': 'stata_dark::StataDarkStyle', - 'inkpot': 'inkpot::InkPotStyle', - 'zenburn': 'zenburn::ZenburnStyle', - 'gruvbox-dark': 'gruvbox::GruvboxDarkStyle', - 'gruvbox-light': 'gruvbox::GruvboxLightStyle', - 'dracula': 'dracula::DraculaStyle', - 'one-dark': 'onedark::OneDarkStyle', - 'lilypond' : 'lilypond::LilyPondStyle', - 'nord': 'nord::NordStyle', - 'nord-darker': 'nord::NordDarkerStyle', - 'github-dark': 'gh_dark::GhDarkStyle' -} +#: This list is deprecated. Use `pygments.styles.STYLES` instead +STYLE_MAP = {v[1]: v[0].split('.')[-1] + '::' + k for k, v in STYLES.items()} + +#: Internal reverse mapping to make `get_style_by_name` more efficient +_STYLE_NAME_TO_MODULE_MAP = {v[1]: (v[0], k) for k, v in STYLES.items()} def get_style_by_name(name): @@ -73,8 +29,8 @@ def get_style_by_name(name): Will raise :exc:`pygments.util.ClassNotFound` if no style of that name is found. """ - if name in STYLE_MAP: - mod, cls = STYLE_MAP[name].split('::') + if name in _STYLE_NAME_TO_MODULE_MAP: + mod, cls = _STYLE_NAME_TO_MODULE_MAP[name] builtin = "yes" else: for found_name, style in find_plugin_styles(): @@ -82,22 +38,24 @@ def get_style_by_name(name): return style # perhaps it got dropped into our styles package builtin = "" - mod = name + mod = 'pygments.styles.' + name cls = name.title() + "Style" try: - mod = __import__('pygments.styles.' + mod, None, None, [cls]) + mod = __import__(mod, None, None, [cls]) except ImportError: - raise ClassNotFound("Could not find style module %r" % mod + - (builtin and ", though it should be builtin") + ".") + raise ClassNotFound(f"Could not find style module {mod!r}" + + (builtin and ", though it should be builtin") + + ".") try: return getattr(mod, cls) except AttributeError: - raise ClassNotFound("Could not find style class %r in style module." % cls) + raise ClassNotFound(f"Could not find style class {cls!r} in style module.") def get_all_styles(): """Return a generator for all styles by name, both builtin and plugin.""" - yield from STYLE_MAP + for v in STYLES.values(): + yield v[1] for name, _ in find_plugin_styles(): yield name diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc index a0442ae1b8d68fd1007f13abc71447f36ee3be7d..0734c850aff111379307f95f4664f23c13638910 100644 GIT binary patch delta 1626 zcmZ`(Z)j6j6hHU9yqEtkZBtuolbZg~CQh4b?WUQVwo6B+ZM93>P*y_BdzNJRQ{Q`S zZAhrdJ|rl%?!kc5klkZYJgwKWj~cTjc5tI0RKCXRIih*qe} zb`=EZBuc_*?dF4L-g&U*{~t`iSqdAeduv3;YrlchdR~XMVMZUI&>Qp9*!9h|!=Q|y z2->gQLy2(*DzYB$si6VSbK>bb>U#bUmN?~d1>U%hVE`5n8jtc97`=u=kO^9mDG*JY zy9AIxDCLJa12$1F}tRS2Oxlc2`Y9aR-cA}z?q z&GQ6x2a`|41MMJhqz^hkY(gOGt7n*IHi2$XH>m`D9*H<|UQGzElE0CVi)b3o)2F~b zjj${)^NuNPg1SNRx|_7}v-Z#SB0VEWMTpl-%#25bs4R6!@=REex{8d4EJorM z<#(M$(dxIWMG{%OS=pm+?vB^mf>B%LTU#W?Plkmqho;!%t5EM7=^GyKd5`;skGoF} z4fuxpPAD;ba&X>xQW8YT$)E903n9PL9SclW9(4}zlL5aRj76QEfIlpVw!VO$7a}vx zp&_>uFJkVHKRO;eA;v;NKvpbHMUvMw>Ebf?H<+?GhqZu!HY-*U7GM}uPY&nhX z)k{4X8eafSE;Q#_T-ly%XU@`Juy#DK4(1$#Yc#SRMNeB=*BHv$RtCz{UII$nUZU}p zzg`-^uX7D-GPhtVkMX#6gP;o{Q|1KRhW&BIzUtT|`r&nZU>=5yWP*iKKao+_)h7 z{Nb>#T3q6G3?9Hk>c#3ecy$4u8O?KJ>9H%m6e@70d6eca=}I(k)@SA&kIbEEbxM`; zNXRU zg@{ySq=|4)E^4bqi>p*5y(yB)s<`N&is)<6inkJJ)9&s{H0zo})r$XEv}2TTE8T`! z0Gt_w)+h~9{ZS9-!za-51U@L~;P5e&J$paA9KIKQXc%6O-sPA4+1k`->Rj48zjuE0 z>i%o4tFBByIlQnhZ{E3BpEvJWLV5Gvym4dTB~&RzE|^er6n-*PXuE*!k>%eFkQ4CbKe1#3lKR6c?jWPV*9MqnI4ugff0 VKSL7vv)q2K-@vZy-qK&k{tGmKpK<^I literal 4467 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 GAN&VbPVzti literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py new file mode 100644 index 00000000..49a7fae9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py @@ -0,0 +1,54 @@ +# Automatically generated by scripts/gen_mapfiles.py. +# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. + +STYLES = { + 'AbapStyle': ('pygments.styles.abap', 'abap', ()), + 'AlgolStyle': ('pygments.styles.algol', 'algol', ()), + 'Algol_NuStyle': ('pygments.styles.algol_nu', 'algol_nu', ()), + 'ArduinoStyle': ('pygments.styles.arduino', 'arduino', ()), + 'AutumnStyle': ('pygments.styles.autumn', 'autumn', ()), + 'BlackWhiteStyle': ('pygments.styles.bw', 'bw', ()), + 'BorlandStyle': ('pygments.styles.borland', 'borland', ()), + 'CoffeeStyle': ('pygments.styles.coffee', 'coffee', ()), + 'ColorfulStyle': ('pygments.styles.colorful', 'colorful', ()), + 'DefaultStyle': ('pygments.styles.default', 'default', ()), + 'DraculaStyle': ('pygments.styles.dracula', 'dracula', ()), + 'EmacsStyle': ('pygments.styles.emacs', 'emacs', ()), + 'FriendlyGrayscaleStyle': ('pygments.styles.friendly_grayscale', 'friendly_grayscale', ()), + 'FriendlyStyle': ('pygments.styles.friendly', 'friendly', ()), + 'FruityStyle': ('pygments.styles.fruity', 'fruity', ()), + 'GhDarkStyle': ('pygments.styles.gh_dark', 'github-dark', ()), + 'GruvboxDarkStyle': ('pygments.styles.gruvbox', 'gruvbox-dark', ()), + 'GruvboxLightStyle': ('pygments.styles.gruvbox', 'gruvbox-light', ()), + 'IgorStyle': ('pygments.styles.igor', 'igor', ()), + 'InkPotStyle': ('pygments.styles.inkpot', 'inkpot', ()), + 'LightbulbStyle': ('pygments.styles.lightbulb', 'lightbulb', ()), + 'LilyPondStyle': ('pygments.styles.lilypond', 'lilypond', ()), + 'LovelaceStyle': ('pygments.styles.lovelace', 'lovelace', ()), + 'ManniStyle': ('pygments.styles.manni', 'manni', ()), + 'MaterialStyle': ('pygments.styles.material', 'material', ()), + 'MonokaiStyle': ('pygments.styles.monokai', 'monokai', ()), + 'MurphyStyle': ('pygments.styles.murphy', 'murphy', ()), + 'NativeStyle': ('pygments.styles.native', 'native', ()), + 'NordDarkerStyle': ('pygments.styles.nord', 'nord-darker', ()), + 'NordStyle': ('pygments.styles.nord', 'nord', ()), + 'OneDarkStyle': ('pygments.styles.onedark', 'one-dark', ()), + 'ParaisoDarkStyle': ('pygments.styles.paraiso_dark', 'paraiso-dark', ()), + 'ParaisoLightStyle': ('pygments.styles.paraiso_light', 'paraiso-light', ()), + 'PastieStyle': ('pygments.styles.pastie', 'pastie', ()), + 'PerldocStyle': ('pygments.styles.perldoc', 'perldoc', ()), + 'RainbowDashStyle': ('pygments.styles.rainbow_dash', 'rainbow_dash', ()), + 'RrtStyle': ('pygments.styles.rrt', 'rrt', ()), + 'SasStyle': ('pygments.styles.sas', 'sas', ()), + 'SolarizedDarkStyle': ('pygments.styles.solarized', 'solarized-dark', ()), + 'SolarizedLightStyle': ('pygments.styles.solarized', 'solarized-light', ()), + 'StarofficeStyle': ('pygments.styles.staroffice', 'staroffice', ()), + 'StataDarkStyle': ('pygments.styles.stata_dark', 'stata-dark', ()), + 'StataLightStyle': ('pygments.styles.stata_light', 'stata-light', ()), + 'TangoStyle': ('pygments.styles.tango', 'tango', ()), + 'TracStyle': ('pygments.styles.trac', 'trac', ()), + 'VimStyle': ('pygments.styles.vim', 'vim', ()), + 'VisualStudioStyle': ('pygments.styles.vs', 'vs', ()), + 'XcodeStyle': ('pygments.styles.xcode', 'xcode', ()), + 'ZenburnStyle': ('pygments.styles.zenburn', 'zenburn', ()), +} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/token.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/token.py index 7395cb6a..f78018a7 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/token.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/token.py @@ -4,7 +4,7 @@ Basic token types and the standard tokens. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -209,5 +209,6 @@ def string_to_tokentype(s): Generic.Prompt: 'gp', Generic.Strong: 'gs', Generic.Subheading: 'gu', + Generic.EmphStrong: 'ges', Generic.Traceback: 'gt', } diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py index 39f6baee..e2c3523e 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py @@ -7,7 +7,7 @@ Inspired by chartypes_create.py from the MoinMoin project. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -104,7 +104,7 @@ def _handle_runs(char_list): # pragma: no cover if a == b: yield a else: - yield '%s-%s' % (a, b) + yield f'{a}-{b}' if __name__ == '__main__': # pragma: no cover @@ -141,13 +141,13 @@ def _handle_runs(char_list): # pragma: no cover for cat in sorted(categories): val = ''.join(_handle_runs(categories[cat])) - fp.write('%s = %a\n\n' % (cat, val)) + fp.write(f'{cat} = {val!a}\n\n') cats = sorted(categories) cats.remove('xid_start') cats.remove('xid_continue') - fp.write('cats = %r\n\n' % cats) + fp.write(f'cats = {cats!r}\n\n') - fp.write('# Generated from unidata %s\n\n' % (unicodedata.unidata_version,)) + fp.write(f'# Generated from unidata {unicodedata.unidata_version}\n\n') fp.write(footer) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/util.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/util.py index 941fdb9e..83cf1049 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/pygments/util.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/util.py @@ -4,7 +4,7 @@ Utility functions. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -46,8 +46,7 @@ def get_choice_opt(options, optname, allowed, default=None, normcase=False): if normcase: string = string.lower() if string not in allowed: - raise OptionError('Value for option %s must be one of %s' % - (optname, ', '.join(map(str, allowed)))) + raise OptionError('Value for option {} must be one of {}'.format(optname, ', '.join(map(str, allowed)))) return string @@ -69,17 +68,15 @@ def get_bool_opt(options, optname, default=None): elif isinstance(string, int): return bool(string) elif not isinstance(string, str): - raise OptionError('Invalid type %r for option %s; use ' - '1/0, yes/no, true/false, on/off' % ( - string, optname)) + raise OptionError(f'Invalid type {string!r} for option {optname}; use ' + '1/0, yes/no, true/false, on/off') elif string.lower() in ('1', 'yes', 'true', 'on'): return True elif string.lower() in ('0', 'no', 'false', 'off'): return False else: - raise OptionError('Invalid value %r for option %s; use ' - '1/0, yes/no, true/false, on/off' % ( - string, optname)) + raise OptionError(f'Invalid value {string!r} for option {optname}; use ' + '1/0, yes/no, true/false, on/off') def get_int_opt(options, optname, default=None): @@ -88,13 +85,11 @@ def get_int_opt(options, optname, default=None): try: return int(string) except TypeError: - raise OptionError('Invalid type %r for option %s; you ' - 'must give an integer value' % ( - string, optname)) + raise OptionError(f'Invalid type {string!r} for option {optname}; you ' + 'must give an integer value') except ValueError: - raise OptionError('Invalid value %r for option %s; you ' - 'must give an integer value' % ( - string, optname)) + raise OptionError(f'Invalid value {string!r} for option {optname}; you ' + 'must give an integer value') def get_list_opt(options, optname, default=None): """ @@ -108,9 +103,8 @@ def get_list_opt(options, optname, default=None): elif isinstance(val, (list, tuple)): return list(val) else: - raise OptionError('Invalid type %r for option %s; you ' - 'must give a list value' % ( - val, optname)) + raise OptionError(f'Invalid type {val!r} for option {optname}; you ' + 'must give a list value') def docstring_headline(obj): @@ -181,7 +175,7 @@ def shebang_matches(text, regex): if x and not x.startswith('-')][-1] except IndexError: return False - regex = re.compile(r'^%s(\.(exe|cmd|bat|bin))?$' % regex, re.IGNORECASE) + regex = re.compile(rf'^{regex}(\.(exe|cmd|bat|bin))?$', re.IGNORECASE) if regex.search(found) is not None: return True return False diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py deleted file mode 100644 index 88bc10ac..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py +++ /dev/null @@ -1,322 +0,0 @@ -# module pyparsing.py -# -# Copyright (c) 2003-2022 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = """ -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and -executing simple grammars, vs. the traditional lex/yacc approach, or the -use of regular expressions. With pyparsing, you don't need to learn -a new syntax for defining grammars or matching expressions - the parsing -module provides a library of classes that you use to construct the -grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -``", !"``), built up using :class:`Word`, -:class:`Literal`, and :class:`And` elements -(the :meth:`'+'` operators create :class:`And` expressions, -and the strings are auto-converted to :class:`Literal` expressions):: - - from pip._vendor.pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print(hello, "->", greet.parse_string(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the -self-explanatory class names, and the use of :class:`'+'`, -:class:`'|'`, :class:`'^'` and :class:`'&'` operators. - -The :class:`ParseResults` object returned from -:class:`ParserElement.parse_string` can be -accessed as a nested list, a dictionary, or an object with named -attributes. - -The pyparsing module handles some of the problems that are typically -vexing when writing text parsers: - - - extra or missing whitespace (the above program will also handle - "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes :class:`ParserElement` and :class:`ParseResults` to -see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - - construct literal match expressions from :class:`Literal` and - :class:`CaselessLiteral` classes - - construct character word-group expressions using the :class:`Word` - class - - see how to create repetitive expressions using :class:`ZeroOrMore` - and :class:`OneOrMore` classes - - use :class:`'+'`, :class:`'|'`, :class:`'^'`, - and :class:`'&'` operators to combine simple expressions into - more complex ones - - associate names with your parsed results using - :class:`ParserElement.set_results_name` - - access the parsed data, which is returned as a :class:`ParseResults` - object - - find some helpful expression short-cuts like :class:`DelimitedList` - and :class:`one_of` - - find more useful common expressions in the :class:`pyparsing_common` - namespace class -""" -from typing import NamedTuple - - -class version_info(NamedTuple): - major: int - minor: int - micro: int - releaselevel: str - serial: int - - @property - def __version__(self): - return ( - f"{self.major}.{self.minor}.{self.micro}" - + ( - f"{'r' if self.releaselevel[0] == 'c' else ''}{self.releaselevel[0]}{self.serial}", - "", - )[self.releaselevel == "final"] - ) - - def __str__(self): - return f"{__name__} {self.__version__} / {__version_time__}" - - def __repr__(self): - return f"{__name__}.{type(self).__name__}({', '.join('{}={!r}'.format(*nv) for nv in zip(self._fields, self))})" - - -__version_info__ = version_info(3, 1, 0, "final", 1) -__version_time__ = "18 Jun 2023 14:05 UTC" -__version__ = __version_info__.__version__ -__versionTime__ = __version_time__ -__author__ = "Paul McGuire " - -from .util import * -from .exceptions import * -from .actions import * -from .core import __diag__, __compat__ -from .results import * -from .core import * # type: ignore[misc, assignment] -from .core import _builtin_exprs as core_builtin_exprs -from .helpers import * # type: ignore[misc, assignment] -from .helpers import _builtin_exprs as helper_builtin_exprs - -from .unicode import unicode_set, UnicodeRangeList, pyparsing_unicode as unicode -from .testing import pyparsing_test as testing -from .common import ( - pyparsing_common as common, - _builtin_exprs as common_builtin_exprs, -) - -# define backward compat synonyms -if "pyparsing_unicode" not in globals(): - pyparsing_unicode = unicode # type: ignore[misc] -if "pyparsing_common" not in globals(): - pyparsing_common = common # type: ignore[misc] -if "pyparsing_test" not in globals(): - pyparsing_test = testing # type: ignore[misc] - -core_builtin_exprs += common_builtin_exprs + helper_builtin_exprs - - -__all__ = [ - "__version__", - "__version_time__", - "__author__", - "__compat__", - "__diag__", - "And", - "AtLineStart", - "AtStringStart", - "CaselessKeyword", - "CaselessLiteral", - "CharsNotIn", - "CloseMatch", - "Combine", - "DelimitedList", - "Dict", - "Each", - "Empty", - "FollowedBy", - "Forward", - "GoToColumn", - "Group", - "IndentedBlock", - "Keyword", - "LineEnd", - "LineStart", - "Literal", - "Located", - "PrecededBy", - "MatchFirst", - "NoMatch", - "NotAny", - "OneOrMore", - "OnlyOnce", - "OpAssoc", - "Opt", - "Optional", - "Or", - "ParseBaseException", - "ParseElementEnhance", - "ParseException", - "ParseExpression", - "ParseFatalException", - "ParseResults", - "ParseSyntaxException", - "ParserElement", - "PositionToken", - "QuotedString", - "RecursiveGrammarException", - "Regex", - "SkipTo", - "StringEnd", - "StringStart", - "Suppress", - "Token", - "TokenConverter", - "White", - "Word", - "WordEnd", - "WordStart", - "ZeroOrMore", - "Char", - "alphanums", - "alphas", - "alphas8bit", - "any_close_tag", - "any_open_tag", - "autoname_elements", - "c_style_comment", - "col", - "common_html_entity", - "condition_as_parse_action", - "counted_array", - "cpp_style_comment", - "dbl_quoted_string", - "dbl_slash_comment", - "delimited_list", - "dict_of", - "empty", - "hexnums", - "html_comment", - "identchars", - "identbodychars", - "infix_notation", - "java_style_comment", - "line", - "line_end", - "line_start", - "lineno", - "make_html_tags", - "make_xml_tags", - "match_only_at_col", - "match_previous_expr", - "match_previous_literal", - "nested_expr", - "null_debug_action", - "nums", - "one_of", - "original_text_for", - "printables", - "punc8bit", - "pyparsing_common", - "pyparsing_test", - "pyparsing_unicode", - "python_style_comment", - "quoted_string", - "remove_quotes", - "replace_with", - "replace_html_entity", - "rest_of_line", - "sgl_quoted_string", - "srange", - "string_end", - "string_start", - "token_map", - "trace_parse_action", - "ungroup", - "unicode_set", - "unicode_string", - "with_attribute", - "with_class", - # pre-PEP8 compatibility names - "__versionTime__", - "anyCloseTag", - "anyOpenTag", - "cStyleComment", - "commonHTMLEntity", - "conditionAsParseAction", - "countedArray", - "cppStyleComment", - "dblQuotedString", - "dblSlashComment", - "delimitedList", - "dictOf", - "htmlComment", - "indentedBlock", - "infixNotation", - "javaStyleComment", - "lineEnd", - "lineStart", - "locatedExpr", - "makeHTMLTags", - "makeXMLTags", - "matchOnlyAtCol", - "matchPreviousExpr", - "matchPreviousLiteral", - "nestedExpr", - "nullDebugAction", - "oneOf", - "opAssoc", - "originalTextFor", - "pythonStyleComment", - "quotedString", - "removeQuotes", - "replaceHTMLEntity", - "replaceWith", - "restOfLine", - "sglQuotedString", - "stringEnd", - "stringStart", - "tokenMap", - "traceParseAction", - "unicodeString", - "withAttribute", - "withClass", -] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b544c30caef875ce6b36c6650c31f4ea0ae29799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7930 zcmb_hTW=gkcJ8^8O%CtWh1R7-FHBJylDgPyo1y5?)WvH{q*kP&coL`CoGuPq>dUyh zhvaZ=K*@T61PGGNOC(3Th>*OZz)(K6UDx?|gMm=^yfWRl(oVFaBfgC(kR&KT#+C%SDaH%LzrfqnJujF%xFe zPB_V8GNB}uONyELKrz!S`Eg3lEvAwROPLuniT_ z=FHAw2fkA6&YwZHXsL}>SJdjVyPbS7@AMRVqB*^dIo(mK8*}=K{n7h@#^?Y>2gPXK z9&(0@!_L0qK4*V%NR0K^2b_b&1ESq)k2ud2M=<{o`hD2Z;g2JAHxho54HfsB{ZEaK z6rVE(o*F$+JjnXlAvU-T3EO!^DfX8YbMP+`#Ur($@nPdgm!hbZTE*}K%Pnh;XI5>d zO=$DB5d`=nMP*T zumsJd?`d(SjlRKb+bd`{Jl{5tjcUiCvEkOR1IC2ep#iCi?K$eo%IHjB*wqjo@!Z*h zHe;A38IG~pW1}l8;{|QCYT2Pyt!Pz&!D*rW^a{kAD+M*~Ubf(D!(J%}^u?oduDPNy zn>ox41NAs9J56|&$w5n?OTk}0ft5}sueS^8C=TA0a4P<(L zNES7*KfAJS1oE5bxOP$-EsWwx5?cq4jY_%e*m8oDYiYrqyC~RF85IAis2(d{7c}XywUlW9eFQVl(iMhxYrfP%$`6@^~ zi1cg%G@_ezY|sYV1fC+n z3MG^HfryL=L<=Zb5T6A`6(7K#LB%LBO~kaZ>Ve~9Cfc-Y8&MK?n$$<2HbSz%&@n(( z_BE{lawekEG#X`LX>uI%Cjc3b>=VVc7-G&UGffPZJVz3Ws$OED(0VB}M6ge&6MO&E z->?EpP-=sC+Z-GdP&+)@eII&&DJ%zjt{ULjHU@XRAk;j(^P5ME8qcs?jAMC1%cORl zh#o>ruM{&Doic38ptCQa&{_935gBCpiIxMwmh>u*o>uyjv=witL2v*9nLQq#htiNA zG~P$*wJ%ayH+-W69@jR(OA}?^1M9b*aqY~e{H?iGm9U_GI<0cz4hyG7CD3IE%>x?~v5#+J#tWsJP zB`B?X026y8#(~}hOE_^$^AOvlAyPE2WEo&S!DX5VWn>7$vxh-o1l;E^t zt3hwNoGZi&Qwrvhi2IsS@9_jz7lG}AvT=`S-J>Kmj4n;6-Fq>zQ{#b@xLIKtIqmqb}e*BMk+)>_BZZ=*u8~0FZ;Z3qR z61So^>A2tgy{G&%gKx6Uk+@|h529(NZXH(?KWV1jgqgWVD}U=;@wOxWzWIwaP~NR2 zzvbI3tw3v0xwE8<=N6tMCVkokPn3AV=L*jND26?r@o8b-9zPIO8m1>O2c>gpPs1?%zhd^eC_JaYgg;vzqa$*Qhj#0e*Nu-*H?C~uhf@~ zdf)19-@v0xs<#Jg^bS7kIl9wx^#02`Jtw}&rFskBq|*7qqg1w2eGEmEX9H~-Z|*1| zO%Q+oE4Y$j16l+qI57n$YTGGoN*hn{4qZ@`uKPof#rvA}2rY+UxF5sPb^ajD$mx`^ z>iYIjY`DmdVw98$M)A08qKY0J#503foFMunvRQeg=c#xci`i-~i=dOJE_QP{m zcFtY-d;jxu*LG&A{~geVe(&IOi6@D1#P|X9cpCXAN10XYYic&s0A>pJh&^>?d=O@|SBDWn0s z7xk;_da?!zXcP$M9Y~77LSaqBgFgc0{4qQ}QiO0}ai72?9&~aAS||BojI$WesTKLOWO72`R$We4V=bTN|&m*XV7LUp;IbPmYtIg>ihMwV_5bi z&fr;KCvgI>fg?=IC}Wc_3Z*>;m=P~~ba7c=xjNw|03UQ!U904oOh*#K`>xB*HN!14 zN*H*5V--D`NK%@Es4@tqea#V>3ivP5wqB;ktMqsUkMX~hHm381^ujd&k`_RQ0?0o@ zqp3O9e-aITu_Meh|_l2OE=mqkeod7kzaRiL2cd)h%X4Wj7xZy(MuY*PN3VqjBZN^H)8b z;mEv}y<5!X-QO3*qjW4kcnvq9IITC>C3y$h6qC8e%4~~gmu^{=Wsi5tFUYiAt*Gc& zs^a<*4xtcHQryURQ5>iH&<;iAC>0O zMH3f80d6$c8*BHNaaEwx{RYp`?FI?~o?#*Ya_ekM?7UkjMoN;(DsD<$+}}VY-Xq$p zo>`0g?wYlw$Nb6%ZWyp5)8AUDBjuw#Ev-s|dYfE>HbxEct`6h`ij+S1IOAqAlB7!^K% zJ0mRD2C!V!6_*PBOT@-Kjk7_B<2|Gr%pToxaaHt1nMbEI5<6UIq#vByc0C~*mc_h2m7Km8fobow)#_zY1cip7jx z0`YmmaAc+oz>8hwyy$@FjX}H&4C6H80}`EW+vt|ql%z^nBxnk22E0GQVvCEqqM;jv zRh3}5xOSO9*$Ys%IiXX+Pf)gON*i?uAYK6u`veYK9i5MG7ip6xn9Vg%*Gb)Z`X8Ew z@uO6p;I0mdPL^&>fnG|gM6T9a+fd1ZM1wL9nS=ZlwJ4F}>1t@%9RJM~os6+Vd$6;7RdzU0OZ<5HR|@@pb4nS~?kDb_zHdC(|H-k>24AczeY=Av=-G4R zVb2K^uD82(2S#uA?&ha&tN*MFexV%vLfQ8V;;20wiH-m5#Q@9YjA jy1np~GEm=lqCPRVvu|!knX4-Uzs#~^SMqmrVw?X1*s3Cx diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc deleted file mode 100644 index b4a0a2ae4d409b0731600c00947661c2ac1e73dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8414 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%0Ds?g98&|!1vD3q4a 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⩔l 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
    lpqg_cBwWZ zQjJC^>Do9;aQUk=&_|FILO}SX0>&roPugExKio80{oR)P1U-jRAnYx^Q5^L)FyI_5 z9oZhutN{D4BW~od z2q>L4({OWS;$+GY(b=Fw5@V3qBV}3|`$8#!c09P&@t0o0Dbl5v(md91_h_lF#J0(+ zy_coKY0MYMFAaWW{>=vMQ5}3)dx&i2D`#ZHu|{4Q>Dm7#0mwuwBgOjMzNi$EE)v{hB;jLo+yzP)xh z_{NUO%(`gCW>pb7zcAKCj_g?wISpn9RiEECB^^cyaw{Oadg&7i>PRz92*i$nO_3v@ zM34`nJRXKkG%j?&glLyab+Nz2kMI{6jPKE4u+oO+1SgMtxjwL2R&2c8{%5&&m+u;E zp7hm5eYInc-Sss@9(`=W_ZVE?@6P{X3pWSoc~keehW{6bfT z9L~M#Ec?Lexra#5o!6ec>#n`$%N@>ob$9<(3J%?Q?a*EKB8Vd=^Or^Qm)%-9k-sLA zM?L{}K{HioPv$)+wWQ__JFfNJh2xz3lHnZwTr58qiO-i2F&L31MHSdIK1AWxgbajvJbI?!vo=w z(tbU5umlB2AzQR-ffkud;6cA6rGRXV_3&tq<42t2 zk(eO>5IR607_98WjL@QwyP7SpBy<1)?MOI=%|m*VW)evan;1%X$!AAeq>C99^OBEc zswGlO<1SY_h86Epxn-Pwm;oz2;~D7mS#~2 zrrU{jC{8gFBN%mvkkk!k+|$5F=E>aMB`ZNa6m2=#Lz4$3`!|4`^W=#aMwJfOfM|=^xFz>#TvF*Qwei z@9es{>#y@38GUNF^!lQaMXy(n=RHEZ9i9iS9v(VOTe*JFI^|8D^p-`vWut4}_tsI2 z-Fmp;>UaO*<0MP|>RCEIZsasp*#CdFroJPmTVGScV)=iCMdgiIR7wVRYa9(tDZ-`k zAZ1Pu{>*FTq-3If=IduO_5{Nu{1ulO zlBTqPJT`?%u*uq}WBAP6g+7}RVj!Qy<+VB}-o!D#3UMUXs(&@FOO4&BwiJHw%LFX? zkFK9$*nbm^htVbDY(yyub#DehdD>b5M5;$JcRxt7q+|?iA7~j~dDl~FfKy_LU3CsQhkcWIfoNV}tSp*W z7qixw=$}Ir@X2=^ZJrO$IExO)UvMB}qy|mdGTOOM@fFC$F!ff~|c)euk0Dv z^KuK$09U~S4}1;v_Yj@-jZMSt69^Ci530L{b`3u@v=^kZH-C5~RR8L4)Zg_kMJVOT z+`xElV9J*_>8p(TDkHu+yu9xIt{X%yIX=3XKK!Kcuz$PsX5UzMv}glSv{Mz;NqEE=^Xgi{hVm-TU5heqA;WbhvYJ(V8g!d4U&~-B+8U47Gf*rj%YkJaTx< zHkL8mHg@TqXKz0H!=+=-{c=soE`6hE%>KQd(QLSbgYN=K`qoUoJN$mYbx@xGEWkTT^tea};j2oj$p+1aB+X??`MW}xr3@}s4Z z)UEIN-b;+8w!q#=U*d&giSHWNH5ht%A1(4i*ho)03!~1$;r;JB{R^NhG;8L>x^|Qr zJ?NRuM2|Eg0XmG%(uL!B9&~sPX)li_k(2IP%?8rms;dq6T8(76VB4rV!bJHhe~%Ir z0&q$a)*4TlHc_kT?R?ZQWe)q|0Z&Kw#VeUKNzKR$kaI6JbKsQl27M2Xq0bGRyVfwa zd?K|0Gg4JUp*sHBw`{a@@Ug2;3_bCkLoh1rx4q<=O3Ua^{spwrvX+MkYq_1%m}ifX zKhU{MLoqvwX2ed2*+x>nuWux?@8+8ZRLr;VMNSy%Q!i|%uhVuiU^uoOd0uPN3Li5* zY&dy(Xt^;w)|W~@r$sii#lwDUHuiv)5|`QO48K59x}c?lLTsil{;Vu=V}d6dH^Zv;sy@xXbFGi*}k=;EWlAbAiP2lY-nKthxR{P zs`Me!wEx*Y1ILDpE6>AaaR?etJ*Q^b@+(Qv094Es$rbK*Ru(uwo&w zAVm*hzE3hn#Z8NZdCJUTWR4J%`i#~QX{j(?$fqI$U|KjzDdnX>QmFOj3P}u~={86> z-CrVyro;S^GuKfzeDZqtNcY%<(P~R#b|ibzgrn*Md)chbl2|=uFZ-Dz zE0SF`;i&$=UQX`<_w407>wF5)ww0Ggw$2XXRlIsYf@M2E+Y1m#cG};3@nV`Y`&ZjP&0eoX#G<$QGT2^te;kX|$-`RuV$?i*}b=Ac>Ng@vv zvN{#PwbpsfAt-rXf&M1o=tbd9oK#nzkrBW}`n@6zKqaUExLyP&{1VIeN#p7G@v53C zFx|T$gKO{UR;!>a%xg#4^X98F=BuS@p>Ik$R^0EghbysrWbeNzbL4wOhFy8bdl3+K79veP#{VP~gbYT0i^*tG2(CQcctdU9cl+k=12q zf@OhPy^!iMDvw^t6z!+*`>9?V&R;k$y%w(*t=0ygllc%xXol1gZnJ z(6XgkC3q*(a4p=anDva6!q*(TI2QP`lNsR<1$J?EgI%2cvsCo6zHO_bbSnpXx-Z7C zk!Y6yqFH7M@rq^LGOGw+qt|){#Q7W6Z(7+XP1{%87;)1uNy6_1rf4){A%Lc#hTld8 zWjR4E6PlD|u{p7gl@jW*SoxcG-KfFNbp>fc9JqN~vKCcTAmq)QKhuDt`MsVZ(Kb4BULc{mNvgT(KVU@CZsx0pb_-wTxr2!`o;_u1 zA~~v|Q%GN_z19CNRLa>!dOGcC!SvNyD*f-mix>@rzs1LJ34^aTDDU;O zwV5a|T|lpAX`F;F$I9KemyWhiE?V{eqE*q#-M>&KQL128lG*UK)zxh*ozXGp> zzG@sJ;5vO}1`cDhKc$}s>Bhtnfp}#J{ba@^6ISF-O&A*gHGREHw|}M^De(kcLdpew zCJVzkQFbByyhMqJDw<9XojY@}r<;KxA1ovVq=TL=mC)kT#bX?kg9K@xMI|^=K>aLQ zJQny~TfgH2xA)tJMzf+>a2e<8Z@O1dG5YvKLCwb&PfF!b(x7#41qiNdtKrBU?4xVT zhcCUhcFa1maXcq*Z^c?NsJ&NM^LFQ3r*1oLx8EuKVdoD$(fa0DTf)lxf5ryeJ6;5s*ZQBIOIpvS`S$9k-<%r6J>_rfPRg zweB-rdm6gqshKv@%88r$bvmzrK!p?!J5}EC>6|%zeM5_Kyd?ATe&6@M8^B8~iIaAE z=GwZvxc9#=-~Zdcym?bxZXUeuWeVo$z;$=|d@fo7*LXSkLmeX}Lpu~JkP4zxvwbv)(|%fhrkW|ee+0hr)t>?QpV z&6=AvA`Mdk5F;SKVqhtSw1ZATVZesd4zfFxrht1Ki@zlwi*arAi?BoaOcgtyapQ zG?y-t9NnmI&^WTl8b{cl@@SDqWq5oB6Vk!@MHCE2tzkgrfn5Zc{(6bVw1if$dJG%a zX8hKNV>wSf>M(oodB#YM6&_pFBSc*d@z8_KR+^&)^bE!WRWe^H4#pdW3N^~1tQWLf z)ldM^q;kNNIg~PixTr_JQZq*02LJxn=Tu!_pc!9A7|&uYh4Q4fJwZbN2FjGLI;2M( zg$wqe{b}>1-yBd6eWT-iKs~a9cBQo!Y?p??$6Kb9E~6^SPu<_eyH9^e>vX^@&;g5I zLL2yZP@sBdw$hoYH{aDTQl)u_dAp2c9!5%P_*RI?0Q47^aVj6>+<1GXyAPbrm z>G`8gFZV~%8g7~5(pyLyWBbTP55zZLNhy-1L$rV6I zzXXS;31DV=2L>eec!LodLc!8Sx;>BEtQG2=T`}UEui?WWAy&rY)9XEb)aTvw3Jnk8 z*H4??#)0V>TmJUSiN_{O{=+&Poh$R6Hed*TKKPeZNBGAtI;(#~&DIdFlI;_Zjg?H7 zuDD*hB3!avAYMSW7>P=zihf3Gh%qj0aq+rhoQnB^s|bm@PGkBYkz0w#F`K-z&xeWd z`?kV);3;V}mExce);_Y@|2h5Eu(xL^vx=G_qDuo_%({I3UO$RpzDgHjd7MHxQAWH7 z>72EKdGokLj?<)M{tauAz-$tg-*v1+cJ9i# zap}sFZ|}KY(0a47>b2unj*lO`atdxzcD=Q0^0BK;-#r^{?g&?QjGA9bxSTK+ciAyh zw|Ue`NZeS{*ke~#L4-Z;qB`N-xVGUtd9UaFsPN!e>%?QBEeEcxIq;D|K+al?wTsu9x2)`oC6C@)AgpJL*@X9wSG{QxP7Jd2TfMo7XcZ@ z?>@j}FNNI+4LxH$ZDTslhx*7=&%o1?#1UfJ?zp zk^C0HzJ|6DU$C!%bn01?h6CbF$pyR56trtLOImtEuYh(1CwbP4aPRh~?B~o{=s}cM zisR9t)Ceh{iXCYzB#bn{v6xG5;;35qK>LMY?>1?ifCZg82N9ZrVO$lxc^_|>CoVB} zOGtQTF#BsocXw<^sE^`rW03Aj6X5y zn(T>G?ikrO+;%w+F4W7)U#q@SO%8b{Ya*rXBdNod;YVkjS);XKXZgil^HnH*z8Y?H zhj$HqC1fx9Xo%jQI-+L$jt^7$JPTc$~5UYSN79{zM&*gXXv$ne8zVFItTWJxxri6F!bL75s-9XPbb2!{pxd^m6QP^zkjV@b?nJ)CK0Vc1zX z+CSxNKx8-s){D5xZlq;?n1BRgfG{`erScPgf>)nMEEm1Hj<#BS7LH)F6%&BdMt8=j z>j|_rp!jcCgfLO|;R*jXzIZr~)@v#2a&VbB_f;l*c={58%ry7eiDeGdJh7AGibb&_ zY45GXzl9aJsiYO=A$k`nyFn&<(xaG>QUlGlF*3Z2r`bSmVnFQNpy?;Uhu}x%G>^5u z>>7RWm8@`1^QTe+Z8bVJ_!#*t?#T;+e%Vck?;hM>()g#8h8G|m1fao1un0hpMm+(_DmIp#=gro62d9q%{xOK1fL)uK3!?(WdA7#xlnq3stqe**0N& zW7lN*>z()!E?GZ0aIK^bV0E+vpdGe>w=E|48o67ZND0T0KZMPGAe`z6$x3A+fP6-* zT&b0YgBh+YJz`wmNW*|B1ol|64HM2vbwXW~^$PxprY}|;Mbc?LjyKX^97RQ}G>{6{ zo~7}&?BPSVP56U&9=px^%pY1xY$Y?f#jg}!E*>uo=dPLO7j4@=qQ3~Z*d(O=__J`# zoNp_>)nc=i-b%6AvgUCs8SDNS#{L4Xai!g;PrVdqzwi`Z#R~F$j{COrhgCm|OyeQ2 zPehzX^6#C5C=n)z?`?i3Z1oc%K!xz0QzgLyKZV8isn|ow(*J{j@m|GEmDqD2Zg>xZ zRtkJ`!;|*Xl6!baVWEA4XXmjb!Yu~Q!Q~V14%v~D@Wxap{Eeuu@e{?fqb4W_kT|}# zzwbC)W^)mso=DcfUP~Z{hbJgsgXeC-{4YZ&&$%^$KL0fEI9{fS_C5O~Stp?C%T=l_ zfaU@m;`pO6!g_;`u2w8!569OO}V;)fLN zlT;zT0o4Bp@I`7s3t8S2bvS)aZA&5eW_&!|rENcnYTLor6Ldl>UOmj6`4~ee7$<~W zNGa%xg7N4@PY&HU+(N+%`;Z!Zj{B3|7zlN)JBx3YRt~k}?-J4!nt!557u4xZ zJhB;n1E1+yay|P$hxM#VR_=2>D<^6~ofL zRErg52XoGDU;yhk}inau#toD(r+QPYV0Mx z(Os{pqvSy?@yaSC>N$`fL})T5`V#1V!5MTK3GbrWhX7Uf3(3KF(CJ%bF=fhy)L=>w zPNt}oQxG4*{cJM1PdH#guT$?{CbJ|HFQlQ5DW|@O{PB27I|f$}R0f`vvfHuP%$GKb zuNRUpZN(TQ`|RxZIWCxtv)GK zr=G$qJw$s6?vhLwlAcN$Hec!$PhilhtpbC# z>4GDe5GY4&4qa^yqtOalc}`M-4zR}!Q^@r>o^qhRS5Y6HP#-~fzEIyLz+@<8 zp~lRLPD`A_#W(>}Ub6xE?7(2?m?kMOiW++C8&7@xsc^~)aST&PXg@$1^G)FXDh|z_ zO@P=AJQ2U(sH_0|j_MgfK9&I&;9)88j05n3xqhgCSnT*iGQj|4_6UACi*X6bHtK>b z#NCA+EReA1Y14SqcUHZ=YP|AkA-F|>)Yzz&5oyCMBRpd1mT7o{jtOUI;iy0&<*$Qd zx`=*Rh3J5#3Tx4=*%a=F)CHL+dB~IKIK1Ef?xFscbAKny@7Uh5jX(Z9%lF!@ny0rs z5Z>}YWW$4zwfjSB_JXTb^&$+HPE7h{&vG|k!w?QN32 zkE*zWE>R5ev%n~cxpd+fr+#_G({}ha77bW;?kvbxvh#uELf%aP;56(*+(qMc+nSwg@3=(zc%FHN)$?U{0}`?0G4 z9}3IIS}*S!d+hRFh;*_&)7e$wY>sj?aXymW8cJ)unN>8jeWtkbmMJ~Ce#9|s9ri=p zaCFUB)8&?Hu8N!arQhtFw>s17XG$txE4WfHeqz!x`ADQ>`v@GYjh4@+m~sk62fi7c zDJ~m3I64S<^v&GDv4nB+m83{+Efo63tz)&96XwfM{CuS;Eqk<aRUH`rz|lnMuof(J|r(dm4uwWTEW>Cv#-oiyKEaj%`EWrJb+sy|VWj37PX=+&!{8 zTz+79_munKOb(3AE+-D{M6}(ZeK#H1Ax9ayot8V=MnNOXs$N@vW&N;oDh&~Ni$r7* zNVZ1HLdC6Dn;}Aiev2tCIpvev`{GRQDmVm9E+z|a3t4zqRMOv4YFP3}@@O|b7ncn? zX9|jbC-J9{lu+`z8`*_3)pf&dQ|=0qa-T!YliX|BwKG+1^G_ir zr{oQ?OVqJ-*IadTWiUin#9Ha^drA4&jz35q-ucyTz1) zS+b_r-Ai@ziAeZapbd-p-2`{X#<(BEW$kE=`>TzKJDO}ij4#`^-1fuePI_KnxxLEv z*Hx|Y`0;+DneNSrJL_!kZ!F(gW&1y?YApXdT+WbEg@`pmw#lYlC*m&_ah7>K5^GjT zeE-4hCF(p%6;zG{Q6k1O6oo1^(DHlftWGNEqdkshWS2*#zjM-{ZRqD`0$ zR`MxYXj@U#655U3k+f1$Nq~dR;%WEJuzM$tVi5!o-WM|K0Gre6gj%EExvXt5fA+)s zG#F>OiR2$RD^c(c(hT94aPSDoxE|uCvR`AeOXr%3~?2W zGg+sdEj{pc=VZ_#7N&g*rdyDG!9akE}A=5&7-{sibwyEx|>0_XX!?pNtj)0LeX;=1D!mS#=zK; znq+@00K7?@I2uSrDEc9UqE%6r)c8%7)c7->MrP13cE+EDoC9WC%B_=ekblmnm~C6l zW8Gw3z1942JQ+R1@_M6S;!|BT(dwn}#Qt@NLH`??=lv_J%+Ey(%4W2Xa`v(KR1=6Q zLQf$P6&s2Kth7zBYamXgjYe-+M50hWc5i}UPf#ZoRtvc=sWA0yD}07v*kilK!sDo3 z(F6#kk$=Wsi}Dsju+f5l3)gUq#$^7tEEq##Xq$K^S#YJceeNU^{x(jVe=(WxJ+|?8 zqS|;++E0hbQnFu{LBGFA1stGU!0BKkiQ6KQgBKszuDtkw2qR7GwaCFE33P#iM+tNd zFhF11L}f?es+&tb%WpZao`3i={$Fl$aU^u5TaH4AA!Mh|uR9mbN{Ov4HPUDOqj(dH$+ zC@S*Xr3AHxR=jtX-wOY`u-293x1=5d+uys%asLKOP?O^t!yCvVA*Hzh!^nFvX%JFH zNDgCVZiJD?T#&h`1U$>!97+O~xxqu>8<;SkW9HRBtQz3pgCa;#^aZo z;#rcUB|Mb?d6rrOa#fMx<4F=d#9XSh%noUpVG3DV2BV2fLnvDqPoyZtpzMvHz*RPa zfvil|H^X%ChEhCr1RyIjD4kk$DWuA*5OVLg(IknqWNI8bTZ?-X2}pE?Cjz z6Ep6D8F%)KyAaf2P6jbwGv;kbHD70P=KP|Z=6Yr{TavRDGnz96SJ{$W4c{&=u0cHP zN3OXlXUZyv_sn?8UQ4)=Fue2UpZwyiHQw(sY*#^c8iO3b+bTjBmDz(RtVzZtrvA;0@O0@DA|JmBE3mj}E;KMeP# zGCxhjG)Q}o)#HipD?Ld+4H>@0cd6h zF1=pAPVUOZ{Rdh#Pg7~n(Ct~eF`H6lUP@o3chBJ#qZiBE#=NC#yFo?6QK(EJslFC} zaaJF^72F%EkN8^>-JV7p0tYbj_r~f=5v)G^S@4vB)3?ifS56<*(#?xYzA5z8f`k`~ z3?7p1*Wdw$4T-*Z3TDU#4GA!NNb-@vgBb=7@tVN{8#$zaT5?DqqDkIf=q#z+JqnR? zKW+)@JV(JI>JedfC`z{QOo)&^dSiz>dnIJ%&)qB;D({Vl2fwgj(r+YQVORgL>eBrk z?Vf%6TRXRRcpmB4vuEE!p6&ZPIyyaD_Z;f*JaB0L1A98~+}gI=^U#i+2l2dr-$R|H znw3J}g!hcUYXC9HbcG&x@KEdi4o}<8{cXs8aQ{w}kB0*XTlaf*bUfU;eP5?%U)w?Y zt1C)&{HHiA1iLH{TMv0p!1q$FwWSo66I%V%;;pVg1ZeE*QnJtw&cR}ZYSqi&6YPkv zs*cPs)R*UBQc+z>S#-tm(5dC|FD{Uus!REgE_tA5(66SZADmdNg5Dst%GfI-ixp3Y z7tGRX;crqgN%2%wR@IP-i?^GMd=a1ik*wqrMZYRN`_2qhb8-Bl#v|USJ=b+l z6hY-RNN4-H(D;EsbyZcB+G=7ya-tTGynMLe7J2pY^m&>Z8|yqxD;kY*$*YY=+Ow)r zbd$1UA&cCr8tc|ZXBAb570(%0G|G)o7cFO9(OB0Uoin!Sa#xu>8)#|K=Jo#jbht|7 zsjBl-iJ_n;(Nuck?MM&YG(3Q1-PlMk>ga~yQA~SiOzX9Qz%Et?u3jD!gS=`Q%KStN z4SLk8^LVA3g8JxbOIpQMWn z4Mj{wHHAD7s}_xeZaJyLAeyY^#e3TOSdqGsk(ah^;d#`Rr@>3HYNOZQVckOD>``Nb zsi&bLnA}27$|{Z?ACZd3r`dRXxMW=yL`x1=#pF~|$OEKX74!xRMYn6z0a6;J=2nJC z&VDx`#Ge5h_$7o8rN6uZPhSFu3 z%+LfDiY8__s90+>p>tv`RBt$JPcoZAt`rG@;iEJl%x9Kj`6ttnrqzzB0{c*~X1alx zp?7oFr&x9o>#nF&xL8sC<`p3fda9t*Xe^bBCWpla-^9cJdg@>}yP*!I4j%tpOY@{M z1MVOx8Ag|5cF4V&x0U_!yMrYWv$=90fA!A20y8!kBUHyQs@f==lwY^4%;T_({TwraL_8O>H-UL;@ z;dqkQ^c!HU(1o^JgLb$P&47eyxp=3)Yk6URcob<9ABU;QrQ^ZGyQV%5mz>zE;tD1! zHR|4_D(~2eF3x8qdqk|NtHBi5^l5ohlyts$*`_b$BsnjNx!^*>^rq@gjAq4`$Toc& zViMvfzOmo&lLp^pn?B<@l8oz+ZTjreI-ld@W`p|da679&Z>)Ae?^Y$1HpbXXsbViF zJ-(1JutrTscB9T<27-eo|DNjH4VHustP1@}C1=ppSibZgS60N*=Y>4yWemA1Mf=z> zoMWI(X`2>Z?Sd=lz-ou{SUx#AloZ1kK0dWCg2+D0OVb$LtM265;LhPtc4dc=;uasHp;10}Yg&gu0OgQZaJ(q|B68 zyghieE}vBe%81xsOXsx6^(lnODls}uB`QCDP3!rw$sBp>A``IY3SCxW_B%^@Jp z&3W{W&CyUv-Fz7y0m^(Se{}|g((zxsGegvw9a|fc;u+XWzr~Rk6;LxoSjVoyR+%E7rN!Na(Mah%3%c;2^C0xj}Nnn3Rg5BnJ8~I zrM`{PnoT*4@M}HV=l@E{lli66idnnzB>fiU)9etN=qEX+osF0Lr~9EVZ={C6ww9-; z-EW~rVZuVDmr@!1tin@GrjbpeY;8zAoVDV3_TWDtGxQ)R*lJP4Q8brd3>OX9j5YP-6&5ZU zJmjLG04^FX?E&djQS;iaE4zN=>KJ|O?b^u)-?Lm_0YA4dZhK){$kj2_jvEpQm$^T& zS=}i&-I>Bs-ZfX*o4Y0+``*g;Z0`+*TJ}%X9k>O*{u%QYq#A0UH{lO7?~6*u+AkkQ zWu5wR%BURjG3$M`Xv)<{0Rb{zj30@gPOA#1RgIg!ll*$}`_@oe)%CQ!w=7o0p+t(- zl2WaN+$qw$e|_&vsfavqGu=HDFPnW{F^4ir$u>0e#iEfS z{7NsyxAe^E^zv|e`IQGl=~eihnLU(rlMPA9hLjCSZ=}G7ZqZm4S#MT`vm1wY%s4a1 z=JQgg_K*n^!_?%OVe@=kN_x#qVG+f#9nYCqeRW{;aHMe0@HY5Q%YZ8LAJ%6ly^+c-Q|?wMzl?4l3C`pczmjq}W$dx*2$P$eH+t-M^I>iIO7i98 zG4J)9>iJ?+b=yPUJz>H5a`#yEOQ)};E}JPXA9mhaW=hTfu+ikq_?!(qf9%MZL9oG| zk)Da{A9>b|x4!Bcd+-mlu6fo)vRa0=&t-UE-3cFhGa2h9t0r@=mW0yUp}Rv?p4Q|P z7^^0_5Ca$?CVrIl@aThYCrvheulsuA)~k>G_2ch89(wShYug|C=402g9uC_d9!mNk zr+jRGB&T{Pc_uv{c0uGT6(I~?S$lcy*pBh;iFJ|ujTiR}wGC&_ICDoIBA=&w=WR#^ zm+2Uly&-m<`ROe$OiQKrrqV&+~shMT0xFf;W$~Oq4zLSO0W3Yty)t_%cr-}Oxcf^16_a( z|0%Px+4`<4h3-v_o$IXMU%#nyll8sSP5Ug?zbftJkV(W zFPWJStcw3H%TnmxV#WRMk`o`OxBXpK;{#4x$XSTzP@Ng~sMC%x6@V4f!hYOHweMGE zFj@KQRhFq^0D6xmldsTOde3Syxl0!P@2DJAK}I-bOuav=qu-^YO*1_bM;o28|3tS~ zFN`FIXJPzp(n8pcIb7#*cE}8aqrNy{ zafDD}us9M}5>?TSg4Ijm=P%sCt3}!e8KiySw~;mhA@+!$m>|bPv?3m&o#G?<*`EvC zD8|E$Vv^4V>X0-ITt2%WzFzz`IejA1I~To8!drNtK`NoG;DEM5ite`)zf*n5&}m5X zxqX?wl;>=ZrsF%><4Z+-8F41R%kNZ>F<;tqswVuSZvLjy!@hLgw@lW4$b$Am)~xFR za_-zAd^~jY!7QoUKX|P5C|IiA?g0;6+;{hS1F-Zv7VYU#lCvDCgO^7M^2gIhAu)h& zMsTr{2pfPnX`ud$)Zb0+9`T-WS;fLoL}BE3MvDWwsr&c?ERz@(H<)AO!3{yhFqL#c z^;DTe_$t)AnkxjS^firvc;{ejP+UcQbRlLjY~I8LqE}^dDevG0DMNWy@~|r>Y?;_g z3lMj~+}EL%tMf3fh732ZORd4Fa~Y$CokOX4$Y)TqQEFw>K)b1IUBgkyQTm}96*w;g zYZ7b)aUs0=@58j#faw**z%-v!nR-f2X2t49xJ3J+JfY-LR|<>^gz=0F0Q zjpDhWMMMYjg%s7wv-TG$RO@D>AQ~~|LJGom`ND{U0*<{5nN?<^l*&AiLurT$<2oe@ zJ64mU^SQ`$OC_q%g{>e6I-3M^T;7#Zh`#^71Wn(kCo(A)rk_mf{EXf)!IMcJendZ~ z=*C{yKB6b=ACvScJtg6(Mh@l7x&Ik&XYFLi*9Bl83}|Vq(dL#dXq)hJu)qL!lzIqZ9R$CRUDF1wIij=Z{Z+#1QQM}#jp1TUY?TM^D%@pi{l zY75+&OlMOpiwS!qd)l_#Hw8m=7I#9)6zR?^??5o`W7c_;m%R#T9b3K=PLPaZwtuH2y zBn~|pvag@az)i?zao(#J@g5i(`yL*aY`F)lYQwf0I%(&46F&2saf)%ofvBhrcK*zx!}{2LNL5bvq3lvQ_tU6cX3_F;hB%K zLZv@D|Hbno=k;!O-ai}4u8L$I3Z)&oon&&AjOC243^i_l-yO;53^_YLxt(Zo!>>ym zGJ|+tc6r&b=0TC*(gX4&v8IRQ|jbn|Jd zdAk1;4>5-}XXQ7~TFd3on6otHZ!1&Ay7Eri5y(}tT)s|}~sj<1_aTcxva zQu~f_|EvRKxljPf;Gb1o~cH8 zs$f;A8xAK`Y)^Y42XMcJ(H(}H2Y zA5ja2(hcS?O|4sB6jDgKuqo^n*qq`F7jrwi)B_&>F7E-iB;VI*br>{MC> zT$a7KZe(4^RZTHPcaH1?Hze#XA3Hc*u_|1#YT{_PV%?Ox1zbi_0J)uDO3t{r{bJ|n zswoldMBehs1}AU3WA5parf^Bq1R_tZie7H&fHS6SFmHkYw1RJY-(b@K6WT}LEiTgbU>ar7C)qKg@I!hpy6uRB)* z?{$jM6;X#jp)m~ieuxLX9-h&7A+Vyl;8+2Ma^fPS;Atoxk&|qL88N`yp2^3I7`!)x zcDflsE{CX7f7gV|M3qVTXe1&bX}*Rw(R}bMZJ{Tc2L;k>rWXas5It3t&X_!U+}qpZ z^A7lbLUTlXQlgI1zL9(}dB%BS4pc~X&PNH>#3TR>XD$#txcwX2JCl-sxiyqhG*%8? zd`i`jg^a0VW~wOcEE)|=Im>43&S`r=*j_NY|GFGlC5o_6r|bx7UkW`pnm*_S=tK7y zPJptxkT&l3tni$ggRuc-MZj3F5SbUqgBeSYu)DTu!}V=oCuqsQ0FrDSiyYo98%7$Y zGit&aHKFv{@zOUBAYfPSTe)w18H;|hHI%w3WZxtx6+IY5Zn1jNNDPI%Tcr*7waB(` zlBU#f_c5mT(1{*cJ)H4&`|W6$^cJm)6(}ca=<)lW>-&#XpCM)`up6yH2UYl|N`;!M zCg{Y_7r|sfBK&*&?;ljTkzDX~2`BIgKKPW{#mL5nUoNM$G6KpR^3}X%k4i z9cbF563RhCBvHGK*}Q*>QI_cT`?U7|3^|z18wWP8J=3;&^w8MGi84e94;QYUH{r$A z@{j1xe1qAxVbnc(I-FZaPNX(0#M^C%#^X+~xyQ@rP53ie{}KK9FoRw-i&q=@)qDnd zrMkdgspfO6f>n$^x12WHn%gN3#O=v5+cpdLRGU9cGR0?wvMM9CsvFkQ1&b-Zdd6D% zV_Rk@t14ovzF{q+cQtd?GC{OcXS&f3^-?s!7f59yma80R+KyfE9C4GaiXPUZHhycx zTbu4}yf5CD;IqGsAU)tFC;9C@hu?lIo-Ny)&!xc9Ed|_R1oUBkt^@qsRB0_5Gx&BA zcr-fmGcqh<0WiCdQiSQm+EHThAm)x&wt4H}K&o)M+uw&UKacx+1+(^0z<=y)FEe}3 zfMrZ9-2p^C^_)B5hvgB@^0VD=`Q|4-RXw0nd*HI_=y@0~QB+n@SaomDDZl4|^8+VP za-jdL)a?h~*ypbi6+{i8d?pCz!O=tLx5(`BIIzd9+;tneZuu-TDg ztK**2DTuK-z+fIm8_uK1krxjMEWF5Q=j`b|Pq)%pDux=yDjTJEh$SJw+>ookXd(SE z%_lW6SzeEgHZ1)eN{cZ={TdPuHX4qU%Cyrd&dAy(c?4$hk8t8Q0~1XX-Z#!qZVxYS zds@IZRLwYe6Ou^G{#XZ)p&XCY3>_kVM9)1ex^q*qsp4fQ^;4XX&h(4h!9XJ}UBT*! za}zzGye(j~?Pk^*oqUnvw(HJz-jz7IV}MRhv!y zea-~ueTg0Bv9^y*^!G!)i;X{xl)v<_?Mc3HeRhm_k6!Wk~H zsb&+7lW$FE_WTKLO6FWq>=Jb~5hTHH0S5QuA%=pqDqK5exXN$`NP097q>x)G{4xl@ zbx@k8-9~!}j8GLw%qBsP2(i!u@TQ0Gp-NMm(IACi8r^IGKNNnc9)e`WOi~wFE_HR4 z(vXp^F+di)bS9<{RhcvD9=C?<5J1#}ai3ofDL^W8P4FifDl0?Q>-IdJ8Pds9FH!)c zE-sYguBUF4^TCK%CiPPVSTo;QU!q*J(fNUV)}RFvEqPEO-&A=w_@YX>IP$YYZKL`S zv?<6p;ywf7iA!mzVhCYG@(&^@tH3*zT-smh3{E>$VyC^=)n?Z@=`my}pag@G@fH&m zdx66*_a9+v5>FBzI_5&Yte98$sq`Jo)D}$aQtJyQ45-0u6t#OLEvo}3Ah-&YiDNIH zWdKGn;u;|Amam{1{zWN+BB17(PL?Stw7<&8gA}p_ZNMRPD!l_0N;<8?3rXmi(YzXl zZc*wVs8UK&>Kg=Zf{-bOqbns0s1nc%&OXFreGWl-;!HtjPz}v8uuLg2=um2*6>^f; zG%=T0v&xJC7fa}rPSI)m_gM6U@f?!W^WT5=^Pm6xGxL@xQiv8PV>?8}6BR0BG=lj0 zb7Wr>aiS)AyAv+Tv8fj$ExQN;P{B`|#+siN;2ty(#}MVX5e#8iX_L?=iH>vWCfx{- zGA1qkn4U@qf_+9w2tEmA(rUb$wVd!jA+(b7uv{fl5tYVpo3*jkr1ak?4-rp@rO7;< z7#UC!v@K4+Ef8WtK&;DnAz`YsX=nU?smtdd0LCcdN8l^sy2{TG{{qMnVm<5ZgOR=8 z*L4&{oSL;bC-uVQ5zV3lB|a zR)jMv#!gIFBALxYNl-USO#VjV#l&fQe%PKrx?}9*Y$u%n} z3PmNNfxlcfdUAY2xM)ozZ*AC#!fx6#jjI@CteDu!$~AttN4TsJl_U9~P;wJws^^1Vm?{BSsL z$584`w0`6B8|Sj}FK+*FR@Kn<8;Cbydm-i3oblz6l9q5<%XDf-IJJYKq@NtCfj{rG zB*cG6OcJQT-(WoVI&gqv zz8)CxN&|zRu-Y;?#n5{gRy-#YO+`+KkNS^eyAXv6ttEQFKq842KIl}u*ZXdWsz4XF zwMNA8A>9Y$sHSkNI>#UI3XInS0ncIn@FmS5!o8M9t%)rY+ctpC3Fg-m
      rIJcXT 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 W-z!aK;Zt+R76`W}P1 zlX|Q$5@UA0run}#`o5gHL${l>k~snibMot!&*T)&lvm^b`Q#Scy7@Fy<+5Apc#1*b z=^HE^GKUY0)`v2y(4qMRdS{2zfcZpvN;0LmztMHEYxF=kxn$l!ubfe@$k2hBob=Ai6lmRi`Yn>LfOU=~>tAaEr-zTr-m1Xj3w?S!wAgLJk;Eix(#6Kf*> zKUiev&B7DV2K(DUhpKe@5%B&dU>ZE3Fx7U z8>F+O#~T<3RFmH@$56diOz4-5ra;6zO43XTkFm}EfiNlc=9KFm9_&(gdk>MV;#?`nmP|69rXEI;OPer zcUo5K6ozLLK`MgMCw{nD`sytrwh~6)ujM7DE{sx zg-AG&zfB3ta5FX~noU&ox`cjKvb4N%j zK|P`;r4~@k)s12NpSp3zRWR+UzUHc)E36sc2oJr5EyLSpnp=mrjjo%{Zw%)*UUN6y zELt|&1=XwE{Neadh(eI{s4`LVXMr@d^tW?rO@Gvyy*0t|{dhC(i@DK+=kng3!$Xu( zryuoVHa;(Sqoua$g0GqIq4!@^QCju9d)Lu$y~V9tG~GIQ>$ zO!K8>aA(ee)O_&-wSYRn>324s*fLhy4Gv`pJQ7C2eFeTQa(Jc=u4pZHo!BdAB@~k~UJFJ9P0$pv$SAkQ_!!n4P7> zVtlRCS;p?#2o5qi@GQOKPNS!C@R7Ul@Ndvwq+1R3b|0S9*rLklZp$ z-huUID7_^l@??fuminNV^72{)I(kp(?Dv-L7-Aj)(G|>lCnURi_h8A=-=dS=W!MRP zbTi4pB2!W`Jwt3awkjjrS@Mt$2d!ixL&x}8=;wfIqHxP(Z;2WsldwoV2Kj*ES;^1~ z7L1XPgZrn;j*x$+nC*ue6!Za)tYjikS#F|SFKHafY&~GV^`sya%|={Y0oupP5DZm? zuSe(^QHSJ$ML*f4>!Q|?sg#OJGe>Ymz07*$frM`^uxM(cG@rJiI`YCL9BgunSuK|v zY@{Lumyl$Sq%e+;i$I70H1hnJ9qA z2@$5iCObwg5nN8#rlSVx^`a5tj!-j?LEQ G7gTSQom<)7g_j85zUO{zwG{A`g$k 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 RHr4Pa`K9XLaul=4`cDi_cf9}r diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 546114df6c307098000ed4973f0aac1a4122578d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48520 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc deleted file mode 100644 index 23d280c0c14f646a96ed5f3e2bcaf59c50742b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34129 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 Y(3%vg&$w?0)d`_GUjLD>mNoDH0o9L8EC2ui diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc deleted file mode 100644 index 670d6f2773adec584a8728721fca1275be76e250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17207 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 NNfYgOLSahy`9I>9h%o>F diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc deleted file mode 100644 index cc97b182e85208a37e126ba97a7b844e3dc734c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13203 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 DFW^QZ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 3cd54dcc484897cecee3b123d2ceb72f6d764e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14923 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 (). - - Example:: - - num = Word(nums).set_parse_action(lambda toks: int(toks[0])) - na = one_of("N/A NA").set_parse_action(replace_with(math.nan)) - term = na | num - - term[1, ...].parse_string("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s, l, t: [repl_str] - - -def remove_quotes(s, l, t): - """ - Helper parse action for removing quotation marks from parsed - quoted strings. - - Example:: - - # by default, quotation marks are included in parsed results - quoted_string.parse_string("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use remove_quotes to strip quotation marks from parsed results - quoted_string.set_parse_action(remove_quotes) - quoted_string.parse_string("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - - -def with_attribute(*args, **attr_dict): - """ - Helper to create a validating parse action to be used with start - tags created with :class:`make_xml_tags` or - :class:`make_html_tags`. Use ``with_attribute`` to qualify - a starting tag with a required attribute value, to avoid false - matches on common tags such as ```` or ``
      ``. - - Call ``with_attribute`` with a series of attribute names and - values. Specify the list of filter attributes names and values as: - - - keyword arguments, as in ``(align="right")``, or - - as an explicit dict with ``**`` operator, when an attribute - name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` - - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align", "right"))`` - - For attribute names with a namespace prefix, you must use the second - form. Attribute names are matched insensitive to upper/lower case. - - If just testing for ``class`` (with or without a namespace), use - :class:`with_class`. - - To verify that the attribute exists, but without specifying a value, - pass ``with_attribute.ANY_VALUE`` as the value. - - Example:: - - html = ''' -
      - Some text -
      1 4 0 1 0
      -
      1,3 2,3 1,1
      -
      this has no type
      -
      - - ''' - div,div_end = make_html_tags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().set_parse_action(with_attribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.search_string(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().set_parse_action(with_attribute(type=with_attribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.search_string(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attr_dict.items() - attrs = [(k, v) for k, v in attrs] - - def pa(s, l, tokens): - for attrName, attrValue in attrs: - if attrName not in tokens: - raise ParseException(s, l, "no matching attribute " + attrName) - if attrValue != with_attribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException( - s, - l, - f"attribute {attrName!r} has value {tokens[attrName]!r}, must be {attrValue!r}", - ) - - return pa - - -with_attribute.ANY_VALUE = object() # type: ignore [attr-defined] - - -def with_class(classname, namespace=""): - """ - Simplified version of :class:`with_attribute` when - matching on a div class - made difficult because ``class`` is - a reserved word in Python. - - Example:: - - html = ''' -
      - Some text -
      1 4 0 1 0
      -
      1,3 2,3 1,1
      -
      this <div> has no class
      -
      - - ''' - div,div_end = make_html_tags("div") - div_grid = div().set_parse_action(with_class("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.search_string(html): - print(grid_header.body) - - div_any_type = div().set_parse_action(with_class(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.search_string(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = f"{namespace}:class" if namespace else "class" - return with_attribute(**{classattr: classname}) - - -# pre-PEP8 compatibility symbols -# fmt: off -@replaced_by_pep8(replace_with) -def replaceWith(): ... - -@replaced_by_pep8(remove_quotes) -def removeQuotes(): ... - -@replaced_by_pep8(with_attribute) -def withAttribute(): ... - -@replaced_by_pep8(with_class) -def withClass(): ... - -@replaced_by_pep8(match_only_at_col) -def matchOnlyAtCol(): ... - -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py deleted file mode 100644 index 7a666b27..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py +++ /dev/null @@ -1,432 +0,0 @@ -# common.py -from .core import * -from .helpers import DelimitedList, any_open_tag, any_close_tag -from datetime import datetime - - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """Here are some common low-level expressions that may be useful in - jump-starting parser development: - - - numeric forms (:class:`integers`, :class:`reals`, - :class:`scientific notation`) - - common :class:`programming identifiers` - - network addresses (:class:`MAC`, - :class:`IPv4`, :class:`IPv6`) - - ISO8601 :class:`dates` and - :class:`datetime` - - :class:`UUID` - - :class:`comma-separated list` - - :class:`url` - - Parse actions: - - - :class:`convert_to_integer` - - :class:`convert_to_float` - - :class:`convert_to_date` - - :class:`convert_to_datetime` - - :class:`strip_html_tags` - - :class:`upcase_tokens` - - :class:`downcase_tokens` - - Example:: - - pyparsing_common.number.run_tests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.run_tests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.run_tests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.run_tests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.run_tests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.set_parse_action(token_map(uuid.UUID)) - pyparsing_common.uuid.run_tests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - - prints:: - - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convert_to_integer = token_map(int) - """ - Parse action for converting parsed integers to Python int - """ - - convert_to_float = token_map(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).set_name("integer").set_parse_action(convert_to_integer) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = ( - Word(hexnums).set_name("hex integer").set_parse_action(token_map(int, 16)) - ) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = ( - Regex(r"[+-]?\d+") - .set_name("signed integer") - .set_parse_action(convert_to_integer) - ) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = ( - signed_integer().set_parse_action(convert_to_float) - + "/" - + signed_integer().set_parse_action(convert_to_float) - ).set_name("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.add_parse_action(lambda tt: tt[0] / tt[-1]) - - mixed_integer = ( - fraction | signed_integer + Opt(Opt("-").suppress() + fraction) - ).set_name("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.add_parse_action(sum) - - real = ( - Regex(r"[+-]?(?:\d+\.\d*|\.\d+)") - .set_name("real number") - .set_parse_action(convert_to_float) - ) - """expression that parses a floating point number and returns a float""" - - sci_real = ( - Regex(r"[+-]?(?:\d+(?:[eE][+-]?\d+)|(?:\d+\.\d*|\.\d+)(?:[eE][+-]?\d+)?)") - .set_name("real number with scientific notation") - .set_parse_action(convert_to_float) - ) - """expression that parses a floating point number with optional - scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).setName("number").streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = ( - Regex(r"[+-]?\d+\.?\d*([eE][+-]?\d+)?") - .set_name("fnumber") - .set_parse_action(convert_to_float) - ) - """any int or real number, returned as float""" - - identifier = Word(identchars, identbodychars).set_name("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex( - r"(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}" - ).set_name("IPv4 address") - "IPv4 address (``0.0.0.0 - 255.255.255.255``)" - - _ipv6_part = Regex(r"[0-9a-fA-F]{1,4}").set_name("hex_integer") - _full_ipv6_address = (_ipv6_part + (":" + _ipv6_part) * 7).set_name( - "full IPv6 address" - ) - _short_ipv6_address = ( - Opt(_ipv6_part + (":" + _ipv6_part) * (0, 6)) - + "::" - + Opt(_ipv6_part + (":" + _ipv6_part) * (0, 6)) - ).set_name("short IPv6 address") - _short_ipv6_address.add_condition( - lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8 - ) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).set_name("mixed IPv6 address") - ipv6_address = Combine( - (_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).set_name( - "IPv6 address" - ) - ).set_name("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex( - r"[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}" - ).set_name("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convert_to_date(fmt: str = "%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) - - Example:: - - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.set_parse_action(pyparsing_common.convert_to_date()) - print(date_expr.parse_string("1999-12-31")) - - prints:: - - [datetime.date(1999, 12, 31)] - """ - - def cvt_fn(ss, ll, tt): - try: - return datetime.strptime(tt[0], fmt).date() - except ValueError as ve: - raise ParseException(ss, ll, str(ve)) - - return cvt_fn - - @staticmethod - def convert_to_datetime(fmt: str = "%Y-%m-%dT%H:%M:%S.%f"): - """Helper to create a parse action for converting parsed - datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) - - Example:: - - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.set_parse_action(pyparsing_common.convert_to_datetime()) - print(dt_expr.parse_string("1999-12-31T23:59:59.999")) - - prints:: - - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - - def cvt_fn(s, l, t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - - return cvt_fn - - iso8601_date = Regex( - r"(?P\d{4})(?:-(?P\d\d)(?:-(?P\d\d))?)?" - ).set_name("ISO8601 date") - "ISO8601 date (``yyyy-mm-dd``)" - - iso8601_datetime = Regex( - r"(?P\d{4})-(?P\d\d)-(?P\d\d)[T ](?P\d\d):(?P\d\d)(:(?P\d\d(\.\d*)?)?)?(?PZ|[+-]\d\d:?\d\d)?" - ).set_name("ISO8601 datetime") - "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" - - uuid = Regex(r"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}").set_name("UUID") - "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" - - _html_stripper = any_open_tag.suppress() | any_close_tag.suppress() - - @staticmethod - def strip_html_tags(s: str, l: int, tokens: ParseResults): - """Parse action to remove HTML tags from web page HTML source - - Example:: - - # strip HTML links from normal text - text = 'More info at the
      pyparsing wiki page' - td, td_end = make_html_tags("TD") - table_text = td + SkipTo(td_end).set_parse_action(pyparsing_common.strip_html_tags)("body") + td_end - print(table_text.parse_string(text).body) - - Prints:: - - More info at the pyparsing wiki page - """ - return pyparsing_common._html_stripper.transform_string(tokens[0]) - - _commasepitem = ( - Combine( - OneOrMore( - ~Literal(",") - + ~LineEnd() - + Word(printables, exclude_chars=",") - + Opt(White(" \t") + ~FollowedBy(LineEnd() | ",")) - ) - ) - .streamline() - .set_name("commaItem") - ) - comma_separated_list = DelimitedList( - Opt(quoted_string.copy() | _commasepitem, default="") - ).set_name("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcase_tokens = staticmethod(token_map(lambda t: t.upper())) - """Parse action to convert tokens to upper case.""" - - downcase_tokens = staticmethod(token_map(lambda t: t.lower())) - """Parse action to convert tokens to lower case.""" - - # fmt: off - url = Regex( - # https://mathiasbynens.be/demo/url-regex - # https://gist.github.com/dperini/729294 - r"(?P" + - # protocol identifier (optional) - # short syntax // still required - r"(?:(?:(?Phttps?|ftp):)?\/\/)" + - # user:pass BasicAuth (optional) - r"(?:(?P\S+(?::\S*)?)@)?" + - r"(?P" + - # IP address exclusion - # private & local networks - r"(?!(?:10|127)(?:\.\d{1,3}){3})" + - r"(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})" + - r"(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})" + - # IP address dotted notation octets - # excludes loopback network 0.0.0.0 - # excludes reserved space >= 224.0.0.0 - # excludes network & broadcast addresses - # (first & last IP address of each class) - r"(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])" + - r"(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}" + - r"(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))" + - r"|" + - # host & domain names, may end with dot - # can be replaced by a shortest alternative - # (?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.)+ - r"(?:" + - r"(?:" + - r"[a-z0-9\u00a1-\uffff]" + - r"[a-z0-9\u00a1-\uffff_-]{0,62}" + - r")?" + - r"[a-z0-9\u00a1-\uffff]\." + - r")+" + - # TLD identifier name, may end with dot - r"(?:[a-z\u00a1-\uffff]{2,}\.?)" + - r")" + - # port number (optional) - r"(:(?P\d{2,5}))?" + - # resource path (optional) - r"(?P\/[^?# ]*)?" + - # query string (optional) - r"(\?(?P[^#]*))?" + - # fragment (optional) - r"(#(?P\S*))?" + - r")" - ).set_name("url") - """URL (http/https/ftp scheme)""" - # fmt: on - - # pre-PEP8 compatibility names - convertToInteger = convert_to_integer - """Deprecated - use :class:`convert_to_integer`""" - convertToFloat = convert_to_float - """Deprecated - use :class:`convert_to_float`""" - convertToDate = convert_to_date - """Deprecated - use :class:`convert_to_date`""" - convertToDatetime = convert_to_datetime - """Deprecated - use :class:`convert_to_datetime`""" - stripHTMLTags = strip_html_tags - """Deprecated - use :class:`strip_html_tags`""" - upcaseTokens = upcase_tokens - """Deprecated - use :class:`upcase_tokens`""" - downcaseTokens = downcase_tokens - """Deprecated - use :class:`downcase_tokens`""" - - -_builtin_exprs = [ - v for v in vars(pyparsing_common).values() if isinstance(v, ParserElement) -] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py deleted file mode 100644 index 8d5a856e..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py +++ /dev/null @@ -1,6115 +0,0 @@ -# -# core.py -# - -from collections import deque -import os -import typing -from typing import ( - Any, - Callable, - Generator, - List, - NamedTuple, - Sequence, - Set, - TextIO, - Tuple, - Union, - cast, -) -from abc import ABC, abstractmethod -from enum import Enum -import string -import copy -import warnings -import re -import sys -from collections.abc import Iterable -import traceback -import types -from operator import itemgetter -from functools import wraps -from threading import RLock -from pathlib import Path - -from .util import ( - _FifoCache, - _UnboundedCache, - __config_flags, - _collapse_string_to_ranges, - _escape_regex_range_chars, - _bslash, - _flatten, - LRUMemo as _LRUMemo, - UnboundedMemo as _UnboundedMemo, - replaced_by_pep8, -) -from .exceptions import * -from .actions import * -from .results import ParseResults, _ParseResultsWithOffset -from .unicode import pyparsing_unicode - -_MAX_INT = sys.maxsize -str_type: Tuple[type, ...] = (str, bytes) - -# -# Copyright (c) 2003-2022 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - - -if sys.version_info >= (3, 8): - from functools import cached_property -else: - - class cached_property: - def __init__(self, func): - self._func = func - - def __get__(self, instance, owner=None): - ret = instance.__dict__[self._func.__name__] = self._func(instance) - return ret - - -class __compat__(__config_flags): - """ - A cross-version compatibility configuration for pyparsing features that will be - released in a future version. By setting values in this configuration to True, - those features can be enabled in prior versions for compatibility development - and testing. - - - ``collect_all_And_tokens`` - flag to enable fix for Issue #63 that fixes erroneous grouping - of results names when an :class:`And` expression is nested within an :class:`Or` or :class:`MatchFirst`; - maintained for compatibility, but setting to ``False`` no longer restores pre-2.3.1 - behavior - """ - - _type_desc = "compatibility" - - collect_all_And_tokens = True - - _all_names = [__ for __ in locals() if not __.startswith("_")] - _fixed_names = """ - collect_all_And_tokens - """.split() - - -class __diag__(__config_flags): - _type_desc = "diagnostic" - - warn_multiple_tokens_in_named_alternation = False - warn_ungrouped_named_tokens_in_collection = False - warn_name_set_on_empty_Forward = False - warn_on_parse_using_empty_Forward = False - warn_on_assignment_to_Forward = False - warn_on_multiple_string_args_to_oneof = False - warn_on_match_first_with_lshift_operator = False - enable_debug_on_named_expressions = False - - _all_names = [__ for __ in locals() if not __.startswith("_")] - _warning_names = [name for name in _all_names if name.startswith("warn")] - _debug_names = [name for name in _all_names if name.startswith("enable_debug")] - - @classmethod - def enable_all_warnings(cls) -> None: - for name in cls._warning_names: - cls.enable(name) - - -class Diagnostics(Enum): - """ - Diagnostic configuration (all default to disabled) - - - ``warn_multiple_tokens_in_named_alternation`` - flag to enable warnings when a results - name is defined on a :class:`MatchFirst` or :class:`Or` expression with one or more :class:`And` subexpressions - - ``warn_ungrouped_named_tokens_in_collection`` - flag to enable warnings when a results - name is defined on a containing expression with ungrouped subexpressions that also - have results names - - ``warn_name_set_on_empty_Forward`` - flag to enable warnings when a :class:`Forward` is defined - with a results name, but has no contents defined - - ``warn_on_parse_using_empty_Forward`` - flag to enable warnings when a :class:`Forward` is - defined in a grammar but has never had an expression attached to it - - ``warn_on_assignment_to_Forward`` - flag to enable warnings when a :class:`Forward` is defined - but is overwritten by assigning using ``'='`` instead of ``'<<='`` or ``'<<'`` - - ``warn_on_multiple_string_args_to_oneof`` - flag to enable warnings when :class:`one_of` is - incorrectly called with multiple str arguments - - ``enable_debug_on_named_expressions`` - flag to auto-enable debug on all subsequent - calls to :class:`ParserElement.set_name` - - Diagnostics are enabled/disabled by calling :class:`enable_diag` and :class:`disable_diag`. - All warnings can be enabled by calling :class:`enable_all_warnings`. - """ - - warn_multiple_tokens_in_named_alternation = 0 - warn_ungrouped_named_tokens_in_collection = 1 - warn_name_set_on_empty_Forward = 2 - warn_on_parse_using_empty_Forward = 3 - warn_on_assignment_to_Forward = 4 - warn_on_multiple_string_args_to_oneof = 5 - warn_on_match_first_with_lshift_operator = 6 - enable_debug_on_named_expressions = 7 - - -def enable_diag(diag_enum: Diagnostics) -> None: - """ - Enable a global pyparsing diagnostic flag (see :class:`Diagnostics`). - """ - __diag__.enable(diag_enum.name) - - -def disable_diag(diag_enum: Diagnostics) -> None: - """ - Disable a global pyparsing diagnostic flag (see :class:`Diagnostics`). - """ - __diag__.disable(diag_enum.name) - - -def enable_all_warnings() -> None: - """ - Enable all global pyparsing diagnostic warnings (see :class:`Diagnostics`). - """ - __diag__.enable_all_warnings() - - -# hide abstract class -del __config_flags - - -def _should_enable_warnings( - cmd_line_warn_options: typing.Iterable[str], warn_env_var: typing.Optional[str] -) -> bool: - enable = bool(warn_env_var) - for warn_opt in cmd_line_warn_options: - w_action, w_message, w_category, w_module, w_line = (warn_opt + "::::").split( - ":" - )[:5] - if not w_action.lower().startswith("i") and ( - not (w_message or w_category or w_module) or w_module == "pyparsing" - ): - enable = True - elif w_action.lower().startswith("i") and w_module in ("pyparsing", ""): - enable = False - return enable - - -if _should_enable_warnings( - sys.warnoptions, os.environ.get("PYPARSINGENABLEALLWARNINGS") -): - enable_all_warnings() - - -# build list of single arg builtins, that can be used as parse actions -_single_arg_builtins = { - sum, - len, - sorted, - reversed, - list, - tuple, - set, - any, - all, - min, - max, -} - -_generatorType = types.GeneratorType -ParseImplReturnType = Tuple[int, Any] -PostParseReturnType = Union[ParseResults, Sequence[ParseResults]] -ParseAction = Union[ - Callable[[], Any], - Callable[[ParseResults], Any], - Callable[[int, ParseResults], Any], - Callable[[str, int, ParseResults], Any], -] -ParseCondition = Union[ - Callable[[], bool], - Callable[[ParseResults], bool], - Callable[[int, ParseResults], bool], - Callable[[str, int, ParseResults], bool], -] -ParseFailAction = Callable[[str, int, "ParserElement", Exception], None] -DebugStartAction = Callable[[str, int, "ParserElement", bool], None] -DebugSuccessAction = Callable[ - [str, int, int, "ParserElement", ParseResults, bool], None -] -DebugExceptionAction = Callable[[str, int, "ParserElement", Exception, bool], None] - - -alphas = string.ascii_uppercase + string.ascii_lowercase -identchars = pyparsing_unicode.Latin1.identchars -identbodychars = pyparsing_unicode.Latin1.identbodychars -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -printables = "".join([c for c in string.printable if c not in string.whitespace]) - -_trim_arity_call_line: traceback.StackSummary = None # type: ignore[assignment] - - -def _trim_arity(func, max_limit=3): - """decorator to trim function calls to match the arity of the target""" - global _trim_arity_call_line - - if func in _single_arg_builtins: - return lambda s, l, t: func(t) - - limit = 0 - found_arity = False - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - # fmt: off - LINE_DIFF = 7 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - _trim_arity_call_line = (_trim_arity_call_line or traceback.extract_stack(limit=2)[-1]) - pa_call_line_synth = (_trim_arity_call_line[0], _trim_arity_call_line[1] + LINE_DIFF) - - def wrapper(*args): - nonlocal found_arity, limit - while 1: - try: - ret = func(*args[limit:]) - found_arity = True - return ret - except TypeError as te: - # re-raise TypeErrors if they did not come from our arity testing - if found_arity: - raise - else: - tb = te.__traceback__ - frames = traceback.extract_tb(tb, limit=2) - frame_summary = frames[-1] - trim_arity_type_error = ( - [frame_summary[:2]][-1][:2] == pa_call_line_synth - ) - del tb - - if trim_arity_type_error: - if limit < max_limit: - limit += 1 - continue - - raise - # fmt: on - - # copy func name to wrapper for sensible debug output - # (can't use functools.wraps, since that messes with function signature) - func_name = getattr(func, "__name__", getattr(func, "__class__").__name__) - wrapper.__name__ = func_name - wrapper.__doc__ = func.__doc__ - - return wrapper - - -def condition_as_parse_action( - fn: ParseCondition, message: typing.Optional[str] = None, fatal: bool = False -) -> ParseAction: - """ - Function to convert a simple predicate function that returns ``True`` or ``False`` - into a parse action. Can be used in places when a parse action is required - and :class:`ParserElement.add_condition` cannot be used (such as when adding a condition - to an operator level in :class:`infix_notation`). - - Optional keyword arguments: - - - ``message`` - define a custom message to be used in the raised exception - - ``fatal`` - if True, will raise :class:`ParseFatalException` to stop parsing immediately; - otherwise will raise :class:`ParseException` - - """ - msg = message if message is not None else "failed user-defined condition" - exc_type = ParseFatalException if fatal else ParseException - fn = _trim_arity(fn) - - @wraps(fn) - def pa(s, l, t): - if not bool(fn(s, l, t)): - raise exc_type(s, l, msg) - - return pa - - -def _default_start_debug_action( - instring: str, loc: int, expr: "ParserElement", cache_hit: bool = False -): - cache_hit_str = "*" if cache_hit else "" - print( - ( - f"{cache_hit_str}Match {expr} at loc {loc}({lineno(loc, instring)},{col(loc, instring)})\n" - f" {line(loc, instring)}\n" - f" {' ' * (col(loc, instring) - 1)}^" - ) - ) - - -def _default_success_debug_action( - instring: str, - startloc: int, - endloc: int, - expr: "ParserElement", - toks: ParseResults, - cache_hit: bool = False, -): - cache_hit_str = "*" if cache_hit else "" - print(f"{cache_hit_str}Matched {expr} -> {toks.as_list()}") - - -def _default_exception_debug_action( - instring: str, - loc: int, - expr: "ParserElement", - exc: Exception, - cache_hit: bool = False, -): - cache_hit_str = "*" if cache_hit else "" - print(f"{cache_hit_str}Match {expr} failed, {type(exc).__name__} raised: {exc}") - - -def null_debug_action(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - - -class ParserElement(ABC): - """Abstract base level parser element class.""" - - DEFAULT_WHITE_CHARS: str = " \n\t\r" - verbose_stacktrace: bool = False - _literalStringClass: type = None # type: ignore[assignment] - - @staticmethod - def set_default_whitespace_chars(chars: str) -> None: - r""" - Overrides the default whitespace chars - - Example:: - - # default whitespace chars are space, and newline - Word(alphas)[1, ...].parse_string("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.set_default_whitespace_chars(" \t") - Word(alphas)[1, ...].parse_string("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - # update whitespace all parse expressions defined in this module - for expr in _builtin_exprs: - if expr.copyDefaultWhiteChars: - expr.whiteChars = set(chars) - - @staticmethod - def inline_literals_using(cls: type) -> None: - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parse_string("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inline_literals_using(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parse_string("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - @classmethod - def using_each(cls, seq, **class_kwargs): - """ - Yields a sequence of class(obj, **class_kwargs) for obj in seq. - - Example:: - - LPAR, RPAR, LBRACE, RBRACE, SEMI = Suppress.using_each("(){};") - - """ - yield from (cls(obj, **class_kwargs) for obj in seq) - - class DebugActions(NamedTuple): - debug_try: typing.Optional[DebugStartAction] - debug_match: typing.Optional[DebugSuccessAction] - debug_fail: typing.Optional[DebugExceptionAction] - - def __init__(self, savelist: bool = False): - self.parseAction: List[ParseAction] = list() - self.failAction: typing.Optional[ParseFailAction] = None - self.customName: str = None # type: ignore[assignment] - self._defaultName: typing.Optional[str] = None - self.resultsName: str = None # type: ignore[assignment] - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) - self.copyDefaultWhiteChars = True - # used when checking for left-recursion - self.mayReturnEmpty = False - self.keepTabs = False - self.ignoreExprs: List["ParserElement"] = list() - self.debug = False - self.streamlined = False - # optimize exception handling for subclasses that don't advance parse index - self.mayIndexError = True - self.errmsg = "" - # mark results names as modal (report only last) or cumulative (list all) - self.modalResults = True - # custom debug actions - self.debugActions = self.DebugActions(None, None, None) - # avoid redundant calls to preParse - self.callPreparse = True - self.callDuringTry = False - self.suppress_warnings_: List[Diagnostics] = [] - - def suppress_warning(self, warning_type: Diagnostics) -> "ParserElement": - """ - Suppress warnings emitted for a particular diagnostic on this expression. - - Example:: - - base = pp.Forward() - base.suppress_warning(Diagnostics.warn_on_parse_using_empty_Forward) - - # statement would normally raise a warning, but is now suppressed - print(base.parse_string("x")) - - """ - self.suppress_warnings_.append(warning_type) - return self - - def visit_all(self): - """General-purpose method to yield all expressions and sub-expressions - in a grammar. Typically just for internal use. - """ - to_visit = deque([self]) - seen = set() - while to_visit: - cur = to_visit.popleft() - - # guard against looping forever through recursive grammars - if cur in seen: - continue - seen.add(cur) - - to_visit.extend(cur.recurse()) - yield cur - - def copy(self) -> "ParserElement": - """ - Make a copy of this :class:`ParserElement`. Useful for defining - different parse actions for the same parsing pattern, using copies of - the original parse element. - - Example:: - - integer = Word(nums).set_parse_action(lambda toks: int(toks[0])) - integerK = integer.copy().add_parse_action(lambda toks: toks[0] * 1024) + Suppress("K") - integerM = integer.copy().add_parse_action(lambda toks: toks[0] * 1024 * 1024) + Suppress("M") - - print((integerK | integerM | integer)[1, ...].parse_string("5K 100 640K 256M")) - - prints:: - - [5120, 100, 655360, 268435456] - - Equivalent form of ``expr.copy()`` is just ``expr()``:: - - integerM = integer().add_parse_action(lambda toks: toks[0] * 1024 * 1024) + Suppress("M") - """ - cpy = copy.copy(self) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) - return cpy - - def set_results_name( - self, name: str, list_all_matches: bool = False, *, listAllMatches: bool = False - ) -> "ParserElement": - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - - Normally, results names are assigned as you would assign keys in a dict: - any existing value is overwritten by later values. If it is necessary to - keep all values captured for a particular results name, call ``set_results_name`` - with ``list_all_matches`` = True. - - NOTE: ``set_results_name`` returns a *copy* of the original :class:`ParserElement` object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - ``expr("name")`` in place of ``expr.set_results_name("name")`` - - see :class:`__call__`. If ``list_all_matches`` is required, use - ``expr("name*")``. - - Example:: - - date_str = (integer.set_results_name("year") + '/' - + integer.set_results_name("month") + '/' - + integer.set_results_name("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - listAllMatches = listAllMatches or list_all_matches - return self._setResultsName(name, listAllMatches) - - def _setResultsName(self, name, listAllMatches=False): - if name is None: - return self - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches = True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def set_break(self, break_flag: bool = True) -> "ParserElement": - """ - Method to invoke the Python pdb debugger when this element is - about to be parsed. Set ``break_flag`` to ``True`` to enable, ``False`` to - disable. - """ - if break_flag: - _parseMethod = self._parse - - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - - # this call to pdb.set_trace() is intentional, not a checkin error - pdb.set_trace() - return _parseMethod(instring, loc, doActions, callPreParse) - - breaker._originalParseMethod = _parseMethod # type: ignore [attr-defined] - self._parse = breaker # type: ignore [assignment] - else: - if hasattr(self._parse, "_originalParseMethod"): - self._parse = self._parse._originalParseMethod # type: ignore [attr-defined, assignment] - return self - - def set_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement": - """ - Define one or more actions to perform when successfully matching parse element definition. - - Parse actions can be called to perform data conversions, do extra validation, - update external data structures, or enhance or replace the parsed tokens. - Each parse action ``fn`` is a callable method with 0-3 arguments, called as - ``fn(s, loc, toks)`` , ``fn(loc, toks)`` , ``fn(toks)`` , or just ``fn()`` , where: - - - ``s`` = the original string being parsed (see note below) - - ``loc`` = the location of the matching substring - - ``toks`` = a list of the matched tokens, packaged as a :class:`ParseResults` object - - The parsed tokens are passed to the parse action as ParseResults. They can be - modified in place using list-style append, extend, and pop operations to update - the parsed list elements; and with dictionary-style item set and del operations - to add, update, or remove any named results. If the tokens are modified in place, - it is not necessary to return them with a return statement. - - Parse actions can also completely replace the given tokens, with another ``ParseResults`` - object, or with some entirely different object (common for parse actions that perform data - conversions). A convenient way to build a new parse result is to define the values - using a dict, and then create the return value using :class:`ParseResults.from_dict`. - - If None is passed as the ``fn`` parse action, all previously added parse actions for this - expression are cleared. - - Optional keyword arguments: - - - ``call_during_try`` = (default= ``False``) indicate if parse action should be run during - lookaheads and alternate testing. For parse actions that have side effects, it is - important to only call the parse action once it is determined that it is being - called as part of a successful parse. For parse actions that perform additional - validation, then call_during_try should be passed as True, so that the validation - code is included in the preliminary "try" parses. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`parse_string` for more - information on parsing strings containing ```` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - - Example:: - - # parse dates in the form YYYY/MM/DD - - # use parse action to convert toks from str to int at parse time - def convert_to_int(toks): - return int(toks[0]) - - # use a parse action to verify that the date is a valid date - def is_valid_date(instring, loc, toks): - from datetime import date - year, month, day = toks[::2] - try: - date(year, month, day) - except ValueError: - raise ParseException(instring, loc, "invalid date given") - - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - # add parse actions - integer.set_parse_action(convert_to_int) - date_str.set_parse_action(is_valid_date) - - # note that integer fields are now ints, not strings - date_str.run_tests(''' - # successful parse - note that integer fields were converted to ints - 1999/12/31 - - # fail - invalid date - 1999/13/31 - ''') - """ - if list(fns) == [None]: - self.parseAction = [] - else: - if not all(callable(fn) for fn in fns): - raise TypeError("parse actions must be callable") - self.parseAction = [_trim_arity(fn) for fn in fns] - self.callDuringTry = kwargs.get( - "call_during_try", kwargs.get("callDuringTry", False) - ) - return self - - def add_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement": - """ - Add one or more parse actions to expression's list of parse actions. See :class:`set_parse_action`. - - See examples in :class:`copy`. - """ - self.parseAction += [_trim_arity(fn) for fn in fns] - self.callDuringTry = self.callDuringTry or kwargs.get( - "call_during_try", kwargs.get("callDuringTry", False) - ) - return self - - def add_condition(self, *fns: ParseCondition, **kwargs) -> "ParserElement": - """Add a boolean predicate function to expression's list of parse actions. See - :class:`set_parse_action` for function call signatures. Unlike ``set_parse_action``, - functions passed to ``add_condition`` need to return boolean success/fail of the condition. - - Optional keyword arguments: - - - ``message`` = define a custom message to be used in the raised exception - - ``fatal`` = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise - ParseException - - ``call_during_try`` = boolean to indicate if this method should be called during internal tryParse calls, - default=False - - Example:: - - integer = Word(nums).set_parse_action(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.add_condition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parse_string("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), - (line:1, col:1) - """ - for fn in fns: - self.parseAction.append( - condition_as_parse_action( - fn, - message=str(kwargs.get("message")), - fatal=bool(kwargs.get("fatal", False)), - ) - ) - - self.callDuringTry = self.callDuringTry or kwargs.get( - "call_during_try", kwargs.get("callDuringTry", False) - ) - return self - - def set_fail_action(self, fn: ParseFailAction) -> "ParserElement": - """ - Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - ``fn(s, loc, expr, err)`` where: - - - ``s`` = string being parsed - - ``loc`` = location where expression match was attempted and failed - - ``expr`` = the parse expression that failed - - ``err`` = the exception thrown - - The function returns no value. It may throw :class:`ParseFatalException` - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables(self, instring: str, loc: int) -> int: - if not self.ignoreExprs: - return loc - exprsFound = True - ignore_expr_fns = [e._parse for e in self.ignoreExprs] - while exprsFound: - exprsFound = False - for ignore_fn in ignore_expr_fns: - try: - while 1: - loc, dummy = ignore_fn(instring, loc) - exprsFound = True - except ParseException: - pass - return loc - - def preParse(self, instring: str, loc: int) -> int: - if self.ignoreExprs: - loc = self._skipIgnorables(instring, loc) - - if self.skipWhitespace: - instrlen = len(instring) - white_chars = self.whiteChars - while loc < instrlen and instring[loc] in white_chars: - loc += 1 - - return loc - - def parseImpl(self, instring, loc, doActions=True): - return loc, [] - - def postParse(self, instring, loc, tokenlist): - return tokenlist - - # @profile - def _parseNoCache( - self, instring, loc, doActions=True, callPreParse=True - ) -> Tuple[int, ParseResults]: - TRY, MATCH, FAIL = 0, 1, 2 - debugging = self.debug # and doActions) - len_instring = len(instring) - - if debugging or self.failAction: - # print("Match {} at loc {}({}, {})".format(self, loc, lineno(loc, instring), col(loc, instring))) - try: - if callPreParse and self.callPreparse: - pre_loc = self.preParse(instring, loc) - else: - pre_loc = loc - tokens_start = pre_loc - if self.debugActions.debug_try: - self.debugActions.debug_try(instring, tokens_start, self, False) - if self.mayIndexError or pre_loc >= len_instring: - try: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - except IndexError: - raise ParseException(instring, len_instring, self.errmsg, self) - else: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - except Exception as err: - # print("Exception raised:", err) - if self.debugActions.debug_fail: - self.debugActions.debug_fail( - instring, tokens_start, self, err, False - ) - if self.failAction: - self.failAction(instring, tokens_start, self, err) - raise - else: - if callPreParse and self.callPreparse: - pre_loc = self.preParse(instring, loc) - else: - pre_loc = loc - tokens_start = pre_loc - if self.mayIndexError or pre_loc >= len_instring: - try: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - except IndexError: - raise ParseException(instring, len_instring, self.errmsg, self) - else: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) - - tokens = self.postParse(instring, loc, tokens) - - ret_tokens = ParseResults( - tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults - ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - try: - tokens = fn(instring, tokens_start, ret_tokens) # type: ignore [call-arg, arg-type] - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - raise exc from parse_action_exc - - if tokens is not None and tokens is not ret_tokens: - ret_tokens = ParseResults( - tokens, - self.resultsName, - asList=self.saveAsList - and isinstance(tokens, (ParseResults, list)), - modal=self.modalResults, - ) - except Exception as err: - # print "Exception raised in user parse action:", err - if self.debugActions.debug_fail: - self.debugActions.debug_fail( - instring, tokens_start, self, err, False - ) - raise - else: - for fn in self.parseAction: - try: - tokens = fn(instring, tokens_start, ret_tokens) # type: ignore [call-arg, arg-type] - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - raise exc from parse_action_exc - - if tokens is not None and tokens is not ret_tokens: - ret_tokens = ParseResults( - tokens, - self.resultsName, - asList=self.saveAsList - and isinstance(tokens, (ParseResults, list)), - modal=self.modalResults, - ) - if debugging: - # print("Matched", self, "->", ret_tokens.as_list()) - if self.debugActions.debug_match: - self.debugActions.debug_match( - instring, tokens_start, loc, self, ret_tokens, False - ) - - return loc, ret_tokens - - def try_parse( - self, - instring: str, - loc: int, - *, - raise_fatal: bool = False, - do_actions: bool = False, - ) -> int: - try: - return self._parse(instring, loc, doActions=do_actions)[0] - except ParseFatalException: - if raise_fatal: - raise - raise ParseException(instring, loc, self.errmsg, self) - - def can_parse_next(self, instring: str, loc: int, do_actions: bool = False) -> bool: - try: - self.try_parse(instring, loc, do_actions=do_actions) - except (ParseException, IndexError): - return False - else: - return True - - # cache for left-recursion in Forward references - recursion_lock = RLock() - recursion_memos: typing.Dict[ - Tuple[int, "Forward", bool], Tuple[int, Union[ParseResults, Exception]] - ] = {} - - class _CacheType(dict): - """ - class to help type checking - """ - - not_in_cache: bool - - def get(self, *args): - ... - - def set(self, *args): - ... - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = ( - _CacheType() - ) # set later by enable_packrat(); this is here so that reset_cache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( - self, instring, loc, doActions=True, callPreParse=True - ) -> Tuple[int, ParseResults]: - HIT, MISS = 0, 1 - TRY, MATCH, FAIL = 0, 1, 2 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy(), loc)) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if self.debug and self.debugActions.debug_try: - try: - self.debugActions.debug_try(instring, loc, self, cache_hit=True) # type: ignore [call-arg] - except TypeError: - pass - if isinstance(value, Exception): - if self.debug and self.debugActions.debug_fail: - try: - self.debugActions.debug_fail( - instring, loc, self, value, cache_hit=True # type: ignore [call-arg] - ) - except TypeError: - pass - raise value - - value = cast(Tuple[int, ParseResults, int], value) - loc_, result, endloc = value[0], value[1].copy(), value[2] - if self.debug and self.debugActions.debug_match: - try: - self.debugActions.debug_match( - instring, loc_, endloc, self, result, cache_hit=True # type: ignore [call-arg] - ) - except TypeError: - pass - - return loc_, result - - _parse = _parseNoCache - - @staticmethod - def reset_cache() -> None: - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len( - ParserElement.packrat_cache_stats - ) - ParserElement.recursion_memos.clear() - - _packratEnabled = False - _left_recursion_enabled = False - - @staticmethod - def disable_memoization() -> None: - """ - Disables active Packrat or Left Recursion parsing and their memoization - - This method also works if neither Packrat nor Left Recursion are enabled. - This makes it safe to call before activating Packrat nor Left Recursion - to clear any previous settings. - """ - ParserElement.reset_cache() - ParserElement._left_recursion_enabled = False - ParserElement._packratEnabled = False - ParserElement._parse = ParserElement._parseNoCache - - @staticmethod - def enable_left_recursion( - cache_size_limit: typing.Optional[int] = None, *, force=False - ) -> None: - """ - Enables "bounded recursion" parsing, which allows for both direct and indirect - left-recursion. During parsing, left-recursive :class:`Forward` elements are - repeatedly matched with a fixed recursion depth that is gradually increased - until finding the longest match. - - Example:: - - from pip._vendor import pyparsing as pp - pp.ParserElement.enable_left_recursion() - - E = pp.Forward("E") - num = pp.Word(pp.nums) - # match `num`, or `num '+' num`, or `num '+' num '+' num`, ... - E <<= E + '+' - num | num - - print(E.parse_string("1+2+3")) - - Recursion search naturally memoizes matches of ``Forward`` elements and may - thus skip reevaluation of parse actions during backtracking. This may break - programs with parse actions which rely on strict ordering of side-effects. - - Parameters: - - - ``cache_size_limit`` - (default=``None``) - memoize at most this many - ``Forward`` elements during matching; if ``None`` (the default), - memoize all ``Forward`` elements. - - Bounded Recursion parsing works similar but not identical to Packrat parsing, - thus the two cannot be used together. Use ``force=True`` to disable any - previous, conflicting settings. - """ - if force: - ParserElement.disable_memoization() - elif ParserElement._packratEnabled: - raise RuntimeError("Packrat and Bounded Recursion are not compatible") - if cache_size_limit is None: - ParserElement.recursion_memos = _UnboundedMemo() # type: ignore[assignment] - elif cache_size_limit > 0: - ParserElement.recursion_memos = _LRUMemo(capacity=cache_size_limit) # type: ignore[assignment] - else: - raise NotImplementedError("Memo size of %s" % cache_size_limit) - ParserElement._left_recursion_enabled = True - - @staticmethod - def enable_packrat(cache_size_limit: int = 128, *, force: bool = False) -> None: - """ - Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - - ``cache_size_limit`` - (default= ``128``) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method :class:`ParserElement.enable_packrat`. - For best results, call ``enable_packrat()`` immediately after - importing pyparsing. - - Example:: - - from pip._vendor import pyparsing - pyparsing.ParserElement.enable_packrat() - - Packrat parsing works similar but not identical to Bounded Recursion parsing, - thus the two cannot be used together. Use ``force=True`` to disable any - previous, conflicting settings. - """ - if force: - ParserElement.disable_memoization() - elif ParserElement._left_recursion_enabled: - raise RuntimeError("Packrat and Bounded Recursion are not compatible") - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = _UnboundedCache() - else: - ParserElement.packrat_cache = _FifoCache(cache_size_limit) # type: ignore[assignment] - ParserElement._parse = ParserElement._parseCache - - def parse_string( - self, instring: str, parse_all: bool = False, *, parseAll: bool = False - ) -> ParseResults: - """ - Parse a string with respect to the parser definition. This function is intended as the primary interface to the - client code. - - :param instring: The input string to be parsed. - :param parse_all: If set, the entire input string must match the grammar. - :param parseAll: retained for pre-PEP8 compatibility, will be removed in a future release. - :raises ParseException: Raised if ``parse_all`` is set and the input string does not match the whole grammar. - :returns: the parsed data as a :class:`ParseResults` object, which may be accessed as a `list`, a `dict`, or - an object with attributes if the given parser includes results names. - - If the input string is required to match the entire grammar, ``parse_all`` flag must be set to ``True``. This - is also equivalent to ending the grammar with :class:`StringEnd`\\ (). - - To report proper column numbers, ``parse_string`` operates on a copy of the input string where all tabs are - converted to spaces (8 spaces per tab, as per the default in ``string.expandtabs``). If the input string - contains tabs and the grammar uses parse actions that use the ``loc`` argument to index into the string - being parsed, one can ensure a consistent view of the input string by doing one of the following: - - - calling ``parse_with_tabs`` on your grammar before calling ``parse_string`` (see :class:`parse_with_tabs`), - - define your parse action using the full ``(s,loc,toks)`` signature, and reference the input string using the - parse action's ``s`` argument, or - - explicitly expand the tabs in your input string before calling ``parse_string``. - - Examples: - - By default, partial matches are OK. - - >>> res = Word('a').parse_string('aaaaabaaa') - >>> print(res) - ['aaaaa'] - - The parsing behavior varies by the inheriting class of this abstract class. Please refer to the children - directly to see more examples. - - It raises an exception if parse_all flag is set and instring does not match the whole grammar. - - >>> res = Word('a').parse_string('aaaaabaaa', parse_all=True) - Traceback (most recent call last): - ... - pyparsing.ParseException: Expected end of text, found 'b' (at char 5), (line:1, col:6) - """ - parseAll = parse_all or parseAll - - ParserElement.reset_cache() - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse(instring, 0) - if parseAll: - loc = self.preParse(instring, loc) - se = Empty() + StringEnd() - se._parse(instring, loc) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clearing out pyparsing internal stack trace - raise exc.with_traceback(None) - else: - return tokens - - def scan_string( - self, - instring: str, - max_matches: int = _MAX_INT, - overlap: bool = False, - *, - debug: bool = False, - maxMatches: int = _MAX_INT, - ) -> Generator[Tuple[ParseResults, int, int], None, None]: - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - ``max_matches`` argument, to clip scanning after 'n' matches are found. If - ``overlap`` is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See :class:`parse_string` for more information on parsing - strings with embedded tabs. - - Example:: - - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens, start, end in Word(alphas).scan_string(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - maxMatches = min(maxMatches, max_matches) - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = str(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc: int = preparseFn(instring, loc) - nextLoc: int - tokens: ParseResults - nextLoc, tokens = parseFn(instring, preloc, callPreParse=False) - except ParseException: - loc = preloc + 1 - else: - if nextLoc > loc: - matches += 1 - if debug: - print( - { - "tokens": tokens.asList(), - "start": preloc, - "end": nextLoc, - } - ) - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn(instring, loc) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc + 1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def transform_string(self, instring: str, *, debug: bool = False) -> str: - """ - Extension to :class:`scan_string`, to modify matching text with modified tokens that may - be returned from a parse action. To use ``transform_string``, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking ``transform_string()`` on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. ``transform_string()`` returns the resulting transformed string. - - Example:: - - wd = Word(alphas) - wd.set_parse_action(lambda toks: toks[0].title()) - - print(wd.transform_string("now is the winter of our discontent made glorious summer by this sun of york.")) - - prints:: - - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out: List[str] = [] - lastE = 0 - # force preservation of s, to minimize unwanted transformation of string, and to - # keep string locs straight between transform_string and scan_string - self.keepTabs = True - try: - for t, s, e in self.scan_string(instring, debug=debug): - out.append(instring[lastE:s]) - if t: - if isinstance(t, ParseResults): - out += t.as_list() - elif isinstance(t, Iterable) and not isinstance(t, str_type): - out.extend(t) - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join([str(s) for s in _flatten(out)]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def search_string( - self, - instring: str, - max_matches: int = _MAX_INT, - *, - debug: bool = False, - maxMatches: int = _MAX_INT, - ) -> ParseResults: - """ - Another extension to :class:`scan_string`, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - ``max_matches`` argument, to clip searching after 'n' matches are found. - - Example:: - - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.search_string("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.search_string("More than Iron, more than Lead, more than Gold I need Electricity"))) - - prints:: - - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - maxMatches = min(maxMatches, max_matches) - try: - return ParseResults( - [t for t, s, e in self.scan_string(instring, maxMatches, debug=debug)] - ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def split( - self, - instring: str, - maxsplit: int = _MAX_INT, - include_separators: bool = False, - *, - includeSeparators=False, - ) -> Generator[str, None, None]: - """ - Generator method to split a string using the given expression as a separator. - May be called with optional ``maxsplit`` argument, to limit the number of splits; - and the optional ``include_separators`` argument (default= ``False``), if the separating - matching text should be included in the split results. - - Example:: - - punc = one_of(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - - prints:: - - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - includeSeparators = includeSeparators or include_separators - last = 0 - for t, s, e in self.scan_string(instring, max_matches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other) -> "ParserElement": - """ - Implementation of ``+`` operator - returns :class:`And`. Adding strings to a :class:`ParserElement` - converts them to :class:`Literal`\\ s by default. - - Example:: - - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print(hello, "->", greet.parse_string(hello)) - - prints:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - - ``...`` may be used as a parse expression as a short form of :class:`SkipTo`:: - - Literal('start') + ... + Literal('end') - - is equivalent to:: - - Literal('start') + SkipTo('end')("_skipped*") + Literal('end') - - Note that the skipped text is returned with '_skipped' as a results name, - and to support having multiple skips in the same parser, the value returned is - a list of all skipped text. - """ - if other is Ellipsis: - return _PendingSkip(self) - - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return And([self, other]) - - def __radd__(self, other) -> "ParserElement": - """ - Implementation of ``+`` operator when left operand is not a :class:`ParserElement` - """ - if other is Ellipsis: - return SkipTo(self)("_skipped*") + self - - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other + self - - def __sub__(self, other) -> "ParserElement": - """ - Implementation of ``-`` operator, returns :class:`And` with error stop - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self + And._ErrorStop() + other - - def __rsub__(self, other) -> "ParserElement": - """ - Implementation of ``-`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other - self - - def __mul__(self, other) -> "ParserElement": - """ - Implementation of ``*`` operator, allows use of ``expr * 3`` in place of - ``expr + expr + expr``. Expressions may also be multiplied by a 2-integer - tuple, similar to ``{min, max}`` multipliers in regular expressions. Tuples - may also include ``None`` as in: - - - ``expr*(n, None)`` or ``expr*(n, )`` is equivalent - to ``expr*n + ZeroOrMore(expr)`` - (read as "at least n instances of ``expr``") - - ``expr*(None, n)`` is equivalent to ``expr*(0, n)`` - (read as "0 to n instances of ``expr``") - - ``expr*(None, None)`` is equivalent to ``ZeroOrMore(expr)`` - - ``expr*(1, None)`` is equivalent to ``OneOrMore(expr)`` - - Note that ``expr*(None, n)`` does not raise an exception if - more than n exprs exist in the input stream; that is, - ``expr*(None, n)`` does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - ``expr*(None, n) + ~expr`` - """ - if other is Ellipsis: - other = (0, None) - elif isinstance(other, tuple) and other[:1] == (Ellipsis,): - other = ((0,) + other[1:] + (None,))[:2] - - if isinstance(other, int): - minElements, optElements = other, 0 - elif isinstance(other, tuple): - other = tuple(o if o is not Ellipsis else None for o in other) - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0], int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self * other[0] + ZeroOrMore(self) - elif isinstance(other[0], int) and isinstance(other[1], int): - minElements, optElements = other - optElements -= minElements - else: - return NotImplemented - else: - return NotImplemented - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError( - "second tuple value must be greater or equal to first tuple value" - ) - if minElements == optElements == 0: - return And([]) - - if optElements: - - def makeOptionalList(n): - if n > 1: - return Opt(self + makeOptionalList(n - 1)) - else: - return Opt(self) - - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self] * minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self] * minElements) - return ret - - def __rmul__(self, other) -> "ParserElement": - return self.__mul__(other) - - def __or__(self, other) -> "ParserElement": - """ - Implementation of ``|`` operator - returns :class:`MatchFirst` - """ - if other is Ellipsis: - return _PendingSkip(self, must_skip=True) - - if isinstance(other, str_type): - # `expr | ""` is equivalent to `Opt(expr)` - if other == "": - return Opt(self) - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return MatchFirst([self, other]) - - def __ror__(self, other) -> "ParserElement": - """ - Implementation of ``|`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other | self - - def __xor__(self, other) -> "ParserElement": - """ - Implementation of ``^`` operator - returns :class:`Or` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return Or([self, other]) - - def __rxor__(self, other) -> "ParserElement": - """ - Implementation of ``^`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other ^ self - - def __and__(self, other) -> "ParserElement": - """ - Implementation of ``&`` operator - returns :class:`Each` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return Each([self, other]) - - def __rand__(self, other) -> "ParserElement": - """ - Implementation of ``&`` operator when left operand is not a :class:`ParserElement` - """ - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return other & self - - def __invert__(self) -> "ParserElement": - """ - Implementation of ``~`` operator - returns :class:`NotAny` - """ - return NotAny(self) - - # disable __iter__ to override legacy use of sequential access to __getitem__ to - # iterate over a sequence - __iter__ = None - - def __getitem__(self, key): - """ - use ``[]`` indexing notation as a short form for expression repetition: - - - ``expr[n]`` is equivalent to ``expr*n`` - - ``expr[m, n]`` is equivalent to ``expr*(m, n)`` - - ``expr[n, ...]`` or ``expr[n,]`` is equivalent - to ``expr*n + ZeroOrMore(expr)`` - (read as "at least n instances of ``expr``") - - ``expr[..., n]`` is equivalent to ``expr*(0, n)`` - (read as "0 to n instances of ``expr``") - - ``expr[...]`` and ``expr[0, ...]`` are equivalent to ``ZeroOrMore(expr)`` - - ``expr[1, ...]`` is equivalent to ``OneOrMore(expr)`` - - ``None`` may be used in place of ``...``. - - Note that ``expr[..., n]`` and ``expr[m, n]`` do not raise an exception - if more than ``n`` ``expr``\\ s exist in the input stream. If this behavior is - desired, then write ``expr[..., n] + ~expr``. - - For repetition with a stop_on expression, use slice notation: - - - ``expr[...: end_expr]`` and ``expr[0, ...: end_expr]`` are equivalent to ``ZeroOrMore(expr, stop_on=end_expr)`` - - ``expr[1, ...: end_expr]`` is equivalent to ``OneOrMore(expr, stop_on=end_expr)`` - - """ - - stop_on_defined = False - stop_on = NoMatch() - if isinstance(key, slice): - key, stop_on = key.start, key.stop - if key is None: - key = ... - stop_on_defined = True - elif isinstance(key, tuple) and isinstance(key[-1], slice): - key, stop_on = (key[0], key[1].start), key[1].stop - stop_on_defined = True - - # convert single arg keys to tuples - if isinstance(key, str_type): - key = (key,) - try: - iter(key) - except TypeError: - key = (key, key) - - if len(key) > 2: - raise TypeError( - f"only 1 or 2 index arguments supported ({key[:5]}{f'... [{len(key)}]' if len(key) > 5 else ''})" - ) - - # clip to 2 elements - ret = self * tuple(key[:2]) - ret = typing.cast(_MultipleMatch, ret) - - if stop_on_defined: - ret.stopOn(stop_on) - - return ret - - def __call__(self, name: typing.Optional[str] = None) -> "ParserElement": - """ - Shortcut for :class:`set_results_name`, with ``list_all_matches=False``. - - If ``name`` is given with a trailing ``'*'`` character, then ``list_all_matches`` will be - passed as ``True``. - - If ``name`` is omitted, same as calling :class:`copy`. - - Example:: - - # these are equivalent - userdata = Word(alphas).set_results_name("name") + Word(nums + "-").set_results_name("socsecno") - userdata = Word(alphas)("name") + Word(nums + "-")("socsecno") - """ - if name is not None: - return self._setResultsName(name) - else: - return self.copy() - - def suppress(self) -> "ParserElement": - """ - Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress(self) - - def ignore_whitespace(self, recursive: bool = True) -> "ParserElement": - """ - Enables the skipping of whitespace before matching the characters in the - :class:`ParserElement`'s defined pattern. - - :param recursive: If ``True`` (the default), also enable whitespace skipping in child elements (if any) - """ - self.skipWhitespace = True - return self - - def leave_whitespace(self, recursive: bool = True) -> "ParserElement": - """ - Disables the skipping of whitespace before matching the characters in the - :class:`ParserElement`'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - - :param recursive: If true (the default), also disable whitespace skipping in child elements (if any) - """ - self.skipWhitespace = False - return self - - def set_whitespace_chars( - self, chars: Union[Set[str], str], copy_defaults: bool = False - ) -> "ParserElement": - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = set(chars) - self.copyDefaultWhiteChars = copy_defaults - return self - - def parse_with_tabs(self) -> "ParserElement": - """ - Overrides default behavior to expand ```` s to spaces before parsing the input string. - Must be called before ``parse_string`` when the input grammar contains elements that - match ```` characters. - """ - self.keepTabs = True - return self - - def ignore(self, other: "ParserElement") -> "ParserElement": - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - - patt = Word(alphas)[1, ...] - patt.parse_string('ablaj /* comment */ lskjd') - # -> ['ablaj'] - - patt.ignore(c_style_comment) - patt.parse_string('ablaj /* comment */ lskjd') - # -> ['ablaj', 'lskjd'] - """ - import typing - - if isinstance(other, str_type): - other = Suppress(other) - - if isinstance(other, Suppress): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append(Suppress(other.copy())) - return self - - def set_debug_actions( - self, - start_action: DebugStartAction, - success_action: DebugSuccessAction, - exception_action: DebugExceptionAction, - ) -> "ParserElement": - """ - Customize display of debugging messages while doing pattern matching: - - - ``start_action`` - method to be called when an expression is about to be parsed; - should have the signature ``fn(input_string: str, location: int, expression: ParserElement, cache_hit: bool)`` - - - ``success_action`` - method to be called when an expression has successfully parsed; - should have the signature ``fn(input_string: str, start_location: int, end_location: int, expression: ParserELement, parsed_tokens: ParseResults, cache_hit: bool)`` - - - ``exception_action`` - method to be called when expression fails to parse; - should have the signature ``fn(input_string: str, location: int, expression: ParserElement, exception: Exception, cache_hit: bool)`` - """ - self.debugActions = self.DebugActions( - start_action or _default_start_debug_action, # type: ignore[truthy-function] - success_action or _default_success_debug_action, # type: ignore[truthy-function] - exception_action or _default_exception_debug_action, # type: ignore[truthy-function] - ) - self.debug = True - return self - - def set_debug(self, flag: bool = True, recurse: bool = False) -> "ParserElement": - """ - Enable display of debugging messages while doing pattern matching. - Set ``flag`` to ``True`` to enable, ``False`` to disable. - Set ``recurse`` to ``True`` to set the debug flag on this expression and all sub-expressions. - - Example:: - - wd = Word(alphas).set_name("alphaword") - integer = Word(nums).set_name("numword") - term = wd | integer - - # turn on debugging for wd - wd.set_debug() - - term[1, ...].parse_string("abc 123 xyz 890") - - prints:: - - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using :class:`set_debug_actions`. Prior to attempting - to match the ``wd`` expression, the debugging message ``"Match at loc (,)"`` - is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` - message is shown. Also note the use of :class:`set_name` to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the :class:`Word` expression without calling ``set_name`` is ``"W:(A-Za-z)"``. - """ - if recurse: - for expr in self.visit_all(): - expr.set_debug(flag, recurse=False) - return self - - if flag: - self.set_debug_actions( - _default_start_debug_action, - _default_success_debug_action, - _default_exception_debug_action, - ) - else: - self.debug = False - return self - - @property - def default_name(self) -> str: - if self._defaultName is None: - self._defaultName = self._generateDefaultName() - return self._defaultName - - @abstractmethod - def _generateDefaultName(self) -> str: - """ - Child classes must define this method, which defines how the ``default_name`` is set. - """ - - def set_name(self, name: str) -> "ParserElement": - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - - Word(nums).parse_string("ABC") # -> Exception: Expected W:(0-9) (at char 0), (line:1, col:1) - Word(nums).set_name("integer").parse_string("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.customName = name - self.errmsg = "Expected " + self.name - if __diag__.enable_debug_on_named_expressions: - self.set_debug() - return self - - @property - def name(self) -> str: - # This will use a user-defined name if available, but otherwise defaults back to the auto-generated name - return self.customName if self.customName is not None else self.default_name - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return str(self) - - def streamline(self) -> "ParserElement": - self.streamlined = True - self._defaultName = None - return self - - def recurse(self) -> List["ParserElement"]: - return [] - - def _checkRecursion(self, parseElementList): - subRecCheckList = parseElementList[:] + [self] - for e in self.recurse(): - e._checkRecursion(subRecCheckList) - - def validate(self, validateTrace=None) -> None: - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - self._checkRecursion([]) - - def parse_file( - self, - file_or_filename: Union[str, Path, TextIO], - encoding: str = "utf-8", - parse_all: bool = False, - *, - parseAll: bool = False, - ) -> ParseResults: - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - parseAll = parseAll or parse_all - try: - file_or_filename = typing.cast(TextIO, file_or_filename) - file_contents = file_or_filename.read() - except AttributeError: - file_or_filename = typing.cast(str, file_or_filename) - with open(file_or_filename, "r", encoding=encoding) as f: - file_contents = f.read() - try: - return self.parse_string(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) - - def __eq__(self, other): - if self is other: - return True - elif isinstance(other, str_type): - return self.matches(other, parse_all=True) - elif isinstance(other, ParserElement): - return vars(self) == vars(other) - return False - - def __hash__(self): - return id(self) - - def matches( - self, test_string: str, parse_all: bool = True, *, parseAll: bool = True - ) -> bool: - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - - ``test_string`` - to test against this expression for a match - - ``parse_all`` - (default= ``True``) - flag to pass to :class:`parse_string` when running tests - - Example:: - - expr = Word(nums) - assert expr.matches("100") - """ - parseAll = parseAll and parse_all - try: - self.parse_string(str(test_string), parse_all=parseAll) - return True - except ParseBaseException: - return False - - def run_tests( - self, - tests: Union[str, List[str]], - parse_all: bool = True, - comment: typing.Optional[Union["ParserElement", str]] = "#", - full_dump: bool = True, - print_results: bool = True, - failure_tests: bool = False, - post_parse: typing.Optional[Callable[[str, ParseResults], str]] = None, - file: typing.Optional[TextIO] = None, - with_line_numbers: bool = False, - *, - parseAll: bool = True, - fullDump: bool = True, - printResults: bool = True, - failureTests: bool = False, - postParse: typing.Optional[Callable[[str, ParseResults], str]] = None, - ) -> Tuple[bool, List[Tuple[str, Union[ParseResults, Exception]]]]: - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - - ``tests`` - a list of separate test strings, or a multiline string of test strings - - ``parse_all`` - (default= ``True``) - flag to pass to :class:`parse_string` when running tests - - ``comment`` - (default= ``'#'``) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - ``full_dump`` - (default= ``True``) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - ``print_results`` - (default= ``True``) prints test output to stdout - - ``failure_tests`` - (default= ``False``) indicates if these tests are expected to fail parsing - - ``post_parse`` - (default= ``None``) optional callback for successful parse results; called as - `fn(test_string, parse_results)` and returns a string to be added to the test output - - ``file`` - (default= ``None``) optional file-like object to which test output will be written; - if None, will default to ``sys.stdout`` - - ``with_line_numbers`` - default= ``False``) show test strings with line and column numbers - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if ``failure_tests`` is True), and the results contain a list of lines of each - test's output - - Example:: - - number_expr = pyparsing_common.number.copy() - - result = number_expr.run_tests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.run_tests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failure_tests=True) - print("Success" if result[0] else "Failed!") - - prints:: - - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.run_tests(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading ``'r'``.) - """ - from .testing import pyparsing_test - - parseAll = parseAll and parse_all - fullDump = fullDump and full_dump - printResults = printResults and print_results - failureTests = failureTests or failure_tests - postParse = postParse or post_parse - if isinstance(tests, str_type): - tests = typing.cast(str, tests) - line_strip = type(tests).strip - tests = [line_strip(test_line) for test_line in tests.rstrip().splitlines()] - comment_specified = comment is not None - if comment_specified: - if isinstance(comment, str_type): - comment = typing.cast(str, comment) - comment = Literal(comment) - comment = typing.cast(ParserElement, comment) - if file is None: - file = sys.stdout - print_ = file.write - - result: Union[ParseResults, Exception] - allResults: List[Tuple[str, Union[ParseResults, Exception]]] = [] - comments: List[str] = [] - success = True - NL = Literal(r"\n").add_parse_action(replace_with("\n")).ignore(quoted_string) - BOM = "\ufeff" - for t in tests: - if comment_specified and comment.matches(t, False) or comments and not t: - comments.append( - pyparsing_test.with_line_numbers(t) if with_line_numbers else t - ) - continue - if not t: - continue - out = [ - "\n" + "\n".join(comments) if comments else "", - pyparsing_test.with_line_numbers(t) if with_line_numbers else t, - ] - comments = [] - try: - # convert newline marks to actual newlines, and strip leading BOM if present - t = NL.transform_string(t.lstrip(BOM)) - result = self.parse_string(t, parse_all=parseAll) - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - out.append(pe.explain()) - out.append("FAIL: " + str(pe)) - if ParserElement.verbose_stacktrace: - out.extend(traceback.format_tb(pe.__traceback__)) - success = success and failureTests - result = pe - except Exception as exc: - out.append(f"FAIL-EXCEPTION: {type(exc).__name__}: {exc}") - if ParserElement.verbose_stacktrace: - out.extend(traceback.format_tb(exc.__traceback__)) - success = success and failureTests - result = exc - else: - success = success and not failureTests - if postParse is not None: - try: - pp_value = postParse(t, result) - if pp_value is not None: - if isinstance(pp_value, ParseResults): - out.append(pp_value.dump()) - else: - out.append(str(pp_value)) - else: - out.append(result.dump()) - except Exception as e: - out.append(result.dump(full=fullDump)) - out.append( - f"{postParse.__name__} failed: {type(e).__name__}: {e}" - ) - else: - out.append(result.dump(full=fullDump)) - out.append("") - - if printResults: - print_("\n".join(out)) - - allResults.append((t, result)) - - return success, allResults - - def create_diagram( - self, - output_html: Union[TextIO, Path, str], - vertical: int = 3, - show_results_names: bool = False, - show_groups: bool = False, - embed: bool = False, - **kwargs, - ) -> None: - """ - Create a railroad diagram for the parser. - - Parameters: - - - ``output_html`` (str or file-like object) - output target for generated - diagram HTML - - ``vertical`` (int) - threshold for formatting multiple alternatives vertically - instead of horizontally (default=3) - - ``show_results_names`` - bool flag whether diagram should show annotations for - defined results names - - ``show_groups`` - bool flag whether groups should be highlighted with an unlabeled surrounding box - - ``embed`` - bool flag whether generated HTML should omit , , and tags to embed - the resulting HTML in an enclosing HTML source - - ``head`` - str containing additional HTML to insert into the section of the generated code; - can be used to insert custom CSS styling - - ``body`` - str containing additional HTML to insert at the beginning of the section of the - generated code - - Additional diagram-formatting keyword arguments can also be included; - see railroad.Diagram class. - """ - - try: - from .diagram import to_railroad, railroad_to_html - except ImportError as ie: - raise Exception( - "must ``pip install pyparsing[diagrams]`` to generate parser railroad diagrams" - ) from ie - - self.streamline() - - railroad = to_railroad( - self, - vertical=vertical, - show_results_names=show_results_names, - show_groups=show_groups, - diagram_kwargs=kwargs, - ) - if isinstance(output_html, (str, Path)): - with open(output_html, "w", encoding="utf-8") as diag_file: - diag_file.write(railroad_to_html(railroad, embed=embed, **kwargs)) - else: - # we were passed a file-like object, just write to it - output_html.write(railroad_to_html(railroad, embed=embed, **kwargs)) - - # Compatibility synonyms - # fmt: off - @staticmethod - @replaced_by_pep8(inline_literals_using) - def inlineLiteralsUsing(): ... - - @staticmethod - @replaced_by_pep8(set_default_whitespace_chars) - def setDefaultWhitespaceChars(): ... - - @replaced_by_pep8(set_results_name) - def setResultsName(self): ... - - @replaced_by_pep8(set_break) - def setBreak(self): ... - - @replaced_by_pep8(set_parse_action) - def setParseAction(self): ... - - @replaced_by_pep8(add_parse_action) - def addParseAction(self): ... - - @replaced_by_pep8(add_condition) - def addCondition(self): ... - - @replaced_by_pep8(set_fail_action) - def setFailAction(self): ... - - @replaced_by_pep8(try_parse) - def tryParse(self): ... - - @staticmethod - @replaced_by_pep8(enable_left_recursion) - def enableLeftRecursion(): ... - - @staticmethod - @replaced_by_pep8(enable_packrat) - def enablePackrat(): ... - - @replaced_by_pep8(parse_string) - def parseString(self): ... - - @replaced_by_pep8(scan_string) - def scanString(self): ... - - @replaced_by_pep8(transform_string) - def transformString(self): ... - - @replaced_by_pep8(search_string) - def searchString(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(set_whitespace_chars) - def setWhitespaceChars(self): ... - - @replaced_by_pep8(parse_with_tabs) - def parseWithTabs(self): ... - - @replaced_by_pep8(set_debug_actions) - def setDebugActions(self): ... - - @replaced_by_pep8(set_debug) - def setDebug(self): ... - - @replaced_by_pep8(set_name) - def setName(self): ... - - @replaced_by_pep8(parse_file) - def parseFile(self): ... - - @replaced_by_pep8(run_tests) - def runTests(self): ... - - canParseNext = can_parse_next - resetCache = reset_cache - defaultName = default_name - # fmt: on - - -class _PendingSkip(ParserElement): - # internal placeholder class to hold a place were '...' is added to a parser element, - # once another ParserElement is added, this placeholder will be replaced with a SkipTo - def __init__(self, expr: ParserElement, must_skip: bool = False): - super().__init__() - self.anchor = expr - self.must_skip = must_skip - - def _generateDefaultName(self) -> str: - return str(self.anchor + Empty()).replace("Empty", "...") - - def __add__(self, other) -> "ParserElement": - skipper = SkipTo(other).set_name("...")("_skipped*") - if self.must_skip: - - def must_skip(t): - if not t._skipped or t._skipped.as_list() == [""]: - del t[0] - t.pop("_skipped", None) - - def show_skip(t): - if t._skipped.as_list()[-1:] == [""]: - t.pop("_skipped") - t["_skipped"] = "missing <" + repr(self.anchor) + ">" - - return ( - self.anchor + skipper().add_parse_action(must_skip) - | skipper().add_parse_action(show_skip) - ) + other - - return self.anchor + skipper + other - - def __repr__(self): - return self.defaultName - - def parseImpl(self, *args): - raise Exception( - "use of `...` expression without following SkipTo target expression" - ) - - -class Token(ParserElement): - """Abstract :class:`ParserElement` subclass, for defining atomic - matching patterns. - """ - - def __init__(self): - super().__init__(savelist=False) - - def _generateDefaultName(self) -> str: - return type(self).__name__ - - -class NoMatch(Token): - """ - A token that will never match. - """ - - def __init__(self): - super().__init__() - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl(self, instring, loc, doActions=True): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """ - Token to exactly match a specified string. - - Example:: - - Literal('blah').parse_string('blah') # -> ['blah'] - Literal('blah').parse_string('blahfooblah') # -> ['blah'] - Literal('blah').parse_string('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use :class:`CaselessLiteral`. - - For keyword matching (force word break before and after the matched string), - use :class:`Keyword` or :class:`CaselessKeyword`. - """ - - def __new__(cls, match_string: str = "", *, matchString: str = ""): - # Performance tuning: select a subclass with optimized parseImpl - if cls is Literal: - match_string = matchString or match_string - if not match_string: - return super().__new__(Empty) - if len(match_string) == 1: - return super().__new__(_SingleCharLiteral) - - # Default behavior - return super().__new__(cls) - - # Needed to make copy.copy() work correctly if we customize __new__ - def __getnewargs__(self): - return (self.match,) - - def __init__(self, match_string: str = "", *, matchString: str = ""): - super().__init__() - match_string = matchString or match_string - self.match = match_string - self.matchLen = len(match_string) - self.firstMatchChar = match_string[:1] - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - def _generateDefaultName(self) -> str: - return repr(self.match) - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] == self.firstMatchChar and instring.startswith( - self.match, loc - ): - return loc + self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - -class Empty(Literal): - """ - An empty token, will always match. - """ - - def __init__(self, match_string="", *, matchString=""): - super().__init__("") - self.mayReturnEmpty = True - self.mayIndexError = False - - def _generateDefaultName(self) -> str: - return "Empty" - - def parseImpl(self, instring, loc, doActions=True): - return loc, [] - - -class _SingleCharLiteral(Literal): - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] == self.firstMatchChar: - return loc + 1, self.match - raise ParseException(instring, loc, self.errmsg, self) - - -ParserElement._literalStringClass = Literal - - -class Keyword(Token): - """ - Token to exactly match a specified string as a keyword, that is, - it must be immediately preceded and followed by whitespace or - non-keyword characters. Compare with :class:`Literal`: - - - ``Literal("if")`` will match the leading ``'if'`` in - ``'ifAndOnlyIf'``. - - ``Keyword("if")`` will not; it will only match the leading - ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` - - Accepts two optional constructor arguments in addition to the - keyword string: - - - ``ident_chars`` is a string of characters that would be valid - identifier characters, defaulting to all alphanumerics + "_" and - "$" - - ``caseless`` allows case-insensitive matching, default is ``False``. - - Example:: - - Keyword("start").parse_string("start") # -> ['start'] - Keyword("start").parse_string("starting") # -> Exception - - For case-insensitive matching, use :class:`CaselessKeyword`. - """ - - DEFAULT_KEYWORD_CHARS = alphanums + "_$" - - def __init__( - self, - match_string: str = "", - ident_chars: typing.Optional[str] = None, - caseless: bool = False, - *, - matchString: str = "", - identChars: typing.Optional[str] = None, - ): - super().__init__() - identChars = identChars or ident_chars - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - match_string = matchString or match_string - self.match = match_string - self.matchLen = len(match_string) - try: - self.firstMatchChar = match_string[0] - except IndexError: - raise ValueError("null string passed to Keyword; use Empty() instead") - self.errmsg = f"Expected {type(self).__name__} {self.name}" - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = match_string.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def _generateDefaultName(self) -> str: - return repr(self.match) - - def parseImpl(self, instring, loc, doActions=True): - errmsg = self.errmsg - errloc = loc - if self.caseless: - if instring[loc : loc + self.matchLen].upper() == self.caselessmatch: - if loc == 0 or instring[loc - 1].upper() not in self.identChars: - if ( - loc >= len(instring) - self.matchLen - or instring[loc + self.matchLen].upper() not in self.identChars - ): - return loc + self.matchLen, self.match - else: - # followed by keyword char - errmsg += ", was immediately followed by keyword character" - errloc = loc + self.matchLen - else: - # preceded by keyword char - errmsg += ", keyword was immediately preceded by keyword character" - errloc = loc - 1 - # else no match just raise plain exception - - else: - if ( - instring[loc] == self.firstMatchChar - and self.matchLen == 1 - or instring.startswith(self.match, loc) - ): - if loc == 0 or instring[loc - 1] not in self.identChars: - if ( - loc >= len(instring) - self.matchLen - or instring[loc + self.matchLen] not in self.identChars - ): - return loc + self.matchLen, self.match - else: - # followed by keyword char - errmsg += ( - ", keyword was immediately followed by keyword character" - ) - errloc = loc + self.matchLen - else: - # preceded by keyword char - errmsg += ", keyword was immediately preceded by keyword character" - errloc = loc - 1 - # else no match just raise plain exception - - raise ParseException(instring, errloc, errmsg, self) - - @staticmethod - def set_default_keyword_chars(chars) -> None: - """ - Overrides the default characters used by :class:`Keyword` expressions. - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - - setDefaultKeywordChars = set_default_keyword_chars - - -class CaselessLiteral(Literal): - """ - Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - - CaselessLiteral("CMD")[1, ...].parse_string("cmd CMD Cmd10") - # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for :class:`CaselessKeyword`.) - """ - - def __init__(self, match_string: str = "", *, matchString: str = ""): - match_string = matchString or match_string - super().__init__(match_string.upper()) - # Preserve the defining literal. - self.returnString = match_string - self.errmsg = "Expected " + self.name - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc : loc + self.matchLen].upper() == self.match: - return loc + self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - - -class CaselessKeyword(Keyword): - """ - Caseless version of :class:`Keyword`. - - Example:: - - CaselessKeyword("CMD")[1, ...].parse_string("cmd CMD Cmd10") - # -> ['CMD', 'CMD'] - - (Contrast with example for :class:`CaselessLiteral`.) - """ - - def __init__( - self, - match_string: str = "", - ident_chars: typing.Optional[str] = None, - *, - matchString: str = "", - identChars: typing.Optional[str] = None, - ): - identChars = identChars or ident_chars - match_string = matchString or match_string - super().__init__(match_string, identChars, caseless=True) - - -class CloseMatch(Token): - """A variation on :class:`Literal` which matches "close" matches, - that is, strings with at most 'n' mismatching characters. - :class:`CloseMatch` takes parameters: - - - ``match_string`` - string to be matched - - ``caseless`` - a boolean indicating whether to ignore casing when comparing characters - - ``max_mismatches`` - (``default=1``) maximum number of - mismatches allowed to count as a match - - The results from a successful parse will contain the matched text - from the input string and the following named results: - - - ``mismatches`` - a list of the positions within the - match_string where mismatches were found - - ``original`` - the original match_string used to compare - against the input string - - If ``mismatches`` is an empty list, then the match was an exact - match. - - Example:: - - patt = CloseMatch("ATCATCGAATGGA") - patt.parse_string("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parse_string("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parse_string("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", max_mismatches=2) - patt.parse_string("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - - def __init__( - self, - match_string: str, - max_mismatches: typing.Optional[int] = None, - *, - maxMismatches: int = 1, - caseless=False, - ): - maxMismatches = max_mismatches if max_mismatches is not None else maxMismatches - super().__init__() - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = f"Expected {self.match_string!r} (with up to {self.maxMismatches} mismatches)" - self.caseless = caseless - self.mayIndexError = False - self.mayReturnEmpty = False - - def _generateDefaultName(self) -> str: - return f"{type(self).__name__}:{self.match_string!r}" - - def parseImpl(self, instring, loc, doActions=True): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc, s_m in enumerate( - zip(instring[loc:maxloc], match_string) - ): - src, mat = s_m - if self.caseless: - src, mat = src.lower(), mat.lower() - - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = start + match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results["original"] = match_string - results["mismatches"] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """Token for matching words composed of allowed character sets. - - Parameters: - - - ``init_chars`` - string of all characters that should be used to - match as a word; "ABC" will match "AAA", "ABAB", "CBAC", etc.; - if ``body_chars`` is also specified, then this is the string of - initial characters - - ``body_chars`` - string of characters that - can be used for matching after a matched initial character as - given in ``init_chars``; if omitted, same as the initial characters - (default=``None``) - - ``min`` - minimum number of characters to match (default=1) - - ``max`` - maximum number of characters to match (default=0) - - ``exact`` - exact number of characters to match (default=0) - - ``as_keyword`` - match as a keyword (default=``False``) - - ``exclude_chars`` - characters that might be - found in the input ``body_chars`` string but which should not be - accepted for matching ;useful to define a word of all - printables except for one or two characters, for instance - (default=``None``) - - :class:`srange` is useful for defining custom character set strings - for defining :class:`Word` expressions, using range notation from - regular expression character sets. - - A common mistake is to use :class:`Word` to match a specific literal - string, as in ``Word("Address")``. Remember that :class:`Word` - uses the string argument to define *sets* of matchable characters. - This expression would match "Add", "AAA", "dAred", or any other word - made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an - exact literal string, use :class:`Literal` or :class:`Keyword`. - - pyparsing includes helper strings for building Words: - - - :class:`alphas` - - :class:`nums` - - :class:`alphanums` - - :class:`hexnums` - - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 - - accented, tilded, umlauted, etc.) - - :class:`punc8bit` (non-alphabetic characters in ASCII range - 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - :class:`printables` (any non-whitespace character) - - ``alphas``, ``nums``, and ``printables`` are also defined in several - Unicode sets - see :class:`pyparsing_unicode``. - - Example:: - - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums + '-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, exclude_chars=",") - """ - - def __init__( - self, - init_chars: str = "", - body_chars: typing.Optional[str] = None, - min: int = 1, - max: int = 0, - exact: int = 0, - as_keyword: bool = False, - exclude_chars: typing.Optional[str] = None, - *, - initChars: typing.Optional[str] = None, - bodyChars: typing.Optional[str] = None, - asKeyword: bool = False, - excludeChars: typing.Optional[str] = None, - ): - initChars = initChars or init_chars - bodyChars = bodyChars or body_chars - asKeyword = asKeyword or as_keyword - excludeChars = excludeChars or exclude_chars - super().__init__() - if not initChars: - raise ValueError( - f"invalid {type(self).__name__}, initChars cannot be empty string" - ) - - initChars_set = set(initChars) - if excludeChars: - excludeChars_set = set(excludeChars) - initChars_set -= excludeChars_set - if bodyChars: - bodyChars = "".join(set(bodyChars) - excludeChars_set) - self.initChars = initChars_set - self.initCharsOrig = "".join(sorted(initChars_set)) - - if bodyChars: - self.bodyChars = set(bodyChars) - self.bodyCharsOrig = "".join(sorted(bodyChars)) - else: - self.bodyChars = initChars_set - self.bodyCharsOrig = self.initCharsOrig - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError( - "cannot specify a minimum length < 1; use Opt(Word()) if zero-length word is permitted" - ) - - if self.maxSpecified and min > max: - raise ValueError( - f"invalid args, if min and max both specified min must be <= max (min={min}, max={max})" - ) - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - min = max = exact - self.maxLen = exact - self.minLen = exact - - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - if self.asKeyword: - self.errmsg += " as a keyword" - - # see if we can make a regex for this Word - if " " not in (self.initChars | self.bodyChars): - if len(self.initChars) == 1: - re_leading_fragment = re.escape(self.initCharsOrig) - else: - re_leading_fragment = f"[{_collapse_string_to_ranges(self.initChars)}]" - - if self.bodyChars == self.initChars: - if max == 0: - repeat = "+" - elif max == 1: - repeat = "" - else: - if self.minLen != self.maxLen: - repeat = f"{{{self.minLen},{'' if self.maxLen == _MAX_INT else self.maxLen}}}" - else: - repeat = f"{{{self.minLen}}}" - self.reString = f"{re_leading_fragment}{repeat}" - else: - if max == 1: - re_body_fragment = "" - repeat = "" - else: - re_body_fragment = f"[{_collapse_string_to_ranges(self.bodyChars)}]" - if max == 0: - repeat = "*" - elif max == 2: - repeat = "?" if min <= 1 else "" - else: - if min != max: - repeat = f"{{{min - 1 if min > 0 else 0},{max - 1}}}" - else: - repeat = f"{{{min - 1 if min > 0 else 0}}}" - - self.reString = ( - f"{re_leading_fragment}" f"{re_body_fragment}" f"{repeat}" - ) - - if self.asKeyword: - self.reString = rf"\b{self.reString}\b" - - try: - self.re = re.compile(self.reString) - except re.error: - self.re = None # type: ignore[assignment] - else: - self.re_match = self.re.match - self.parseImpl = self.parseImpl_regex # type: ignore[assignment] - - def _generateDefaultName(self) -> str: - def charsAsStr(s): - max_repr_len = 16 - s = _collapse_string_to_ranges(s, re_escape=False) - if len(s) > max_repr_len: - return s[: max_repr_len - 3] + "..." - else: - return s - - if self.initChars != self.bodyChars: - base = f"W:({charsAsStr(self.initChars)}, {charsAsStr(self.bodyChars)})" - else: - base = f"W:({charsAsStr(self.initChars)})" - - # add length specification - if self.minLen > 1 or self.maxLen != _MAX_INT: - if self.minLen == self.maxLen: - if self.minLen == 1: - return base[2:] - else: - return base + f"{{{self.minLen}}}" - elif self.maxLen == _MAX_INT: - return base + f"{{{self.minLen},...}}" - else: - return base + f"{{{self.minLen},{self.maxLen}}}" - return base - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] not in self.initChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min(maxloc, instrlen) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - elif self.asKeyword: - if ( - start > 0 - and instring[start - 1] in bodychars - or loc < instrlen - and instring[loc] in bodychars - ): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def parseImpl_regex(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - -class Char(Word): - """A short-cut class for defining :class:`Word` ``(characters, exact=1)``, - when defining a match of any single character in a string of - characters. - """ - - def __init__( - self, - charset: str, - as_keyword: bool = False, - exclude_chars: typing.Optional[str] = None, - *, - asKeyword: bool = False, - excludeChars: typing.Optional[str] = None, - ): - asKeyword = asKeyword or as_keyword - excludeChars = excludeChars or exclude_chars - super().__init__( - charset, exact=1, as_keyword=asKeyword, exclude_chars=excludeChars - ) - - -class Regex(Token): - r"""Token for matching strings that match a given regular - expression. Defined with string specifying the regular expression in - a form recognized by the stdlib Python `re module `_. - If the given regex contains named groups (defined using ``(?P...)``), - these will be preserved as named :class:`ParseResults`. - - If instead of the Python stdlib ``re`` module you wish to use a different RE module - (such as the ``regex`` module), you can do so by building your ``Regex`` object with - a compiled RE that was compiled using ``regex``. - - Example:: - - realnum = Regex(r"[+-]?\d+\.\d*") - # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - - # named fields in a regex will be returned as named results - date = Regex(r'(?P\d{4})-(?P\d\d?)-(?P\d\d?)') - - # the Regex class will accept re's compiled using the regex module - import regex - parser = pp.Regex(regex.compile(r'[0-9]')) - """ - - def __init__( - self, - pattern: Any, - flags: Union[re.RegexFlag, int] = 0, - as_group_list: bool = False, - as_match: bool = False, - *, - asGroupList: bool = False, - asMatch: bool = False, - ): - """The parameters ``pattern`` and ``flags`` are passed - to the ``re.compile()`` function as-is. See the Python - `re module `_ module for an - explanation of the acceptable patterns and flags. - """ - super().__init__() - asGroupList = asGroupList or as_group_list - asMatch = asMatch or as_match - - if isinstance(pattern, str_type): - if not pattern: - raise ValueError("null string passed to Regex; use Empty() instead") - - self._re = None - self.reString = self.pattern = pattern - self.flags = flags - - elif hasattr(pattern, "pattern") and hasattr(pattern, "match"): - self._re = pattern - self.pattern = self.reString = pattern.pattern - self.flags = flags - - else: - raise TypeError( - "Regex may only be constructed with a string or a compiled RE object" - ) - - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asGroupList = asGroupList - self.asMatch = asMatch - if self.asGroupList: - self.parseImpl = self.parseImplAsGroupList # type: ignore [assignment] - if self.asMatch: - self.parseImpl = self.parseImplAsMatch # type: ignore [assignment] - - @cached_property - def re(self): - if self._re: - return self._re - else: - try: - return re.compile(self.pattern, self.flags) - except re.error: - raise ValueError(f"invalid pattern ({self.pattern!r}) passed to Regex") - - @cached_property - def re_match(self): - return self.re.match - - @cached_property - def mayReturnEmpty(self): - return self.re_match("") is not None - - def _generateDefaultName(self) -> str: - return "Re:({})".format(repr(self.pattern).replace("\\\\", "\\")) - - def parseImpl(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = ParseResults(result.group()) - d = result.groupdict() - if d: - for k, v in d.items(): - ret[k] = v - return loc, ret - - def parseImplAsGroupList(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.groups() - return loc, ret - - def parseImplAsMatch(self, instring, loc, doActions=True): - result = self.re_match(instring, loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result - return loc, ret - - def sub(self, repl: str) -> ParserElement: - r""" - Return :class:`Regex` with an attached parse action to transform the parsed - result as if called using `re.sub(expr, repl, string) `_. - - Example:: - - make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2") - print(make_html.transform_string("h1:main title:")) - # prints "

      main title

      " - """ - if self.asGroupList: - raise TypeError("cannot use sub() with Regex(as_group_list=True)") - - if self.asMatch and callable(repl): - raise TypeError( - "cannot use sub() with a callable with Regex(as_match=True)" - ) - - if self.asMatch: - - def pa(tokens): - return tokens[0].expand(repl) - - else: - - def pa(tokens): - return self.re.sub(repl, tokens[0]) - - return self.add_parse_action(pa) - - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - - ``quote_char`` - string of one or more characters defining the - quote delimiting string - - ``esc_char`` - character to re_escape quotes, typically backslash - (default= ``None``) - - ``esc_quote`` - special quote sequence to re_escape an embedded quote - string (such as SQL's ``""`` to re_escape an embedded ``"``) - (default= ``None``) - - ``multiline`` - boolean indicating whether quotes can span - multiple lines (default= ``False``) - - ``unquote_results`` - boolean indicating whether the matched text - should be unquoted (default= ``True``) - - ``end_quote_char`` - string of one or more characters defining the - end of the quote delimited string (default= ``None`` => same as - quote_char) - - ``convert_whitespace_escapes`` - convert escaped whitespace - (``'\t'``, ``'\n'``, etc.) to actual whitespace - (default= ``True``) - - Example:: - - qs = QuotedString('"') - print(qs.search_string('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', end_quote_char='}}') - print(complex_qs.search_string('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', esc_quote='""') - print(sql_qs.search_string('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - - prints:: - - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - ws_map = dict(((r"\t", "\t"), (r"\n", "\n"), (r"\f", "\f"), (r"\r", "\r"))) - - def __init__( - self, - quote_char: str = "", - esc_char: typing.Optional[str] = None, - esc_quote: typing.Optional[str] = None, - multiline: bool = False, - unquote_results: bool = True, - end_quote_char: typing.Optional[str] = None, - convert_whitespace_escapes: bool = True, - *, - quoteChar: str = "", - escChar: typing.Optional[str] = None, - escQuote: typing.Optional[str] = None, - unquoteResults: bool = True, - endQuoteChar: typing.Optional[str] = None, - convertWhitespaceEscapes: bool = True, - ): - super().__init__() - escChar = escChar or esc_char - escQuote = escQuote or esc_quote - unquoteResults = unquoteResults and unquote_results - endQuoteChar = endQuoteChar or end_quote_char - convertWhitespaceEscapes = ( - convertWhitespaceEscapes and convert_whitespace_escapes - ) - quote_char = quoteChar or quote_char - - # remove white space from quote chars - wont work anyway - quote_char = quote_char.strip() - if not quote_char: - raise ValueError("quote_char cannot be the empty string") - - if endQuoteChar is None: - endQuoteChar = quote_char - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - raise ValueError("end_quote_char cannot be the empty string") - - self.quoteChar: str = quote_char - self.quoteCharLen: int = len(quote_char) - self.firstQuoteChar: str = quote_char[0] - self.endQuoteChar: str = endQuoteChar - self.endQuoteCharLen: int = len(endQuoteChar) - self.escChar: str = escChar or "" - self.escQuote: str = escQuote or "" - self.unquoteResults: bool = unquoteResults - self.convertWhitespaceEscapes: bool = convertWhitespaceEscapes - self.multiline = multiline - - sep = "" - inner_pattern = "" - - if escQuote: - inner_pattern += rf"{sep}(?:{re.escape(escQuote)})" - sep = "|" - - if escChar: - inner_pattern += rf"{sep}(?:{re.escape(escChar)}.)" - sep = "|" - self.escCharReplacePattern = re.escape(escChar) + "(.)" - - if len(self.endQuoteChar) > 1: - inner_pattern += ( - f"{sep}(?:" - + "|".join( - f"(?:{re.escape(self.endQuoteChar[:i])}(?!{re.escape(self.endQuoteChar[i:])}))" - for i in range(len(self.endQuoteChar) - 1, 0, -1) - ) - + ")" - ) - sep = "|" - - self.flags = re.RegexFlag(0) - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - inner_pattern += ( - rf"{sep}(?:[^{_escape_regex_range_chars(self.endQuoteChar[0])}" - rf"{(_escape_regex_range_chars(escChar) if escChar is not None else '')}])" - ) - else: - inner_pattern += ( - rf"{sep}(?:[^{_escape_regex_range_chars(self.endQuoteChar[0])}\n\r" - rf"{(_escape_regex_range_chars(escChar) if escChar is not None else '')}])" - ) - - self.pattern = "".join( - [ - re.escape(self.quoteChar), - "(?:", - inner_pattern, - ")*", - re.escape(self.endQuoteChar), - ] - ) - - if self.unquoteResults: - if self.convertWhitespaceEscapes: - self.unquote_scan_re = re.compile( - rf"({'|'.join(re.escape(k) for k in self.ws_map)})|({re.escape(self.escChar)}.)|(\n|.)", - flags=self.flags, - ) - else: - self.unquote_scan_re = re.compile( - rf"({re.escape(self.escChar)}.)|(\n|.)", flags=self.flags - ) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - self.re_match = self.re.match - except re.error: - raise ValueError(f"invalid pattern {self.pattern!r} passed to Regex") - - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def _generateDefaultName(self) -> str: - if self.quoteChar == self.endQuoteChar and isinstance(self.quoteChar, str_type): - return f"string enclosed in {self.quoteChar!r}" - - return f"quoted string, starting with {self.quoteChar} ending with {self.endQuoteChar}" - - def parseImpl(self, instring, loc, doActions=True): - result = ( - instring[loc] == self.firstQuoteChar - and self.re_match(instring, loc) - or None - ) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - # strip off quotes - ret = ret[self.quoteCharLen : -self.endQuoteCharLen] - - if isinstance(ret, str_type): - if self.convertWhitespaceEscapes: - ret = "".join( - self.ws_map[match.group(1)] - if match.group(1) - else match.group(2)[-1] - if match.group(2) - else match.group(3) - for match in self.unquote_scan_re.finditer(ret) - ) - else: - ret = "".join( - match.group(1)[-1] if match.group(1) else match.group(2) - for match in self.unquote_scan_re.finditer(ret) - ) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - -class CharsNotIn(Token): - """Token for matching words composed of characters *not* in a given - set (will include whitespace in matched characters if not listed in - the provided exclusion set - see example). Defined with string - containing all disallowed characters, and an optional minimum, - maximum, and/or exact length. The default value for ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``exact`` are 0, meaning no maximum or exact - length restriction. - - Example:: - - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(DelimitedList(csv_value).parse_string("dkls,lsdkjf,s12 34,@!#,213")) - - prints:: - - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - - def __init__( - self, - not_chars: str = "", - min: int = 1, - max: int = 0, - exact: int = 0, - *, - notChars: str = "", - ): - super().__init__() - self.skipWhitespace = False - self.notChars = not_chars or notChars - self.notCharsSet = set(self.notChars) - - if min < 1: - raise ValueError( - "cannot specify a minimum length < 1; use " - "Opt(CharsNotIn()) if zero-length char group is permitted" - ) - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = self.minLen == 0 - self.mayIndexError = False - - def _generateDefaultName(self) -> str: - not_chars_str = _collapse_string_to_ranges(self.notChars) - if len(not_chars_str) > 16: - return f"!W:({self.notChars[: 16 - 3]}...)" - else: - return f"!W:({self.notChars})" - - def parseImpl(self, instring, loc, doActions=True): - notchars = self.notCharsSet - if instring[loc] in notchars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - maxlen = min(start + self.maxLen, len(instring)) - while loc < maxlen and instring[loc] not in notchars: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class White(Token): - """Special matching class for matching whitespace. Normally, - whitespace is ignored by pyparsing grammars. This class is included - when some whitespace structures are significant. Define with - a string containing the whitespace characters to be matched; default - is ``" \\t\\r\\n"``. Also takes optional ``min``, - ``max``, and ``exact`` arguments, as defined for the - :class:`Word` class. - """ - - whiteStrs = { - " ": "", - "\t": "", - "\n": "", - "\r": "", - "\f": "", - "\u00A0": "", - "\u1680": "", - "\u180E": "", - "\u2000": "", - "\u2001": "", - "\u2002": "", - "\u2003": "", - "\u2004": "", - "\u2005": "", - "\u2006": "", - "\u2007": "", - "\u2008": "", - "\u2009": "", - "\u200A": "", - "\u200B": "", - "\u202F": "", - "\u205F": "", - "\u3000": "", - } - - def __init__(self, ws: str = " \t\r\n", min: int = 1, max: int = 0, exact: int = 0): - super().__init__() - self.matchWhite = ws - self.set_whitespace_chars( - "".join(c for c in self.whiteStrs if c not in self.matchWhite), - copy_defaults=True, - ) - # self.leave_whitespace() - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def _generateDefaultName(self) -> str: - return "".join(White.whiteStrs[c] for c in self.matchWhite) - - def parseImpl(self, instring, loc, doActions=True): - if instring[loc] not in self.matchWhite: - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min(maxloc, len(instring)) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class PositionToken(Token): - def __init__(self): - super().__init__() - self.mayReturnEmpty = True - self.mayIndexError = False - - -class GoToColumn(PositionToken): - """Token to advance to a specific column of input text; useful for - tabular report scraping. - """ - - def __init__(self, colno: int): - super().__init__() - self.col = colno - - def preParse(self, instring: str, loc: int) -> int: - if col(loc, instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables(instring, loc) - while ( - loc < instrlen - and instring[loc].isspace() - and col(loc, instring) != self.col - ): - loc += 1 - return loc - - def parseImpl(self, instring, loc, doActions=True): - thiscol = col(loc, instring) - if thiscol > self.col: - raise ParseException(instring, loc, "Text not in expected column", self) - newloc = loc + self.col - thiscol - ret = instring[loc:newloc] - return newloc, ret - - -class LineStart(PositionToken): - r"""Matches if current position is at the beginning of a line within - the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + rest_of_line).search_string(test): - print(t) - - prints:: - - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - - def __init__(self): - super().__init__() - self.leave_whitespace() - self.orig_whiteChars = set() | self.whiteChars - self.whiteChars.discard("\n") - self.skipper = Empty().set_whitespace_chars(self.whiteChars) - self.errmsg = "Expected start of line" - - def preParse(self, instring: str, loc: int) -> int: - if loc == 0: - return loc - else: - ret = self.skipper.preParse(instring, loc) - if "\n" in self.orig_whiteChars: - while instring[ret : ret + 1] == "\n": - ret = self.skipper.preParse(instring, ret + 1) - return ret - - def parseImpl(self, instring, loc, doActions=True): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - - -class LineEnd(PositionToken): - """Matches if current position is at the end of a line within the - parse string - """ - - def __init__(self): - super().__init__() - self.whiteChars.discard("\n") - self.set_whitespace_chars(self.whiteChars, copy_defaults=False) - self.errmsg = "Expected end of line" - - def parseImpl(self, instring, loc, doActions=True): - if loc < len(instring): - if instring[loc] == "\n": - return loc + 1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc + 1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - - -class StringStart(PositionToken): - """Matches if current position is at the beginning of the parse - string - """ - - def __init__(self): - super().__init__() - self.errmsg = "Expected start of text" - - def parseImpl(self, instring, loc, doActions=True): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse(instring, 0): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class StringEnd(PositionToken): - """ - Matches if current position is at the end of the parse string - """ - - def __init__(self): - super().__init__() - self.errmsg = "Expected end of text" - - def parseImpl(self, instring, loc, doActions=True): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc + 1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - - -class WordStart(PositionToken): - """Matches if the current position is at the beginning of a - :class:`Word`, and is not preceded by any character in a given - set of ``word_chars`` (default= ``printables``). To emulate the - ``\b`` behavior of regular expressions, use - ``WordStart(alphanums)``. ``WordStart`` will also match at - the beginning of the string being parsed, or at the beginning of - a line. - """ - - def __init__(self, word_chars: str = printables, *, wordChars: str = printables): - wordChars = word_chars if wordChars == printables else wordChars - super().__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True): - if loc != 0: - if ( - instring[loc - 1] in self.wordChars - or instring[loc] not in self.wordChars - ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class WordEnd(PositionToken): - """Matches if the current position is at the end of a :class:`Word`, - and is not followed by any character in a given set of ``word_chars`` - (default= ``printables``). To emulate the ``\b`` behavior of - regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` - will also match at the end of the string being parsed, or at the end - of a line. - """ - - def __init__(self, word_chars: str = printables, *, wordChars: str = printables): - wordChars = word_chars if wordChars == printables else wordChars - super().__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True): - instrlen = len(instring) - if instrlen > 0 and loc < instrlen: - if ( - instring[loc] in self.wordChars - or instring[loc - 1] not in self.wordChars - ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """Abstract subclass of ParserElement, for combining and - post-processing parsed tokens. - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False): - super().__init__(savelist) - self.exprs: List[ParserElement] - if isinstance(exprs, _generatorType): - exprs = list(exprs) - - if isinstance(exprs, str_type): - self.exprs = [self._literalStringClass(exprs)] - elif isinstance(exprs, ParserElement): - self.exprs = [exprs] - elif isinstance(exprs, Iterable): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if any(isinstance(expr, str_type) for expr in exprs): - exprs = ( - self._literalStringClass(e) if isinstance(e, str_type) else e - for e in exprs - ) - self.exprs = list(exprs) - else: - try: - self.exprs = list(exprs) - except TypeError: - self.exprs = [exprs] - self.callPreparse = False - - def recurse(self) -> List[ParserElement]: - return self.exprs[:] - - def append(self, other) -> ParserElement: - self.exprs.append(other) - self._defaultName = None - return self - - def leave_whitespace(self, recursive: bool = True) -> ParserElement: - """ - Extends ``leave_whitespace`` defined in base class, and also invokes ``leave_whitespace`` on - all contained expressions. - """ - super().leave_whitespace(recursive) - - if recursive: - self.exprs = [e.copy() for e in self.exprs] - for e in self.exprs: - e.leave_whitespace(recursive) - return self - - def ignore_whitespace(self, recursive: bool = True) -> ParserElement: - """ - Extends ``ignore_whitespace`` defined in base class, and also invokes ``leave_whitespace`` on - all contained expressions. - """ - super().ignore_whitespace(recursive) - if recursive: - self.exprs = [e.copy() for e in self.exprs] - for e in self.exprs: - e.ignore_whitespace(recursive) - return self - - def ignore(self, other) -> ParserElement: - if isinstance(other, Suppress): - if other not in self.ignoreExprs: - super().ignore(other) - for e in self.exprs: - e.ignore(self.ignoreExprs[-1]) - else: - super().ignore(other) - for e in self.exprs: - e.ignore(self.ignoreExprs[-1]) - return self - - def _generateDefaultName(self) -> str: - return f"{self.__class__.__name__}:({str(self.exprs)})" - - def streamline(self) -> ParserElement: - if self.streamlined: - return self - - super().streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested :class:`And`'s of the form ``And(And(And(a, b), c), d)`` to ``And(a, b, c, d)`` - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for :class:`Or`'s and :class:`MatchFirst`'s) - if len(self.exprs) == 2: - other = self.exprs[0] - if ( - isinstance(other, self.__class__) - and not other.parseAction - and other.resultsName is None - and not other.debug - ): - self.exprs = other.exprs[:] + [self.exprs[1]] - self._defaultName = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( - isinstance(other, self.__class__) - and not other.parseAction - and other.resultsName is None - and not other.debug - ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self._defaultName = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + str(self) - - return self - - def validate(self, validateTrace=None) -> None: - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - tmp = (validateTrace if validateTrace is not None else [])[:] + [self] - for e in self.exprs: - e.validate(tmp) - self._checkRecursion([]) - - def copy(self) -> ParserElement: - ret = super().copy() - ret = typing.cast(ParseExpression, ret) - ret.exprs = [e.copy() for e in self.exprs] - return ret - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_ungrouped_named_tokens_in_collection - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in self.suppress_warnings_ - ): - for e in self.exprs: - if ( - isinstance(e, ParserElement) - and e.resultsName - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in e.suppress_warnings_ - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "collides with {!r} on contained expression".format( - "warn_ungrouped_named_tokens_in_collection", - name, - type(self).__name__, - e.resultsName, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - # Compatibility synonyms - # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - # fmt: on - - -class And(ParseExpression): - """ - Requires all given :class:`ParseExpression` s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the ``'+'`` operator. - May also be constructed using the ``'-'`` operator, which will - suppress backtracking. - - Example:: - - integer = Word(nums) - name_expr = Word(alphas)[1, ...] - - expr = And([integer("id"), name_expr("name"), integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.leave_whitespace() - - def _generateDefaultName(self) -> str: - return "-" - - def __init__( - self, exprs_arg: typing.Iterable[ParserElement], savelist: bool = True - ): - exprs: List[ParserElement] = list(exprs_arg) - if exprs and Ellipsis in exprs: - tmp = [] - for i, expr in enumerate(exprs): - if expr is Ellipsis: - if i < len(exprs) - 1: - skipto_arg: ParserElement = typing.cast( - ParseExpression, (Empty() + exprs[i + 1]) - ).exprs[-1] - tmp.append(SkipTo(skipto_arg)("_skipped*")) - else: - raise Exception( - "cannot construct And with sequence ending in ..." - ) - else: - tmp.append(expr) - exprs[:] = tmp - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - if not isinstance(self.exprs[0], White): - self.set_whitespace_chars( - self.exprs[0].whiteChars, - copy_defaults=self.exprs[0].copyDefaultWhiteChars, - ) - self.skipWhitespace = self.exprs[0].skipWhitespace - else: - self.skipWhitespace = False - else: - self.mayReturnEmpty = True - self.callPreparse = True - - def streamline(self) -> ParserElement: - # collapse any _PendingSkip's - if self.exprs: - if any( - isinstance(e, ParseExpression) - and e.exprs - and isinstance(e.exprs[-1], _PendingSkip) - for e in self.exprs[:-1] - ): - deleted_expr_marker = NoMatch() - for i, e in enumerate(self.exprs[:-1]): - if e is deleted_expr_marker: - continue - if ( - isinstance(e, ParseExpression) - and e.exprs - and isinstance(e.exprs[-1], _PendingSkip) - ): - e.exprs[-1] = e.exprs[-1] + self.exprs[i + 1] - self.exprs[i + 1] = deleted_expr_marker - self.exprs = [e for e in self.exprs if e is not deleted_expr_marker] - - super().streamline() - - # link any IndentedBlocks to the prior expression - prev: ParserElement - cur: ParserElement - for prev, cur in zip(self.exprs, self.exprs[1:]): - # traverse cur or any first embedded expr of cur looking for an IndentedBlock - # (but watch out for recursive grammar) - seen = set() - while True: - if id(cur) in seen: - break - seen.add(id(cur)) - if isinstance(cur, IndentedBlock): - prev.add_parse_action( - lambda s, l, t, cur_=cur: setattr( - cur_, "parent_anchor", col(l, s) - ) - ) - break - subs = cur.recurse() - next_first = next(iter(subs), None) - if next_first is None: - break - cur = typing.cast(ParserElement, next_first) - - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - def parseImpl(self, instring, loc, doActions=True): - # pass False as callPreParse arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( - instring, loc, doActions, callPreParse=False - ) - errorStop = False - for e in self.exprs[1:]: - # if isinstance(e, And._ErrorStop): - if type(e) is And._ErrorStop: - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse(instring, loc, doActions) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException( - instring, len(instring), self.errmsg, self - ) - else: - loc, exprtokens = e._parse(instring, loc, doActions) - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # And([self, other]) - - def _checkRecursion(self, parseElementList): - subRecCheckList = parseElementList[:] + [self] - for e in self.exprs: - e._checkRecursion(subRecCheckList) - if not e.mayReturnEmpty: - break - - def _generateDefaultName(self) -> str: - inner = " ".join(str(e) for e in self.exprs) - # strip off redundant inner {}'s - while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}": - inner = inner[1:-1] - return "{" + inner + "}" - - -class Or(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - two expressions match, the expression that matches the longest - string will be used. May be constructed using the ``'^'`` - operator. - - Example:: - - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.search_string("123 3.1416 789")) - - prints:: - - [['123'], ['3.1416'], ['789']] - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False): - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = all(e.skipWhitespace for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self) -> ParserElement: - super().streamline() - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.saveAsList = any(e.saveAsList for e in self.exprs) - self.skipWhitespace = all( - e.skipWhitespace and not isinstance(e, White) for e in self.exprs - ) - else: - self.saveAsList = False - return self - - def parseImpl(self, instring, loc, doActions=True): - maxExcLoc = -1 - maxException = None - matches = [] - fatals = [] - if all(e.callPreparse for e in self.exprs): - loc = self.preParse(instring, loc) - for e in self.exprs: - try: - loc2 = e.try_parse(instring, loc, raise_fatal=True) - except ParseFatalException as pfe: - pfe.__traceback__ = None - pfe.parser_element = e - fatals.append(pfe) - maxException = None - maxExcLoc = -1 - except ParseException as err: - if not fatals: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException( - instring, len(instring), e.errmsg, self - ) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - # re-evaluate all matches in descending order of length of match, in case attached actions - # might change whether or how much they match of the input. - matches.sort(key=itemgetter(0), reverse=True) - - if not doActions: - # no further conditions or parse actions to change the selection of - # alternative, so the first match will be the best match - best_expr = matches[0][1] - return best_expr._parse(instring, loc, doActions) - - longest = -1, None - for loc1, expr1 in matches: - if loc1 <= longest[0]: - # already have a longer match than this one will deliver, we are done - return longest - - try: - loc2, toks = expr1._parse(instring, loc, doActions) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - else: - if loc2 >= loc1: - return loc2, toks - # didn't match as much as before - elif loc2 > longest[0]: - longest = loc2, toks - - if longest != (-1, None): - return longest - - if fatals: - if len(fatals) > 1: - fatals.sort(key=lambda e: -e.loc) - if fatals[0].loc == fatals[1].loc: - fatals.sort(key=lambda e: (-e.loc, -len(str(e.parser_element)))) - max_fatal = fatals[0] - raise max_fatal - - if maxException is not None: - # infer from this check that all alternatives failed at the current position - # so emit this collective error message instead of any single error message - if maxExcLoc == loc: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException( - instring, loc, "no defined alternatives to match", self - ) - - def __ixor__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # Or([self, other]) - - def _generateDefaultName(self) -> str: - return "{" + " ^ ".join(str(e) for e in self.exprs) + "}" - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_multiple_tokens_in_named_alternation - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in self.suppress_warnings_ - ): - if any( - isinstance(e, And) - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in e.suppress_warnings_ - for e in self.exprs - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "will return a list of all parsed tokens in an And alternative, " - "in prior versions only the first token was returned; enclose " - "contained argument in Group".format( - "warn_multiple_tokens_in_named_alternation", - name, - type(self).__name__, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - -class MatchFirst(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - more than one expression matches, the first one listed is the one that will - match. May be constructed using the ``'|'`` operator. - - Example:: - - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.search_string("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.search_string("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False): - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = all(e.skipWhitespace for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self) -> ParserElement: - if self.streamlined: - return self - - super().streamline() - if self.exprs: - self.saveAsList = any(e.saveAsList for e in self.exprs) - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = all( - e.skipWhitespace and not isinstance(e, White) for e in self.exprs - ) - else: - self.saveAsList = False - self.mayReturnEmpty = True - return self - - def parseImpl(self, instring, loc, doActions=True): - maxExcLoc = -1 - maxException = None - - for e in self.exprs: - try: - return e._parse( - instring, - loc, - doActions, - ) - except ParseFatalException as pfe: - pfe.__traceback__ = None - pfe.parser_element = e - raise - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException( - instring, len(instring), e.errmsg, self - ) - maxExcLoc = len(instring) - - if maxException is not None: - # infer from this check that all alternatives failed at the current position - # so emit this collective error message instead of any individual error message - if maxExcLoc == loc: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException( - instring, loc, "no defined alternatives to match", self - ) - - def __ior__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # MatchFirst([self, other]) - - def _generateDefaultName(self) -> str: - return "{" + " | ".join(str(e) for e in self.exprs) + "}" - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_multiple_tokens_in_named_alternation - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in self.suppress_warnings_ - ): - if any( - isinstance(e, And) - and Diagnostics.warn_multiple_tokens_in_named_alternation - not in e.suppress_warnings_ - for e in self.exprs - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "will return a list of all parsed tokens in an And alternative, " - "in prior versions only the first token was returned; enclose " - "contained argument in Group".format( - "warn_multiple_tokens_in_named_alternation", - name, - type(self).__name__, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - -class Each(ParseExpression): - """Requires all given :class:`ParseExpression` s to be found, but in - any order. Expressions may be separated by whitespace. - - May be constructed using the ``'&'`` operator. - - Example:: - - color = one_of("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = one_of("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Opt(color_attr) & Opt(size_attr) - - shape_spec.run_tests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - - prints:: - - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - - def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = True): - super().__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - self.skipWhitespace = True - self.initExprGroups = True - self.saveAsList = True - - def __iand__(self, other): - if isinstance(other, str_type): - other = self._literalStringClass(other) - if not isinstance(other, ParserElement): - return NotImplemented - return self.append(other) # Each([self, other]) - - def streamline(self) -> ParserElement: - super().streamline() - if self.exprs: - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - return self - - def parseImpl(self, instring, loc, doActions=True): - if self.initExprGroups: - self.opt1map = dict( - (id(e.expr), e) for e in self.exprs if isinstance(e, Opt) - ) - opt1 = [e.expr for e in self.exprs if isinstance(e, Opt)] - opt2 = [ - e - for e in self.exprs - if e.mayReturnEmpty and not isinstance(e, (Opt, Regex, ZeroOrMore)) - ] - self.optionals = opt1 + opt2 - self.multioptionals = [ - e.expr.set_results_name(e.resultsName, list_all_matches=True) - for e in self.exprs - if isinstance(e, _MultipleMatch) - ] - self.multirequired = [ - e.expr.set_results_name(e.resultsName, list_all_matches=True) - for e in self.exprs - if isinstance(e, OneOrMore) - ] - self.required = [ - e for e in self.exprs if not isinstance(e, (Opt, ZeroOrMore, OneOrMore)) - ] - self.required += self.multirequired - self.initExprGroups = False - - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - multis = self.multioptionals[:] - matchOrder = [] - - keepMatching = True - failed = [] - fatals = [] - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + multis - failed.clear() - fatals.clear() - for e in tmpExprs: - try: - tmpLoc = e.try_parse(instring, tmpLoc, raise_fatal=True) - except ParseFatalException as pfe: - pfe.__traceback__ = None - pfe.parser_element = e - fatals.append(pfe) - failed.append(e) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e), e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - # look for any ParseFatalExceptions - if fatals: - if len(fatals) > 1: - fatals.sort(key=lambda e: -e.loc) - if fatals[0].loc == fatals[1].loc: - fatals.sort(key=lambda e: (-e.loc, -len(str(e.parser_element)))) - max_fatal = fatals[0] - raise max_fatal - - if tmpReqd: - missing = ", ".join([str(e) for e in tmpReqd]) - raise ParseException( - instring, - loc, - f"Missing one or more required elements ({missing})", - ) - - # add any unmatched Opts, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e, Opt) and e.expr in tmpOpt] - - total_results = ParseResults([]) - for e in matchOrder: - loc, results = e._parse(instring, loc, doActions) - total_results += results - - return loc, total_results - - def _generateDefaultName(self) -> str: - return "{" + " & ".join(str(e) for e in self.exprs) + "}" - - -class ParseElementEnhance(ParserElement): - """Abstract subclass of :class:`ParserElement`, for combining and - post-processing parsed tokens. - """ - - def __init__(self, expr: Union[ParserElement, str], savelist: bool = False): - super().__init__(savelist) - if isinstance(expr, str_type): - expr_str = typing.cast(str, expr) - if issubclass(self._literalStringClass, Token): - expr = self._literalStringClass(expr_str) # type: ignore[call-arg] - elif issubclass(type(self), self._literalStringClass): - expr = Literal(expr_str) - else: - expr = self._literalStringClass(Literal(expr_str)) # type: ignore[assignment, call-arg] - expr = typing.cast(ParserElement, expr) - self.expr = expr - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.set_whitespace_chars( - expr.whiteChars, copy_defaults=expr.copyDefaultWhiteChars - ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def recurse(self) -> List[ParserElement]: - return [self.expr] if self.expr is not None else [] - - def parseImpl(self, instring, loc, doActions=True): - if self.expr is not None: - try: - return self.expr._parse(instring, loc, doActions, callPreParse=False) - except ParseBaseException as pbe: - pbe.msg = self.errmsg - raise - else: - raise ParseException(instring, loc, "No expression defined", self) - - def leave_whitespace(self, recursive: bool = True) -> ParserElement: - super().leave_whitespace(recursive) - - if recursive: - if self.expr is not None: - self.expr = self.expr.copy() - self.expr.leave_whitespace(recursive) - return self - - def ignore_whitespace(self, recursive: bool = True) -> ParserElement: - super().ignore_whitespace(recursive) - - if recursive: - if self.expr is not None: - self.expr = self.expr.copy() - self.expr.ignore_whitespace(recursive) - return self - - def ignore(self, other) -> ParserElement: - if isinstance(other, Suppress): - if other not in self.ignoreExprs: - super().ignore(other) - if self.expr is not None: - self.expr.ignore(self.ignoreExprs[-1]) - else: - super().ignore(other) - if self.expr is not None: - self.expr.ignore(self.ignoreExprs[-1]) - return self - - def streamline(self) -> ParserElement: - super().streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def _checkRecursion(self, parseElementList): - if self in parseElementList: - raise RecursiveGrammarException(parseElementList + [self]) - subRecCheckList = parseElementList[:] + [self] - if self.expr is not None: - self.expr._checkRecursion(subRecCheckList) - - def validate(self, validateTrace=None) -> None: - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - if validateTrace is None: - validateTrace = [] - tmp = validateTrace[:] + [self] - if self.expr is not None: - self.expr.validate(tmp) - self._checkRecursion([]) - - def _generateDefaultName(self) -> str: - return f"{self.__class__.__name__}:({str(self.expr)})" - - # Compatibility synonyms - # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - # fmt: on - - -class IndentedBlock(ParseElementEnhance): - """ - Expression to match one or more expressions at a given indentation level. - Useful for parsing text where structure is implied by indentation (like Python source code). - """ - - class _Indent(Empty): - def __init__(self, ref_col: int): - super().__init__() - self.errmsg = f"expected indent at column {ref_col}" - self.add_condition(lambda s, l, t: col(l, s) == ref_col) - - class _IndentGreater(Empty): - def __init__(self, ref_col: int): - super().__init__() - self.errmsg = f"expected indent at column greater than {ref_col}" - self.add_condition(lambda s, l, t: col(l, s) > ref_col) - - def __init__( - self, expr: ParserElement, *, recursive: bool = False, grouped: bool = True - ): - super().__init__(expr, savelist=True) - # if recursive: - # raise NotImplementedError("IndentedBlock with recursive is not implemented") - self._recursive = recursive - self._grouped = grouped - self.parent_anchor = 1 - - def parseImpl(self, instring, loc, doActions=True): - # advance parse position to non-whitespace by using an Empty() - # this should be the column to be used for all subsequent indented lines - anchor_loc = Empty().preParse(instring, loc) - - # see if self.expr matches at the current location - if not it will raise an exception - # and no further work is necessary - self.expr.try_parse(instring, anchor_loc, do_actions=doActions) - - indent_col = col(anchor_loc, instring) - peer_detect_expr = self._Indent(indent_col) - - inner_expr = Empty() + peer_detect_expr + self.expr - if self._recursive: - sub_indent = self._IndentGreater(indent_col) - nested_block = IndentedBlock( - self.expr, recursive=self._recursive, grouped=self._grouped - ) - nested_block.set_debug(self.debug) - nested_block.parent_anchor = indent_col - inner_expr += Opt(sub_indent + nested_block) - - inner_expr.set_name(f"inner {hex(id(inner_expr))[-4:].upper()}@{indent_col}") - block = OneOrMore(inner_expr) - - trailing_undent = self._Indent(self.parent_anchor) | StringEnd() - - if self._grouped: - wrapper = Group - else: - wrapper = lambda expr: expr - return (wrapper(block) + Optional(trailing_undent)).parseImpl( - instring, anchor_loc, doActions - ) - - -class AtStringStart(ParseElementEnhance): - """Matches if expression matches at the beginning of the parse - string:: - - AtStringStart(Word(nums)).parse_string("123") - # prints ["123"] - - AtStringStart(Word(nums)).parse_string(" 123") - # raises ParseException - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - self.callPreparse = False - - def parseImpl(self, instring, loc, doActions=True): - if loc != 0: - raise ParseException(instring, loc, "not found at string start") - return super().parseImpl(instring, loc, doActions) - - -class AtLineStart(ParseElementEnhance): - r"""Matches if an expression matches at the beginning of a line within - the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (AtLineStart('AAA') + rest_of_line).search_string(test): - print(t) - - prints:: - - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - self.callPreparse = False - - def parseImpl(self, instring, loc, doActions=True): - if col(loc, instring) != 1: - raise ParseException(instring, loc, "not found at line start") - return super().parseImpl(instring, loc, doActions) - - -class FollowedBy(ParseElementEnhance): - """Lookahead matching of the given parse expression. - ``FollowedBy`` does *not* advance the parsing position within - the input string, it only verifies that the specified parse - expression matches at the current position. ``FollowedBy`` - always returns a null token list. If any results names are defined - in the lookahead expression, those *will* be returned for access by - name. - - Example:: - - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - - attr_expr[1, ...].parse_string("shape: SQUARE color: BLACK posn: upper left").pprint() - - prints:: - - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - self.mayReturnEmpty = True - - def parseImpl(self, instring, loc, doActions=True): - # by using self._expr.parse and deleting the contents of the returned ParseResults list - # we keep any named results that were defined in the FollowedBy expression - _, ret = self.expr._parse(instring, loc, doActions=doActions) - del ret[:] - - return loc, ret - - -class PrecededBy(ParseElementEnhance): - """Lookbehind matching of the given parse expression. - ``PrecededBy`` does not advance the parsing position within the - input string, it only verifies that the specified parse expression - matches prior to the current position. ``PrecededBy`` always - returns a null token list, but if a results name is defined on the - given expression, it is returned. - - Parameters: - - - ``expr`` - expression that must match prior to the current parse - location - - ``retreat`` - (default= ``None``) - (int) maximum number of characters - to lookbehind prior to the current parse location - - If the lookbehind expression is a string, :class:`Literal`, - :class:`Keyword`, or a :class:`Word` or :class:`CharsNotIn` - with a specified exact or maximum length, then the retreat - parameter is not required. Otherwise, retreat must be specified to - give a maximum number of characters to look back from - the current parse position for a lookbehind match. - - Example:: - - # VB-style variable names with type prefixes - int_var = PrecededBy("#") + pyparsing_common.identifier - str_var = PrecededBy("$") + pyparsing_common.identifier - - """ - - def __init__( - self, expr: Union[ParserElement, str], retreat: typing.Optional[int] = None - ): - super().__init__(expr) - self.expr = self.expr().leave_whitespace() - self.mayReturnEmpty = True - self.mayIndexError = False - self.exact = False - if isinstance(expr, str_type): - expr = typing.cast(str, expr) - retreat = len(expr) - self.exact = True - elif isinstance(expr, (Literal, Keyword)): - retreat = expr.matchLen - self.exact = True - elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: - retreat = expr.maxLen - self.exact = True - elif isinstance(expr, PositionToken): - retreat = 0 - self.exact = True - self.retreat = retreat - self.errmsg = "not preceded by " + str(expr) - self.skipWhitespace = False - self.parseAction.append(lambda s, l, t: t.__delitem__(slice(None, None))) - - def parseImpl(self, instring, loc=0, doActions=True): - if self.exact: - if loc < self.retreat: - raise ParseException(instring, loc, self.errmsg) - start = loc - self.retreat - _, ret = self.expr._parse(instring, start) - else: - # retreat specified a maximum lookbehind window, iterate - test_expr = self.expr + StringEnd() - instring_slice = instring[max(0, loc - self.retreat) : loc] - last_expr = ParseException(instring, loc, self.errmsg) - for offset in range(1, min(loc, self.retreat + 1) + 1): - try: - # print('trying', offset, instring_slice, repr(instring_slice[loc - offset:])) - _, ret = test_expr._parse( - instring_slice, len(instring_slice) - offset - ) - except ParseBaseException as pbe: - last_expr = pbe - else: - break - else: - raise last_expr - return loc, ret - - -class Located(ParseElementEnhance): - """ - Decorates a returned token with its starting and ending - locations in the input string. - - This helper adds the following results names: - - - ``locn_start`` - location where matched expression begins - - ``locn_end`` - location where matched expression ends - - ``value`` - the actual parsed results - - Be careful if the input text contains ```` characters, you - may want to call :class:`ParserElement.parse_with_tabs` - - Example:: - - wd = Word(alphas) - for match in Located(wd).search_string("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [0, ['ljsdf'], 5] - [8, ['lksdjjf'], 15] - [18, ['lkkjj'], 23] - - """ - - def parseImpl(self, instring, loc, doActions=True): - start = loc - loc, tokens = self.expr._parse(instring, start, doActions, callPreParse=False) - ret_tokens = ParseResults([start, tokens, loc]) - ret_tokens["locn_start"] = start - ret_tokens["value"] = tokens - ret_tokens["locn_end"] = loc - if self.resultsName: - # must return as a list, so that the name will be attached to the complete group - return loc, [ret_tokens] - else: - return loc, ret_tokens - - -class NotAny(ParseElementEnhance): - """ - Lookahead to disallow matching with the given parse expression. - ``NotAny`` does *not* advance the parsing position within the - input string, it only verifies that the specified parse expression - does *not* match at the current position. Also, ``NotAny`` does - *not* skip over leading whitespace. ``NotAny`` always returns - a null token list. May be constructed using the ``'~'`` operator. - - Example:: - - AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) - - # take care not to mistake keywords for identifiers - ident = ~(AND | OR | NOT) + Word(alphas) - boolean_term = Opt(NOT) + ident - - # very crude boolean expression - to support parenthesis groups and - # operation hierarchy, use infix_notation - boolean_expr = boolean_term + ((AND | OR) + boolean_term)[...] - - # integers that are followed by "." are actually floats - integer = Word(nums) + ~Char(".") - """ - - def __init__(self, expr: Union[ParserElement, str]): - super().__init__(expr) - # do NOT use self.leave_whitespace(), don't want to propagate to exprs - # self.leave_whitespace() - self.skipWhitespace = False - - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, " + str(self.expr) - - def parseImpl(self, instring, loc, doActions=True): - if self.expr.can_parse_next(instring, loc, do_actions=doActions): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def _generateDefaultName(self) -> str: - return "~{" + str(self.expr) + "}" - - -class _MultipleMatch(ParseElementEnhance): - def __init__( - self, - expr: Union[str, ParserElement], - stop_on: typing.Optional[Union[ParserElement, str]] = None, - *, - stopOn: typing.Optional[Union[ParserElement, str]] = None, - ): - super().__init__(expr) - stopOn = stopOn or stop_on - self.saveAsList = True - ender = stopOn - if isinstance(ender, str_type): - ender = self._literalStringClass(ender) - self.stopOn(ender) - - def stopOn(self, ender) -> ParserElement: - if isinstance(ender, str_type): - ender = self._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - return self - - def parseImpl(self, instring, loc, doActions=True): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.try_parse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse(instring, loc, doActions) - try: - hasIgnoreExprs = not not self.ignoreExprs - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables(instring, loc) - else: - preloc = loc - loc, tmptokens = self_expr_parse(instring, preloc, doActions) - tokens += tmptokens - except (ParseException, IndexError): - pass - - return loc, tokens - - def _setResultsName(self, name, listAllMatches=False): - if ( - __diag__.warn_ungrouped_named_tokens_in_collection - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in self.suppress_warnings_ - ): - for e in [self.expr] + self.expr.recurse(): - if ( - isinstance(e, ParserElement) - and e.resultsName - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in e.suppress_warnings_ - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "collides with {!r} on contained expression".format( - "warn_ungrouped_named_tokens_in_collection", - name, - type(self).__name__, - e.resultsName, - ), - stacklevel=3, - ) - - return super()._setResultsName(name, listAllMatches) - - -class OneOrMore(_MultipleMatch): - """ - Repetition of one or more of the given expression. - - Parameters: - - - ``expr`` - expression that must match one or more times - - ``stop_on`` - (default= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).set_parse_action(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - attr_expr[1, ...].parse_string(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stop_on attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - OneOrMore(attr_expr).parse_string(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parse_string(text).pprint() - """ - - def _generateDefaultName(self) -> str: - return "{" + str(self.expr) + "}..." - - -class ZeroOrMore(_MultipleMatch): - """ - Optional repetition of zero or more of the given expression. - - Parameters: - - - ``expr`` - expression that must match zero or more times - - ``stop_on`` - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - (default= ``None``) - - Example: similar to :class:`OneOrMore` - """ - - def __init__( - self, - expr: Union[str, ParserElement], - stop_on: typing.Optional[Union[ParserElement, str]] = None, - *, - stopOn: typing.Optional[Union[ParserElement, str]] = None, - ): - super().__init__(expr, stopOn=stopOn or stop_on) - self.mayReturnEmpty = True - - def parseImpl(self, instring, loc, doActions=True): - try: - return super().parseImpl(instring, loc, doActions) - except (ParseException, IndexError): - return loc, ParseResults([], name=self.resultsName) - - def _generateDefaultName(self) -> str: - return "[" + str(self.expr) + "]..." - - -class DelimitedList(ParseElementEnhance): - def __init__( - self, - expr: Union[str, ParserElement], - delim: Union[str, ParserElement] = ",", - combine: bool = False, - min: typing.Optional[int] = None, - max: typing.Optional[int] = None, - *, - allow_trailing_delim: bool = False, - ): - """Helper to define a delimited list of expressions - the delimiter - defaults to ','. By default, the list elements and delimiters can - have intervening whitespace, and comments, but this can be - overridden by passing ``combine=True`` in the constructor. If - ``combine`` is set to ``True``, the matching tokens are - returned as a single token string, with the delimiters included; - otherwise, the matching tokens are returned as a list of tokens, - with the delimiters suppressed. - - If ``allow_trailing_delim`` is set to True, then the list may end with - a delimiter. - - Example:: - - DelimitedList(Word(alphas)).parse_string("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - DelimitedList(Word(hexnums), delim=':', combine=True).parse_string("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - if isinstance(expr, str_type): - expr = ParserElement._literalStringClass(expr) - expr = typing.cast(ParserElement, expr) - - if min is not None: - if min < 1: - raise ValueError("min must be greater than 0") - if max is not None: - if min is not None and max < min: - raise ValueError("max must be greater than, or equal to min") - - self.content = expr - self.raw_delim = str(delim) - self.delim = delim - self.combine = combine - if not combine: - self.delim = Suppress(delim) - self.min = min or 1 - self.max = max - self.allow_trailing_delim = allow_trailing_delim - - delim_list_expr = self.content + (self.delim + self.content) * ( - self.min - 1, - None if self.max is None else self.max - 1, - ) - if self.allow_trailing_delim: - delim_list_expr += Opt(self.delim) - - if self.combine: - delim_list_expr = Combine(delim_list_expr) - - super().__init__(delim_list_expr, savelist=True) - - def _generateDefaultName(self) -> str: - return "{0} [{1} {0}]...".format(self.content.streamline(), self.raw_delim) - - -class _NullToken: - def __bool__(self): - return False - - def __str__(self): - return "" - - -class Opt(ParseElementEnhance): - """ - Optional matching of the given expression. - - Parameters: - - - ``expr`` - expression that must match zero or more times - - ``default`` (optional) - value to be returned if the optional expression is not found. - - Example:: - - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Opt('-' + Word(nums, exact=4))) - zip.run_tests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - - prints:: - - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - - __optionalNotMatched = _NullToken() - - def __init__( - self, expr: Union[ParserElement, str], default: Any = __optionalNotMatched - ): - super().__init__(expr, savelist=False) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl(self, instring, loc, doActions=True): - self_expr = self.expr - try: - loc, tokens = self_expr._parse(instring, loc, doActions, callPreParse=False) - except (ParseException, IndexError): - default_value = self.defaultValue - if default_value is not self.__optionalNotMatched: - if self_expr.resultsName: - tokens = ParseResults([default_value]) - tokens[self_expr.resultsName] = default_value - else: - tokens = [default_value] - else: - tokens = [] - return loc, tokens - - def _generateDefaultName(self) -> str: - inner = str(self.expr) - # strip off redundant inner {}'s - while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}": - inner = inner[1:-1] - return "[" + inner + "]" - - -Optional = Opt - - -class SkipTo(ParseElementEnhance): - """ - Token for skipping over all undefined text until the matched - expression is found. - - Parameters: - - - ``expr`` - target expression marking the end of the data to be skipped - - ``include`` - if ``True``, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element - list) (default= ``False``). - - ``ignore`` - (default= ``None``) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - ``fail_on`` - (default= ``None``) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the :class:`SkipTo` is not a match - - Example:: - - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quoted_string) - string_data.set_parse_action(token_map(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.search_string(report): - print tkt.dump() - - prints:: - - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: '6' - - desc: 'Intermittent system crash' - - issue_num: '101' - - sev: 'Critical' - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: '14' - - desc: "Spelling error on Login ('log|n')" - - issue_num: '94' - - sev: 'Cosmetic' - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: '47' - - desc: 'System slow when running too many reports' - - issue_num: '79' - - sev: 'Minor' - """ - - def __init__( - self, - other: Union[ParserElement, str], - include: bool = False, - ignore: typing.Optional[Union[ParserElement, str]] = None, - fail_on: typing.Optional[Union[ParserElement, str]] = None, - *, - failOn: typing.Optional[Union[ParserElement, str]] = None, - ): - super().__init__(other) - failOn = failOn or fail_on - if ignore is not None: - self.ignore(ignore) - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.saveAsList = False - if isinstance(failOn, str_type): - self.failOn = self._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for " + str(self.expr) - - def parseImpl(self, instring, loc, doActions=True): - startloc = loc - instrlen = len(instring) - self_expr_parse = self.expr._parse - self_failOn_canParseNext = ( - self.failOn.canParseNext if self.failOn is not None else None - ) - self_preParse = self.preParse if self.callPreparse else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_preParse is not None: - # skip grammar-ignored expressions - tmploc = self_preParse(instring, tmploc) - - try: - self_expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = self_expr_parse(instring, loc, doActions, callPreParse=False) - skipresult += mat - - return loc, skipresult - - -class Forward(ParseElementEnhance): - """ - Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the ``Forward`` - variable using the ``'<<'`` operator. - - Note: take care when assigning to ``Forward`` not to overlook - precedence of operators. - - Specifically, ``'|'`` has a lower precedence than ``'<<'``, so that:: - - fwd_expr << a | b | c - - will actually be evaluated as:: - - (fwd_expr << a) | b | c - - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the ``Forward``:: - - fwd_expr << (a | b | c) - - Converting to use the ``'<<='`` operator instead will avoid this problem. - - See :class:`ParseResults.pprint` for an example of a recursive - parser created using ``Forward``. - """ - - def __init__(self, other: typing.Optional[Union[ParserElement, str]] = None): - self.caller_frame = traceback.extract_stack(limit=2)[0] - super().__init__(other, savelist=False) # type: ignore[arg-type] - self.lshift_line = None - - def __lshift__(self, other) -> "Forward": - if hasattr(self, "caller_frame"): - del self.caller_frame - if isinstance(other, str_type): - other = self._literalStringClass(other) - - if not isinstance(other, ParserElement): - return NotImplemented - - self.expr = other - self.streamlined = other.streamlined - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.set_whitespace_chars( - self.expr.whiteChars, copy_defaults=self.expr.copyDefaultWhiteChars - ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - self.lshift_line = traceback.extract_stack(limit=2)[-2] # type: ignore[assignment] - return self - - def __ilshift__(self, other) -> "Forward": - if not isinstance(other, ParserElement): - return NotImplemented - - return self << other - - def __or__(self, other) -> "ParserElement": - caller_line = traceback.extract_stack(limit=2)[-2] - if ( - __diag__.warn_on_match_first_with_lshift_operator - and caller_line == self.lshift_line - and Diagnostics.warn_on_match_first_with_lshift_operator - not in self.suppress_warnings_ - ): - warnings.warn( - "using '<<' operator with '|' is probably an error, use '<<='", - stacklevel=2, - ) - ret = super().__or__(other) - return ret - - def __del__(self): - # see if we are getting dropped because of '=' reassignment of var instead of '<<=' or '<<' - if ( - self.expr is None - and __diag__.warn_on_assignment_to_Forward - and Diagnostics.warn_on_assignment_to_Forward not in self.suppress_warnings_ - ): - warnings.warn_explicit( - "Forward defined here but no expression attached later using '<<=' or '<<'", - UserWarning, - filename=self.caller_frame.filename, - lineno=self.caller_frame.lineno, - ) - - def parseImpl(self, instring, loc, doActions=True): - if ( - self.expr is None - and __diag__.warn_on_parse_using_empty_Forward - and Diagnostics.warn_on_parse_using_empty_Forward - not in self.suppress_warnings_ - ): - # walk stack until parse_string, scan_string, search_string, or transform_string is found - parse_fns = ( - "parse_string", - "scan_string", - "search_string", - "transform_string", - ) - tb = traceback.extract_stack(limit=200) - for i, frm in enumerate(reversed(tb), start=1): - if frm.name in parse_fns: - stacklevel = i + 1 - break - else: - stacklevel = 2 - warnings.warn( - "Forward expression was never assigned a value, will not parse any input", - stacklevel=stacklevel, - ) - if not ParserElement._left_recursion_enabled: - return super().parseImpl(instring, loc, doActions) - # ## Bounded Recursion algorithm ## - # Recursion only needs to be processed at ``Forward`` elements, since they are - # the only ones that can actually refer to themselves. The general idea is - # to handle recursion stepwise: We start at no recursion, then recurse once, - # recurse twice, ..., until more recursion offers no benefit (we hit the bound). - # - # The "trick" here is that each ``Forward`` gets evaluated in two contexts - # - to *match* a specific recursion level, and - # - to *search* the bounded recursion level - # and the two run concurrently. The *search* must *match* each recursion level - # to find the best possible match. This is handled by a memo table, which - # provides the previous match to the next level match attempt. - # - # See also "Left Recursion in Parsing Expression Grammars", Medeiros et al. - # - # There is a complication since we not only *parse* but also *transform* via - # actions: We do not want to run the actions too often while expanding. Thus, - # we expand using `doActions=False` and only run `doActions=True` if the next - # recursion level is acceptable. - with ParserElement.recursion_lock: - memo = ParserElement.recursion_memos - try: - # we are parsing at a specific recursion expansion - use it as-is - prev_loc, prev_result = memo[loc, self, doActions] - if isinstance(prev_result, Exception): - raise prev_result - return prev_loc, prev_result.copy() - except KeyError: - act_key = (loc, self, True) - peek_key = (loc, self, False) - # we are searching for the best recursion expansion - keep on improving - # both `doActions` cases must be tracked separately here! - prev_loc, prev_peek = memo[peek_key] = ( - loc - 1, - ParseException( - instring, loc, "Forward recursion without base case", self - ), - ) - if doActions: - memo[act_key] = memo[peek_key] - while True: - try: - new_loc, new_peek = super().parseImpl(instring, loc, False) - except ParseException: - # we failed before getting any match – do not hide the error - if isinstance(prev_peek, Exception): - raise - new_loc, new_peek = prev_loc, prev_peek - # the match did not get better: we are done - if new_loc <= prev_loc: - if doActions: - # replace the match for doActions=False as well, - # in case the action did backtrack - prev_loc, prev_result = memo[peek_key] = memo[act_key] - del memo[peek_key], memo[act_key] - return prev_loc, prev_result.copy() - del memo[peek_key] - return prev_loc, prev_peek.copy() - # the match did get better: see if we can improve further - else: - if doActions: - try: - memo[act_key] = super().parseImpl(instring, loc, True) - except ParseException as e: - memo[peek_key] = memo[act_key] = (new_loc, e) - raise - prev_loc, prev_peek = memo[peek_key] = new_loc, new_peek - - def leave_whitespace(self, recursive: bool = True) -> ParserElement: - self.skipWhitespace = False - return self - - def ignore_whitespace(self, recursive: bool = True) -> ParserElement: - self.skipWhitespace = True - return self - - def streamline(self) -> ParserElement: - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate(self, validateTrace=None) -> None: - warnings.warn( - "ParserElement.validate() is deprecated, and should not be used to check for left recursion", - DeprecationWarning, - stacklevel=2, - ) - if validateTrace is None: - validateTrace = [] - - if self not in validateTrace: - tmp = validateTrace[:] + [self] - if self.expr is not None: - self.expr.validate(tmp) - self._checkRecursion([]) - - def _generateDefaultName(self) -> str: - # Avoid infinite recursion by setting a temporary _defaultName - self._defaultName = ": ..." - - # Use the string representation of main expression. - retString = "..." - try: - if self.expr is not None: - retString = str(self.expr)[:1000] - else: - retString = "None" - finally: - return self.__class__.__name__ + ": " + retString - - def copy(self) -> ParserElement: - if self.expr is not None: - return super().copy() - else: - ret = Forward() - ret <<= self - return ret - - def _setResultsName(self, name, list_all_matches=False): - if ( - __diag__.warn_name_set_on_empty_Forward - and Diagnostics.warn_name_set_on_empty_Forward - not in self.suppress_warnings_ - ): - if self.expr is None: - warnings.warn( - "{}: setting results name {!r} on {} expression " - "that has no contained expression".format( - "warn_name_set_on_empty_Forward", name, type(self).__name__ - ), - stacklevel=3, - ) - - return super()._setResultsName(name, list_all_matches) - - # Compatibility synonyms - # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - # fmt: on - - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of :class:`ParseExpression`, for converting parsed results. - """ - - def __init__(self, expr: Union[ParserElement, str], savelist=False): - super().__init__(expr) # , savelist) - self.saveAsList = False - - -class Combine(TokenConverter): - """Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the - input string; this can be disabled by specifying - ``'adjacent=False'`` in the constructor. - - Example:: - - real = Word(nums) + '.' + Word(nums) - print(real.parse_string('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parse_string('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parse_string('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parse_string('3. 1416')) # -> Exception: Expected W:(0123...) - """ - - def __init__( - self, - expr: ParserElement, - join_string: str = "", - adjacent: bool = True, - *, - joinString: typing.Optional[str] = None, - ): - super().__init__(expr) - joinString = joinString if joinString is not None else join_string - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leave_whitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore(self, other) -> ParserElement: - if self.adjacent: - ParserElement.ignore(self, other) - else: - super().ignore(other) - return self - - def postParse(self, instring, loc, tokenlist): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults( - ["".join(tokenlist._asStringList(self.joinString))], modal=self.modalResults - ) - - if self.resultsName and retToks.haskeys(): - return [retToks] - else: - return retToks - - -class Group(TokenConverter): - """Converter to return the matched tokens as a list - useful for - returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. - - The optional ``aslist`` argument when set to True will return the - parsed tokens as a Python list instead of a pyparsing ParseResults. - - Example:: - - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Opt(DelimitedList(term)) - print(func.parse_string("fn a, b, 100")) - # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Opt(DelimitedList(term))) - print(func.parse_string("fn a, b, 100")) - # -> ['fn', ['a', 'b', '100']] - """ - - def __init__(self, expr: ParserElement, aslist: bool = False): - super().__init__(expr) - self.saveAsList = True - self._asPythonList = aslist - - def postParse(self, instring, loc, tokenlist): - if self._asPythonList: - return ParseResults.List( - tokenlist.asList() - if isinstance(tokenlist, ParseResults) - else list(tokenlist) - ) - else: - return [tokenlist] - - -class Dict(TokenConverter): - """Converter to return a repetitive expression as a list, but also - as a dictionary. Each element can also be referenced using the first - token in the expression as its key. Useful for tabular report - scraping when the first column can be used as a item key. - - The optional ``asdict`` argument when set to True will return the - parsed tokens as a Python dict instead of a pyparsing ParseResults. - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - - # print attributes as plain groups - print(attr_expr[1, ...].parse_string(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(Group(expr)[1, ...]) - Dict will auto-assign names - result = Dict(Group(attr_expr)[1, ...]).parse_string(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.as_dict()) - - prints:: - - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: 'light blue' - - posn: 'upper left' - - shape: 'SQUARE' - - texture: 'burlap' - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - - See more examples at :class:`ParseResults` of accessing fields by results name. - """ - - def __init__(self, expr: ParserElement, asdict: bool = False): - super().__init__(expr) - self.saveAsList = True - self._asPythonDict = asdict - - def postParse(self, instring, loc, tokenlist): - for i, tok in enumerate(tokenlist): - if len(tok) == 0: - continue - - ikey = tok[0] - if isinstance(ikey, int): - ikey = str(ikey).strip() - - if len(tok) == 1: - tokenlist[ikey] = _ParseResultsWithOffset("", i) - - elif len(tok) == 2 and not isinstance(tok[1], ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1], i) - - else: - try: - dictvalue = tok.copy() # ParseResults(i) - except Exception: - exc = TypeError( - "could not extract dict values from parsed results" - " - Dict expression must contain Grouped expressions" - ) - raise exc from None - - del dictvalue[0] - - if len(dictvalue) != 1 or ( - isinstance(dictvalue, ParseResults) and dictvalue.haskeys() - ): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue, i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0], i) - - if self._asPythonDict: - return [tokenlist.as_dict()] if self.resultsName else tokenlist.as_dict() - else: - return [tokenlist] if self.resultsName else tokenlist - - -class Suppress(TokenConverter): - """Converter for ignoring the results of a parsed expression. - - Example:: - - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + (',' + wd)[...] - print(wd_list1.parse_string(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + (Suppress(',') + wd)[...] - print(wd_list2.parse_string(source)) - - # Skipped text (using '...') can be suppressed as well - source = "lead in START relevant text END trailing text" - start_marker = Keyword("START") - end_marker = Keyword("END") - find_body = Suppress(...) + start_marker + ... + end_marker - print(find_body.parse_string(source) - - prints:: - - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - ['START', 'relevant text ', 'END'] - - (See also :class:`DelimitedList`.) - """ - - def __init__(self, expr: Union[ParserElement, str], savelist: bool = False): - if expr is ...: - expr = _PendingSkip(NoMatch()) - super().__init__(expr) - - def __add__(self, other) -> "ParserElement": - if isinstance(self.expr, _PendingSkip): - return Suppress(SkipTo(other)) + other - else: - return super().__add__(other) - - def __sub__(self, other) -> "ParserElement": - if isinstance(self.expr, _PendingSkip): - return Suppress(SkipTo(other)) - other - else: - return super().__sub__(other) - - def postParse(self, instring, loc, tokenlist): - return [] - - def suppress(self) -> ParserElement: - return self - - -def trace_parse_action(f: ParseAction) -> ParseAction: - """Decorator for debugging parse actions. - - When the parse action is called, this decorator will print - ``">> entering method-name(line:, , )"``. - When the parse action completes, the decorator will print - ``"<<"`` followed by the returned value, or any exception that the parse action raised. - - Example:: - - wd = Word(alphas) - - @trace_parse_action - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = wd[1, ...].set_parse_action(remove_duplicate_chars) - print(wds.parse_string("slkdjs sld sldd sdlf sdljf")) - - prints:: - - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - < 3: - thisFunc = paArgs[0].__class__.__name__ + "." + thisFunc - sys.stderr.write(f">>entering {thisFunc}(line: {line(l, s)!r}, {l}, {t!r})\n") - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write(f"< str: - r"""Helper to easily define string ranges for use in :class:`Word` - construction. Borrows syntax from regexp ``'[]'`` string range - definitions:: - - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - - The input string must be enclosed in []'s, and the returned string - is the expanded character set joined into a single string. The - values enclosed in the []'s may be: - - - a single character - - an escaped character with a leading backslash (such as ``\-`` - or ``\]``) - - an escaped hex character with a leading ``'\x'`` - (``\x21``, which is a ``'!'`` character) (``\0x##`` - is also supported for backwards compatibility) - - an escaped octal character with a leading ``'\0'`` - (``\041``, which is a ``'!'`` character) - - a range of any of the above, separated by a dash (``'a-z'``, - etc.) - - any combination of the above (``'aeiouy'``, - ``'a-zA-Z0-9_$'``, etc.) - """ - _expanded = ( - lambda p: p - if not isinstance(p, ParseResults) - else "".join(chr(c) for c in range(ord(p[0]), ord(p[1]) + 1)) - ) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parse_string(s).body) - except Exception as e: - return "" - - -def token_map(func, *args) -> ParseAction: - """Helper to define a parse action by mapping a function to all - elements of a :class:`ParseResults` list. If any additional args are passed, - they are forwarded to the given function as additional arguments - after the token, as in - ``hex_integer = Word(hexnums).set_parse_action(token_map(int, 16))``, - which will convert the parsed data to an integer using base 16. - - Example (compare the last to example in :class:`ParserElement.transform_string`:: - - hex_ints = Word(hexnums)[1, ...].set_parse_action(token_map(int, 16)) - hex_ints.run_tests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).set_parse_action(token_map(str.upper)) - upperword[1, ...].run_tests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).set_parse_action(token_map(str.title)) - wd[1, ...].set_parse_action(' '.join).run_tests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - - prints:: - - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - - def pa(s, l, t): - return [func(tokn, *args) for tokn in t] - - func_name = getattr(func, "__name__", getattr(func, "__class__").__name__) - pa.__name__ = func_name - - return pa - - -def autoname_elements() -> None: - """ - Utility to simplify mass-naming of parser elements, for - generating railroad diagram with named subdiagrams. - """ - calling_frame = sys._getframe().f_back - if calling_frame is None: - return - calling_frame = typing.cast(types.FrameType, calling_frame) - for name, var in calling_frame.f_locals.items(): - if isinstance(var, ParserElement) and not var.customName: - var.set_name(name) - - -dbl_quoted_string = Combine( - Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"' -).set_name("string enclosed in double quotes") - -sgl_quoted_string = Combine( - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'" -).set_name("string enclosed in single quotes") - -quoted_string = Combine( - (Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"').set_name( - "double quoted string" - ) - | (Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").set_name( - "single quoted string" - ) -).set_name("quoted string using single or double quotes") - -python_quoted_string = Combine( - (Regex(r'"""(?:[^"\\]|""(?!")|"(?!"")|\\.)*', flags=re.MULTILINE) + '"""').set_name( - "multiline double quoted string" - ) - ^ ( - Regex(r"'''(?:[^'\\]|''(?!')|'(?!'')|\\.)*", flags=re.MULTILINE) + "'''" - ).set_name("multiline single quoted string") - ^ (Regex(r'"(?:[^"\n\r\\]|(?:\\")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"').set_name( - "double quoted string" - ) - ^ (Regex(r"'(?:[^'\n\r\\]|(?:\\')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").set_name( - "single quoted string" - ) -).set_name("Python quoted string") - -unicode_string = Combine("u" + quoted_string.copy()).set_name("unicode string literal") - - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -# build list of built-in expressions, for future reference if a global default value -# gets updated -_builtin_exprs: List[ParserElement] = [ - v for v in vars().values() if isinstance(v, ParserElement) -] - -# backward compatibility names -# fmt: off -sglQuotedString = sgl_quoted_string -dblQuotedString = dbl_quoted_string -quotedString = quoted_string -unicodeString = unicode_string -lineStart = line_start -lineEnd = line_end -stringStart = string_start -stringEnd = string_end - -@replaced_by_pep8(null_debug_action) -def nullDebugAction(): ... - -@replaced_by_pep8(trace_parse_action) -def traceParseAction(): ... - -@replaced_by_pep8(condition_as_parse_action) -def conditionAsParseAction(): ... - -@replaced_by_pep8(token_map) -def tokenMap(): ... -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py deleted file mode 100644 index 83f9018e..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py +++ /dev/null @@ -1,656 +0,0 @@ -# mypy: ignore-errors -import railroad -from pip._vendor import pyparsing -import typing -from typing import ( - List, - NamedTuple, - Generic, - TypeVar, - Dict, - Callable, - Set, - Iterable, -) -from jinja2 import Template -from io import StringIO -import inspect - - -jinja2_template_source = """\ -{% if not embed %} - - - -{% endif %} - {% if not head %} - - {% else %} - {{ head | safe }} - {% endif %} -{% if not embed %} - - -{% endif %} -{{ body | safe }} -{% for diagram in diagrams %} -
      -

      {{ diagram.title }}

      -
      {{ diagram.text }}
      -
      - {{ diagram.svg }} -
      -
      -{% endfor %} -{% if not embed %} - - -{% endif %} -""" - -template = Template(jinja2_template_source) - -# Note: ideally this would be a dataclass, but we're supporting Python 3.5+ so we can't do this yet -NamedDiagram = NamedTuple( - "NamedDiagram", - [("name", str), ("diagram", typing.Optional[railroad.DiagramItem]), ("index", int)], -) -""" -A simple structure for associating a name with a railroad diagram -""" - -T = TypeVar("T") - - -class EachItem(railroad.Group): - """ - Custom railroad item to compose a: - - Group containing a - - OneOrMore containing a - - Choice of the elements in the Each - with the group label indicating that all must be matched - """ - - all_label = "[ALL]" - - def __init__(self, *items): - choice_item = railroad.Choice(len(items) - 1, *items) - one_or_more_item = railroad.OneOrMore(item=choice_item) - super().__init__(one_or_more_item, label=self.all_label) - - -class AnnotatedItem(railroad.Group): - """ - Simple subclass of Group that creates an annotation label - """ - - def __init__(self, label: str, item): - super().__init__(item=item, label="[{}]".format(label) if label else label) - - -class EditablePartial(Generic[T]): - """ - Acts like a functools.partial, but can be edited. In other words, it represents a type that hasn't yet been - constructed. - """ - - # We need this here because the railroad constructors actually transform the data, so can't be called until the - # entire tree is assembled - - def __init__(self, func: Callable[..., T], args: list, kwargs: dict): - self.func = func - self.args = args - self.kwargs = kwargs - - @classmethod - def from_call(cls, func: Callable[..., T], *args, **kwargs) -> "EditablePartial[T]": - """ - If you call this function in the same way that you would call the constructor, it will store the arguments - as you expect. For example EditablePartial.from_call(Fraction, 1, 3)() == Fraction(1, 3) - """ - return EditablePartial(func=func, args=list(args), kwargs=kwargs) - - @property - def name(self): - return self.kwargs["name"] - - def __call__(self) -> T: - """ - Evaluate the partial and return the result - """ - args = self.args.copy() - kwargs = self.kwargs.copy() - - # This is a helpful hack to allow you to specify varargs parameters (e.g. *args) as keyword args (e.g. - # args=['list', 'of', 'things']) - arg_spec = inspect.getfullargspec(self.func) - if arg_spec.varargs in self.kwargs: - args += kwargs.pop(arg_spec.varargs) - - return self.func(*args, **kwargs) - - -def railroad_to_html(diagrams: List[NamedDiagram], embed=False, **kwargs) -> str: - """ - Given a list of NamedDiagram, produce a single HTML string that visualises those diagrams - :params kwargs: kwargs to be passed in to the template - """ - data = [] - for diagram in diagrams: - if diagram.diagram is None: - continue - io = StringIO() - try: - css = kwargs.get('css') - diagram.diagram.writeStandalone(io.write, css=css) - except AttributeError: - diagram.diagram.writeSvg(io.write) - title = diagram.name - if diagram.index == 0: - title += " (root)" - data.append({"title": title, "text": "", "svg": io.getvalue()}) - - return template.render(diagrams=data, embed=embed, **kwargs) - - -def resolve_partial(partial: "EditablePartial[T]") -> T: - """ - Recursively resolves a collection of Partials into whatever type they are - """ - if isinstance(partial, EditablePartial): - partial.args = resolve_partial(partial.args) - partial.kwargs = resolve_partial(partial.kwargs) - return partial() - elif isinstance(partial, list): - return [resolve_partial(x) for x in partial] - elif isinstance(partial, dict): - return {key: resolve_partial(x) for key, x in partial.items()} - else: - return partial - - -def to_railroad( - element: pyparsing.ParserElement, - diagram_kwargs: typing.Optional[dict] = None, - vertical: int = 3, - show_results_names: bool = False, - show_groups: bool = False, -) -> List[NamedDiagram]: - """ - Convert a pyparsing element tree into a list of diagrams. This is the recommended entrypoint to diagram - creation if you want to access the Railroad tree before it is converted to HTML - :param element: base element of the parser being diagrammed - :param diagram_kwargs: kwargs to pass to the Diagram() constructor - :param vertical: (optional) - int - limit at which number of alternatives should be - shown vertically instead of horizontally - :param show_results_names - bool to indicate whether results name annotations should be - included in the diagram - :param show_groups - bool to indicate whether groups should be highlighted with an unlabeled - surrounding box - """ - # Convert the whole tree underneath the root - lookup = ConverterState(diagram_kwargs=diagram_kwargs or {}) - _to_diagram_element( - element, - lookup=lookup, - parent=None, - vertical=vertical, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - root_id = id(element) - # Convert the root if it hasn't been already - if root_id in lookup: - if not element.customName: - lookup[root_id].name = "" - lookup[root_id].mark_for_extraction(root_id, lookup, force=True) - - # Now that we're finished, we can convert from intermediate structures into Railroad elements - diags = list(lookup.diagrams.values()) - if len(diags) > 1: - # collapse out duplicate diags with the same name - seen = set() - deduped_diags = [] - for d in diags: - # don't extract SkipTo elements, they are uninformative as subdiagrams - if d.name == "...": - continue - if d.name is not None and d.name not in seen: - seen.add(d.name) - deduped_diags.append(d) - resolved = [resolve_partial(partial) for partial in deduped_diags] - else: - # special case - if just one diagram, always display it, even if - # it has no name - resolved = [resolve_partial(partial) for partial in diags] - return sorted(resolved, key=lambda diag: diag.index) - - -def _should_vertical( - specification: int, exprs: Iterable[pyparsing.ParserElement] -) -> bool: - """ - Returns true if we should return a vertical list of elements - """ - if specification is None: - return False - else: - return len(_visible_exprs(exprs)) >= specification - - -class ElementState: - """ - State recorded for an individual pyparsing Element - """ - - # Note: this should be a dataclass, but we have to support Python 3.5 - def __init__( - self, - element: pyparsing.ParserElement, - converted: EditablePartial, - parent: EditablePartial, - number: int, - name: str = None, - parent_index: typing.Optional[int] = None, - ): - #: The pyparsing element that this represents - self.element: pyparsing.ParserElement = element - #: The name of the element - self.name: typing.Optional[str] = name - #: The output Railroad element in an unconverted state - self.converted: EditablePartial = converted - #: The parent Railroad element, which we store so that we can extract this if it's duplicated - self.parent: EditablePartial = parent - #: The order in which we found this element, used for sorting diagrams if this is extracted into a diagram - self.number: int = number - #: The index of this inside its parent - self.parent_index: typing.Optional[int] = parent_index - #: If true, we should extract this out into a subdiagram - self.extract: bool = False - #: If true, all of this element's children have been filled out - self.complete: bool = False - - def mark_for_extraction( - self, el_id: int, state: "ConverterState", name: str = None, force: bool = False - ): - """ - Called when this instance has been seen twice, and thus should eventually be extracted into a sub-diagram - :param el_id: id of the element - :param state: element/diagram state tracker - :param name: name to use for this element's text - :param force: If true, force extraction now, regardless of the state of this. Only useful for extracting the - root element when we know we're finished - """ - self.extract = True - - # Set the name - if not self.name: - if name: - # Allow forcing a custom name - self.name = name - elif self.element.customName: - self.name = self.element.customName - else: - self.name = "" - - # Just because this is marked for extraction doesn't mean we can do it yet. We may have to wait for children - # to be added - # Also, if this is just a string literal etc, don't bother extracting it - if force or (self.complete and _worth_extracting(self.element)): - state.extract_into_diagram(el_id) - - -class ConverterState: - """ - Stores some state that persists between recursions into the element tree - """ - - def __init__(self, diagram_kwargs: typing.Optional[dict] = None): - #: A dictionary mapping ParserElements to state relating to them - self._element_diagram_states: Dict[int, ElementState] = {} - #: A dictionary mapping ParserElement IDs to subdiagrams generated from them - self.diagrams: Dict[int, EditablePartial[NamedDiagram]] = {} - #: The index of the next unnamed element - self.unnamed_index: int = 1 - #: The index of the next element. This is used for sorting - self.index: int = 0 - #: Shared kwargs that are used to customize the construction of diagrams - self.diagram_kwargs: dict = diagram_kwargs or {} - self.extracted_diagram_names: Set[str] = set() - - def __setitem__(self, key: int, value: ElementState): - self._element_diagram_states[key] = value - - def __getitem__(self, key: int) -> ElementState: - return self._element_diagram_states[key] - - def __delitem__(self, key: int): - del self._element_diagram_states[key] - - def __contains__(self, key: int): - return key in self._element_diagram_states - - def generate_unnamed(self) -> int: - """ - Generate a number used in the name of an otherwise unnamed diagram - """ - self.unnamed_index += 1 - return self.unnamed_index - - def generate_index(self) -> int: - """ - Generate a number used to index a diagram - """ - self.index += 1 - return self.index - - def extract_into_diagram(self, el_id: int): - """ - Used when we encounter the same token twice in the same tree. When this - happens, we replace all instances of that token with a terminal, and - create a new subdiagram for the token - """ - position = self[el_id] - - # Replace the original definition of this element with a regular block - if position.parent: - ret = EditablePartial.from_call(railroad.NonTerminal, text=position.name) - if "item" in position.parent.kwargs: - position.parent.kwargs["item"] = ret - elif "items" in position.parent.kwargs: - position.parent.kwargs["items"][position.parent_index] = ret - - # If the element we're extracting is a group, skip to its content but keep the title - if position.converted.func == railroad.Group: - content = position.converted.kwargs["item"] - else: - content = position.converted - - self.diagrams[el_id] = EditablePartial.from_call( - NamedDiagram, - name=position.name, - diagram=EditablePartial.from_call( - railroad.Diagram, content, **self.diagram_kwargs - ), - index=position.number, - ) - - del self[el_id] - - -def _worth_extracting(element: pyparsing.ParserElement) -> bool: - """ - Returns true if this element is worth having its own sub-diagram. Simply, if any of its children - themselves have children, then its complex enough to extract - """ - children = element.recurse() - return any(child.recurse() for child in children) - - -def _apply_diagram_item_enhancements(fn): - """ - decorator to ensure enhancements to a diagram item (such as results name annotations) - get applied on return from _to_diagram_element (we do this since there are several - returns in _to_diagram_element) - """ - - def _inner( - element: pyparsing.ParserElement, - parent: typing.Optional[EditablePartial], - lookup: ConverterState = None, - vertical: int = None, - index: int = 0, - name_hint: str = None, - show_results_names: bool = False, - show_groups: bool = False, - ) -> typing.Optional[EditablePartial]: - ret = fn( - element, - parent, - lookup, - vertical, - index, - name_hint, - show_results_names, - show_groups, - ) - - # apply annotation for results name, if present - if show_results_names and ret is not None: - element_results_name = element.resultsName - if element_results_name: - # add "*" to indicate if this is a "list all results" name - element_results_name += "" if element.modalResults else "*" - ret = EditablePartial.from_call( - railroad.Group, item=ret, label=element_results_name - ) - - return ret - - return _inner - - -def _visible_exprs(exprs: Iterable[pyparsing.ParserElement]): - non_diagramming_exprs = ( - pyparsing.ParseElementEnhance, - pyparsing.PositionToken, - pyparsing.And._ErrorStop, - ) - return [ - e - for e in exprs - if not (e.customName or e.resultsName or isinstance(e, non_diagramming_exprs)) - ] - - -@_apply_diagram_item_enhancements -def _to_diagram_element( - element: pyparsing.ParserElement, - parent: typing.Optional[EditablePartial], - lookup: ConverterState = None, - vertical: int = None, - index: int = 0, - name_hint: str = None, - show_results_names: bool = False, - show_groups: bool = False, -) -> typing.Optional[EditablePartial]: - """ - Recursively converts a PyParsing Element to a railroad Element - :param lookup: The shared converter state that keeps track of useful things - :param index: The index of this element within the parent - :param parent: The parent of this element in the output tree - :param vertical: Controls at what point we make a list of elements vertical. If this is an integer (the default), - it sets the threshold of the number of items before we go vertical. If True, always go vertical, if False, never - do so - :param name_hint: If provided, this will override the generated name - :param show_results_names: bool flag indicating whether to add annotations for results names - :returns: The converted version of the input element, but as a Partial that hasn't yet been constructed - :param show_groups: bool flag indicating whether to show groups using bounding box - """ - exprs = element.recurse() - name = name_hint or element.customName or element.__class__.__name__ - - # Python's id() is used to provide a unique identifier for elements - el_id = id(element) - - element_results_name = element.resultsName - - # Here we basically bypass processing certain wrapper elements if they contribute nothing to the diagram - if not element.customName: - if isinstance( - element, - ( - # pyparsing.TokenConverter, - # pyparsing.Forward, - pyparsing.Located, - ), - ): - # However, if this element has a useful custom name, and its child does not, we can pass it on to the child - if exprs: - if not exprs[0].customName: - propagated_name = name - else: - propagated_name = None - - return _to_diagram_element( - element.expr, - parent=parent, - lookup=lookup, - vertical=vertical, - index=index, - name_hint=propagated_name, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - # If the element isn't worth extracting, we always treat it as the first time we say it - if _worth_extracting(element): - if el_id in lookup: - # If we've seen this element exactly once before, we are only just now finding out that it's a duplicate, - # so we have to extract it into a new diagram. - looked_up = lookup[el_id] - looked_up.mark_for_extraction(el_id, lookup, name=name_hint) - ret = EditablePartial.from_call(railroad.NonTerminal, text=looked_up.name) - return ret - - elif el_id in lookup.diagrams: - # If we have seen the element at least twice before, and have already extracted it into a subdiagram, we - # just put in a marker element that refers to the sub-diagram - ret = EditablePartial.from_call( - railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] - ) - return ret - - # Recursively convert child elements - # Here we find the most relevant Railroad element for matching pyparsing Element - # We use ``items=[]`` here to hold the place for where the child elements will go once created - if isinstance(element, pyparsing.And): - # detect And's created with ``expr*N`` notation - for these use a OneOrMore with a repeat - # (all will have the same name, and resultsName) - if not exprs: - return None - if len(set((e.name, e.resultsName) for e in exprs)) == 1: - ret = EditablePartial.from_call( - railroad.OneOrMore, item="", repeat=str(len(exprs)) - ) - elif _should_vertical(vertical, exprs): - ret = EditablePartial.from_call(railroad.Stack, items=[]) - else: - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - elif isinstance(element, (pyparsing.Or, pyparsing.MatchFirst)): - if not exprs: - return None - if _should_vertical(vertical, exprs): - ret = EditablePartial.from_call(railroad.Choice, 0, items=[]) - else: - ret = EditablePartial.from_call(railroad.HorizontalChoice, items=[]) - elif isinstance(element, pyparsing.Each): - if not exprs: - return None - ret = EditablePartial.from_call(EachItem, items=[]) - elif isinstance(element, pyparsing.NotAny): - ret = EditablePartial.from_call(AnnotatedItem, label="NOT", item="") - elif isinstance(element, pyparsing.FollowedBy): - ret = EditablePartial.from_call(AnnotatedItem, label="LOOKAHEAD", item="") - elif isinstance(element, pyparsing.PrecededBy): - ret = EditablePartial.from_call(AnnotatedItem, label="LOOKBEHIND", item="") - elif isinstance(element, pyparsing.Group): - if show_groups: - ret = EditablePartial.from_call(AnnotatedItem, label="", item="") - else: - ret = EditablePartial.from_call(railroad.Group, label="", item="") - elif isinstance(element, pyparsing.TokenConverter): - label = type(element).__name__.lower() - if label == "tokenconverter": - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - else: - ret = EditablePartial.from_call(AnnotatedItem, label=label, item="") - elif isinstance(element, pyparsing.Opt): - ret = EditablePartial.from_call(railroad.Optional, item="") - elif isinstance(element, pyparsing.OneOrMore): - ret = EditablePartial.from_call(railroad.OneOrMore, item="") - elif isinstance(element, pyparsing.ZeroOrMore): - ret = EditablePartial.from_call(railroad.ZeroOrMore, item="") - elif isinstance(element, pyparsing.Group): - ret = EditablePartial.from_call( - railroad.Group, item=None, label=element_results_name - ) - elif isinstance(element, pyparsing.Empty) and not element.customName: - # Skip unnamed "Empty" elements - ret = None - elif isinstance(element, pyparsing.ParseElementEnhance): - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - elif len(exprs) > 0 and not element_results_name: - ret = EditablePartial.from_call(railroad.Group, item="", label=name) - elif len(exprs) > 0: - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - else: - terminal = EditablePartial.from_call(railroad.Terminal, element.defaultName) - ret = terminal - - if ret is None: - return - - # Indicate this element's position in the tree so we can extract it if necessary - lookup[el_id] = ElementState( - element=element, - converted=ret, - parent=parent, - parent_index=index, - number=lookup.generate_index(), - ) - if element.customName: - lookup[el_id].mark_for_extraction(el_id, lookup, element.customName) - - i = 0 - for expr in exprs: - # Add a placeholder index in case we have to extract the child before we even add it to the parent - if "items" in ret.kwargs: - ret.kwargs["items"].insert(i, None) - - item = _to_diagram_element( - expr, - parent=ret, - lookup=lookup, - vertical=vertical, - index=i, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - # Some elements don't need to be shown in the diagram - if item is not None: - if "item" in ret.kwargs: - ret.kwargs["item"] = item - elif "items" in ret.kwargs: - # If we've already extracted the child, don't touch this index, since it's occupied by a nonterminal - ret.kwargs["items"][i] = item - i += 1 - elif "items" in ret.kwargs: - # If we're supposed to skip this element, remove it from the parent - del ret.kwargs["items"][i] - - # If all this items children are none, skip this item - if ret and ( - ("items" in ret.kwargs and len(ret.kwargs["items"]) == 0) - or ("item" in ret.kwargs and ret.kwargs["item"] is None) - ): - ret = EditablePartial.from_call(railroad.Terminal, name) - - # Mark this element as "complete", ie it has all of its children - if el_id in lookup: - lookup[el_id].complete = True - - if el_id in lookup and lookup[el_id].extract and lookup[el_id].complete: - lookup.extract_into_diagram(el_id) - if ret is not None: - ret = EditablePartial.from_call( - railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] - ) - - return ret diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1815cbc1163a176e35c5f259bf9b58b7b06a5b81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26832 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 0: - callers = inspect.getinnerframes(exc.__traceback__, context=depth) - seen = set() - for i, ff in enumerate(callers[-depth:]): - frm = ff[0] - - f_self = frm.f_locals.get("self", None) - if isinstance(f_self, ParserElement): - if not frm.f_code.co_name.startswith( - ("parseImpl", "_parseNoCache") - ): - continue - if id(f_self) in seen: - continue - seen.add(id(f_self)) - - self_type = type(f_self) - ret.append( - f"{self_type.__module__}.{self_type.__name__} - {f_self}" - ) - - elif f_self is not None: - self_type = type(f_self) - ret.append(f"{self_type.__module__}.{self_type.__name__}") - - else: - code = frm.f_code - if code.co_name in ("wrapper", ""): - continue - - ret.append(code.co_name) - - depth -= 1 - if not depth: - break - - return "\n".join(ret) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parser_element) - - @property - def line(self) -> str: - """ - Return the line of text where the exception occurred. - """ - return line(self.loc, self.pstr) - - @property - def lineno(self) -> int: - """ - Return the 1-based line number of text where the exception occurred. - """ - return lineno(self.loc, self.pstr) - - @property - def col(self) -> int: - """ - Return the 1-based column on the line of text where the exception occurred. - """ - return col(self.loc, self.pstr) - - @property - def column(self) -> int: - """ - Return the 1-based column on the line of text where the exception occurred. - """ - return col(self.loc, self.pstr) - - # pre-PEP8 compatibility - @property - def parserElement(self): - return self.parser_element - - @parserElement.setter - def parserElement(self, elem): - self.parser_element = elem - - def __str__(self) -> str: - if self.pstr: - if self.loc >= len(self.pstr): - foundstr = ", found end of text" - else: - # pull out next word at error location - found_match = _exception_word_extractor.match(self.pstr, self.loc) - if found_match is not None: - found = found_match.group(0) - else: - found = self.pstr[self.loc : self.loc + 1] - foundstr = (", found %r" % found).replace(r"\\", "\\") - else: - foundstr = "" - return f"{self.msg}{foundstr} (at char {self.loc}), (line:{self.lineno}, col:{self.column})" - - def __repr__(self): - return str(self) - - def mark_input_line( - self, marker_string: typing.Optional[str] = None, *, markerString: str = ">!<" - ) -> str: - """ - Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - markerString = marker_string if marker_string is not None else markerString - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join( - (line_str[:line_column], markerString, line_str[line_column:]) - ) - return line_str.strip() - - def explain(self, depth=16) -> str: - """ - Method to translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - - Example:: - - expr = pp.Word(pp.nums) * 3 - try: - expr.parse_string("123 456 A789") - except pp.ParseException as pe: - print(pe.explain(depth=0)) - - prints:: - - 123 456 A789 - ^ - ParseException: Expected W:(0-9), found 'A' (at char 8), (line:1, col:9) - - Note: the diagnostic output will include string representations of the expressions - that failed to parse. These representations will be more helpful if you use `set_name` to - give identifiable names to your expressions. Otherwise they will use the default string - forms, which may be cryptic to read. - - Note: pyparsing's default truncation of exception tracebacks may also truncate the - stack of expressions that are displayed in the ``explain`` output. To get the full listing - of parser expressions, you may have to set ``ParserElement.verbose_stacktrace = True`` - """ - return self.explain_exception(self, depth) - - # fmt: off - @replaced_by_pep8(mark_input_line) - def markInputline(self): ... - # fmt: on - - -class ParseException(ParseBaseException): - """ - Exception thrown when a parse expression doesn't match the input string - - Example:: - - try: - Word(nums).set_name("integer").parse_string("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.column)) - - prints:: - - Expected integer (at char 0), (line:1, col:1) - column: 1 - - """ - - -class ParseFatalException(ParseBaseException): - """ - User-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately - """ - - -class ParseSyntaxException(ParseFatalException): - """ - Just like :class:`ParseFatalException`, but thrown internally - when an :class:`ErrorStop` ('-' operator) indicates - that parsing is to stop immediately because an unbacktrackable - syntax error has been found. - """ - - -class RecursiveGrammarException(Exception): - """ - Exception thrown by :class:`ParserElement.validate` if the - grammar could be left-recursive; parser may need to enable - left recursion using :class:`ParserElement.enable_left_recursion` - """ - - def __init__(self, parseElementList): - self.parseElementTrace = parseElementList - - def __str__(self) -> str: - return f"RecursiveGrammarException: {self.parseElementTrace}" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py deleted file mode 100644 index 018f0d6a..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py +++ /dev/null @@ -1,1100 +0,0 @@ -# helpers.py -import html.entities -import re -import sys -import typing - -from . import __diag__ -from .core import * -from .util import ( - _bslash, - _flatten, - _escape_regex_range_chars, - replaced_by_pep8, -) - - -# -# global helpers -# -def counted_array( - expr: ParserElement, - int_expr: typing.Optional[ParserElement] = None, - *, - intExpr: typing.Optional[ParserElement] = None, -) -> ParserElement: - """Helper to define a counted list of expressions. - - This helper defines a pattern of the form:: - - integer expr expr expr... - - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the - leading count token is suppressed. - - If ``int_expr`` is specified, it should be a pyparsing expression - that produces an integer value. - - Example:: - - counted_array(Word(alphas)).parse_string('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binary_constant = Word('01').set_parse_action(lambda t: int(t[0], 2)) - counted_array(Word(alphas), int_expr=binary_constant).parse_string('10 ab cd ef') # -> ['ab', 'cd'] - - # if other fields must be parsed after the count but before the - # list items, give the fields results names and they will - # be preserved in the returned ParseResults: - count_with_metadata = integer + Word(alphas)("type") - typed_array = counted_array(Word(alphanums), int_expr=count_with_metadata)("items") - result = typed_array.parse_string("3 bool True True False") - print(result.dump()) - - # prints - # ['True', 'True', 'False'] - # - items: ['True', 'True', 'False'] - # - type: 'bool' - """ - intExpr = intExpr or int_expr - array_expr = Forward() - - def count_field_parse_action(s, l, t): - nonlocal array_expr - n = t[0] - array_expr <<= (expr * n) if n else Empty() - # clear list contents, but keep any named results - del t[:] - - if intExpr is None: - intExpr = Word(nums).set_parse_action(lambda t: int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.set_name("arrayLen") - intExpr.add_parse_action(count_field_parse_action, call_during_try=True) - return (intExpr + array_expr).set_name("(len) " + str(expr) + "...") - - -def match_previous_literal(expr: ParserElement) -> ParserElement: - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = match_previous_literal(first) - match_expr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches a previous literal, will also match the leading - ``"1:1"`` in ``"1:10"``. If this is not desired, use - :class:`match_previous_expr`. Do *not* use with packrat parsing - enabled. - """ - rep = Forward() - - def copy_token_to_repeater(s, l, t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.as_list()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - - expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) - rep.set_name("(prev) " + str(expr)) - return rep - - -def match_previous_expr(expr: ParserElement) -> ParserElement: - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = match_previous_expr(first) - match_expr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches by expressions, will *not* match the leading ``"1:1"`` - in ``"1:10"``; the expressions are evaluated first, and then - compared, so ``"1"`` is compared with ``"10"``. Do *not* use - with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - - def copy_token_to_repeater(s, l, t): - matchTokens = _flatten(t.as_list()) - - def must_match_these_tokens(s, l, t): - theseTokens = _flatten(t.as_list()) - if theseTokens != matchTokens: - raise ParseException( - s, l, f"Expected {matchTokens}, found{theseTokens}" - ) - - rep.set_parse_action(must_match_these_tokens, callDuringTry=True) - - expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) - rep.set_name("(prev) " + str(expr)) - return rep - - -def one_of( - strs: Union[typing.Iterable[str], str], - caseless: bool = False, - use_regex: bool = True, - as_keyword: bool = False, - *, - useRegex: bool = True, - asKeyword: bool = False, -) -> ParserElement: - """Helper to quickly define a set of alternative :class:`Literal` s, - and makes sure to do longest-first testing when there is a conflict, - regardless of the input order, but returns - a :class:`MatchFirst` for best performance. - - Parameters: - - - ``strs`` - a string of space-delimited literals, or a collection of - string literals - - ``caseless`` - treat all literals as caseless - (default= ``False``) - - ``use_regex`` - as an optimization, will - generate a :class:`Regex` object; otherwise, will generate - a :class:`MatchFirst` object (if ``caseless=True`` or ``as_keyword=True``, or if - creating a :class:`Regex` raises an exception) - (default= ``True``) - - ``as_keyword`` - enforce :class:`Keyword`-style matching on the - generated expressions - (default= ``False``) - - ``asKeyword`` and ``useRegex`` are retained for pre-PEP8 compatibility, - but will be removed in a future release - - Example:: - - comp_oper = one_of("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.search_string("B = 12 AA=23 B<=AA AA>12")) - - prints:: - - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - asKeyword = asKeyword or as_keyword - useRegex = useRegex and use_regex - - if ( - isinstance(caseless, str_type) - and __diag__.warn_on_multiple_string_args_to_oneof - ): - warnings.warn( - "More than one string argument passed to one_of, pass" - " choices as a list or space-delimited string", - stacklevel=2, - ) - - if caseless: - isequal = lambda a, b: a.upper() == b.upper() - masks = lambda a, b: b.upper().startswith(a.upper()) - parseElementClass = CaselessKeyword if asKeyword else CaselessLiteral - else: - isequal = lambda a, b: a == b - masks = lambda a, b: b.startswith(a) - parseElementClass = Keyword if asKeyword else Literal - - symbols: List[str] = [] - if isinstance(strs, str_type): - strs = typing.cast(str, strs) - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - raise TypeError("Invalid argument to one_of, expected string or iterable") - if not symbols: - return NoMatch() - - # reorder given symbols to take care to avoid masking longer choices with shorter ones - # (but only if the given symbols are not just single characters) - if any(len(sym) > 1 for sym in symbols): - i = 0 - while i < len(symbols) - 1: - cur = symbols[i] - for j, other in enumerate(symbols[i + 1 :]): - if isequal(other, cur): - del symbols[i + j + 1] - break - elif masks(cur, other): - del symbols[i + j + 1] - symbols.insert(i, other) - break - else: - i += 1 - - if useRegex: - re_flags: int = re.IGNORECASE if caseless else 0 - - try: - if all(len(sym) == 1 for sym in symbols): - # symbols are just single characters, create range regex pattern - patt = f"[{''.join(_escape_regex_range_chars(sym) for sym in symbols)}]" - else: - patt = "|".join(re.escape(sym) for sym in symbols) - - # wrap with \b word break markers if defining as keywords - if asKeyword: - patt = rf"\b(?:{patt})\b" - - ret = Regex(patt, flags=re_flags).set_name(" | ".join(symbols)) - - if caseless: - # add parse action to return symbols as specified, not in random - # casing as found in input string - symbol_map = {sym.lower(): sym for sym in symbols} - ret.add_parse_action(lambda s, l, t: symbol_map[t[0].lower()]) - - return ret - - except re.error: - warnings.warn( - "Exception creating Regex for one_of, building MatchFirst", stacklevel=2 - ) - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).set_name( - " | ".join(symbols) - ) - - -def dict_of(key: ParserElement, value: ParserElement) -> ParserElement: - """Helper to easily and clearly define a dictionary by specifying - the respective patterns for the key and value. Takes care of - defining the :class:`Dict`, :class:`ZeroOrMore`, and - :class:`Group` tokens in the proper order. The key pattern - can include delimiting markers or punctuation, as long as they are - suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the :class:`Dict` results - can include named token fields. - - Example:: - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - print(attr_expr[1, ...].parse_string(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join) - - # similar to Dict, but simpler call format - result = dict_of(attr_label, attr_value).parse_string(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.as_dict()) - - prints:: - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: 'light blue' - - posn: 'upper left' - - shape: 'SQUARE' - - texture: 'burlap' - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict(OneOrMore(Group(key + value))) - - -def original_text_for( - expr: ParserElement, as_string: bool = True, *, asString: bool = True -) -> ParserElement: - """Helper to return the original, untokenized text for a given - expression. Useful to restore the parsed fields of an HTML start - tag into the raw tag text itself, or to revert separate tokens with - intervening whitespace back to the original matching input text. By - default, returns a string containing the original parsed text. - - If the optional ``as_string`` argument is passed as - ``False``, then the return value is - a :class:`ParseResults` containing any results names that - were originally matched, and a single token containing the original - matched text from the input string. So if the expression passed to - :class:`original_text_for` contains expressions with defined - results names, you must set ``as_string`` to ``False`` if you - want to preserve those results name values. - - The ``asString`` pre-PEP8 argument is retained for compatibility, - but will be removed in a future release. - - Example:: - - src = "this is test bold text normal text " - for tag in ("b", "i"): - opener, closer = make_html_tags(tag) - patt = original_text_for(opener + ... + closer) - print(patt.search_string(src)[0]) - - prints:: - - [' bold text '] - ['text'] - """ - asString = asString and as_string - - locMarker = Empty().set_parse_action(lambda s, loc, t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s, l, t: s[t._original_start : t._original_end] - else: - - def extractText(s, l, t): - t[:] = [s[t.pop("_original_start") : t.pop("_original_end")]] - - matchExpr.set_parse_action(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - matchExpr.suppress_warning(Diagnostics.warn_ungrouped_named_tokens_in_collection) - return matchExpr - - -def ungroup(expr: ParserElement) -> ParserElement: - """Helper to undo pyparsing's default grouping of And expressions, - even if all but one are non-empty. - """ - return TokenConverter(expr).add_parse_action(lambda t: t[0]) - - -def locatedExpr(expr: ParserElement) -> ParserElement: - """ - (DEPRECATED - future code should use the :class:`Located` class) - Helper to decorate a returned token with its starting and ending - locations in the input string. - - This helper adds the following results names: - - - ``locn_start`` - location where matched expression begins - - ``locn_end`` - location where matched expression ends - - ``value`` - the actual parsed results - - Be careful if the input text contains ```` characters, you - may want to call :class:`ParserElement.parse_with_tabs` - - Example:: - - wd = Word(alphas) - for match in locatedExpr(wd).search_string("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().set_parse_action(lambda ss, ll, tt: ll) - return Group( - locator("locn_start") - + expr("value") - + locator.copy().leaveWhitespace()("locn_end") - ) - - -def nested_expr( - opener: Union[str, ParserElement] = "(", - closer: Union[str, ParserElement] = ")", - content: typing.Optional[ParserElement] = None, - ignore_expr: ParserElement = quoted_string(), - *, - ignoreExpr: ParserElement = quoted_string(), -) -> ParserElement: - """Helper method for defining nested lists enclosed in opening and - closing delimiters (``"("`` and ``")"`` are the default). - - Parameters: - - - ``opener`` - opening character for a nested list - (default= ``"("``); can also be a pyparsing expression - - ``closer`` - closing character for a nested list - (default= ``")"``); can also be a pyparsing expression - - ``content`` - expression for items within the nested lists - (default= ``None``) - - ``ignore_expr`` - expression for ignoring opening and closing delimiters - (default= :class:`quoted_string`) - - ``ignoreExpr`` - this pre-PEP8 argument is retained for compatibility - but will be removed in a future release - - If an expression is not provided for the content argument, the - nested expression will capture all whitespace-delimited content - between delimiters as a list of separate values. - - Use the ``ignore_expr`` argument to define expressions that may - contain opening or closing characters that should not be treated as - opening or closing characters for nesting, such as quoted_string or - a comment expression. Specify multiple expressions using an - :class:`Or` or :class:`MatchFirst`. The default is - :class:`quoted_string`, but if no expressions are to be ignored, then - pass ``None`` for this argument. - - Example:: - - data_type = one_of("void int short long char float double") - decl_data_type = Combine(data_type + Opt(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR, RPAR = map(Suppress, "()") - - code_body = nested_expr('{', '}', ignore_expr=(quoted_string | c_style_comment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Opt(DelimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(c_style_comment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.search_string(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - - prints:: - - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if ignoreExpr != ignore_expr: - ignoreExpr = ignore_expr if ignoreExpr == quoted_string() else ignoreExpr - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener, str_type) and isinstance(closer, str_type): - opener = typing.cast(str, opener) - closer = typing.cast(str, closer) - if len(opener) == 1 and len(closer) == 1: - if ignoreExpr is not None: - content = Combine( - OneOrMore( - ~ignoreExpr - + CharsNotIn( - opener + closer + ParserElement.DEFAULT_WHITE_CHARS, - exact=1, - ) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - content = empty.copy() + CharsNotIn( - opener + closer + ParserElement.DEFAULT_WHITE_CHARS - ).set_parse_action(lambda t: t[0].strip()) - else: - if ignoreExpr is not None: - content = Combine( - OneOrMore( - ~ignoreExpr - + ~Literal(opener) - + ~Literal(closer) - + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - content = Combine( - OneOrMore( - ~Literal(opener) - + ~Literal(closer) - + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - raise ValueError( - "opening and closing arguments must be strings if no content expression is given" - ) - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( - Suppress(opener) + ZeroOrMore(ignoreExpr | ret | content) + Suppress(closer) - ) - else: - ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer)) - ret.set_name("nested %s%s expression" % (opener, closer)) - return ret - - -def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr, str_type): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas, alphanums + "_-:") - if xml: - tagAttrValue = dbl_quoted_string.copy().set_parse_action(remove_quotes) - openTag = ( - suppress_LT - + tagStr("tag") - + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue))) - + Opt("/", default=[False])("empty").set_parse_action( - lambda s, l, t: t[0] == "/" - ) - + suppress_GT - ) - else: - tagAttrValue = quoted_string.copy().set_parse_action(remove_quotes) | Word( - printables, exclude_chars=">" - ) - openTag = ( - suppress_LT - + tagStr("tag") - + Dict( - ZeroOrMore( - Group( - tagAttrName.set_parse_action(lambda t: t[0].lower()) - + Opt(Suppress("=") + tagAttrValue) - ) - ) - ) - + Opt("/", default=[False])("empty").set_parse_action( - lambda s, l, t: t[0] == "/" - ) - + suppress_GT - ) - closeTag = Combine(Literal("", adjacent=False) - - openTag.set_name("<%s>" % resname) - # add start results name in parse action now that ungrouped names are not reported at two levels - openTag.add_parse_action( - lambda t: t.__setitem__( - "start" + "".join(resname.replace(":", " ").title().split()), t.copy() - ) - ) - closeTag = closeTag( - "end" + "".join(resname.replace(":", " ").title().split()) - ).set_name("" % resname) - openTag.tag = resname - closeTag.tag = resname - openTag.tag_body = SkipTo(closeTag()) - return openTag, closeTag - - -def make_html_tags( - tag_str: Union[str, ParserElement] -) -> Tuple[ParserElement, ParserElement]: - """Helper to construct opening and closing tag expressions for HTML, - given a tag name. Matches tags in either upper or lower case, - attributes with namespaces and with quoted or unquoted values. - - Example:: - - text = 'More info at the pyparsing wiki page' - # make_html_tags returns pyparsing expressions for the opening and - # closing tags as a 2-tuple - a, a_end = make_html_tags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.search_string(text): - # attributes in the tag (like "href" shown here) are - # also accessible as named results - print(link.link_text, '->', link.href) - - prints:: - - pyparsing -> https://github.com/pyparsing/pyparsing/wiki - """ - return _makeTags(tag_str, False) - - -def make_xml_tags( - tag_str: Union[str, ParserElement] -) -> Tuple[ParserElement, ParserElement]: - """Helper to construct opening and closing tag expressions for XML, - given a tag name. Matches tags only in the given upper/lower case. - - Example: similar to :class:`make_html_tags` - """ - return _makeTags(tag_str, True) - - -any_open_tag: ParserElement -any_close_tag: ParserElement -any_open_tag, any_close_tag = make_html_tags( - Word(alphas, alphanums + "_:").set_name("any tag") -) - -_htmlEntityMap = {k.rstrip(";"): v for k, v in html.entities.html5.items()} -common_html_entity = Regex("&(?P" + "|".join(_htmlEntityMap) + ");").set_name( - "common HTML entity" -) - - -def replace_html_entity(s, l, t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - - -class OpAssoc(Enum): - """Enumeration of operator associativity - - used in constructing InfixNotationOperatorSpec for :class:`infix_notation`""" - - LEFT = 1 - RIGHT = 2 - - -InfixNotationOperatorArgType = Union[ - ParserElement, str, Tuple[Union[ParserElement, str], Union[ParserElement, str]] -] -InfixNotationOperatorSpec = Union[ - Tuple[ - InfixNotationOperatorArgType, - int, - OpAssoc, - typing.Optional[ParseAction], - ], - Tuple[ - InfixNotationOperatorArgType, - int, - OpAssoc, - ], -] - - -def infix_notation( - base_expr: ParserElement, - op_list: List[InfixNotationOperatorSpec], - lpar: Union[str, ParserElement] = Suppress("("), - rpar: Union[str, ParserElement] = Suppress(")"), -) -> ParserElement: - """Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary - or binary, left- or right-associative. Parse actions can also be - attached to operator expressions. The generated parser will also - recognize the use of parentheses to override operator precedences - (see example below). - - Note: if you define a deep operator list, you may see performance - issues when using infix_notation. See - :class:`ParserElement.enable_packrat` for a mechanism to potentially - improve your parser performance. - - Parameters: - - - ``base_expr`` - expression representing the most basic operand to - be used in the expression - - ``op_list`` - list of tuples, one for each operator precedence level - in the expression grammar; each tuple is of the form ``(op_expr, - num_operands, right_left_assoc, (optional)parse_action)``, where: - - - ``op_expr`` is the pyparsing expression for the operator; may also - be a string, which will be converted to a Literal; if ``num_operands`` - is 3, ``op_expr`` is a tuple of two expressions, for the two - operators separating the 3 terms - - ``num_operands`` is the number of terms for this operator (must be 1, - 2, or 3) - - ``right_left_assoc`` is the indicator whether the operator is right - or left associative, using the pyparsing-defined constants - ``OpAssoc.RIGHT`` and ``OpAssoc.LEFT``. - - ``parse_action`` is the parse action to be associated with - expressions matching this operator expression (the parse action - tuple member may be omitted); if the parse action is passed - a tuple or list of functions, this is equivalent to calling - ``set_parse_action(*fn)`` - (:class:`ParserElement.set_parse_action`) - - ``lpar`` - expression for matching left-parentheses; if passed as a - str, then will be parsed as ``Suppress(lpar)``. If lpar is passed as - an expression (such as ``Literal('(')``), then it will be kept in - the parsed results, and grouped with them. (default= ``Suppress('(')``) - - ``rpar`` - expression for matching right-parentheses; if passed as a - str, then will be parsed as ``Suppress(rpar)``. If rpar is passed as - an expression (such as ``Literal(')')``), then it will be kept in - the parsed results, and grouped with them. (default= ``Suppress(')')``) - - Example:: - - # simple example of four-function arithmetic with ints and - # variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infix_notation(integer | varname, - [ - ('-', 1, OpAssoc.RIGHT), - (one_of('* /'), 2, OpAssoc.LEFT), - (one_of('+ -'), 2, OpAssoc.LEFT), - ]) - - arith_expr.run_tests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', full_dump=False) - - prints:: - - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - (5+x)*y - [[[5, '+', 'x'], '*', 'y']] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - - # captive version of FollowedBy that does not do parse actions or capture results names - class _FB(FollowedBy): - def parseImpl(self, instring, loc, doActions=True): - self.expr.try_parse(instring, loc) - return loc, [] - - _FB.__name__ = "FollowedBy>" - - ret = Forward() - if isinstance(lpar, str): - lpar = Suppress(lpar) - if isinstance(rpar, str): - rpar = Suppress(rpar) - - # if lpar and rpar are not suppressed, wrap in group - if not (isinstance(rpar, Suppress) and isinstance(rpar, Suppress)): - lastExpr = base_expr | Group(lpar + ret + rpar) - else: - lastExpr = base_expr | (lpar + ret + rpar) - - arity: int - rightLeftAssoc: opAssoc - pa: typing.Optional[ParseAction] - opExpr1: ParserElement - opExpr2: ParserElement - for i, operDef in enumerate(op_list): - opExpr, arity, rightLeftAssoc, pa = (operDef + (None,))[:4] # type: ignore[assignment] - if isinstance(opExpr, str_type): - opExpr = ParserElement._literalStringClass(opExpr) - opExpr = typing.cast(ParserElement, opExpr) - if arity == 3: - if not isinstance(opExpr, (tuple, list)) or len(opExpr) != 2: - raise ValueError( - "if numterms=3, opExpr must be a tuple or list of two expressions" - ) - opExpr1, opExpr2 = opExpr - term_name = f"{opExpr1}{opExpr2} term" - else: - term_name = f"{opExpr} term" - - if not 1 <= arity <= 3: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - - if rightLeftAssoc not in (OpAssoc.LEFT, OpAssoc.RIGHT): - raise ValueError("operator must indicate right or left associativity") - - thisExpr: ParserElement = Forward().set_name(term_name) - thisExpr = typing.cast(Forward, thisExpr) - if rightLeftAssoc is OpAssoc.LEFT: - if arity == 1: - matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + opExpr[1, ...]) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( - lastExpr + (opExpr + lastExpr)[1, ...] - ) - else: - matchExpr = _FB(lastExpr + lastExpr) + Group(lastExpr[2, ...]) - elif arity == 3: - matchExpr = _FB( - lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr - ) + Group(lastExpr + OneOrMore(opExpr1 + lastExpr + opExpr2 + lastExpr)) - elif rightLeftAssoc is OpAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Opt): - opExpr = Opt(opExpr) - matchExpr = _FB(opExpr.expr + thisExpr) + Group(opExpr + thisExpr) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( - lastExpr + (opExpr + thisExpr)[1, ...] - ) - else: - matchExpr = _FB(lastExpr + thisExpr) + Group( - lastExpr + thisExpr[1, ...] - ) - elif arity == 3: - matchExpr = _FB( - lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr - ) + Group(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.set_parse_action(*pa) - else: - matchExpr.set_parse_action(pa) - thisExpr <<= (matchExpr | lastExpr).setName(term_name) - lastExpr = thisExpr - ret <<= lastExpr - return ret - - -def indentedBlock(blockStatementExpr, indentStack, indent=True, backup_stacks=[]): - """ - (DEPRECATED - use :class:`IndentedBlock` class instead) - Helper method for defining space-delimited indentation blocks, - such as those used to define block statements in Python source code. - - Parameters: - - - ``blockStatementExpr`` - expression defining syntax of statement that - is repeated within the indented block - - ``indentStack`` - list created by caller to manage indentation stack - (multiple ``statementWithIndentedBlock`` expressions within a single - grammar should share a common ``indentStack``) - - ``indent`` - boolean indicating whether block must be indented beyond - the current level; set to ``False`` for block of left-most statements - (default= ``True``) - - A valid block must contain at least one ``blockStatement``. - - (Note that indentedBlock uses internal parse actions which make it - incompatible with packrat parsing.) - - Example:: - - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group("(" + Opt(delimitedList(identifier)) + ")") + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group(funcDecl + func_body) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Opt(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << (funcDef | assignment | identifier) - - module_body = stmt[1, ...] - - parseTree = module_body.parseString(data) - parseTree.pprint() - - prints:: - - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - backup_stacks.append(indentStack[:]) - - def reset_stack(): - indentStack[:] = backup_stacks[-1] - - def checkPeerIndent(s, l, t): - if l >= len(s): - return - curCol = col(l, s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseException(s, l, "illegal nesting") - raise ParseException(s, l, "not a peer entry") - - def checkSubIndent(s, l, t): - curCol = col(l, s) - if curCol > indentStack[-1]: - indentStack.append(curCol) - else: - raise ParseException(s, l, "not a subentry") - - def checkUnindent(s, l, t): - if l >= len(s): - return - curCol = col(l, s) - if not (indentStack and curCol in indentStack): - raise ParseException(s, l, "not an unindent") - if curCol < indentStack[-1]: - indentStack.pop() - - NL = OneOrMore(LineEnd().set_whitespace_chars("\t ").suppress()) - INDENT = (Empty() + Empty().set_parse_action(checkSubIndent)).set_name("INDENT") - PEER = Empty().set_parse_action(checkPeerIndent).set_name("") - UNDENT = Empty().set_parse_action(checkUnindent).set_name("UNINDENT") - if indent: - smExpr = Group( - Opt(NL) - + INDENT - + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) - + UNDENT - ) - else: - smExpr = Group( - Opt(NL) - + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) - + Opt(UNDENT) - ) - - # add a parse action to remove backup_stack from list of backups - smExpr.add_parse_action( - lambda: backup_stacks.pop(-1) and None if backup_stacks else None - ) - smExpr.set_fail_action(lambda a, b, c, d: reset_stack()) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.set_name("indented block") - - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -c_style_comment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/").set_name( - "C style comment" -) -"Comment of the form ``/* ... */``" - -html_comment = Regex(r"").set_name("HTML comment") -"Comment of the form ````" - -rest_of_line = Regex(r".*").leave_whitespace().set_name("rest of line") -dbl_slash_comment = Regex(r"//(?:\\\n|[^\n])*").set_name("// comment") -"Comment of the form ``// ... (to end of line)``" - -cpp_style_comment = Combine( - Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/" | dbl_slash_comment -).set_name("C++ style comment") -"Comment of either form :class:`c_style_comment` or :class:`dbl_slash_comment`" - -java_style_comment = cpp_style_comment -"Same as :class:`cpp_style_comment`" - -python_style_comment = Regex(r"#.*").set_name("Python style comment") -"Comment of the form ``# ... (to end of line)``" - - -# build list of built-in expressions, for future reference if a global default value -# gets updated -_builtin_exprs: List[ParserElement] = [ - v for v in vars().values() if isinstance(v, ParserElement) -] - - -# compatibility function, superseded by DelimitedList class -def delimited_list( - expr: Union[str, ParserElement], - delim: Union[str, ParserElement] = ",", - combine: bool = False, - min: typing.Optional[int] = None, - max: typing.Optional[int] = None, - *, - allow_trailing_delim: bool = False, -) -> ParserElement: - """(DEPRECATED - use :class:`DelimitedList` class)""" - return DelimitedList( - expr, delim, combine, min, max, allow_trailing_delim=allow_trailing_delim - ) - - -# pre-PEP8 compatible names -# fmt: off -opAssoc = OpAssoc -anyOpenTag = any_open_tag -anyCloseTag = any_close_tag -commonHTMLEntity = common_html_entity -cStyleComment = c_style_comment -htmlComment = html_comment -restOfLine = rest_of_line -dblSlashComment = dbl_slash_comment -cppStyleComment = cpp_style_comment -javaStyleComment = java_style_comment -pythonStyleComment = python_style_comment - -@replaced_by_pep8(DelimitedList) -def delimitedList(): ... - -@replaced_by_pep8(DelimitedList) -def delimited_list(): ... - -@replaced_by_pep8(counted_array) -def countedArray(): ... - -@replaced_by_pep8(match_previous_literal) -def matchPreviousLiteral(): ... - -@replaced_by_pep8(match_previous_expr) -def matchPreviousExpr(): ... - -@replaced_by_pep8(one_of) -def oneOf(): ... - -@replaced_by_pep8(dict_of) -def dictOf(): ... - -@replaced_by_pep8(original_text_for) -def originalTextFor(): ... - -@replaced_by_pep8(nested_expr) -def nestedExpr(): ... - -@replaced_by_pep8(make_html_tags) -def makeHTMLTags(): ... - -@replaced_by_pep8(make_xml_tags) -def makeXMLTags(): ... - -@replaced_by_pep8(replace_html_entity) -def replaceHTMLEntity(): ... - -@replaced_by_pep8(infix_notation) -def infixNotation(): ... -# fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py deleted file mode 100644 index 03130497..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py +++ /dev/null @@ -1,796 +0,0 @@ -# results.py -from collections.abc import ( - MutableMapping, - Mapping, - MutableSequence, - Iterator, - Sequence, - Container, -) -import pprint -from typing import Tuple, Any, Dict, Set, List - -str_type: Tuple[type, ...] = (str, bytes) -_generator_type = type((_ for _ in ())) - - -class _ParseResultsWithOffset: - tup: Tuple["ParseResults", int] - __slots__ = ["tup"] - - def __init__(self, p1: "ParseResults", p2: int): - self.tup: Tuple[ParseResults, int] = (p1, p2) - - def __getitem__(self, i): - return self.tup[i] - - def __getstate__(self): - return self.tup - - def __setstate__(self, *args): - self.tup = args[0] - - -class ParseResults: - """Structured parse results, to provide multiple means of access to - the parsed data: - - - as a list (``len(results)``) - - by list index (``results[0], results[1]``, etc.) - - by attribute (``results.`` - see :class:`ParserElement.set_results_name`) - - Example:: - - integer = Word(nums) - date_str = (integer.set_results_name("year") + '/' - + integer.set_results_name("month") + '/' - + integer.set_results_name("day")) - # equivalent form: - # date_str = (integer("year") + '/' - # + integer("month") + '/' - # + integer("day")) - - # parse_string returns a ParseResults object - result = date_str.parse_string("1999/12/31") - - def test(s, fn=repr): - print(f"{s} -> {fn(eval(s))}") - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - - prints:: - - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: '31' - - month: '12' - - year: '1999' - """ - - _null_values: Tuple[Any, ...] = (None, [], ()) - - _name: str - _parent: "ParseResults" - _all_names: Set[str] - _modal: bool - _toklist: List[Any] - _tokdict: Dict[str, Any] - - __slots__ = ( - "_name", - "_parent", - "_all_names", - "_modal", - "_toklist", - "_tokdict", - ) - - class List(list): - """ - Simple wrapper class to distinguish parsed list results that should be preserved - as actual Python lists, instead of being converted to :class:`ParseResults`:: - - LBRACK, RBRACK = map(pp.Suppress, "[]") - element = pp.Forward() - item = ppc.integer - element_list = LBRACK + pp.DelimitedList(element) + RBRACK - - # add parse actions to convert from ParseResults to actual Python collection types - def as_python_list(t): - return pp.ParseResults.List(t.as_list()) - element_list.add_parse_action(as_python_list) - - element <<= item | element_list - - element.run_tests(''' - 100 - [2,3,4] - [[2, 1],3,4] - [(2, 1),3,4] - (2,3,4) - ''', post_parse=lambda s, r: (r[0], type(r[0]))) - - prints:: - - 100 - (100, ) - - [2,3,4] - ([2, 3, 4], ) - - [[2, 1],3,4] - ([[2, 1], 3, 4], ) - - (Used internally by :class:`Group` when `aslist=True`.) - """ - - def __new__(cls, contained=None): - if contained is None: - contained = [] - - if not isinstance(contained, list): - raise TypeError( - f"{cls.__name__} may only be constructed with a list, not {type(contained).__name__}" - ) - - return list.__new__(cls) - - def __new__(cls, toklist=None, name=None, **kwargs): - if isinstance(toklist, ParseResults): - return toklist - self = object.__new__(cls) - self._name = None - self._parent = None - self._all_names = set() - - if toklist is None: - self._toklist = [] - elif isinstance(toklist, (list, _generator_type)): - self._toklist = ( - [toklist[:]] - if isinstance(toklist, ParseResults.List) - else list(toklist) - ) - else: - self._toklist = [toklist] - self._tokdict = dict() - return self - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( - self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance - ): - self._tokdict: Dict[str, _ParseResultsWithOffset] - self._modal = modal - if name is not None and name != "": - if isinstance(name, int): - name = str(name) - if not modal: - self._all_names = {name} - self._name = name - if toklist not in self._null_values: - if isinstance(toklist, (str_type, type)): - toklist = [toklist] - if asList: - if isinstance(toklist, ParseResults): - self[name] = _ParseResultsWithOffset( - ParseResults(toklist._toklist), 0 - ) - else: - self[name] = _ParseResultsWithOffset( - ParseResults(toklist[0]), 0 - ) - self[name]._name = name - else: - try: - self[name] = toklist[0] - except (KeyError, TypeError, IndexError): - if toklist is not self: - self[name] = toklist - else: - self._name = name - - def __getitem__(self, i): - if isinstance(i, (int, slice)): - return self._toklist[i] - else: - if i not in self._all_names: - return self._tokdict[i][-1][0] - else: - return ParseResults([v[0] for v in self._tokdict[i]]) - - def __setitem__(self, k, v, isinstance=isinstance): - if isinstance(v, _ParseResultsWithOffset): - self._tokdict[k] = self._tokdict.get(k, list()) + [v] - sub = v[0] - elif isinstance(k, (int, slice)): - self._toklist[k] = v - sub = v - else: - self._tokdict[k] = self._tokdict.get(k, list()) + [ - _ParseResultsWithOffset(v, 0) - ] - sub = v - if isinstance(sub, ParseResults): - sub._parent = self - - def __delitem__(self, i): - if isinstance(i, (int, slice)): - mylen = len(self._toklist) - del self._toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i + 1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset( - value, position - (position > j) - ) - else: - del self._tokdict[i] - - def __contains__(self, k) -> bool: - return k in self._tokdict - - def __len__(self) -> int: - return len(self._toklist) - - def __bool__(self) -> bool: - return not not (self._toklist or self._tokdict) - - def __iter__(self) -> Iterator: - return iter(self._toklist) - - def __reversed__(self) -> Iterator: - return iter(self._toklist[::-1]) - - def keys(self): - return iter(self._tokdict) - - def values(self): - return (self[k] for k in self.keys()) - - def items(self): - return ((k, self[k]) for k in self.keys()) - - def haskeys(self) -> bool: - """ - Since ``keys()`` returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return not not self._tokdict - - def pop(self, *args, **kwargs): - """ - Removes and returns item at specified index (default= ``last``). - Supports both ``list`` and ``dict`` semantics for ``pop()``. If - passed no argument or an integer argument, it will use ``list`` - semantics and pop tokens from the list of parsed tokens. If passed - a non-integer argument (most likely a string), it will use ``dict`` - semantics and pop the corresponding value from any defined results - names. A second default return value argument is supported, just as in - ``dict.pop()``. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - def remove_first(tokens): - tokens.pop(0) - numlist.add_parse_action(remove_first) - print(numlist.parse_string("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + Word(nums)[1, ...] - print(patt.parse_string("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.add_parse_action(remove_LABEL) - print(patt.parse_string("AAB 123 321").dump()) - - prints:: - - ['AAB', '123', '321'] - - LABEL: 'AAB' - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k, v in kwargs.items(): - if k == "default": - args = (args[0], v) - else: - raise TypeError(f"pop() got an unexpected keyword argument {k!r}") - if isinstance(args[0], int) or len(args) == 1 or args[0] in self: - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, default_value=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given ``default_value`` or ``None`` if no - ``default_value`` is specified. - - Similar to ``dict.get()``. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return default_value - - def insert(self, index, ins_string): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to ``list.insert()``. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - numlist.add_parse_action(insert_locn) - print(numlist.parse_string("0 123 321")) # -> [0, '0', '123', '321'] - """ - self._toklist.insert(index, ins_string) - # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset( - value, position + (position > index) - ) - - def append(self, item): - """ - Add single element to end of ``ParseResults`` list of elements. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - numlist.add_parse_action(append_sum) - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321', 444] - """ - self._toklist.append(item) - - def extend(self, itemseq): - """ - Add sequence of elements to end of ``ParseResults`` list of elements. - - Example:: - - patt = Word(alphas)[1, ...] - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - patt.add_parse_action(make_palindrome) - print(patt.parse_string("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self.__iadd__(itemseq) - else: - self._toklist.extend(itemseq) - - def clear(self): - """ - Clear all elements and results names. - """ - del self._toklist[:] - self._tokdict.clear() - - def __getattr__(self, name): - try: - return self[name] - except KeyError: - if name.startswith("__"): - raise AttributeError(name) - return "" - - def __add__(self, other: "ParseResults") -> "ParseResults": - ret = self.copy() - ret += other - return ret - - def __iadd__(self, other: "ParseResults") -> "ParseResults": - if not other: - return self - - if other._tokdict: - offset = len(self._toklist) - addoffset = lambda a: offset if a < 0 else a + offset - otheritems = other._tokdict.items() - otherdictitems = [ - (k, _ParseResultsWithOffset(v[0], addoffset(v[1]))) - for k, vlist in otheritems - for v in vlist - ] - for k, v in otherdictitems: - self[k] = v - if isinstance(v[0], ParseResults): - v[0]._parent = self - - self._toklist += other._toklist - self._all_names |= other._all_names - return self - - def __radd__(self, other) -> "ParseResults": - if isinstance(other, int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__(self) -> str: - return f"{type(self).__name__}({self._toklist!r}, {self.as_dict()})" - - def __str__(self) -> str: - return ( - "[" - + ", ".join( - [ - str(i) if isinstance(i, ParseResults) else repr(i) - for i in self._toklist - ] - ) - + "]" - ) - - def _asStringList(self, sep=""): - out = [] - for item in self._toklist: - if out and sep: - out.append(sep) - if isinstance(item, ParseResults): - out += item._asStringList() - else: - out.append(str(item)) - return out - - def as_list(self) -> list: - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - - patt = Word(alphas)[1, ...] - result = patt.parse_string("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] - - # Use as_list() to create an actual list - result_list = result.as_list() - print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [ - res.as_list() if isinstance(res, ParseResults) else res - for res in self._toklist - ] - - def as_dict(self) -> dict: - """ - Returns the named parse results as a nested dictionary. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string('12/31/1999') - print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.as_dict() - print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.as_dict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - - def to_item(obj): - if isinstance(obj, ParseResults): - return obj.as_dict() if obj.haskeys() else [to_item(v) for v in obj] - else: - return obj - - return dict((k, to_item(v)) for k, v in self.items()) - - def copy(self) -> "ParseResults": - """ - Returns a new shallow copy of a :class:`ParseResults` object. `ParseResults` - items contained within the source are shared with the copy. Use - :class:`ParseResults.deepcopy()` to create a copy with its own separate - content values. - """ - ret = ParseResults(self._toklist) - ret._tokdict = self._tokdict.copy() - ret._parent = self._parent - ret._all_names |= self._all_names - ret._name = self._name - return ret - - def deepcopy(self) -> "ParseResults": - """ - Returns a new deep copy of a :class:`ParseResults` object. - """ - ret = self.copy() - # replace values with copies if they are of known mutable types - for i, obj in enumerate(self._toklist): - if isinstance(obj, ParseResults): - self._toklist[i] = obj.deepcopy() - elif isinstance(obj, (str, bytes)): - pass - elif isinstance(obj, MutableMapping): - self._toklist[i] = dest = type(obj)() - for k, v in obj.items(): - dest[k] = v.deepcopy() if isinstance(v, ParseResults) else v - elif isinstance(obj, Container): - self._toklist[i] = type(obj)( - v.deepcopy() if isinstance(v, ParseResults) else v for v in obj - ) - return ret - - def get_name(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = user_data[1, ...] - - result = user_info.parse_string("22 111-22-3333 #221B") - for item in result: - print(item.get_name(), ':', item[0]) - - prints:: - - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self._name: - return self._name - elif self._parent: - par: "ParseResults" = self._parent - parent_tokdict_items = par._tokdict.items() - return next( - ( - k - for k, vlist in parent_tokdict_items - for v, loc in vlist - if v is self - ), - None, - ) - elif ( - len(self) == 1 - and len(self._tokdict) == 1 - and next(iter(self._tokdict.values()))[0][1] in (0, -1) - ): - return next(iter(self._tokdict.keys())) - else: - return None - - def dump(self, indent="", full=True, include_list=True, _depth=0) -> str: - """ - Diagnostic method for listing out the contents of - a :class:`ParseResults`. Accepts an optional ``indent`` argument so - that this string can be embedded in a nested display of other data. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string('1999/12/31') - print(result.dump()) - - prints:: - - ['1999', '/', '12', '/', '31'] - - day: '31' - - month: '12' - - year: '1999' - """ - out = [] - NL = "\n" - out.append(indent + str(self.as_list()) if include_list else "") - - if full: - if self.haskeys(): - items = sorted((str(k), v) for k, v in self.items()) - for k, v in items: - if out: - out.append(NL) - out.append(f"{indent}{(' ' * _depth)}- {k}: ") - if isinstance(v, ParseResults): - if v: - out.append( - v.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ) - ) - else: - out.append(str(v)) - else: - out.append(repr(v)) - if any(isinstance(vv, ParseResults) for vv in self): - v = self - for i, vv in enumerate(v): - if isinstance(vv, ParseResults): - out.append( - "\n{}{}[{}]:\n{}{}{}".format( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - vv.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ), - ) - ) - else: - out.append( - "\n%s%s[%d]:\n%s%s%s" - % ( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - str(vv), - ) - ) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the - `pprint `_ module. - Accepts additional positional or keyword args as defined for - `pprint.pprint `_ . - - Example:: - - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(DelimitedList(term))) - result = func.parse_string("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - - prints:: - - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.as_list(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( - self._toklist, - ( - self._tokdict.copy(), - None, - self._all_names, - self._name, - ), - ) - - def __setstate__(self, state): - self._toklist, (self._tokdict, par, inAccumNames, self._name) = state - self._all_names = set(inAccumNames) - self._parent = None - - def __getnewargs__(self): - return self._toklist, self._name - - def __dir__(self): - return dir(type(self)) + list(self.keys()) - - @classmethod - def from_dict(cls, other, name=None) -> "ParseResults": - """ - Helper classmethod to construct a ``ParseResults`` from a ``dict``, preserving the - name-value relations as results names. If an optional ``name`` argument is - given, a nested ``ParseResults`` will be returned. - """ - - def is_iterable(obj): - try: - iter(obj) - except Exception: - return False - # str's are iterable, but in pyparsing, we don't want to iterate over them - else: - return not isinstance(obj, str_type) - - ret = cls([]) - for k, v in other.items(): - if isinstance(v, Mapping): - ret += cls.from_dict(v, name=k) - else: - ret += cls([v], name=k, asList=is_iterable(v)) - if name is not None: - ret = cls([ret], name=name) - return ret - - asList = as_list - """Deprecated - use :class:`as_list`""" - asDict = as_dict - """Deprecated - use :class:`as_dict`""" - getName = get_name - """Deprecated - use :class:`get_name`""" - - -MutableMapping.register(ParseResults) -MutableSequence.register(ParseResults) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py deleted file mode 100644 index 6a254c1c..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py +++ /dev/null @@ -1,331 +0,0 @@ -# testing.py - -from contextlib import contextmanager -import typing - -from .core import ( - ParserElement, - ParseException, - Keyword, - __diag__, - __compat__, -) - - -class pyparsing_test: - """ - namespace class for classes useful in writing unit tests - """ - - class reset_pyparsing_context: - """ - Context manager to be used when writing unit tests that modify pyparsing config values: - - packrat parsing - - bounded recursion parsing - - default whitespace characters. - - default keyword characters - - literal string auto-conversion class - - __diag__ settings - - Example:: - - with reset_pyparsing_context(): - # test that literals used to construct a grammar are automatically suppressed - ParserElement.inlineLiteralsUsing(Suppress) - - term = Word(alphas) | Word(nums) - group = Group('(' + term[...] + ')') - - # assert that the '()' characters are not included in the parsed tokens - self.assertParseAndCheckList(group, "(abc 123 def)", ['abc', '123', 'def']) - - # after exiting context manager, literals are converted to Literal expressions again - """ - - def __init__(self): - self._save_context = {} - - def save(self): - self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS - self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS - - self._save_context[ - "literal_string_class" - ] = ParserElement._literalStringClass - - self._save_context["verbose_stacktrace"] = ParserElement.verbose_stacktrace - - self._save_context["packrat_enabled"] = ParserElement._packratEnabled - if ParserElement._packratEnabled: - self._save_context[ - "packrat_cache_size" - ] = ParserElement.packrat_cache.size - else: - self._save_context["packrat_cache_size"] = None - self._save_context["packrat_parse"] = ParserElement._parse - self._save_context[ - "recursion_enabled" - ] = ParserElement._left_recursion_enabled - - self._save_context["__diag__"] = { - name: getattr(__diag__, name) for name in __diag__._all_names - } - - self._save_context["__compat__"] = { - "collect_all_And_tokens": __compat__.collect_all_And_tokens - } - - return self - - def restore(self): - # reset pyparsing global state - if ( - ParserElement.DEFAULT_WHITE_CHARS - != self._save_context["default_whitespace"] - ): - ParserElement.set_default_whitespace_chars( - self._save_context["default_whitespace"] - ) - - ParserElement.verbose_stacktrace = self._save_context["verbose_stacktrace"] - - Keyword.DEFAULT_KEYWORD_CHARS = self._save_context["default_keyword_chars"] - ParserElement.inlineLiteralsUsing( - self._save_context["literal_string_class"] - ) - - for name, value in self._save_context["__diag__"].items(): - (__diag__.enable if value else __diag__.disable)(name) - - ParserElement._packratEnabled = False - if self._save_context["packrat_enabled"]: - ParserElement.enable_packrat(self._save_context["packrat_cache_size"]) - else: - ParserElement._parse = self._save_context["packrat_parse"] - ParserElement._left_recursion_enabled = self._save_context[ - "recursion_enabled" - ] - - __compat__.collect_all_And_tokens = self._save_context["__compat__"] - - return self - - def copy(self): - ret = type(self)() - ret._save_context.update(self._save_context) - return ret - - def __enter__(self): - return self.save() - - def __exit__(self, *args): - self.restore() - - class TestParseResultsAsserts: - """ - A mixin class to add parse results assertion methods to normal unittest.TestCase classes. - """ - - def assertParseResultsEquals( - self, result, expected_list=None, expected_dict=None, msg=None - ): - """ - Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``, - and compare any defined results names with an optional ``expected_dict``. - """ - if expected_list is not None: - self.assertEqual(expected_list, result.as_list(), msg=msg) - if expected_dict is not None: - self.assertEqual(expected_dict, result.as_dict(), msg=msg) - - def assertParseAndCheckList( - self, expr, test_string, expected_list, msg=None, verbose=True - ): - """ - Convenience wrapper assert to test a parser element and input string, and assert that - the resulting ``ParseResults.asList()`` is equal to the ``expected_list``. - """ - result = expr.parse_string(test_string, parse_all=True) - if verbose: - print(result.dump()) - else: - print(result.as_list()) - self.assertParseResultsEquals(result, expected_list=expected_list, msg=msg) - - def assertParseAndCheckDict( - self, expr, test_string, expected_dict, msg=None, verbose=True - ): - """ - Convenience wrapper assert to test a parser element and input string, and assert that - the resulting ``ParseResults.asDict()`` is equal to the ``expected_dict``. - """ - result = expr.parse_string(test_string, parseAll=True) - if verbose: - print(result.dump()) - else: - print(result.as_list()) - self.assertParseResultsEquals(result, expected_dict=expected_dict, msg=msg) - - def assertRunTestResults( - self, run_tests_report, expected_parse_results=None, msg=None - ): - """ - Unit test assertion to evaluate output of ``ParserElement.runTests()``. If a list of - list-dict tuples is given as the ``expected_parse_results`` argument, then these are zipped - with the report tuples returned by ``runTests`` and evaluated using ``assertParseResultsEquals``. - Finally, asserts that the overall ``runTests()`` success value is ``True``. - - :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests - :param expected_parse_results (optional): [tuple(str, list, dict, Exception)] - """ - run_test_success, run_test_results = run_tests_report - - if expected_parse_results is not None: - merged = [ - (*rpt, expected) - for rpt, expected in zip(run_test_results, expected_parse_results) - ] - for test_string, result, expected in merged: - # expected should be a tuple containing a list and/or a dict or an exception, - # and optional failure message string - # an empty tuple will skip any result validation - fail_msg = next( - (exp for exp in expected if isinstance(exp, str)), None - ) - expected_exception = next( - ( - exp - for exp in expected - if isinstance(exp, type) and issubclass(exp, Exception) - ), - None, - ) - if expected_exception is not None: - with self.assertRaises( - expected_exception=expected_exception, msg=fail_msg or msg - ): - if isinstance(result, Exception): - raise result - else: - expected_list = next( - (exp for exp in expected if isinstance(exp, list)), None - ) - expected_dict = next( - (exp for exp in expected if isinstance(exp, dict)), None - ) - if (expected_list, expected_dict) != (None, None): - self.assertParseResultsEquals( - result, - expected_list=expected_list, - expected_dict=expected_dict, - msg=fail_msg or msg, - ) - else: - # warning here maybe? - print(f"no validation for {test_string!r}") - - # do this last, in case some specific test results can be reported instead - self.assertTrue( - run_test_success, msg=msg if msg is not None else "failed runTests" - ) - - @contextmanager - def assertRaisesParseException(self, exc_type=ParseException, msg=None): - with self.assertRaises(exc_type, msg=msg): - yield - - @staticmethod - def with_line_numbers( - s: str, - start_line: typing.Optional[int] = None, - end_line: typing.Optional[int] = None, - expand_tabs: bool = True, - eol_mark: str = "|", - mark_spaces: typing.Optional[str] = None, - mark_control: typing.Optional[str] = None, - ) -> str: - """ - Helpful method for debugging a parser - prints a string with line and column numbers. - (Line and column numbers are 1-based.) - - :param s: tuple(bool, str - string to be printed with line and column numbers - :param start_line: int - (optional) starting line number in s to print (default=1) - :param end_line: int - (optional) ending line number in s to print (default=len(s)) - :param expand_tabs: bool - (optional) expand tabs to spaces, to match the pyparsing default - :param eol_mark: str - (optional) string to mark the end of lines, helps visualize trailing spaces (default="|") - :param mark_spaces: str - (optional) special character to display in place of spaces - :param mark_control: str - (optional) convert non-printing control characters to a placeholding - character; valid values: - - "unicode" - replaces control chars with Unicode symbols, such as "␍" and "␊" - - any single character string - replace control characters with given string - - None (default) - string is displayed as-is - - :return: str - input string with leading line numbers and column number headers - """ - if expand_tabs: - s = s.expandtabs() - if mark_control is not None: - mark_control = typing.cast(str, mark_control) - if mark_control == "unicode": - transtable_map = { - c: u for c, u in zip(range(0, 33), range(0x2400, 0x2433)) - } - transtable_map[127] = 0x2421 - tbl = str.maketrans(transtable_map) - eol_mark = "" - else: - ord_mark_control = ord(mark_control) - tbl = str.maketrans( - {c: ord_mark_control for c in list(range(0, 32)) + [127]} - ) - s = s.translate(tbl) - if mark_spaces is not None and mark_spaces != " ": - if mark_spaces == "unicode": - tbl = str.maketrans({9: 0x2409, 32: 0x2423}) - s = s.translate(tbl) - else: - s = s.replace(" ", mark_spaces) - if start_line is None: - start_line = 1 - if end_line is None: - end_line = len(s) - end_line = min(end_line, len(s)) - start_line = min(max(1, start_line), end_line) - - if mark_control != "unicode": - s_lines = s.splitlines()[start_line - 1 : end_line] - else: - s_lines = [line + "␊" for line in s.split("␊")[start_line - 1 : end_line]] - if not s_lines: - return "" - - lineno_width = len(str(end_line)) - max_line_len = max(len(line) for line in s_lines) - lead = " " * (lineno_width + 1) - if max_line_len >= 99: - header0 = ( - lead - + "".join( - f"{' ' * 99}{(i + 1) % 100}" - for i in range(max(max_line_len // 100, 1)) - ) - + "\n" - ) - else: - header0 = "" - header1 = ( - header0 - + lead - + "".join(f" {(i + 1) % 10}" for i in range(-(-max_line_len // 10))) - + "\n" - ) - header2 = lead + "1234567890" * (-(-max_line_len // 10)) + "\n" - return ( - header1 - + header2 - + "\n".join( - f"{i:{lineno_width}d}:{line}{eol_mark}" - for i, line in enumerate(s_lines, start=start_line) - ) - + "\n" - ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py deleted file mode 100644 index ec0b3a4f..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py +++ /dev/null @@ -1,361 +0,0 @@ -# unicode.py - -import sys -from itertools import filterfalse -from typing import List, Tuple, Union - - -class _lazyclassproperty: - def __init__(self, fn): - self.fn = fn - self.__doc__ = fn.__doc__ - self.__name__ = fn.__name__ - - def __get__(self, obj, cls): - if cls is None: - cls = type(obj) - if not hasattr(cls, "_intern") or any( - cls._intern is getattr(superclass, "_intern", []) - for superclass in cls.__mro__[1:] - ): - cls._intern = {} - attrname = self.fn.__name__ - if attrname not in cls._intern: - cls._intern[attrname] = self.fn(cls) - return cls._intern[attrname] - - -UnicodeRangeList = List[Union[Tuple[int, int], Tuple[int]]] - - -class unicode_set: - """ - A set of Unicode characters, for language-specific strings for - ``alphas``, ``nums``, ``alphanums``, and ``printables``. - A unicode_set is defined by a list of ranges in the Unicode character - set, in a class attribute ``_ranges``. Ranges can be specified using - 2-tuples or a 1-tuple, such as:: - - _ranges = [ - (0x0020, 0x007e), - (0x00a0, 0x00ff), - (0x0100,), - ] - - Ranges are left- and right-inclusive. A 1-tuple of (x,) is treated as (x, x). - - A unicode set can also be defined using multiple inheritance of other unicode sets:: - - class CJK(Chinese, Japanese, Korean): - pass - """ - - _ranges: UnicodeRangeList = [] - - @_lazyclassproperty - def _chars_for_ranges(cls): - ret = [] - for cc in cls.__mro__: - if cc is unicode_set: - break - for rr in getattr(cc, "_ranges", ()): - ret.extend(range(rr[0], rr[-1] + 1)) - return [chr(c) for c in sorted(set(ret))] - - @_lazyclassproperty - def printables(cls): - """all non-whitespace characters in this range""" - return "".join(filterfalse(str.isspace, cls._chars_for_ranges)) - - @_lazyclassproperty - def alphas(cls): - """all alphabetic characters in this range""" - return "".join(filter(str.isalpha, cls._chars_for_ranges)) - - @_lazyclassproperty - def nums(cls): - """all numeric digit characters in this range""" - return "".join(filter(str.isdigit, cls._chars_for_ranges)) - - @_lazyclassproperty - def alphanums(cls): - """all alphanumeric characters in this range""" - return cls.alphas + cls.nums - - @_lazyclassproperty - def identchars(cls): - """all characters in this range that are valid identifier characters, plus underscore '_'""" - return "".join( - sorted( - set( - "".join(filter(str.isidentifier, cls._chars_for_ranges)) - + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº" - + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" - + "_" - ) - ) - ) - - @_lazyclassproperty - def identbodychars(cls): - """ - all characters in this range that are valid identifier body characters, - plus the digits 0-9, and · (Unicode MIDDLE DOT) - """ - return "".join( - sorted( - set( - cls.identchars - + "0123456789·" - + "".join( - [c for c in cls._chars_for_ranges if ("_" + c).isidentifier()] - ) - ) - ) - ) - - @_lazyclassproperty - def identifier(cls): - """ - a pyparsing Word expression for an identifier using this range's definitions for - identchars and identbodychars - """ - from pip._vendor.pyparsing import Word - - return Word(cls.identchars, cls.identbodychars) - - -class pyparsing_unicode(unicode_set): - """ - A namespace class for defining common language unicode_sets. - """ - - # fmt: off - - # define ranges in language character sets - _ranges: UnicodeRangeList = [ - (0x0020, sys.maxunicode), - ] - - class BasicMultilingualPlane(unicode_set): - """Unicode set for the Basic Multilingual Plane""" - _ranges: UnicodeRangeList = [ - (0x0020, 0xFFFF), - ] - - class Latin1(unicode_set): - """Unicode set for Latin-1 Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0020, 0x007E), - (0x00A0, 0x00FF), - ] - - class LatinA(unicode_set): - """Unicode set for Latin-A Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0100, 0x017F), - ] - - class LatinB(unicode_set): - """Unicode set for Latin-B Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0180, 0x024F), - ] - - class Greek(unicode_set): - """Unicode set for Greek Unicode Character Ranges""" - _ranges: UnicodeRangeList = [ - (0x0342, 0x0345), - (0x0370, 0x0377), - (0x037A, 0x037F), - (0x0384, 0x038A), - (0x038C,), - (0x038E, 0x03A1), - (0x03A3, 0x03E1), - (0x03F0, 0x03FF), - (0x1D26, 0x1D2A), - (0x1D5E,), - (0x1D60,), - (0x1D66, 0x1D6A), - (0x1F00, 0x1F15), - (0x1F18, 0x1F1D), - (0x1F20, 0x1F45), - (0x1F48, 0x1F4D), - (0x1F50, 0x1F57), - (0x1F59,), - (0x1F5B,), - (0x1F5D,), - (0x1F5F, 0x1F7D), - (0x1F80, 0x1FB4), - (0x1FB6, 0x1FC4), - (0x1FC6, 0x1FD3), - (0x1FD6, 0x1FDB), - (0x1FDD, 0x1FEF), - (0x1FF2, 0x1FF4), - (0x1FF6, 0x1FFE), - (0x2129,), - (0x2719, 0x271A), - (0xAB65,), - (0x10140, 0x1018D), - (0x101A0,), - (0x1D200, 0x1D245), - (0x1F7A1, 0x1F7A7), - ] - - class Cyrillic(unicode_set): - """Unicode set for Cyrillic Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0400, 0x052F), - (0x1C80, 0x1C88), - (0x1D2B,), - (0x1D78,), - (0x2DE0, 0x2DFF), - (0xA640, 0xA672), - (0xA674, 0xA69F), - (0xFE2E, 0xFE2F), - ] - - class Chinese(unicode_set): - """Unicode set for Chinese Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x2E80, 0x2E99), - (0x2E9B, 0x2EF3), - (0x31C0, 0x31E3), - (0x3400, 0x4DB5), - (0x4E00, 0x9FEF), - (0xA700, 0xA707), - (0xF900, 0xFA6D), - (0xFA70, 0xFAD9), - (0x16FE2, 0x16FE3), - (0x1F210, 0x1F212), - (0x1F214, 0x1F23B), - (0x1F240, 0x1F248), - (0x20000, 0x2A6D6), - (0x2A700, 0x2B734), - (0x2B740, 0x2B81D), - (0x2B820, 0x2CEA1), - (0x2CEB0, 0x2EBE0), - (0x2F800, 0x2FA1D), - ] - - class Japanese(unicode_set): - """Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges""" - - class Kanji(unicode_set): - "Unicode set for Kanji Unicode Character Range" - _ranges: UnicodeRangeList = [ - (0x4E00, 0x9FBF), - (0x3000, 0x303F), - ] - - class Hiragana(unicode_set): - """Unicode set for Hiragana Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x3041, 0x3096), - (0x3099, 0x30A0), - (0x30FC,), - (0xFF70,), - (0x1B001,), - (0x1B150, 0x1B152), - (0x1F200,), - ] - - class Katakana(unicode_set): - """Unicode set for Katakana Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x3099, 0x309C), - (0x30A0, 0x30FF), - (0x31F0, 0x31FF), - (0x32D0, 0x32FE), - (0xFF65, 0xFF9F), - (0x1B000,), - (0x1B164, 0x1B167), - (0x1F201, 0x1F202), - (0x1F213,), - ] - - 漢字 = Kanji - カタカナ = Katakana - ひらがな = Hiragana - - _ranges = ( - Kanji._ranges - + Hiragana._ranges - + Katakana._ranges - ) - - class Hangul(unicode_set): - """Unicode set for Hangul (Korean) Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x1100, 0x11FF), - (0x302E, 0x302F), - (0x3131, 0x318E), - (0x3200, 0x321C), - (0x3260, 0x327B), - (0x327E,), - (0xA960, 0xA97C), - (0xAC00, 0xD7A3), - (0xD7B0, 0xD7C6), - (0xD7CB, 0xD7FB), - (0xFFA0, 0xFFBE), - (0xFFC2, 0xFFC7), - (0xFFCA, 0xFFCF), - (0xFFD2, 0xFFD7), - (0xFFDA, 0xFFDC), - ] - - Korean = Hangul - - class CJK(Chinese, Japanese, Hangul): - """Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range""" - - class Thai(unicode_set): - """Unicode set for Thai Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0E01, 0x0E3A), - (0x0E3F, 0x0E5B) - ] - - class Arabic(unicode_set): - """Unicode set for Arabic Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0600, 0x061B), - (0x061E, 0x06FF), - (0x0700, 0x077F), - ] - - class Hebrew(unicode_set): - """Unicode set for Hebrew Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0591, 0x05C7), - (0x05D0, 0x05EA), - (0x05EF, 0x05F4), - (0xFB1D, 0xFB36), - (0xFB38, 0xFB3C), - (0xFB3E,), - (0xFB40, 0xFB41), - (0xFB43, 0xFB44), - (0xFB46, 0xFB4F), - ] - - class Devanagari(unicode_set): - """Unicode set for Devanagari Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0900, 0x097F), - (0xA8E0, 0xA8FF) - ] - - BMP = BasicMultilingualPlane - - # add language identifiers using language Unicode - العربية = Arabic - 中文 = Chinese - кириллица = Cyrillic - Ελληνικά = Greek - עִברִית = Hebrew - 日本語 = Japanese - 한국어 = Korean - ไทย = Thai - देवनागरी = Devanagari - - # fmt: on diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py b/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py deleted file mode 100644 index d8d3f414..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py +++ /dev/null @@ -1,284 +0,0 @@ -# util.py -import inspect -import warnings -import types -import collections -import itertools -from functools import lru_cache, wraps -from typing import Callable, List, Union, Iterable, TypeVar, cast - -_bslash = chr(92) -C = TypeVar("C", bound=Callable) - - -class __config_flags: - """Internal class for defining compatibility and debugging flags""" - - _all_names: List[str] = [] - _fixed_names: List[str] = [] - _type_desc = "configuration" - - @classmethod - def _set(cls, dname, value): - if dname in cls._fixed_names: - warnings.warn( - f"{cls.__name__}.{dname} {cls._type_desc} is {str(getattr(cls, dname)).upper()}" - f" and cannot be overridden", - stacklevel=3, - ) - return - if dname in cls._all_names: - setattr(cls, dname, value) - else: - raise ValueError(f"no such {cls._type_desc} {dname!r}") - - enable = classmethod(lambda cls, name: cls._set(name, True)) - disable = classmethod(lambda cls, name: cls._set(name, False)) - - -@lru_cache(maxsize=128) -def col(loc: int, strg: str) -> int: - """ - Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See - :class:`ParserElement.parse_string` for more - information on parsing strings containing ```` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - """ - s = strg - return 1 if 0 < loc < len(s) and s[loc - 1] == "\n" else loc - s.rfind("\n", 0, loc) - - -@lru_cache(maxsize=128) -def lineno(loc: int, strg: str) -> int: - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note - the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`ParserElement.parse_string` - for more information on parsing strings containing ```` s, and - suggested methods to maintain a consistent view of the parsed string, the - parse location, and line and column positions within the parsed string. - """ - return strg.count("\n", 0, loc) + 1 - - -@lru_cache(maxsize=128) -def line(loc: int, strg: str) -> str: - """ - Returns the line of text containing loc within a string, counting newlines as line separators. - """ - last_cr = strg.rfind("\n", 0, loc) - next_cr = strg.find("\n", loc) - return strg[last_cr + 1 : next_cr] if next_cr >= 0 else strg[last_cr + 1 :] - - -class _UnboundedCache: - def __init__(self): - cache = {} - cache_get = cache.get - self.not_in_cache = not_in_cache = object() - - def get(_, key): - return cache_get(key, not_in_cache) - - def set_(_, key, value): - cache[key] = value - - def clear(_): - cache.clear() - - self.size = None - self.get = types.MethodType(get, self) - self.set = types.MethodType(set_, self) - self.clear = types.MethodType(clear, self) - - -class _FifoCache: - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - cache = {} - keyring = [object()] * size - cache_get = cache.get - cache_pop = cache.pop - keyiter = itertools.cycle(range(size)) - - def get(_, key): - return cache_get(key, not_in_cache) - - def set_(_, key, value): - cache[key] = value - i = next(keyiter) - cache_pop(keyring[i], None) - keyring[i] = key - - def clear(_): - cache.clear() - keyring[:] = [object()] * size - - self.size = size - self.get = types.MethodType(get, self) - self.set = types.MethodType(set_, self) - self.clear = types.MethodType(clear, self) - - -class LRUMemo: - """ - A memoizing mapping that retains `capacity` deleted items - - The memo tracks retained items by their access order; once `capacity` items - are retained, the least recently used item is discarded. - """ - - def __init__(self, capacity): - self._capacity = capacity - self._active = {} - self._memory = collections.OrderedDict() - - def __getitem__(self, key): - try: - return self._active[key] - except KeyError: - self._memory.move_to_end(key) - return self._memory[key] - - def __setitem__(self, key, value): - self._memory.pop(key, None) - self._active[key] = value - - def __delitem__(self, key): - try: - value = self._active.pop(key) - except KeyError: - pass - else: - while len(self._memory) >= self._capacity: - self._memory.popitem(last=False) - self._memory[key] = value - - def clear(self): - self._active.clear() - self._memory.clear() - - -class UnboundedMemo(dict): - """ - A memoizing mapping that retains all deleted items - """ - - def __delitem__(self, key): - pass - - -def _escape_regex_range_chars(s: str) -> str: - # escape these chars: ^-[] - for c in r"\^-[]": - s = s.replace(c, _bslash + c) - s = s.replace("\n", r"\n") - s = s.replace("\t", r"\t") - return str(s) - - -def _collapse_string_to_ranges( - s: Union[str, Iterable[str]], re_escape: bool = True -) -> str: - def is_consecutive(c): - c_int = ord(c) - is_consecutive.prev, prev = c_int, is_consecutive.prev - if c_int - prev > 1: - is_consecutive.value = next(is_consecutive.counter) - return is_consecutive.value - - is_consecutive.prev = 0 # type: ignore [attr-defined] - is_consecutive.counter = itertools.count() # type: ignore [attr-defined] - is_consecutive.value = -1 # type: ignore [attr-defined] - - def escape_re_range_char(c): - return "\\" + c if c in r"\^-][" else c - - def no_escape_re_range_char(c): - return c - - if not re_escape: - escape_re_range_char = no_escape_re_range_char - - ret = [] - s = "".join(sorted(set(s))) - if len(s) > 3: - for _, chars in itertools.groupby(s, key=is_consecutive): - first = last = next(chars) - last = collections.deque( - itertools.chain(iter([last]), chars), maxlen=1 - ).pop() - if first == last: - ret.append(escape_re_range_char(first)) - else: - sep = "" if ord(last) == ord(first) + 1 else "-" - ret.append( - f"{escape_re_range_char(first)}{sep}{escape_re_range_char(last)}" - ) - else: - ret = [escape_re_range_char(c) for c in s] - - return "".join(ret) - - -def _flatten(ll: list) -> list: - ret = [] - for i in ll: - if isinstance(i, list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - - -def _make_synonym_function(compat_name: str, fn: C) -> C: - # In a future version, uncomment the code in the internal _inner() functions - # to begin emitting DeprecationWarnings. - - # Unwrap staticmethod/classmethod - fn = getattr(fn, "__func__", fn) - - # (Presence of 'self' arg in signature is used by explain_exception() methods, so we take - # some extra steps to add it if present in decorated function.) - if "self" == list(inspect.signature(fn).parameters)[0]: - - @wraps(fn) - def _inner(self, *args, **kwargs): - # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 - # ) - return fn(self, *args, **kwargs) - - else: - - @wraps(fn) - def _inner(*args, **kwargs): - # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 - # ) - return fn(*args, **kwargs) - - _inner.__doc__ = f"""Deprecated - use :class:`{fn.__name__}`""" - _inner.__name__ = compat_name - _inner.__annotations__ = fn.__annotations__ - if isinstance(fn, types.FunctionType): - _inner.__kwdefaults__ = fn.__kwdefaults__ - elif isinstance(fn, type) and hasattr(fn, "__init__"): - _inner.__kwdefaults__ = fn.__init__.__kwdefaults__ - else: - _inner.__kwdefaults__ = None - _inner.__qualname__ = fn.__qualname__ - return cast(C, _inner) - - -def replaced_by_pep8(fn: C) -> Callable[[Callable], C]: - """ - Decorator for pre-PEP8 compatibility synonyms, to link them to the new function. - """ - return lambda other: _make_synonym_function(other.__name__, fn) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc index b90d410c82dc4585732bafddb8dfe76131208106..fd56e3f01051a294cb98c2f8f8f242bb971419eb 100644 GIT binary patch delta 98 zcmeytGJ%!nG%qg~0}$9UGNy0jSB`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i=Inz0uE_>>{k delta 74 zcmbQh`h$h%G%qg~0}uq?|CY9qXFa1qg??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL begRM>KQA#yKO;3KC%-(uC?{nyGgB`Bu)!K| diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc index 00f17c09263c6d2ce330141fbdbe9af24c808801..baa4ec9277723c1ad922db861587eaa6d167b883 100644 GIT binary patch delta 97 zcmeBVUdYUInwOW00SIgv8Pg~79QWwg4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFix yPAtjH&(jZ1PRvOyQgBR8Oi9hH)c5gm(FZc}U9uAM((?m~^0QKtOC~cjwgCXi5FmO0 delta 73 zcmZ3;+{w&ynwOW00SJQce@mOlbKIa@KeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv a04S56mzblUk(!f}U!Gr-lQLPFu?+x?SsE1p diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc index b44257123430199e8227c73949027ce6d49e2081..2ab8fe42b5108badd002852245d7c2d9b98cf1e9 100644 GIT binary patch delta 300 zcmbPHJiVCbG%qg~0}$9UGNy0jNoMls)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t2b$c# zaEFt(BV~f~0`;q$S}PLoaPahVc5+Too=|v^LwSbVB@X59%nV%G*EzK=a%xRBV}7Qq zh0r!5{3@sF3c)-4!u^$JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=fJ5!9c1<-^BhC7_R9Vru>7pPz1)cU}{$f~j;@eT)1 zKW8WB1my{Z7dez?xLx8<{>}`P`3{o)2qGrCGCwoaL+GCoeuYyNq+4c%;2nP9{>skE z8G_w4AYC#bT{53Q#O4T=KSGRUlS9Qd Q`pykh2Ufh9-FyNQ03W7d3;+NC diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc index 58e255d11f885cd638644ca892c8a57e6480a618..d36e364e02b34010a057d31bc398ed0aa5ad877c 100644 GIT binary patch delta 99 zcmX@j@tA|>G%qg~0}$9UGNy0j5oGe1qaRwFT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKmFXWN0K3^600000 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc index ff2a73867e085e332b8be755ef935a4f3c4ef8ee..8d63be29a94dd2a957e96101569bb6ca2b1b90d6 100644 GIT binary patch delta 380 zcmcamaIk>qG%qg~0}$9UGNy0j`Nr%qUq7@swWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)i;i#FA&E4>Y-f z;SMKnN6G}}1?pEhwN@nF;o#}#?BtxFJfZL+hw==!OB~AInHjjWuXAc$~WYGIbR2UhbPPPve-3Aoes}CLXtC- zXH;Gm((H8pz|0_}yZMjcPag3Aumc`&@iaK!5D>pEpm0$@;hKQbWI=fqW(Gm!%@*>1 znHXnJHd9jKxytEzgM$a;124wO8A>wDS2(36_bSN)1*9i$P?8e>NnGIc{Pmp!C~|>Q KYV%{ITu}g4_IkPi delta 444 zcmX?DaG`+bG%qg~0}uq?|CY9q=Nq#@yMAbKYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pI7fYVC1<-^BhC7_R9Vru>7pPz1)cU}{$f~j;@eT)1 zKW8WB1my{Z7dez?xLx8<{>}`P`3{o)2qGrGVtHn$htNMG{0gTkNVm)i!8`oI{gs`S zGX%S9K)Pf=x@10qh|PalS-E6CF)#~rJrEH2!py)cIYW59%uJaDCD(a$J~9KvH_HpC zFfzWH>>}96@<2lU%jA=S%F>r5b%6RgwK_cS2uaRRo>6&ONVC)V12a%)Gn3Fy9+^riKzg&K{9h)<)sxMYlp-#3dV;*cdxL`q z= 2.0.0 < 4.0.0 assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) else: - raise Exception("You need either charset_normalizer or chardet installed") + # pip does not need or use character detection + pass def _check_cryptography(cryptography_version): diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc index 326084e8ba176c042d0f5ef371fda7912a5b8453..9bfc237992ea64a467866500ef695a27ac74462b 100644 GIT binary patch delta 1300 zcmah}OKclO7@pZ(uf1!p?OofADJfJ-h2EFp0PaX^I&NIYgXF{t#wNc+wIfB$p- z+1>AFKdVH))HD^awG83bVPY6f!{V?!zh?<3Xvud03RyvhiUI_HLs+zv-1+f^gIL}d zPdEq^U_nc9Vs0G8A;57j#3FS|-G?V0??B%}a13NHO9C5K*outfy>l#DbF`$JLMh0L zrtG=lkA?G5XTnuc+NTtp9%qBRTFjYrGbrQRpuIp#!NgJ=XZD40Ps~SfvM9@T-O0K+ zlw)y{WjJ}afC_FA6@5M7sBQ_B=-aRqRgvm*NoUqQkLV{b7xDF!Be^wHqhG_BJ)bz^ zEW0ac#a%_KZXMNqZo;|ZUPV{kYv`Jd z;l26}cvHL$b|9;yvnnz>s(=jNcIiJh2?C!_?SKPYTofnTr|*m3Nq`~Of0?0Q$UliU z--7g5&L4amOhaiGR3cPSrl%v!f$$q83WJLHgZvM{*@{RM`ht?5sz{@N*LOODk?7#= zNH+U@+_gqxr#qluDdw~9RyRFNysGt@xr1%9+UT{nUECdb)uy%GHV2(vw|c8>I+zr% zv`q`UyVZ@2MwJP@hHZAYdM}cmjoSnIs`|2;VU=s_@#^$}`W~F8FNHr1{44`Sqv6P3 zM)0IDiEYI1KT5OOb=ly0jCQn5I7uI9lYw)LxOMQIR)>*rtMvwJk9E;%(M;?CE@K5o{UtesVBn)E}rF3q<8e9{uC2O z;dQs)BZDR(JwiXy=it-ySTDnA`kOujXKCJ;Qs=lIAoBpw6{A)hiDth;F7Z6ia9HH9 z#39Y$G94PLOC#CsS=jN&I_GY1c#gp+{56sxtZW#f#0F`0xVcxDZ@};=^T;@kanM`3U;56j;;5qX=a9H{pK_ AlmGw# delta 1599 zcmah}O>7%Q6yEXL>s|lFf3=-BcI-G&a3C=dL7_Bp(k5=xLMjrqkVVKW*-5hQtk<30 zkWwKmrJMj!!U)6xapAxr5kks^3rLk{E*yx&rCJHm144=fQWOaesrZ>$Cxj3rR`S!E z?|X0Nd+*Ko^Wwe!&^N)LkE7qr55LVn5?>9aKxMUWpeb=GPzB`GMOgxz>V1Qg{i;Z9 zK;m2+^h3TDW@$%1C_!P3Z()FQ_VA&I9+jhjgHcnYnLgFO23ip-z=?37m>i=_9LCgu z8g%lLG{Wqq5<=*No{$rO9h#^OuHNfv3MfTYwL4G%wjb<9RRXmQb?9k1?Qo#>#8Gu@ zrG{a8&DFx43>V7C8JZbE89gg!DdtwAs7ueuIXy4uoplU}dbixI7vzH8LsmdC)Gzl_ z4Wh%w5&0Bk0{W0VE zg(mchTycbFYVRBu4$mJHS|i6<+MVp$KD-}C442sauMV`s$JLJY^x>RdbrtAbdN?dl zDK1%><=zEv4=i)n`B`omP%a2V^DfFiy5HCAaRI7S%O6LZ|9?%O=Wra(!BhV@_)t{L z;VS>)+<z8bAyjivvlb!F%`Ga}gjTg~U|m7l4GI}8RE1VftDBaB5LAmE+hgV% zNV9An!MZIdjRvf%Hm}t!Tbj5&2OAbGj|@x7!`DieOGyzdr2^r1oS`aTQ%7)oxXp8YN~y(LbQ zxBP!b#a5k8Sx!6J$VY*5LX4FeCfk9_AWh1_c26G#u57#*90g=Ov;hS2Qd>9ZAUE6o zh(y^I7i@2}sv2|EDlU-s!hKiRo3~>PtuaVvRaXr>$XY|2fSo2M810|b8wR!}Fg7q| ziZMIJ4vm?#U{-&NVOJ6NFw;$b3Fq7oP?uyQ4}pGiG13Qmi5cn1KgcozrlvO#oY#;A zvF%01!h%*`zypjUUq*&g12-b$R`4D&Q*GX|I+ Pcl@NMlH)hK0JVPs@eN;P diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc index c42dc30fb79be6b24728f5d9a435a9cfd31a8c8d..c2dd2bd6222b13ecf5c1485c10fa98ddb4daa632 100644 GIT binary patch delta 112 zcmcc3@|lI_G%qg~0}$9UGNw=DnaXCQXPn7wG;z5eqwd6OJ3V^zLyJ?3iuF^H63bJw z67^m3lS^|`^Gb^KT~kVv6H7Al^Ynw06LV6F6daQiQ&Mv)^?iI?^nr|gm#oCR^!$LL O{H)aElF9oS=KuiLY$m7x delta 88 zcmey&a+`(cG%qg~0}uq?|CTn9XDXYao~M diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc index 9e6453fcedd13c3cae62d8699270a4cf5e148645..e5801f341244dfa1fb2c5a6bfa178baaae0d64e4 100644 GIT binary patch delta 99 zcmey(KUsk1G%qg~0}$9UGNy0jX<_!5pdVVCT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag2D3E_0L_pa3jhEB diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc index 6fd4cfdbd02324a6d1611f1f8e559d73c55754db..f92724312b7e8699527e505e74ca968deea6a85b 100644 GIT binary patch delta 11137 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 delta 131 zcmX?UvE72_G%qg~0}uq?|CY9q$Ciyzce5AUDOQ6V{m|mnqGJ8*#G=GJy`+r9lFUSX zm(=3ylKcYw0-#KOUSf`ZMruw@etCXTPRisM9v^8Jpg|1`Um_S8xP-2AN?zoYyv!;6 afq{|Lk#X`~9tEE7VCE+X*g1qD9F8=L3pZDwYa-5g}Jl#$VJ@(<%2M$5^m hCf%%Btb(5+Hh(oKU=;LcW>lOI@s$BY7s&$60{}urK3V_( delta 163 zcmeCl{g%UfnwOW00SJQce@i>Pk++l0AXh)MIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC%w`5xO`NhvX)89y2rW@;`dT#&p%aE0Ltew3Z(G%qg~0}$9UGNy0j31{+X(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~HIo!00JH%bQ~&?~ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc index c6e75f461b3785fb79935955ba00891c743fb8c1..e5dc14ef27f4f3ecec165bf8ecb7886ace2d52bc 100644 GIT binary patch delta 612 zcmYk3&ubGw6vtizinW;H%1L>PEB85TIS$j#Tk6Esay1`sZE$Bi`oNu{!9N}}<+L;KVwhX4qJ2fFK;CS71?|^G>~Z($z1_LW*Q=;GcB{k45BpYfPh5Xdh-oi<7I`K zux!aTI(iY`w;F7$I^v1$iMU~8exBb|Xe%8a*-S zn!8|nIIH;O-Mm^Zw?SKzKGtm-)Bbl2sNl3k+_s7sv2S5*bo;Ac8#N~wvv(`b9Ui)N z&;DtI8O#;??)rg`qV%On)9L3}p!4PYf0?@INC+?sAz_~C-for+VS(gvY0Se!<1>_1 z%GRf`1-eb?BnE0EsyU?CQy&Vz_gKOdoM3E$!AX**2+N4#fwyuo{M!rqQLb$UXQ+CX zaE=fW&KK6Zw+SBUS;8^I(d@OpQF*Fwzy^l&2kdLacb9X1=v25jsWI;V2wlE(SY`g| Pm$?h0O3|Hp>5<28-f^Lf delta 438 zcmYk2y-EW?6oqGYV*WSLs8ORu+9>RH5rM|&77QTQYrby*nv~Y@#bI%#h9p=#-70g%D%oBYM-bTmip}A16Q9^ErN7}@r zo*`)8Xd4tY6RgcR8@ARc8(uz97VpxRVuL0bx9fn%qt?R~+o9D$=!e$PDGxjez;t!O z)VYdpQ!5u~oC>ZKg1eC~0|gm$%Kse8>9~;9F60pSwj|Y!q7VuwbFP#rU%I-Pf1Xic(M80EhbJdGvXootHfg|iL7eby%5MKOj sY%Y(p>wW1B1mA$BF4134)Sbo$qm+Ic8Jha85L$mH`M8n3O0DYX2P|H7&Hw-a diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc index f0948f7e3702ef5dcfea15976395d6f793c4dab2..ea9b06ba2f39135208034e56e1dca1d9969b423a 100644 GIT binary patch delta 841 zcmdmZlyT-!M&8rByj%=GV9UsuK5rwh9wXzX$u^8$d>JJr1$xQ(`PrGNS&2oP`x%oM z8NW~d#N>xA&woa%!3?snjBf!ev@RG*pg_MK|P$!W<4|1)w1>7=AP`eBogbm!4rVEvv)rhLFT` z?TOl#d1OB_Gl(m0UZL5_q=rkO&P1KdJaS-#KZ_bCA2gPnd_vQD^BNs5CLv7>!zc6V zivulE{8`Kblxxz_o4ipoXmgW(7n6+zP@sX~fsjZC`yDYUs7v@o`)fOE7r0;I*S;Yj zKAmqO-;A>PwKHq43g~`d1)B4LjX^-XgKzSFW9iB73|c3@HJT^{HAq0HgB5Dfi0bBHehe22rZq?*yQys91E>lJ(kwAzFJ_a#~4lbA(OU%u{D(;$>voID; z4z*E7571T{Ulu6`pk82bKH(OfkUA&wx~#!PS%WLwhPS2UCx3L1WM+_7*v#t~$IPDr zw&RNgG}I^8yI6sZ-{bOwS!6QA0TK)%5*-{c2h_XhPyXYf309@yIgy<)X7a88OXk}` zqLY6I03%yiY_nwGRc^-Y$?s#NrEZ$oUY4}m=($2|hT44X+1eXCJNPb0+T9kBpR5_H z!OS44usJmL3lrm#$zBPK61NpKCh*=6ki0ISa#28KLF`olV_=jjX>NXzaFP)K{)-fH delta 871 zcmZ`%O-vI(6rR~_X}7dxUAJ^g(;pK4yXls;SouvfXoLiVAxcby&}t1ol~y2fX-qws z?7;)gm{61mBu4Sz0q11m!3&ATOG!ocK!n7fcrXS@qa2;3vGkyGnD_GD_rCYOH?yz~ z*VduwoylYXIzh zscC5?6#g(IWy*EEqsky z`Nbnn^obuoO!iwO8h%G9q30-xw}b(0zuw<~?ao z&gl3_lK_6xc$fMQ+EqY{X)$MXs%RHZh$~dH_n+Kikvns1DY=l$a-@kzEfaC4^o6o^ z9?IM0cv-hySydQ`V!SBmchkh;LH|kk7sPV1wgl9KRswDV#Wd}e0oEcL(Xii+zXnF3 zt*5XvBRFm;p{1E76loD@VsW|!QnpJ4m>E0>&EGg|o)?M_p~14{Mf|e+fVO1{;|YKlWPNcw1LGqw3FXf<(!|H^ zp0o~z(To08y~0`4pWsD5`qiJ{#l{PpDBhC(BE97=VADls@`Qdrv-TeHE| QEDvq60aaTNXGh+`KNK|&6#xJL diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc index ddaacd52098115837f671e8256f3fb00bcc3343f..0b1aca60265c0241135af84ea1753bbc398c34a0 100644 GIT binary patch delta 1573 zcmZWpPfR0K9B!e7wv@I&+kwVyp4nyHX1hC!?$Rzx5wbKaxX?vdH(3*#VdhZ=+L`9f zG>DqiL=ue}6a6I~WDg!ZXuPoDz6Y;dP-D#Yw%$xUn1!3f_wE9}=KKAd z^sC&{Tam;5{*Z@11+TZVAA1~G_uu(MzHd=x$=aH-O*a*J)>IocYS@-s)EcT{>!u;E zs7jSGGNURQt?kHn@6O76W6o|WM#a3x%uTA=2jBSny1XyIeyRV1a z^CgVTvP3borZ8K4y+pRnMpYwgJ4B=FN~3CvN|Eg(^8aRZifUUDt-(W>!c#XkDARdX zD(?-`D7)G*%5_a=Cfd-;9?<`JIL1AZ&;uJI~>r)PMWMuKt@v7WD}Z?|V*S zp4jNGQTfNHyzl!tdgCZ?gT*M^D4h(qp%mA zfcyOV>;7QuHeRI>FeP@G8(xE7!iUloJR;2TW%Y8{^*rzL!+zu@{Mr8%sO@c2EVrN=nW5FYS#e3sLKBO4R4z37s39c2h_^3_TGI(!_-hsacgNZFSB|8q2!r|M& zmGl%kAee4h-jPj-dgg}~($gqIu=whfopof>@ObEvB-)O!jk2@O%)@Cs2Yd0-NReMN zgm-Z>gCOQp6hU4|lp&oACYt=d^K!va%)zsPF?g0JNb~p>!Ut~IDEyJkK{csMuOW}{ zp_?zldr}@QNHfwR@(7=~`3o>PoPz_2rAx>oeBtI-ois`!QEQluETatJOWeGSAWB(= zzlUk_B|K*kE+dGqPR5=1cEp!~lW&FIP^t~_uf)Wt#UR-vD#cW$aVNTpU26qbcj|5R z95SL8SZk~Ifx-;_zbGne!EYn+9#P0LoQ|CHK7>?iB9`!uA0;myT`HV-`1a)5ftDKg F{sZ*vfoA{! delta 1013 zcmYk4&rcIU6vuZ96fdyP9YbBDhG9EiElUtOx`vv8Xg@$dWEnSzDNbhJ&{r zIB@crn0W9)Vq!cP<*5HbFI=fH#EXe1qY!T<&YRU{H+i2-=KIa}&CJ`Q%YJy> zDF*Q*HSWkcaN=we(jS{OL^bgOK#>DlyzdT%lDJC~928*=w0&)cnwQ5iN+T zxHwM%4UY!TMGfXeck3ALDv%cw5a_ByU37a>bgSy3sBym>g3tzEs8{vAf#WW>bi*#T z2yIrYLE35v`nrpfig}26S||TcGz&kyaroRluMDG(SfJHB@rV^O%wit<#-$OoAr|en zC`|aYXZ}TH6lKJcT^_SiMp??fe_4v74NIGvD!?sHjPjg_Cjv&CR!&D zY~E8$B+{~!!9Bz_t!73Fl9C2z!)aw2b;OQck6AI(Eaq*v1ck6W_|)#mSdJOySdp(u za~OoE*=-l#k{pKBCU(VPEQ$qs!CC!G2_v{|kVs;idop diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc index 4885024ce32c2ffb5dfaacfa750f0228d159573b..959170a680229b7aca209e41d078435a03029a8c 100644 GIT binary patch delta 537 zcmX|-K~EDw6vubArAxcpoh?v9Qd+v&h^S;efZ?E+nv#Ga7Sfowds}x#Y}4H#(`_mz zCBd7QG9SPri5E?J^F&V`-~*6y_T&K*Z=QV98Yg+b`Op8o$$K+D?Ju@@p3P6#4aFrffHiU)TL5%K9ZGCWFbSUpQPL<&qg@LV|CT1~6o&!AR z25?#BIdPR)OwCBYc%nZ`kF?;8&k2o1U0+=p`?qAW0vKua#wO>C^Rl#(5-ExM68FSc z{VCGKZ~YTm62hohi(rqE&FD4bPe5)Az8kKZw`K7p75dGHZ^8Lctl^u;7B6v0ANO39 zMK{C|F3ih8CvDcGn)CuChPYJJq_raP05H_h>(ydnxPX9v0m8X{mjD0& delta 634 zcmXw!zi-n(6vyx4BzF8GcH)#ERZVf4wxp$XkpLkvphT_sF+i(|AzmyKyGm65h|Uq| z01`rsEYS^22r3=snh1Ke}ON%y_)yU%;?-klmhjN%7H5fNL5 zUw$90tK;HX{B68`&@LbsyS$$ZWJ|^WPHui(z9fh+`?02m0gjk?n+E6 z-hwNS-!5KL8i?drLB^6h=$Sb}CtL@O@Cx#P6jGuxT4Gyc85jR&G?nqsj=*<&4spHV zq>VRoJArvG_DF0VJH!dM@AsTx-!XT+_;?r%%mE`&==f&O^ZjTP5#Ocn^ZPl2eQkLn z@~^q88ndL#k# z<*gJofUg4J?;h?E5)lILkt_)GAQwP*`a)`Bfqs=<;`8*e+|bUk>m=I`k0NrN+4kg} z+{rA|A$g7hryr7=EPh1mYJCGpBG@)u+jjFz!rQhRb#0sMK}|Z$C2&<5s*9`ez4`l> z!Oe$YE|G2pgNO{%QRyqSrU}5eKz2Y3`bk~N&*z|j)hd2YtJ<14%W_!%oL!j-bXU7l z?Q%%ae<6(ZkHzwn8#9i%KQoa&)M{%``zGJ2pwoQIK+_7}s&UgL3~ER%lbdd1rvCtK C_?F=S diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc index 286a1c0258ea4e3f912a22b767d6a7d4fbb101a2..f6d5d873b54c399e4ce400ddd8738c9dac6075df 100644 GIT binary patch delta 151 zcmZ3_ag2lKG%qg~0}$9UGNy0jNoMqD(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t+|0ui!^jvhIg?qR`L>AUJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=fJ7a{X6wrhQhC9j{*SIxjsCKwcFzWQYv{{2GhLJIL bax1ew#|;t5PYleQ>XWxK%Q1uK8_anC*_bKq diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc index e946ce6a5a9d7472f1be8e37365480dcf392050b..bc4ee6e0cf611ca4a38013296b8b065104188824 100644 GIT binary patch delta 961 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 TT8(5j=p3o_Cd7A`?vLRMdx}dG delta 427 zcmZvYKT88K7{=cu*QUMNR*`}VLfx!Gk0OeLV+RrJA}$9C*XEV}IePVSA{D_e(52ka z$?nn*;Oy+^b`H*NwSq$@6WT%tGbGRRKKVU_Jeh-d<}IBzL9O%8-|H9J&upAdl^cKn zL0qsw&@x>505%Z}$-T;KN&y+t5z!oga>i&T0m<=f5<_UN^dEK}IdY_}T>zOw-dvmC zTRM;mL)R|qBeb;SN_ambr+D^o4b;lPNgf&{?g;d03SB9@t96iI2My5B`g+yOkEys7-#cJIN z8je*)*$TXl)lrGpc3i8DuIt@-zAM5ZJIm)3sXt2&)i!2?kPk4&Cae}GkRVqiOc;B~ W_iTOwET-InQORoYozkJduAn~XYilpGw3d6@wMcE@7U_lymV{XT#cpa4Ba$?`w3iB_y`;U+ zxTxXDl!wK_F|jC-YWBchjOLgHwk4C8m@RwZra+6#1heSF9v0}DWhQ&rEiT!94=3Mz z&+nV_Ip3LWu)htoKWj8Km^^*}qIBwsc2wOr%MK>_M3Rk+a4CMAV*^5XD#pjfB-*~kz`gL3TOuwY--Z^Ya<3-Y(ZIeiP565)%C|k921T-VjvJ9A=22ZA^ zNI43WN1{9h$}3Uc$8{^zCeHD?tnT(fOAG ze1g`R3_x`i5SG$3dg*$p)Z7FZmb@o_dj>04!L^nWcn+Vk5WGNr-VFl$gsdN3RDgF# zJgHC-R|MhnBwPy`2bmZ*IXM=OG8K!7b1|L~1xAST3_mRw#0ZHR=6^FWmXy8G_m@e} zze}+x*&X2-xxoo;WP(S0=c-aut`I$XPjmyhPdC;cA{7>KdA`PT%6V}aN3VvwO4aXjHu)ABLf%Hx2L+Q$GP$-) z?m1-!WLk?lV?k$^boN|pj@#5V$u-t{P&{-);n3i6Y~X-mkHi?q()ESw1^R?UpV*>( zvuD#incgC-<7gFuF&~y|PzR?3ZgVAMKM3vWYwuX+tOdPO(mS{G$I@LzQgf?!w)e~a zeH=T|goKedKt)#qqwsRX?0D$U8~Y#lv)t3uD**L;Kk%&XyWzaA?=Hys)8x9b|5pPI z7b7+tqZs%s@|*j3CEIrJSkd40L+IO3UKd;qJ-(2kZl|(h?!vM!Z}duf?@9=6@UPu1 z|G^b4%u>ff$9@0onRFoI{Dm}R0$E3n*d!ZexT7xkX7n2nfs0WS(LpqqzJRMyziJo| zlq~;_It^z4p)XxlSc!|E)Om>b6qL-!cSQoA4XMTl70wh6T>Dt%EQ{)(8XQ~K+RIo) O{1MWUpf+(z#{LH?7bXD! delta 879 zcmYL^Z%i9?7{~8vdo9Jg_HG<4wkzzAqx|XCL(8n$Izk59P&PBiSl9?z7u(gX!lVss zlNb_XEG~wFpNX9_S;@A*tA*uf6e5W;#%QuPz0`6yT_V0P@y`p(Nr=AlckG3~7f*gq zp6C0?=h=J=(~rURh-IrO@=pD{oxC^kz?F2!Z-q~1662Zh<@k7fbl-(kJo`pG+>^*$ z&W>FPUm=sR(RezXN~F_clVjuQ*U_5e9Na~9RTn!-;)@#BJ2#Pse8)=1>Pz!{k?WoA zQ@LKHPgA*2c+O^{VV zUiPdAW#JG>@LlM&K$))CsX7t0)t`rx_(uJ|7VzWu#FI7%V@>+U0w-{>r3UQRf%Y3$ z@$aoa+SvDjqB6J0q0`h>H7f2i;9K-f7{T}WjQj%)k8o)JpamxJyHSfBJGz!^?6#S> z|1@zOuN`i#eMYdD`HG8jx)BWdQPt3Pn5aDKyY0N`BHEsu(GW z`whzKY*3j%ZcsV1;odcSZRXmIw>7tfZW!SH(eAw-~${w}HId zga&t@8+`4@fw_RjODZpw_#m-zdUD-5!_FR^Ir?GWrj_*gw+p|*G0{w2da6=Qi7h$X zEIY$0Nwq4VKNnn#EyUKnefjujhgSd}Sv&R6^X0ixR2_Yg-fK*uwp7eM1himGpf^)e zO+V1QF>DFYgJ2wD=o4V<#`jVxKqsEOblM_awL}5k%KZF&-o-%e I_(7unADEURw*UYD diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc index 0f7a21edb528c655c4a8ec67b6f4dd8eb18097ef..7d1fb2301b345ca200093c38c65fc60e0852c870 100644 GIT binary patch delta 641 zcmXX@O=uHA6yC}1#?3aVN$R#H*09E(l7d}PtY}nJA_Oc_kszoLHk&bS-0bSiEK)%z zc&UO^I#yDUv^_|zCpCvs@ZiClAdw)#>P1f;QwmbWgR^M|=6jF#^L_8lcq4DM$j3-T z=GZv}K;`F~$WDBl1VRSI5vScDH6vi zS~{vgvjI3R6QJ*<0TD$QC;ck@20Z-~+CShauD!*omn>M^YNqRCVwG!E7>t(Edu70O(EX1D=FI%)0&4L-a96idvvfA`V zw7PGam1lVLgcq@G~-7obzTXqK+TjuoG>fEUCLBCwnhy1ZVHn8bqE6T5a(#&1+r^-NdC6N{#867+%vYwY4j z4A>succ$jUbKyqs!|;?ab>o||i(ZKzlDPiC4$mcq=yZJVt#_$*I^Ry@KTG*Fo)g2J zAlDmT+r~UJ$5<|Af@qOhPsRkf25}L@$lnpo`q1#fmqq?-bUV5e{gqDEoU&`d(`bn$ z*q?KFls0qq}Vg( zF)}b{GERQLAwKyJ$2Uf%$)7n@C+l-r16kQzikqi%g|Zry>W3Dm78UDfCl)2<=_O?( zmSiUCyQCIpm*f}d7XW4Q^AdCPGg5PM^2_s!a#ALn2-HeT03Gmx;YS0*B}wZQf-{_E z6wXLqAT&qoqNMfYvjWzP{gXKbO_^8bT$$`Bn5EJKRISNe)C;7FCWDBnK%$r#NGK>Y z6!n8dCQLprsH7$eWd4AdtK_jkWTEkblI4~cl{|hHvjAn9g+v)OIg2JumJl+}oCp-S z#a5hORFaya$pSX^7F$VXNlt3Ese&Go}vt&1;4KFbb-Dh-M6AJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{aAoy~+rLKJAk3x*#J443%5FUlIth*(fPh2tW>_vC3@ zxh$8>ysm6!=VoM5ltU;Bxu|8c!eT?%1c@1D3lwKsUJ+2e$R9FUhqr*`vP1Bd%?o&& FH~<9KIg9`R diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc index 1837b154256117e93ec3d17b4944954b29b6d542..191aa5b6989dbddde9573e24a708b20cf1432c94 100644 GIT binary patch delta 5236 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 BU912A delta 5195 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 NI}YzW+9Rs<{|8PLQ~v+} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py index 5063c3f8..2c105aca 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py @@ -5,10 +5,10 @@ __title__ = "requests" __description__ = "Python HTTP for Humans." __url__ = "https://requests.readthedocs.io" -__version__ = "2.31.0" -__build__ = 0x023100 +__version__ = "2.32.3" +__build__ = 0x023203 __author__ = "Kenneth Reitz" __author_email__ = "me@kennethreitz.org" -__license__ = "Apache 2.0" +__license__ = "Apache-2.0" __copyright__ = "Copyright Kenneth Reitz" __cake__ = "\u2728 \U0001f370 \u2728" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py index 10c17679..70307774 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py @@ -8,6 +8,8 @@ import os.path import socket # noqa: F401 +import typing +import warnings from pip._vendor.urllib3.exceptions import ClosedPoolError, ConnectTimeoutError from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError @@ -25,6 +27,7 @@ from pip._vendor.urllib3.util import Timeout as TimeoutSauce from pip._vendor.urllib3.util import parse_url from pip._vendor.urllib3.util.retry import Retry +from pip._vendor.urllib3.util.ssl_ import create_urllib3_context from .auth import _basic_auth_str from .compat import basestring, urlparse @@ -61,12 +64,76 @@ def SOCKSProxyManager(*args, **kwargs): raise InvalidSchema("Missing dependencies for SOCKS support.") +if typing.TYPE_CHECKING: + from .models import PreparedRequest + + DEFAULT_POOLBLOCK = False DEFAULT_POOLSIZE = 10 DEFAULT_RETRIES = 0 DEFAULT_POOL_TIMEOUT = None +try: + import ssl # noqa: F401 + + _preloaded_ssl_context = create_urllib3_context() + _preloaded_ssl_context.load_verify_locations( + extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + ) +except ImportError: + # Bypass default SSLContext creation when Python + # interpreter isn't built with the ssl module. + _preloaded_ssl_context = None + + +def _urllib3_request_context( + request: "PreparedRequest", + verify: "bool | str | None", + client_cert: "typing.Tuple[str, str] | str | None", + poolmanager: "PoolManager", +) -> "(typing.Dict[str, typing.Any], typing.Dict[str, typing.Any])": + host_params = {} + pool_kwargs = {} + parsed_request_url = urlparse(request.url) + scheme = parsed_request_url.scheme.lower() + port = parsed_request_url.port + + # Determine if we have and should use our default SSLContext + # to optimize performance on standard requests. + poolmanager_kwargs = getattr(poolmanager, "connection_pool_kw", {}) + has_poolmanager_ssl_context = poolmanager_kwargs.get("ssl_context") + should_use_default_ssl_context = ( + _preloaded_ssl_context is not None and not has_poolmanager_ssl_context + ) + + cert_reqs = "CERT_REQUIRED" + if verify is False: + cert_reqs = "CERT_NONE" + elif verify is True and should_use_default_ssl_context: + pool_kwargs["ssl_context"] = _preloaded_ssl_context + elif isinstance(verify, str): + if not os.path.isdir(verify): + pool_kwargs["ca_certs"] = verify + else: + pool_kwargs["ca_cert_dir"] = verify + pool_kwargs["cert_reqs"] = cert_reqs + if client_cert is not None: + if isinstance(client_cert, tuple) and len(client_cert) == 2: + pool_kwargs["cert_file"] = client_cert[0] + pool_kwargs["key_file"] = client_cert[1] + else: + # According to our docs, we allow users to specify just the client + # cert path + pool_kwargs["cert_file"] = client_cert + host_params = { + "scheme": scheme, + "host": parsed_request_url.hostname, + "port": port, + } + return host_params, pool_kwargs + + class BaseAdapter: """The Base Transport Adapter""" @@ -247,28 +314,26 @@ def cert_verify(self, conn, url, verify, cert): :param cert: The SSL certificate to verify. """ if url.lower().startswith("https") and verify: + conn.cert_reqs = "CERT_REQUIRED" - cert_loc = None - - # Allow self-specified cert location. + # Only load the CA certificates if 'verify' is a string indicating the CA bundle to use. + # Otherwise, if verify is a boolean, we don't load anything since + # the connection will be using a context with the default certificates already loaded, + # and this avoids a call to the slow load_verify_locations() if verify is not True: + # `verify` must be a str with a path then cert_loc = verify - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + if not os.path.exists(cert_loc): + raise OSError( + f"Could not find a suitable TLS CA certificate bundle, " + f"invalid path: {cert_loc}" + ) - if not cert_loc or not os.path.exists(cert_loc): - raise OSError( - f"Could not find a suitable TLS CA certificate bundle, " - f"invalid path: {cert_loc}" - ) - - conn.cert_reqs = "CERT_REQUIRED" - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc else: conn.cert_reqs = "CERT_NONE" conn.ca_certs = None @@ -328,8 +393,110 @@ def build_response(self, req, resp): return response + def build_connection_pool_key_attributes(self, request, verify, cert=None): + """Build the PoolKey attributes used by urllib3 to return a connection. + + This looks at the PreparedRequest, the user-specified verify value, + and the value of the cert parameter to determine what PoolKey values + to use to select a connection from a given urllib3 Connection Pool. + + The SSL related pool key arguments are not consistently set. As of + this writing, use the following to determine what keys may be in that + dictionary: + + * If ``verify`` is ``True``, ``"ssl_context"`` will be set and will be the + default Requests SSL Context + * If ``verify`` is ``False``, ``"ssl_context"`` will not be set but + ``"cert_reqs"`` will be set + * If ``verify`` is a string, (i.e., it is a user-specified trust bundle) + ``"ca_certs"`` will be set if the string is not a directory recognized + by :py:func:`os.path.isdir`, otherwise ``"ca_certs_dir"`` will be + set. + * If ``"cert"`` is specified, ``"cert_file"`` will always be set. If + ``"cert"`` is a tuple with a second item, ``"key_file"`` will also + be present + + To override these settings, one may subclass this class, call this + method and use the above logic to change parameters as desired. For + example, if one wishes to use a custom :py:class:`ssl.SSLContext` one + must both set ``"ssl_context"`` and based on what else they require, + alter the other keys to ensure the desired behaviour. + + :param request: + The PreparedReqest being sent over the connection. + :type request: + :class:`~requests.models.PreparedRequest` + :param verify: + Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use. + :param cert: + (optional) Any user-provided SSL certificate for client + authentication (a.k.a., mTLS). This may be a string (i.e., just + the path to a file which holds both certificate and key) or a + tuple of length 2 with the certificate file path and key file + path. + :returns: + A tuple of two dictionaries. The first is the "host parameters" + portion of the Pool Key including scheme, hostname, and port. The + second is a dictionary of SSLContext related parameters. + """ + return _urllib3_request_context(request, verify, cert, self.poolmanager) + + def get_connection_with_tls_context(self, request, verify, proxies=None, cert=None): + """Returns a urllib3 connection for the given request and TLS settings. + This should not be called from user code, and is only exposed for use + when subclassing the :class:`HTTPAdapter `. + + :param request: + The :class:`PreparedRequest ` object to be sent + over the connection. + :param verify: + Either a boolean, in which case it controls whether we verify the + server's TLS certificate, or a string, in which case it must be a + path to a CA bundle to use. + :param proxies: + (optional) The proxies dictionary to apply to the request. + :param cert: + (optional) Any user-provided SSL certificate to be used for client + authentication (a.k.a., mTLS). + :rtype: + urllib3.ConnectionPool + """ + proxy = select_proxy(request.url, proxies) + try: + host_params, pool_kwargs = self.build_connection_pool_key_attributes( + request, + verify, + cert, + ) + except ValueError as e: + raise InvalidURL(e, request=request) + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + else: + # Only scheme should be lower case + conn = self.poolmanager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + + return conn + def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be + """DEPRECATED: Users should move to `get_connection_with_tls_context` + for all subclasses of HTTPAdapter using Requests>=2.32.2. + + Returns a urllib3 connection for the given URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. @@ -337,6 +504,15 @@ def get_connection(self, url, proxies=None): :param proxies: (optional) A Requests-style dictionary of proxies used on this request. :rtype: urllib3.ConnectionPool """ + warnings.warn( + ( + "`get_connection` has been deprecated in favor of " + "`get_connection_with_tls_context`. Custom HTTPAdapter subclasses " + "will need to migrate for Requests>=2.32.2. Please see " + "https://github.com/psf/requests/pull/6710 for more details." + ), + DeprecationWarning, + ) proxy = select_proxy(url, proxies) if proxy: @@ -391,6 +567,9 @@ def request_url(self, request, proxies): using_socks_proxy = proxy_scheme.startswith("socks") url = request.path_url + if url.startswith("//"): # Don't confuse urllib3 + url = f"/{url.lstrip('/')}" + if is_proxied_http_request and not using_socks_proxy: url = urldefragauth(request.url) @@ -451,7 +630,9 @@ def send( """ try: - conn = self.get_connection(request.url, proxies) + conn = self.get_connection_with_tls_context( + request, verify, proxies=proxies, cert=cert + ) except LocationValueError as e: raise InvalidURL(e, request=request) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/api.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/api.py index cd0b3eea..59607445 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/api.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/api.py @@ -25,7 +25,7 @@ def request(method, url, **kwargs): :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers to add for the file. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/auth.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/auth.py index 9733686d..4a7ce6dc 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/auth.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/auth.py @@ -258,7 +258,6 @@ def handle_401(self, r, **kwargs): s_auth = r.headers.get("www-authenticate", "") if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: - self._thread_local.num_401_calls += 1 pat = re.compile(r"digest ", flags=re.IGNORECASE) self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/compat.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/compat.py index 9ab2bb48..7081da75 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/compat.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/compat.py @@ -7,10 +7,21 @@ compatibility until the next major version. """ -from pip._vendor import chardet - import sys +# ------------------- +# Character Detection +# ------------------- + + +def _resolve_char_detection(): + """Find supported character detection libraries.""" + chardet = None + return chardet + + +chardet = _resolve_char_detection() + # ------- # Pythons # ------- diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py index bf54ab23..f69d0cda 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py @@ -2,7 +2,7 @@ requests.cookies ~~~~~~~~~~~~~~~~ -Compatibility code to be able to use `cookielib.CookieJar` with requests. +Compatibility code to be able to use `http.cookiejar.CookieJar` with requests. requests.utils imports from here, so be careful with imports. """ @@ -23,7 +23,7 @@ class MockRequest: """Wraps a `requests.Request` to mimic a `urllib2.Request`. - The code in `cookielib.CookieJar` expects this interface in order to correctly + The code in `http.cookiejar.CookieJar` expects this interface in order to correctly manage cookie policies, i.e., determine whether a cookie can be set, given the domains of the request and the cookie. @@ -76,7 +76,7 @@ def get_header(self, name, default=None): return self._r.headers.get(name, self._new_headers.get(name, default)) def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" + """cookiejar has no legitimate use for this method; add it back if you find one.""" raise NotImplementedError( "Cookie headers should be added with add_unredirected_header()" ) @@ -104,11 +104,11 @@ class MockResponse: """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. + the way `http.cookiejar` expects to see them. """ def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. + """Make a MockResponse for `cookiejar` to read. :param headers: a httplib.HTTPMessage or analogous carrying the headers """ @@ -124,7 +124,7 @@ def getheaders(self, name): def extract_cookies_to_jar(jar, request, response): """Extract the cookies from the response into a CookieJar. - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param jar: http.cookiejar.CookieJar (not necessarily a RequestsCookieJar) :param request: our own requests.Request object :param response: urllib3.HTTPResponse object """ @@ -174,7 +174,7 @@ class CookieConflictError(RuntimeError): class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict + """Compatibility class; is a http.cookiejar.CookieJar, but exposes a dict interface. This is the CookieJar we create by default for requests and sessions that @@ -341,7 +341,7 @@ def __setitem__(self, name, value): self.set(name, value) def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + """Deletes a cookie given a name. Wraps ``http.cookiejar.CookieJar``'s ``remove_cookie_by_name()``. """ remove_cookie_by_name(self, name) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py index 168d0739..7f3660f0 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py @@ -41,6 +41,16 @@ def __init__(self, *args, **kwargs): CompatJSONDecodeError.__init__(self, *args) InvalidJSONError.__init__(self, *self.args, **kwargs) + def __reduce__(self): + """ + The __reduce__ method called when pickling the object must + be the one from the JSONDecodeError (be it json/simplejson) + as it expects all the arguments for instantiation, not just + one like the IOError, and the MRO would by default call the + __reduce__ method from the IOError due to the inheritance order. + """ + return CompatJSONDecodeError.__reduce__(self) + class HTTPError(RequestException): """An HTTP error occurred.""" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/help.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/help.py index 2d292c2f..ddbb6150 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/help.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/help.py @@ -11,11 +11,7 @@ from . import __version__ as requests_version charset_normalizer = None - -try: - from pip._vendor import chardet -except ImportError: - chardet = None +chardet = None try: from pip._vendor.urllib3.contrib import pyopenssl diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/models.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/models.py index 76e6f199..85a008cf 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/models.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/models.py @@ -170,7 +170,7 @@ def _encode_files(files, data): ) ) - for (k, v) in files: + for k, v in files: # support for explicit filename ft = None fh = None @@ -268,7 +268,6 @@ def __init__( hooks=None, json=None, ): - # Default empty dicts for dict params. data = [] if data is None else data files = [] if files is None else files @@ -277,7 +276,7 @@ def __init__( hooks = {} if hooks is None else hooks self.hooks = default_hooks() - for (k, v) in list(hooks.items()): + for k, v in list(hooks.items()): self.register_hook(event=k, hook=v) self.method = method @@ -790,7 +789,12 @@ def next(self): @property def apparent_encoding(self): """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" - return chardet.detect(self.content)["encoding"] + if chardet is not None: + return chardet.detect(self.content)["encoding"] + else: + # If no character detection library is available, we'll fall back + # to a standard Python utf-8 str. + return "utf-8" def iter_content(self, chunk_size=1, decode_unicode=False): """Iterates over the response data. When stream=True is set on the @@ -865,7 +869,6 @@ def iter_lines( for chunk in self.iter_content( chunk_size=chunk_size, decode_unicode=decode_unicode ): - if pending is not None: chunk = pending + chunk diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/packages.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/packages.py index 9582fa73..200c3828 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/packages.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/packages.py @@ -1,9 +1,11 @@ import sys +from .compat import chardet + # This code exists for backwards compatibility reasons. # I don't like it either. Just look the other way. :) -for package in ('urllib3', 'idna', 'chardet'): +for package in ("urllib3", "idna"): vendored_package = "pip._vendor." + package locals()[package] = __import__(vendored_package) # This traversal is apparently necessary such that the identities are @@ -13,4 +15,11 @@ unprefixed_mod = mod[len("pip._vendor."):] sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] -# Kinda cool, though, right? +if chardet is not None: + target = chardet.__name__ + for mod in list(sys.modules): + if mod == target or mod.startswith(f"{target}."): + imported_mod = sys.modules[mod] + sys.modules[f"requests.packages.{mod}"] = imported_mod + mod = mod.replace(target, "chardet") + sys.modules[f"requests.packages.{mod}"] = imported_mod diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py index dbcf2a7b..b387bc36 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py @@ -262,7 +262,6 @@ def resolve_redirects( if yield_requests: yield req else: - resp = self.send( req, stream=stream, @@ -326,7 +325,7 @@ def rebuild_proxies(self, prepared_request, proxies): # urllib3 handles proxy authorization for us in the standard adapter. # Avoid appending this to TLS tunneled requests where it may be leaked. - if not scheme.startswith('https') and username and password: + if not scheme.startswith("https") and username and password: headers["Proxy-Authorization"] = _basic_auth_str(username, password) return new_proxies @@ -389,7 +388,6 @@ class Session(SessionRedirectMixin): ] def __init__(self): - #: A case-insensitive dictionary of headers to be sent on each #: :class:`Request ` sent from this #: :class:`Session `. @@ -545,6 +543,8 @@ def request( :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol or protocol and hostname to the URL of the proxy. + :param hooks: (optional) Dictionary mapping hook name to one event or + list of events, event must be callable. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) Either a boolean, in which case it controls whether we verify @@ -711,7 +711,6 @@ def send(self, request, **kwargs): # Persist cookies if r.history: - # If the hooks create history then we want those cookies too for resp in r.history: extract_cookies_to_jar(self.cookies, resp.request, resp.raw) @@ -759,7 +758,7 @@ def merge_environment_settings(self, url, proxies, stream, verify, cert): # Set environment's proxies. no_proxy = proxies.get("no_proxy") if proxies is not None else None env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - for (k, v) in env_proxies.items(): + for k, v in env_proxies.items(): proxies.setdefault(k, v) # Look for requests environment configuration @@ -785,8 +784,7 @@ def get_adapter(self, url): :rtype: requests.adapters.BaseAdapter """ - for (prefix, adapter) in self.adapters.items(): - + for prefix, adapter in self.adapters.items(): if url.lower().startswith(prefix.lower()): return adapter diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py index 4bd072be..c7945a2f 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py @@ -24,7 +24,7 @@ # Informational. 100: ("continue",), 101: ("switching_protocols",), - 102: ("processing",), + 102: ("processing", "early-hints"), 103: ("checkpoint",), 122: ("uri_too_long", "request_uri_too_long"), 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), @@ -65,8 +65,8 @@ 410: ("gone",), 411: ("length_required",), 412: ("precondition_failed", "precondition"), - 413: ("request_entity_too_large",), - 414: ("request_uri_too_large",), + 413: ("request_entity_too_large", "content_too_large"), + 414: ("request_uri_too_large", "uri_too_long"), 415: ("unsupported_media_type", "unsupported_media", "media_type"), 416: ( "requested_range_not_satisfiable", @@ -76,10 +76,10 @@ 417: ("expectation_failed",), 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), 421: ("misdirected_request",), - 422: ("unprocessable_entity", "unprocessable"), + 422: ("unprocessable_entity", "unprocessable", "unprocessable_content"), 423: ("locked",), 424: ("failed_dependency", "dependency"), - 425: ("unordered_collection", "unordered"), + 425: ("unordered_collection", "unordered", "too_early"), 426: ("upgrade_required", "upgrade"), 428: ("precondition_required", "precondition"), 429: ("too_many_requests", "too_many"), diff --git a/env/lib/python3.12/site-packages/pip/_vendor/requests/utils.py b/env/lib/python3.12/site-packages/pip/_vendor/requests/utils.py index 36607eda..a35ce478 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/requests/utils.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/requests/utils.py @@ -97,6 +97,8 @@ def proxy_bypass_registry(host): # '' string by the localhost entry and the corresponding # canonical entry. proxyOverride = proxyOverride.split(";") + # filter out empty strings to avoid re.match return true in the following code. + proxyOverride = filter(None, proxyOverride) # now check if we match one of the registry values. for test in proxyOverride: if test == "": @@ -134,6 +136,9 @@ def super_len(o): total_length = None current_position = 0 + if isinstance(o, str): + o = o.encode("utf-8") + if hasattr(o, "__len__"): total_length = len(o) @@ -466,11 +471,7 @@ def dict_from_cookiejar(cj): :rtype: dict """ - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - + cookie_dict = {cookie.name: cookie.value for cookie in cj} return cookie_dict @@ -767,6 +768,7 @@ def should_bypass_proxies(url, no_proxy): :rtype: bool """ + # Prioritize lowercase environment variables over uppercase # to keep a consistent behaviour with other http projects (curl, wget). def get_proxy(key): @@ -862,7 +864,7 @@ def select_proxy(url, proxies): def resolve_proxies(request, proxies, trust_env=True): """This method takes proxy information from a request and configuration input to resolve a mapping of target proxies. This will consider settings - such a NO_PROXY to strip proxy configurations. + such as NO_PROXY to strip proxy configurations. :param request: Request or PreparedRequest :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs @@ -1054,7 +1056,7 @@ def _validate_header_part(header, header_part, header_validator_index): if not validator.match(header_part): header_kind = "name" if header_validator_index == 0 else "value" raise InvalidHeader( - f"Invalid leading whitespace, reserved character(s), or return" + f"Invalid leading whitespace, reserved character(s), or return " f"character(s) in header {header_kind}: {header_part!r}" ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc index b862237818e6a533d8c9eed4e2329b7de7d6db70..f218846141df8df165a211345b3ea29391ef0e1f 100644 GIT binary patch delta 98 zcmeBWUCPRHnwOW00SIgv8PhlN9Aot8)(JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=9im4j_oiZ9i diff --git a/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc index 37ed043f55e6242eb1edb84744f08b90e8126434..fa5eae4b56b73b0682e84063a6628f78abf76cdb 100644 GIT binary patch delta 99 zcmca+`p%T+G%qg~0}$9UGNy0jkzn%Z(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKhp9;d0NGL-2><{9 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc index 0ea9245eb491ccc41f1ed1e1ef89e89d0d491009..39fffebfdda71c3ea3974415d06e5f5f2ba72dcd 100644 GIT binary patch delta 99 zcmew;(kaSwnwOW00SIgv8PhlNxG{S4=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9bc7~gXM0RHeH Ang9R* delta 75 zcmeAa{V2k7nwOW00SJQce@olQm*$U|UjC@(pPW&XGxgu>tTh;;R%<<{SR7GO4N{p()piWJ zkun$+R!sV9>t(Ptfr4&y%KCF|qamSNN}*C~Ys&<^g21xhgJNilT;BV77`w z4-M~Y_N%yp*kLqaFELNPDzTk$CW38IcPUk(8PlX@pY2SeFHL{E>}!>3P6@o~BkmHa zM0;i9n*EwnY0+rzF*Y7lx;I8|_C@HYw)%{oR`hj}zAj$`8axWyz0YH94`=Ci@F@Y4Z@` z`+nB|*Evk|`oh?`AJoQC7##KhyW{?a*oEwIMw;x&k}4%lHWhGa*QN;i83A4!!P2%7 z>Gbd}FHGE@icKkYmt=SC1b?)*q)rbb!oN((_FnZzgE43C6)<$eUq)o?y?GoM>d{C3 z4obFl9pccX%h|f3KJ=5H#xu6A=eT&}uP(v9Lzc1gctHn@m1uR$Nvkz)1SOP0*d)Rx z6O}((tK$~M+Kj#$Yj(>H?;);XbUBANIvVK{=uEj)DesWVJ9gKSLvp$Qxtdy*ad_2q zsuG#_8liIN-p4{^N7m}~5h>5y}rAu^5q z$Fnz}@o`=~txMb9{GLre_k$9doP zJnwm)^SA}e7fPnWPJW&T<)Ei zyELD;EMF!_Vmdx0PfkotC0GCe7_#V94`sDxSC=zlR5TO- z%amSy^h!@s{K;37<3y7S>Rd2i3~HN9sZ*Ca_b4mx-11c8x21-n0>VE?UPSI__oeHW z5P5c)ZHwdc2-x{+(W_CDt=8G<4VZp1!&aMYjFeJl!|#T_wHU6ZU2P_^4&ewcmu1HA zo+$vx^g}!#i-MqlZc;3AB?Yt_1BH91M=q>b(`#0)2yTt8v-mE!K^zo8#@ zw$#wN7%2cRa|DmK9J3f=>n^_D@-iX^T3PEqOr`(-L9ktFV4eTS^S(!~d-#fS?fl|- zo$bQ%$qx>-i>+5@2sXAjrnB|hgOeALLxA95khySd2Y7j+)AI)+RvYeJfYGlA_}2p1 z?E?PLjk9ZK?-G^gvuxL0wm#LDW$Sk+_V4`qws3SJzpr44&+0oW)HP7e>(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t84x$o-;` z`xPV4E7D#UjXYPXtWaDLIKy#H@dCryWivf57xFIb+-)^Seb!q*J()!n=4LiL%96Ks*i^@)5ydfq&LvTXMWGXXReryk9zw7XWGJmD~UT delta 371 zcmZ1JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKim94~v2OA;HciLNhVIv;JXVUV5M1Fn!*EXW0>#;B zGc7Mmd33P$@ZT^p+pfP+|GJU;MI-miMxNKDy;iEMP+So>!*NdW0>jy5Gd(YF_F=!y z3^YuITaDwgpvET#Mo#U?zTDDMK>C58=ydss^4A4bE()qF2)-<+36j>DT+1!Z#K^gM z7WYnOM?0WTUNHPRNN4i1#0A#p1^oR zOnipmgp|o#ADMytkIX1HbZbl;SQGlygPX>>AOxbyeQ;0IafN7d1mgF%@?KPcmWsP Bg$e)w diff --git a/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc index 245881ecf45a7f5ac4715287ef0d57a206e0a00f..8f1ecc2429c4adbc5d31092ae8865e55d329e993 100644 GIT binary patch delta 96 zcmcc3_?eOCG%qg~0}$9UGNw=DG4hzCA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_7XX5!8gc*t diff --git a/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc index b3f5c5a57511fa018f7e908dc85868595c50f9d3..81ffc53c16916df03c236c0944a3ab8b98601d4c 100644 GIT binary patch delta 97 zcmdnae4d%-G%qg~0}$9UGNw=Dx#%%dKeRZts8~NGDX}~?D^cGiKe;qFHLs*t-!-K) yIk6-&KTkh6IWZ@-NWn2VF(oy(Qs2kNMIXq>cgaf3OV1A|%FjwoE}6{BxC#LA)*%=G delta 73 zcmX@lyq%fnG%qg~0}uq?|CTn9=b}NQerR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT a0Z=ACFEK|yBQ+-{zdXMvCuOoK<0=5FpBl3O diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py index 270629fd..efb7fb79 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py @@ -207,7 +207,6 @@ def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: if __name__ == "__main__": # pragma: no cover - console = Console( file=io.StringIO(), force_terminal=True, diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc index ae2e7893965532bd31694d2639c86324a98cebdc..d48456f69e2c96e4b9c5524cb5b6b13fe3429fba 100644 GIT binary patch delta 99 zcmexmHp!glG%qg~0}$9UGNy0j$!76r)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tzN#G%qg~0}uq?|CY9qC!56}S3k5kwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~Kg(q?0Nj%s#sB~S diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc index 495ef7a46bf0ad68a6f2c502ef35589391c5d665..d551ed26f653ba695a36660341a501213778ec5d 100644 GIT binary patch delta 186 zcmcZ{a6f?eG%qg~0}$9UGN#LJ3tDk5SE&*Gf`)< k-en$zkHQQ>vYXYovSk==Zl0vJoslb_k%2|3$QWoM0Mhh4d;kCd delta 174 zcmcZ~a5;eYG%qg~0}uq?|CT1Vk++q@AXh)MIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC$F`4&fk{zsq@FBpC_FnnQS5E7qII74x=^d|;RPQ?z# zJEBrE%&$x9T$I+iEUNp7ft}ZjadIB#I&l!=ivWYL)O4MRI+OJ-^C)~22I|;s#FZ_> V_;B+)we5^tg^Ua=Qboo<(*f1uIPL%d diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc index b8d7bf87c18e4185f769167011ffe93fc29b1f59..9b0b97045eb14861ae49a8b0ea397acee127dcba 100644 GIT binary patch literal 7915 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 JKQA#yKO;3KC%-(uC?{p}N9Ny50O4mGBLDyZ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc index 8dd7e6a0b698dec9ffa165a913b8878e219c7fbc..1c91437a3185a534d6b3cb51e66982410fa9c8c8 100644 GIT binary patch delta 160 zcmZ1?bVG>uG%qg~0}$9UGNuPiXJlZoQFQTl4v7qKRmdpG&9URMndm=x;>#o% zh2oORoK#z-wEVmh-L%Bq%$!QA%)E@$qRbMd&EAYE>>l0vp~b01#ri2piRGzTiTW=2 z$)&lec_qdAt|_I-i6xo&dHTW0i8-l73XaK%DXF=Y`aV7``anj$OIBiDdVWArepYI7 J$>jMQtpHLnHEaL? delta 105 zcmca1v_y#aG%qg~0}uq?|CVMlk=KMzn~{ORM$yIJIV3W`RbgV-WR{GQ+?xUMn78UDfCl)2<=_O?(mSiUCyQCIpm*f}d7XW4Q^AdCPGg5PM^2_s!a#AK= H=4b@~z6&G< diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc index 7d48eb10bb2a8bb01c1b4e5c9e34a945a8e56726..51c207fc349304f31364d610c60eeb8a61fe308d 100644 GIT binary patch delta 98 zcmZ3(a)gEFG%qg~0}$9UGNy0jk!JL0*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKm`R@z0Muq0uK)l5 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc index 68ee3377bead8235b0ab758fb028cb847bf7a7fd..cd6536c404b25482cc08ef91c06fbe0b4c3ce07a 100644 GIT binary patch delta 338 zcmX>QcO{PJG%qg~0}$9UGNy0j(Pj2%)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tW@Khi(cCPgT+Jcn3-opa!xte2F|8HKS48zb zvoiCrJrvdJaGktVTZQ$8sNP4`&8M}K7?o8ZD)|`1Og98y6SeH%yumGULBjYFxA9G3 Q@eiyFVpf|&bzd_A0KAoWwEzGB delta 296 zcmcZ-cOZ`EG%qg~0}uq?|CY9qN0-?kS3k5kwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#k$I;Kqupd{g`Bh-%IepIU1m71C|+N;vTjGpRek44 z&KHDTI$VIn4SwPNnywnK8fUngtKQA#yKO;3KC%-(uC?{pJ5{nHF0O^q$*Z=?k diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc index 4f44cf3c4cb53263548cfd1dc46d0c479cfe7ed4..a6b0c934b05e9382d5e925a585967c7d33e3ae24 100644 GIT binary patch delta 200 zcmeys_mhw3G%qg~0}$9UGNy0j;bih?(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?7?@b)Axh&e@F`#7P`)84*U9&R6)3#9m8G7M gF&CzRAE<#>u)!5<0W+)oWPLViW+1)UmraKe0FIM9#Q*>R diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc index c853ebadeb76c431cdda8a4f4822ecfa661dfd0e..2deb2deacae98081b9dbd1291a09e93d7aa2a0ed 100644 GIT binary patch delta 99 zcmdlkb6$q$G%qg~0}$9UGNy0jDP{6#*AFdDEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tvvt5SgG%qg~0}uq?|CY9qrJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agBvTtV0L|hXMF0Q* diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc index 6ab02446e3cf83385dce0548585e5b7015055564..01795dea76081c8f131a2a1965986417cc3bc26c 100644 GIT binary patch delta 98 zcmdn3aan`sG%qg~0}$9UGNy0jNfGvF(+@39Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tvGPd~IcwWwG>JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fhwy9wy5t*9 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc index 3a59692c7ad23e2f6721e4da1fe07239a6d0a1a0..14486e4b9ce2814732b7d61bf41e97dfe610cfc8 100644 GIT binary patch delta 146 zcmaFK`iGV0G%qg~0}$9UGNy0j*~RG5q#s(GT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{nyA5#FM#pHMwH@M7jneR2zYnJ~C z#o7Kl{U)<<-%y&#$iUFR@KK3D&-gNr@ygHzAss3GnVp%J_~d7pT;!8q5jy!lw<6CK zb?2|FEK*z#)txU+*5i?ox}om;ft7(%{1XFE^aBrrsMH+iiy((wo*d636>&w$_zNqu z2;V~`LT9YsG7zzUEk3tNRN(&Tc^K^LLme-vu z!K=^AprE(ei}yXV)(N1`8yLRGFqm8IP&=S;#mxH(ug^s@?}gP1N>`*zEa^;LAb62a z>4KT}U1`dHcR<=9R4rE-h^1mV&aM8+t zrS%Ha4JtEDCaNw7yeOo0!ODN~S+Og mA4U;oRym;WSmi!5GqCZ0U;?r}a!qcPwBQs4240aQP%!{gnY&Q{ delta 562 zcmca=e9V~lG%qg~0}uq?|CW}pk=KIRAX`7QIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC%wxtF=0O;QYK#tViY4Gfp$ZC0c#U|Gbuf^jkDMR}Xa zW?Ux}<>0bX-W$a?2ySqh;WFQArq?Y06^gU{FG_h&R^Yy&IFFHmp@HFp5`&)cH6G&y zAss3GnVp%J_~d7pT;!9#z+*gFibpZ!vbytkRu(C)4-7!!p@8xP)`>MUSZ1W$;1}+w z`M}D+Cp^KW%l88_P_~2b6G+hq9tKgVInF@GY)HK#Z*y73=AwvA2j>lLkr|9#c3(Ic zl+_lbt_Z!XWc;0#S%mMQh}`4_JhBF#nSq=S49vWIAGsKWWp40@PALXDb%);-DeueT z-k+J7gt%2Y-s~426NSRpDnYuvmBA?O)UZ2Sog615T z741GTu(L`{-Xs{#45T;n2(4n)dJHzZ%1o1q zstW=y3aMQX44C{_G=k%@lmW;P^~rW(-atdtC-;cG=T-%p(aP|FjX_>{bBp*NMiCZP hIbfKw%6(>LVB`P51Y~{WnLI_(f>RtAh((e>=vJ`-09i00 A_W%F@ delta 75 zcmZ3M-j~jEnwOW00SJQce@olQb3?}JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YqN4JU%0R3GXk^lez diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc index 832abd9336571c91ec340604ebc81cab97b47335..2059ab5c36fb7588a634afdd729128e389d11ae4 100644 GIT binary patch delta 99 zcmcb?{(+t6G%qg~0}$9UGNy0j@nQ66)(JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~0b>9Y0Lk4N#sB~S diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc index c95a8046cb2d596c553f50deee6703b4761569c4..5355789c6258d94b9225afe11cf75d71b4b0975d 100644 GIT binary patch delta 99 zcmeyu*2B(onwOW00SIgv8PhlNd}Q=!)(JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAmC2nE0M_9ez5oCK diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc index 7f788122579820a3ee931ede3147fc1f179c594a..d444da1a9303f62af2fe7c48aa435c4af913fe12 100644 GIT binary patch delta 101 zcmX^7i1GF#MxN8Wyj%=GV9UsuzL96Ch)1`6XmM&$v3^QYVtHy-qP|Oha%paAUP-aO zYf5QyVo7Fxo_=t0Voqw2f@5-GN@{MUzK@TKK9G^`l9ia3o*z(@pOur{8X6tG%qg~0}$9UGN!j~7nKP~=y!5YTC}9hsa|7!IlMIhisaGGPRg0A&$2wg3PC delta 140 zcmaDVd{&tEG%qg~0}uq?|CZLak++A*AXh)MIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC%w`61IQ9#Dv}IJ79LX7| q=*-B#DL#XHLDU6ygHH^sj1nK%m{=t)XgPdk0MZ}WStp<7lmY+)nJjAn diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc index 577b77e0c5f9d95c79727980a20678f4b78ec594..f4e51319074d626c77a841c1ab3fd42812452325 100644 GIT binary patch delta 136 zcmeB>nI^+?nwOW00SIgv8PhlNSaW&w>4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9D^xiYvNnHU%v j7{2f^D5_6>&t<@TM?rV9I`@A@4hBWNkAfgkJ>FXYO*1OW delta 122 zcmbOx(;>rinwOW00SJQce@olQW6fnyrXO0IT2!o`omiBZr^OK~eoPgBGjSWF~F{jvETPpBa>R VwKkh_|7YX?GCm4|q-=O^0RV#ECR6|b diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc index b6a503a968b7f8480f60dd3e5a5a56d6d33b034f..cb9e71b9d6b3b74d8ba0069785f5ada95ccd558d 100644 GIT binary patch literal 3369 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc index 3adcc08bd877cdd143348b4d22ec9b0eb35d62d7..80ff250d006c1ace1188df9ef36aeac523898d07 100644 GIT binary patch delta 377 zcmdm*uquJ)G%qg~0}$9UGNy0jiDqNUOy8WzCdJ~>q#s(GT2!o`l9X7Unw6;UlAm0f zo0?ZrtnZpqnw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k8v%`+a0(kX4%8C9WiQ z8%gS>xYP|f#aWyXC7d87=f&MvKeK^Y@)8P`K>C9KgOKe^f@;l`+{4)iyDINU%FQU9Co{qEhLp->5tWb3 z3{q;F-%8%&Q&xa0y(20$!*p8A1jZX;3YP>FZivZE<^wukOlk6Gjn|B(lkaPO6}v4W d+2L|ST)N-C!~cemRJY#;Rt8b2&F{6`SOEq^gSr3! delta 366 zcmZ3Lur-0_G%qg~0}uq?|CY9qCz_2ZJ#%v=n-q&dmVRh)YEiL%c4ARto?cQ$Vo7GA zzDsIxc1eDLegRM>KQA#yKO;3KC%-(uC?{p}X|7c~x|WO#3_o5l{Aggf!7n|d@Djhm z0~y6n3`~N`6I^b{D^K^I;D19(X|mr(R-n-2x#CL7H$d_%Nb)zurEbV6&f{@oA{S)!z}7nqfLQ2IvJ|`3a0S z#1t+GDBKW}o6HCF0k8bzw;Hb*ttQ{p{3?AzL=vcoQ@X?DhPZUUe~14KA*pV^53E3; J%}=!4SOJ{!e9r&? diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc index f3947e61e8ee40cfd228069d04b922fe56e329d0..5cf59b98f48fcfd213a17468afc8f7fccba26b36 100644 GIT binary patch delta 366 zcmZ4LKGmJ)G%qg~0}$9UGNy0jX=n9l)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7ti}(h!SJJj;e!x^sM2*2or@wm*F^L>Ty6-7T^CZi zD5SK&)Wgd->%nYLXn|TEfaWF2Jd_mHK`MQe5WCf`zo+WahSy?279xCe3V4b`~ zN?H1bqW%X~20^h83_#&8Tnutb3sh%EPvE*Eqc-`OlpFI^S(C{Zr4=TJNXLsa$eCW0 zHTfXJASJgzXpYnqS=A-E5cw7Zh}JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agHtS4g)yqI5UNHPEikz(q;Z)?<0CUre6zIRAr8i!lkZ7-a9mcg_{?CzsWe$rs)}o|+&5MhNudW4 zvXj?KDa(Ig2685_eqaDnU$_|LloqJYj-J4ELq_d0gSw#7$?I>_2vc{9cIR-o7c*3WtP4ypbPXOt4s&W4G#W(-cH^LDOWk9 NKQIG@CRZrS0st$(f3g4o diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc index a910ceb2134011790e4a66bd66b334f4bf727ad1..33a0230553b6b3852b67e4546f4885f23e25848d 100644 GIT binary patch delta 166 zcmX@Ccw3S8G%qg~0}$9UGN$j}$h(Bqqd`BkIJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`={E(G}jgf8h zGwxU>#<0yUd|`~TDy*_M#N|FPgJ?~2F#Uj2^fN1v|G{VScK+XjK8%c99XekbKy;B3 G&|v_%Wi$l< delta 142 zcmcbucvzA5G%qg~0}uq?|CV-OBkvMcgAD!9;?$yI{p`e|#5}#EjKq@6M17ak;_QXV6|8d7MF@|rB;R|DwRb`dEAujiU8ANNE jgXssHqMuoT{11MU&-4El^krn^>d^Vh0HTYOfDQlv!p<%9 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc index 37a7de412708fef3095a43b62e1b09b716a8cace..69af21c6b72255ad4b1588c0364edf75e04020c1 100644 GIT binary patch delta 737 zcmaDF^D>6-G%qg~0}$9UGN$`$ZRCsK@o3NwElw>e)=x=FEKki!)OX2GF3nBND=F4@ zO({)IEXmBz(+^Hg%t~wHc#V`=VHvC z%p)%~`GOb^^EGLm$xpFbrHw%i-W?|HryjJ=RSa_j~JXrX!j0Y2AF;IsF(>3YI z*7Dk5(MXm@GuA=x1h5m@ZDBkzx$eav)tGacQRd3k*UNoIf)_ zWCVmkGWltuJKm#760X6g>4g!fod;oKhpa|FluvipiYT)Ql21msQIR;jqj<6dnVl&up zun0_0yTQWQVRnOsZvxwm$vV20jCUue>4q^)^PPNHw@rpYROy2lP(!3DXX&M0g0l_-} delta 717 zcmaDE^E8ISU)?lC^1hjDI>8YGg03qwK%&Z zzd*kLD3hO;n4_POnv;`Xo?n!cvUwekJQrih-%x zW?|Hwd_ejQOipg{dKr13oZRM%G9FBf6+nGbqSyK5FY?P@;ZV3Et+F5tYRY66d2OIV zoy|q^o!pFBlmBSh*2l3j@Cklk;$&s{Ai}`S|3#dKkEwyRq4+Zc4q1`(zP?vCJkmvhODbE>^Y4$93Cefb<7323DSS-$vgF>Q`B$J|r_T Lut*g-0Mjo3vXQ)} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc index 54aad6d402a8a1ab73059e1feb9f0a1309a86e40..092d4dab5dd978c8dbdf4b3c044f7279d0383677 100644 GIT binary patch delta 2683 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 delta 220 zcmexzp7HK^M&8rByj%=G5Pbhzn!!fib-V^y`k}?CMaBBriA9NddPy0HC7Fr(E~&-Y zCHV#V1wfhnyu=*+jMSW*{PO&woRrPXe13WoqChiVF#Kp>xFqJd!gE690_UsZ>KDZv zH)q-CF*ENFzp{C@y`{K9A`=5cu>@SLu*1xf8HEcJCj`!5oZ@y-*kSYcu$zpG3Y#xR zJmqD4HhFtmukdAc`zyi@mw6o;+-}IJd}82Y<(nLo-YyNKKS(gJ^0fOl`c6>2$|CW> Ml7U64NEv8209wgS4gdfE diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc index c58866630963a1ba702efde83abac95afd1553cc..dba04d0a130e657f19b9cf8f973be30c4a66f0c0 100644 GIT binary patch delta 99 zcmdnNdx4kdG%qg~0}$9UGNy0jdC%z4r5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kyMveKG%qg~0}uq?|CY9q=RKoAk$z}#YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJGgB`M0N(E#9{>OV diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc index ffcb3a71696e7635d39928841c66134c7c593053..392d248bbf73a476632bdacaf3e213ab73dc857a 100644 GIT binary patch delta 567 zcmWlVPlys>7{$GO0+C+Nw)`An4Fx z*-Kx1hulj@bl47si*)ba#aZ2P4ncUUQzP3UI`#FQo|or&AAY=VbK@NQ)oNt`o)kee z4%se!{iSldSMT#4G} zl~=In+~&7{$WxVW%R~z^$d`d-!>ox=3-nE z<0DQNFQQ)#HwmOmXw4b1>FzSj8oUoxmL%YB5aW{b!>Q;K5`e!yz@Hbuv;c=V=Rz76 z+GX(K4a_C^NRm$|(#b3&88S%VU6dioOA00Udz(v~iC|a6ZWuDS)hY~%!#fAfDSLU& zW~Xe{kit0pnSW2}+$K^zn8p!C&pjfkpDm$xo<}PnS|$)D_|h|P3U|4fg*OG){&#r> zSB}|`;Z2zopg9v@&s+tp?NxFwxnw{_Y)wn*Y9`nb{X j&Vsoao7aN5{rn(1*oMSz5Bgvhp5MDW3FeMa%(wjy{R6jk delta 540 zcmW-e&1(}u7{(_~6O%Y832Z+0GtH)2T}w6^tTdvyCN!j2p%f9sgR4fXjrlAT0^VaT zuFPeGM6*@TJS@{bs4rRJZhoUP(RK)VE*iYQEIm+OF2r8l6-tdRg5pmCMzgYNPyY@Wpo( zxpwg1@LHTmwVM(ODmqYfFxhE&FnBfLtMR(`|^{g5e}OcxP$@i0~} z-1Hg?q7g8l@${!Cce6xHO~BdE9PUMK$0$#NKuV6pv?ZqdVIp3i02s>P(+CS4MxzQt z*j1-oHncI9z-z~}Q68*EKc8{c@hK~vx1`k64Ws^}Aa?@6!j(R^zcIX^yILAFo+8z*Bs8@8n#}EVrv(SCedqvRl2x$aq)c2M9ON&EuUs-n{W0E!dDMZDa!q+Y3&P x{g4?ShvVWRq#WE6Uqjb#yg&DXCG)uv%74h4nprno?WU11G$Ye_NbsFR{U0LnuEhWV diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc index 0b98c69d9ec29aed454b6ad41be51f806b8eed6f..e06128df174de591e8b50b4f4468ec4e72af55c6 100644 GIT binary patch delta 2912 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 GS^o>kX2ekd delta 3116 zcma)84RllG8NScG`6p?UHf@qN4Q-Or*dJ1%Ews>5pit=#Mp~#;-2mGPv;qU9I#f7Q zphc9{3%jjUsLsv$gA_mKEzHAIJm4m3WBZ;W%H?LXg zEvetsxOx2s?*?jFziwrdcXfSJ)B5K18=LCLZH70jNG3^BEI^u=n|2!M;&*BH!%cqf zc@mgTtm$1)%>>77suGW9WM~HL1*06VwTqu;*afz$Gw((=xhJ!LN150=^*9!bjo!;x zLh7^QfLd|ujmI#L4t4fm38;j28JCNC9#$m4nP==?U| zHR4#X8hBIOwQvB3$Ze%A0mI_9vQKf2)RmV4ABitk4B!iKd*!ouk9Zbu5O7uOyyYQ$ zD<&;@5En_;k~|(tGEhAVxX7txZ9KeU&GIT_k{6a!y5@-|YyXT2(tX=r7n(`-wuc0a zkyn1P1vEs)!~Og}c=5Z3k3b==*l7{p+Hn9{ih2+wYIpq+F-%Lo++|k4^75V`z)OZ7 z)iB1-Kemv!%@imJ^J$Z8=Yla@RLtJm*4hv!XdPmHd#Zu%VJ1vy>f4927Bc_Ti2ntH zX~G*?N5GcUQnIHkEKnTg=n`TJx#RI>%r0k-DFOOofKpqxw3$g!hDX^MseC<52kt{i3Qs4nn_vQn@LGtm* zcmdCm%cshL6J){Li7K2XE8knl<1^CJALQ{3=^S`VrBW$rT0Zg4KmA1;Nb-zw3T-jO z@^c;q17yp&2i3NG<}!`;IjwH?_td9oZA9~l1-dXt;V4^(=hMHdu$iQOxmJNAr0wD* zHNGaT;W8jh1}`;0^)3tbQ?dBUeY&8YOLUHMChaWo#1&Csd-YY9IZ(P}IH9U9p)0RD zy{CRCF{eMFitM>c6Sk5Et~q!|u8M|;r)B({yR@DAz*X62?Y?QmoipUl@w+PbA4ger z7IUe%-YZ7)NVNNdXm`LAN6TwijDXQB>D%=qMwg#{U6rrb47w@@jg_=(s5Kbz2@0Gs zHB3u#T_G<7Gzxne3vK@XbZ2RA=`+*2o1dNSca}_g{Eocdtpkqv?URD^4N4$gjKvC1z?nteOmo`G&YBZC8Jp_{ z5(|gSMInJ|gDTE7b(B+@;-$OI@LDJc={ck0Q?sRmKcwzd(`5Q81|?!fP2#w~C&i3% zg2~fX5>jz-&TjXRIW4573Mn}b76Z*L%ud@qw{f-*xNIq8Sezh*FR5)TjvO1-t z0@&0+fl6&Usi*)|uAupU(|EW5PDj9T17mwuo9?VJzI{u_+McNcmi!@O0pog>^mzeX zg_Iv#6y?X@Zc|WxOpcDaA)|}(V{nISKvNE~yf2T&bCYky&xGdVarea8cTL6cGA=$7Hna~VmFQ9WIwLqF( zigJO0M@rEY&msgPal#Sre?86LgcZ6UZ1P<<;RL;cq$%a_X#(!_QBJ2#lI|-rdo#TX=(FilN74)Z>4oD;Dvfc1HKtt=)N$5? z2^SXLl{Vta^SkoKrIBSwj;29^cFt&SnG{ZOZo|^V0n4&6E=TKbEp3_GvN>Qhwag9NkTu3lGq~kD+VLhzC<-d6 z$9NNH7cauwrjs*=Efsz04s~~i-+}X{V)pPrRt6*HJ z7m+NS+%_(^h^T{x=E44eWXhxa@RSO-OZyIB#&xEhKkk{TL46AA87J!*C+iuf{KWxW z=5dSs$w54#Pxe9Sz7P`^R5CzEX_P6bjzA5ATA%dT3$WHjGSlI z>SW!EsL|m`dDW}P;H9=cT!iACOv);a2@-2k7gtHMmax z>KLpj-E82jK5Uvz%X{iZyDyeI9cA~WaHliuJ}-Bsz~C!X^~b7x4xv8@Y)w)7GKKyO Pu+^*f6$t(LpzA*YJ?Yr1 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc index e253eda866813f4585446b032a03d0401dc0760a..1c897602c54544b2745beb64da22e5de22ee99e3 100644 GIT binary patch delta 99 zcmaDV_*anUG%qg~0}$9UGNy0jdCug~rXO0IT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k_*9VRG%qg~0}uq?|CY9q=Q)!>o_=U?YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJHS-}>0QoE%r2qf` diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc index 9ae6bd3e045255e354d35c31623a35c1fe786230..962dd1fe57838fe4274ec757a6d62f87db1e1d9a 100644 GIT binary patch delta 609 zcmbR1vDAb2G%qg~0}$9UGN#u}>-r}sbPslw^&2-fFidz^2<_-a`F>X zHoG%^W%Ov*4=qkDD%MX)N-R&!O4N7BPcF?(%_}L^cTFixP6QdEADo<+lUk(Un4FlB znp>&w~28IhljvKR9NKUZ4F067@ zSY>0@=2vWfjHcB<`38m$TnzHc*X8st$?1P)WftRlD5pPx>kBgjuSCCpr~eH11>q~Q zuJTykkkkLb%D^c+Ig3M9cw^ROA;-)7jvXv__=PTlOuxK&7KbnsBgf`-T;BYQODF%5 zoXnS+lT)maSeBTX0}7SJ)1;VWrQl9d@HnWtLuHA?3YGO*E48jGnjTc$yh)~(k+E*F zft)zg9PY{fa$-UZk}3~)MP_hZ;#IgIAv2#FC|oNSCIS=&I-5^)2Kyymd4z=WWPW)O zNsuH5NRsU`uiPCK-4!Y8vsY$cSFxJxC~vHDQ1!Bc$7NZM30!w%6&8rjj#{BOGY-g6 z)mmY7Mb+%Gr1?cvvjvQ^6fdZnO`a=X!}^Vx$xvvrib9nlkp3vdprWyYX|cs}+l96p z#4amaOkkN1by+~+qdtSG_2dHz#cFIoFBUn02yP&8i#ao|q$nK3VlB?eOinFg2T5^l Jj#NCt1OO&D%TfRU delta 638 zcmZ4LG1r6lG%qg~0}uq?|CUxckvD{qYhscoBj?05{yrR@C8JFzG+PcJDWu_QB5-zBv;yClCrzW^u$GE+YzH76&(JijO> zWpfL2Dzl^*(0MNyel###5^`K2Il=O}u*y|om5V}-o0-}D7?Uc1(hUqBxESP>ugmFQ zl+*vl$}Gn9KtSpXGXt+gzkjFy4EF`$E3&TgSbksz%5-pjU;t7dIT!?_?g-1xC|sa; zSy<%)kIEf>A)uifvaSd@Ugme~V1e^DZ{rYVVr1WZip!gyalvFUsmYufKp!LngQs}$ zb}1$qNw^CYJa(uokyxR!UTdY+bw$&Q3LcxU$ka0W&0qpK@~Z*^r~CtMp$Tc1xMglg z$js-S$^D6ek=KcF0?Q2nk?Fh>d1s`q$k^dBf%mF_<40zY%mZGL861~*72wKQcx@;D zl~bO)P0m;n$Od|xPjm+RC0=>B3T9p#pbB$2ApL;@B+GW0SMH9A?uwN4*(??1qc|i4wg2!c9j|p6NWEB>O&W>84I5Q5&QPo;uby?Nynxy#x##xFNB+VzU zk+0$Y%*QR T&dE$pEn)*nacoXhJi-J3Mn=-| diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc index 6d8a754bdfd8846992bd9d2e05f96fd6d753db77..e5a8d2b8ab286f8bf0d2b3ed02861fa3b455c613 100644 GIT binary patch delta 616 zcmX>S`XZF)G%qg~0}$9UGNy0j@n`jD(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tFf`wqj4y0(*Vb5+Sp zLtIz7A#g+C#^4REI|O$a?g-pzyhC+I;YD3Xpl*Z7%eakU?okJdiyvUQXyCf}4YxXr z!UqN>MXsAJffw{0R+MbWy1*mb;XQ-pB9H8hsw+HN2Yn|S3(WM)0NU}Rf#IQdz-MMA z9j=?+0S8Q`R4q_h!+k~Eq$8x$eTT|L9=j8!AD9_9#egR2aD8E85ZCVDz9A_+Uwo$c zXQ(BgHwy~}h)aDGV9>AznxxEhQ{8HYRD;(9mWwPR7u2mjZm!T^W@74#oZO_P!OXxX JK6$N{H~JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=fF>3((XC|N#jSQ0m*wiK~v8l2aDFFFEo-drGKKU%0 zIufs*onx{NyE2N1HWKd^yCxFPm_v(EVR9Ttk}yBe;0A^jrW-^zux}{5plR8_F!>@! z3`{(9gXsqK9fB9Mt-<2vlS?^Op>i8oH>7R|-{E*c&kid0h*MPvVjj@6(hcc50x#&> zH%w08keO`E!JHvN)9tgZ(>JHUmPO?gL1sgZBdikov;LAg&tNND0>5lF7Yq;={UE@gVGT4# ondye4a)Z|dmWwPRpEfVlU}j?Pjs!Y~RbuioEg%m_U(^x@0NxU(`~Uy| diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc index 0502b54bb43b7354b1285ce27c8e6d81dcdae8ca..d913f5b61ad0c898f67aa79bbe6bdee5203bb3d0 100644 GIT binary patch delta 121 zcmbOcxH6FEG%qg~0}$9UGNy0jiIn!})(wqz8cNIzawe0LG|T{8U?>Lw delta 104 zcmZ1(I3tkfG%qg~0}uq?|CY9qCsNv=SUJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?=ft#kzAqRnhFt~{KVWsN^EFtR!_PWIDKVgWOXHOv5A C4k8%< diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc index 9687b7fc848493e2264f643c9f5a9a3334373180..591ed54e1bbde382b1c307f8400cd3ea13ca5e58 100644 GIT binary patch delta 139 zcmaFF{hOQTG%qg~0}$9UGNy0jImqnMsvlaMT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pIC`$li$K*5?ZJ7^J40`6*xXc%XbeK#Lnl3p}a)!xd R`HS2N7r4wfuVe9L1ONurC-VRR diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc index 1e60593e2d067cb1bddecf2635c7bd550ca55f45..74c9b935503239155b45be3a4d56ecb6978f3902 100644 GIT binary patch delta 136 zcmZosoUh1pnwOW00SIgv8PhlNgfV+G>4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9a7F&A<1YXFUY l!SJJj;Q~kKMGc$D0(??T8aA7C_*j`(u4vd?o@^@M4*+cKD^CCb delta 109 zcmbQQ*rLdDnwOW00SJQce@olQ6UJ!=$cIRVdV!5ng Kb7gXXfIk4v*(3V^ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc index 7aa8de3c2a4af6f86e09ca761ccdf2f5d3cc8ac0..e01882e6e7f913882aff7a7c800a6da76c60f6fa 100644 GIT binary patch delta 99 zcmX@X_kfS*G%qg~0}$9UGNy0jsbTbJ)(JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{ag0^&+=gEIZV9geI_kU}F%Jn9e(qcShP30oCuE3__BV4Y|abf%Il? Hu7k_~FyTmD delta 218 zcmbOy(<8%knwOW00SJQce@olQbA-ttUq7@swWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Yqf;oa!OC4y$j~5I-8W=t?Flh?iuydN=a$Q9IqKNu+ z5#x&@#v6b<%a6=JsmU`rZZiIyT+BH;T zDUc&2G=c2{8-t+4bl!=)Gt#aIsD9@J>iELNARs)!q`UG0heS^?l<}P#D6=`1>mV}# DJtImc diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc index 0f04411c6aad16564c096bcbdb914c3be921a981..9759db2d670e64c60b19929c803f04479d1a5171 100644 GIT binary patch delta 171 zcmbO$v08%XG%qg~0}$9UGNy0jsbTSG)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t&hieH8{GU8RJyHi@(6xlXAslboWQEi$ma}nMgzkWQMnlv V*F-fY&tlVJW)Rcde4H(e6##G_Hah?S delta 157 zcmZ22F;{};G%qg~0}uq?|CY9qr-sEKS3k5kwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>~0!tuc(_|%91GUSd+MgJhS%o?|I~Y66Ztx3F2<$BH zV7bA~KS8D2`X-Oy2X>(B=3-WLMqv-2oed06MCE2wTo%;;Yn!}+O^X?%;3``fD*!h8 BG4=oe diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc index ad53f2341dfeeeb05b67da68d1c617738754b1dd..78501223e5b3f368d29546286142e42cfe24fea8 100644 GIT binary patch delta 198 zcmdn%d&-yhG%qg~0}$9UGNu=9PAw|dPf1EFPt8iycgasK%}vcKDb{yQ zDNRl+$;{8w4^B?ZNi9-vOioNm&8^h;@o~`yGV)!r67$mY1B&vqQj<$Ihp~2WGHOr0 z&nGT7$G^kpCXe(CpA9A3>o?Y4<8lAU%pj{%BnY%wlY6oPkLYFt{vuXJ=gEsj?AhyL uwKV-S*+IgS|B4hb25l}7r#3brSv-ZZ^$Uj_n+zi ziGh*RgR#TsCXe(CpA9A3>o?Y4<8lAU3=%C81Zvadp3JBuy4jJxh?UW4@)i+$wpcAq xKTUR^sMKT;(OkyB%}t{GER3rsPm*-!xGZY+iGhn#Z1Nq+7-k^7*;=Zf2LQp7KOF!7 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc index aa1bd7ae8c43a26f892e09d957f93ba1fd04de1b..ff7ddbf07794a341a0dee350ff7edd3c095eafd9 100644 GIT binary patch delta 119 zcmZ3czfYg{G%qg~0}$9UGNv!z$h(cxqftM!IJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`={F$?whw=90 Ve6cGWu8a&UQa?V}O!gL!1^_^`DS!X~ delta 95 zcmdm|zf7O^G%qg~0}uq?|CY95Bkwj&gG~L<;?$yI{p`e|#5}#EjKq@6M17ak;_Q&L$+r_SMxHB@aNd5R=H#u268UR*6B3S?c diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc index a1b598572c45cb26002576c35a6918cfa02174b2..47b730cd8eb8bbb2f1a9f2d3cf3262131bf0ff62 100644 GIT binary patch delta 290 zcmaE((X7dHnwOW00SIgv8PhlNSTlRH=!X`k78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9c1nSGcTt0x~} zRd!oab4A!?Va?328Ho!7Hx%x0-&8ZfaYErlmjyK)E*FJeZgLCVP}g2wwXh1L(gUIL z0Q)6#cbL-2_qoJ2JF>B`Fs_~K#uZ8>Q#aq|dceYXb@BmzTjpyDR+Cu;a+w(vtv8nn Hd}js#?|5>D delta 263 zcmZqHe51j0nwOW00SJQce@olQW6f-kqaRwFT2!o`omiBZr>5@ zg%e#a2)lH+ToiV>$t`q4U3+=e!YYtL517IO?3c{lVJbZ~yRu2KFs`1Qz!gdz^L}$Z hU}3y9`3}D=$7KbpPYj%_a+75Qa+!hj<{p9X%mB>3XZHXA diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc index ee67cb40e2cf0659ba7667c6c6d114b5c7e52c9d..3ce372dc2ec1a036071b2ed5e267cebd49ddcc40 100644 GIT binary patch delta 855 zcmYk2Ur19?9LLYO$9vQ1?#x~H&$V^0Tez9dbP5$MXKT)8qJ<9)_ORx%Bpo=T0xO{& zW<5AP4@p#1FZoiGC&0%v(T_w8$bs^UWe=I6Pl&%$6;p z!h)RbMCa*dOimScQ+Q6@q=5fWft$(;e6)y|>}eHjD(BoB%5Or8#9G+|VJUv^HIr*q zMx1A{5OB4?g zUc;Bs4^nuEMF!0`DLlw$xM7ZhT74$i-y}<6^$2>R_uWEVmpb_iCVszmTJkQjSr#hs z4)S>2UzjaRUKKUsqPk-A-L@MC>uM3Omy!Ou3^LwOr8*im@5gPquMRf5#-mde;TO>{ zI9f0kO*c+dgg+as>3Uf#ofRu5#mX7cJE*0$SUehZu*-;%3h>vUAw)CXC{-`}iCG0c_v3x*~4$NJD*! o(K%RQ5dn@@7+NXE$eV`pEMrR+v@1Z3^pD9^n2pA1oZqzm7n+C(N&o-= delta 967 zcmZ`%PfQb89DZ*eGqk1C0v)Ebly>Q~+Lk{pSV%Nl5t<_48l#H`5)L(s@-LK75B%A1OYA}1*Ieg!n@0;)U ze)D_ppCvqh4~xHxq5;8k?)C1)r%%KVAv7KwNDfaYgX8h(_+-n4k@(DLJQy8Lj?W~f zf>YomCgT&qk>QDn#O1{F#P{r`P$%MX`pD9*%eo^4#OdAiwWXN=Gqco9z&mFJPwCV= zh2FGkp2AkF1BQAx?0p@n0`mACMIJ<6n7cFHp9Y=|v7y`iI%{)}aX3boJoV*2I17k~ zKDy$m=ZMH&diDt3W}Chz*uDofl4k)vUPn2bYs=+%y`K2$7*ioH(mnV{8yHegE$l7pUek^aup}E*E7oVMHlWWGP zO2AI(SY2?MYdfH21CV{I?G7#eZ!&9)=CvgKwRJ#pX)$kU%e+a;*c*13ukAF(P4s2h z#?puSFb>0#;iGK6{SXdyY6;($CXL8cJwG@%m`7M2$hrKf=!VfzB=Azyl#LiGx{pxX72;_rK3sY>UTlA6I!~lG5kbjSiK7nKDsJm!jKtHWg5r{un*n)k%Qa zY*(5%Zk5IXP?|g3pZ$qc>0MNbooRkP^di*%4F6oc8tPA-0(d1mQaw4Pc}oeeDdDWr zQ9!)tT`;HRObxvo^IZEtICnLiV3l{FH{G3)plD6)V&6hvW@c0Jk&xx=|6pUcrD`PhnL?RR=y68}{XY zlSko1Z-~)v@H`9lT;j}LUiv_gU{X0)so$}Oy)9+dvt<~{Xb2uxp>ic*jK2H!(`O-^ BCa?ei diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc index ff65022476e1da0f0c410e0ea9ffc2464721347e..56d0a2c7293d72c3de0ddc80ad0282e00835f806 100644 GIT binary patch delta 564 zcmcaLmGRRQM&8rByj%=GV9UsuzJDXH7KcZperR!OQL%nXQet^(R-(R3esXDUYFGl=C*R|iWxX$`FhPDZD^I#0|4*RZ4GbT682E(xqq?IeH^?4h zW#E(Oh??vrrwCzfE|$B_&TGvCQuu&Z5UealErV&Y%;eK*kGU9x zQkpa5CqJ`Ph?*R8LquY_&qSZ=B5D^!)RvSluDl{*_??+SOld;Q2Q~&#$?3k6d{?Nf z*IT9c0LY2Kqv5+D*qz_yAjX$ksfvP)`SqO(N<$QE-eCm{x*d~m+3GS)mYU3O=Lrlt znaMGBCLntA6uV?j#%-H_xQj3{U*(jWEaIucG(Bpvy{9Pi6B*UXF`jqDOx>@W`d&2k zy=LlvQN(bf--NIkAq#vbhjZQ&O00nKd4*&oF delta 691 zcmew~h4I!@M&8rByj%=G5Pbhz+QE&yS{w$M`k}?CMaBBriA9NddPy0HC7Fr(E~&-Y zCHV#V1wfhnyu=*+jMSW*{PO&woRrP=9E!}0Rg)KTYqC$2|H#0^t1UxM z^_>aG`T!E%EXLY^~r|#rV*+U#a`U98~Ag2iDY%Y_# z&MxG~1k&?>R}i8@n$uu%lv)P+M468a0=x#3kElK71=8Qeff64WK(ZUv&k6%Yz|y}E z;+wlQE^{#kO^!F#(gIn{%qf3EUbDmH3XjZ9ez6+@BGY*$@=W3T&JL9L4w3~c*}THI zm{q7A>~6RlBsq;HYgmSJ%mjH^)RS>?qopYqhynB}h`ZZTfqi1kM+Qbgqse?$V#+}J z1Bmm1jX_j$y6+_46)NlXR_Q$ea$=CwNdlF8Hv}5~fdNQ-mqRkq)JjzjX3DScTnHvy z`R05pU{oBKJkeH{W1`eY1~y)I#>oe4Jz2mE9y=2-W3#heGAHBN&CA_I7&)$R%6(u^ zWHq0>&qGCJa@1!AIZpEq*Bf%`D_A!&Z}8mAcTvOcqMUt){{tD-&kWMM=9B+;+?6)> zyl(D)(cJ&CdEh4o4neVtBE}QrCZx?sSr9w1 HmpVHDTh-4M diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc index 589f89a41768304a43f625650648b176946ec775..d925a7e28506121378c5b5384c880a737718b98f 100644 GIT binary patch delta 199 zcmdm}c0`T$G%qg~0}$9UGNuP@&wDA#fLFI$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9boiRH@y04I|n A%>V!Z delta 75 zcmbQ6)tbd~nwOW00SJQce@olQ6D4MlqaRwFT2!o`omiBZre9?gir*uKruCK-0%pAN=S(|_LSH)yV1;s zM-(frDnzI%HD##eibLs%RWNj|j;t!E55~k8{HWVUjCPXva}i%jJ#I^iianB)6+P zUDC{oq34E5S`A@!M@cKAqbGC4Vm`-+k*{j{5o0els;FdIe~Z7k;5qt}r?9{3=9m0; zl*LQ%g@U8A;C~(Ne;vd<3(DdQvk!q;Hq(-o_CA3Lyn#tGuCcMSfW3_341<;z>1A@f zVouV8yjJdK(yMHeLAqDYCOv`Eb05tun2R3e!pOz(ug5QsEcR?&YFpD3&(v>um1S#I zo)qK(mhm>vO3|l*ZsGpwG>r%E3Lu=Z?BE^`{DE$d*0aPsSwoxEzG0npJWE(*#i~TKrI58LU~=%J?x2S2W#J`JeN4goH)#34F}#@>|@XpD!PdW zs21;m!}N5#x^5d+C1PL`m9fYJH<{9OlJ3MkJgdmzT@Hg(>4^CzI4yCQqT4!Ry*oKQ z#9;@6mONF{D*8At62HgQeH;q3-a&%SqefXwIvG%?#AsBBgzGG*a`n6bz+VmUdxmaN zzH(hWY&}pcD1hFL*7;X1x!_@1NRGywr?fG9OF|eMnBWi#aFJe3W~8m0R_Np8t|q}Nm5C!#RCr6sTbGyfU? k=Led-bgc8jrhDFuEr3Y-uM%*}^WCQg>@Fb2vC8Ur4zn>GZ2$lO delta 729 zcmXAlO=uHA6vt<>A4zu8Bqo}s`Dj9uP}A0=BKUz&La9-kN{h9q0UI{$YGRk&bvCG! zR(mM~5iCp(y@&_BskE}-K@hwMiU+AdkX#IYTzXnlDSC4z4!qz0KX2YV-pswi&ok~1 zU0nhoYx?WnRX+a0{hA$K$j%rtGO`O2lGIGOBGsx=c1$)FYMP$a$%&>)O12^^igrsw z%Dn04zS&?N@7YhY(;&^74;(wtm9`-V>5B#k@P^PY93y6!gmDPJ7lzD$SYd>5vd`08 zKd!rzj>f)p8~C_xyy`8wWWszn8@oiRk&og41sxBG1Wl%@*3dX! z52xS-{3?7Mj^I=zCerR`g5n&Wj0De0)RrkUf~F|xx~$HZ3|&&2TxpsJ8l|U2iX1Hw zbVaJFrJ8)ZhAz_V6h$6yMGU?(&1Ia99`P-a>@^a`69$04E8uq$tIEa&No@uD6Q=_7`_UW){q!bV z)-(kzVKtHHy+acLy{czQH_2NxltI1ne#mkK*tzF-?bZV=C=0s*4Gc)$tuHcze+ sSCD_`5&W5%NrdgDNAM1JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#iwuJ2D2O^U443cu6xq!q3mK)OY)A=Xx-;h?gE}(ExK;Z)`PKQA#yKO;3KC%-(uC?{pJJ(~nCqvhrZ;TepsHzZ^~F);HgPGGqqCN+uchP3>2 q{t5gyq!q3UC|nd!_{a{F`@qE@Dffwi39JfD!3S2L@Mdk%D{KJTlr!xB diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc index 186efee90fcf03f2c6306e06634526e884401f35..5e38f3dca8c4b2258a00358a453c7368d4659c45 100644 GIT binary patch delta 163 zcmZ3_w~vqKG%qg~0}$9UGNy0j@n`aA(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tA=1yM9 z=3#l2Q~3r5e?M<0@5H>zVro}7)W0(`aH(A2RQ|xtz#{dX3&QzT%mZ}EL4I*Z1LlJU Itd5rK0HhN#!vFvP delta 148 zcmdnTx1NvZG%qg~0}uq?|CY9q$Dhd{OFy(YwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~F_R<Sv4VVuausT|@0{~FXE$ILN diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc index 435d105d0748b7d7d1a06b037ef4a4d9330a08ca..e40c7683912735966df8a7a7cd74572bf0e56bf4 100644 GIT binary patch delta 181 zcmcbrc}J7yG%qg~0}$9UGNy0jnZ)GLq90nET2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k^95{vL>5nu)A|H{b!i`P*6qqnyBgo#ygU7Gs>^a8(fq(xF%^hSy^ba h7=x727Xb!wx#>9*b0+6q7Et*p%pj(=`K{0kMgSW=JbC~C delta 174 zcmcbkc~z6=G%qg~0}uq?|CY9qXA+Y^j(%uyYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{p}GbS?@#_5w~*?l-J%NT!RVCCeSoWpLz45T-&W_Rae z;%1!uMNmcVvZ(4O22Nhp35<6npmCg4@ySq)A8Y0BWmz6^VKn)Pq8fB4ZmoJA)S=yqVwsz5jc>&*$Epm)=T}0B9^i zxH@_zJ>}q4Wf`qW3v5-e zE7OW$prKR>9i?~+{4Sv{(rhA@!SNhU>Nu93Oe?BDfD#t`cj{e;9xBh^ntw!n#KG(S zCv7akC;qN}fe&oc1>LbfQ~1W2U*nm64Qu(2Vjib*4;uXj*0T4P>9f5|!XT0LjgrGd z)xT5Tg>VTiR{q>HrvxH^xiT(P@O%ZAs<<$Zb0(fWi1h+Cig>Pqv-+M+ec$6nGR6D> zAV*2?-=vxzghq-a-@8FFOl3hdGl=a-B*#=9XazFOXa>a7gq=kUAVl{}O8YzrL7wJq;eWK8zd{ik9w4f5euoAzMe`F6__0LWQ(ZpZwNBx!FrKSGrmA-#$ zFj-y=$Nrda!j=BWUmA=?;aV7t0{S!m5h)MyRr*OY7CdgXC<{X#3QwJ<;9Glnc?c2^ zAc#mrCMl988ImPAq7aqj1N2IIsnLCS0jdAhuuzK{ygY}FMqlH3MNB3dFZ2)ga)&s$ z0l%AcPH!3|Cn;98ZEUIxu%gCw>n5U`#xry|zH2^~&|2IsZffXJtko~dnOj2WR~)%t zrCd_7r;t({ddhQT-s8|)l#v#H?z}~)P49JguGi8kQ(?A~xZR}PO}t*>wiBn3H0P2% zZZg}QI{e~$sm0RbG6TBBvj2X}%6e|YXt2DX8k8Fh3#3EQS)bo1w3s2N33iKF0u{vK z;Qbye3RVKsX1i*KIV{6Woy~}01-Phu=NhvGt3ttL!k+C0)tc5g+L9q-F-gph#OLiLxb#5Qu2GLnS$NuTRWCN2= diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc index 92879d37e22d3634c8a623d4970863dd511a31e6..24024b95c946001053efff3785703eea014c84b1 100644 GIT binary patch delta 3985 zcmZu!4OG-s7JqO4^TiAdATtPz$nYUJpfjM5BBBN2SAwpfX=c+n^VdL_!8d~lYN%P^ z8em>^J!d^9+hbd8?3Vj)PsfhCS;uqAbv4-tb@HoL&(^WCO-fqUv3>XbLD@DB{{Hvl z-TUsl_r8zWc|>#fh$il2T%3vUf8~^}F}@I&O5Zu0XVlOj6l!+TpmJ1mp6Z(YMRGD+ z(PqFA?Vsoy%9A<`&6k@rL|!B}_-p)YdmCSu&

      0Q}s)UhRh-UrtQQZ0H&W~zT8SS zNXtnpb*@v6>#u0$KJ8u-l3B>@U*&C;8@%pWL0?Og90-TpRsI&AH(VbKxNCjhMwvMt z@_GGoQ=5Cif>~}(1ZOpP18ahdSg=9%g_Zu8cVp-g*ppNw^~a>asU%+xG1;Ro5}VXh zwxeuk`B`&DpE={8_G9z7Gum;t-CTPnCQVstt)?^=4%yaDk0D`$8aH3T5V1MNPyL2Q zZIf=ZNnK5+p);;i>eP2?J9V9OwZU)PZuG~1H#vjG!q()ZiI!m>_rHGAbk4L%*(97W zEX^UzLJ7Q)oNQUnRreBOR!$_>=#`xGDoPnNjNMMJz}I7$i*dtW0Iyn#S4 zEYcJ5co;fm>p3_LY$?(i@X(la=*@8G)^YYC^kqz@n?UDq#hTa1VNZQ?TlmRf03LLt z@fxpiWSe4YyiIZyV?hR+9kca8bg~IfI4UVXT;_}fyKWA>5SOxZWvAv_BZ-*?p3Fkm zcY~8jtnCJ&y1a8~xz9`8@llD>cS4EW{4b`5O38br)`|q_{dmez`EBMrBW;0e&Q@wv zR_6P)oO$2nr+G@AJ6_6ogf~rSG`IYMe7A+1iLdM{s5n@>$GG468w)34@ubDv;N?ln z=zO?4$)oKrsQ4JXlk3N~Vz3(!+BifE9*;lh8_r5Hilq8Ln6<-=$>ZsuVlV!Y(#Ig> zfgh+JtW#dH)Z@fDK90|tSqaCctgD&rC-Oz>|N-YnyX>Q(O%C`@*c#O z6~wc@;wt~fp1s)1+b+|YZ_jZy+F)bR#s(c88JF{v9hCV zF4g^$``f4tOuwP+_yql5LKr}}h;SC+Q-li~B2uFqh?wicGV_FkYvn+QMNoGc;T*zw z4o(eg;h%`k_hfyeKcwNb!@;Ja`d=K{6KaBf*)_t+UX1Gtm{YM&b0{6IR^&+}%dJ={ zM{7o*0n6dw)Cs5T8ceCG9*bv8Xc`x9AyF$y$?1$eXG=Y68`ozWH(<+ySE|w_k~|(h zsA@B!2aE{j&Mu-ymG;>$N-GD@+{P7Zw~Z-1T=Hu1f!c%C7ndI{`JTOuCWeU4v!Fg8 zv(GsfG07X6y#c>>Rihj+s2S%%;CVQ+$D#X)wk#%+^x>le}k$hbH=&&_@5QOj)>^R$#gqXXQ=9JV@)}rbfhmgd`1^e> z;&-5er!{-1t?#=xtFiwY2dLA-i8@z;NZHjPE5f|+cv4C#yUhjdv7(J!YL^W1rG&C! z>XIYUfPFH2zoc9uV~Um1rL*b0>wL6RuV!C_FBUH*5%bIFUP1@_|8VZH#O-nF6dq3~ z%sd_&eE3M)FZP^BnrI%;bE59|t1CK0%qiMZ%qily*Ax+BGYdA$EZoMv#bEAtniW}G zuG(|G1m5n7Gl~2nMBwbQ_j$L~l%y)k^2r)q0$;*d<@$;&omosKvL1#MuaC}FHhJsf z>44JLJeiJ(=L5wSe)&!L?FOY`Pt{8szYiI?dRwBM?lIWu|HnUcDi2_2xZrl3 z%jI$u)baRHr5-A%a88V9>iy!FU=N@sfe<*}nwTbv)Q6Hvgjj@+5G?R@t1YjUlM%hQ zxmgbQnFHk>1W`PZVX@sVLBWPRcRm&a>(8pu%HZ*a{Pn(YM8|K0rVu-WhNlo_Abbv6 zH@HXNJO7;dtPsU%Xm5uPHaKYxe6u01BbN&zTHYI>h{@OJ4TU@b{-{w`R*ZwiJ`%BH zBAbPP8Tx=_*sW7U&NgVcg;O-O^q5zwhOLxoRS9Iv*4XAn{M^}0RcIW*!A`i85 z+m-qA@o0_*W<_OdJdS{!=ColA1FXOx<3BTK0(J=`%)d*t4i_I(YrRB%; z(2kyhYJ6;}hsz*R;t&vp-H)uOqR73d%?h-@{6?rhqV;>jUM4m&p7m@Mf><}dYJB@f zn_u7q`5y@x^~y8*KBXP}m)#tCF3z^AzAw%Zl>~dmGB&CcR8&vQ@lk_H8;La~8l%!C zl9;+b>4mtcS>N{=FX)6FD757H-;f&FWwq|dZ5 sJ92kf57xc8s^3)Fubp;V3o{Qm=sbAhz?k^zcycP;M1& delta 3910 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 JxwOC_`xnZ-R8;@~ delta 1914 zcmZ`(X;4#F6uu`fkK`qJ*%Ok;zR3~+V{x=ntX5&Bb*Wpe+Ny}CEeJMov~-|Ct0Pid zzzY*_8MU};JL;{XKeRgTiZcdqh>mUTXsxxK`iRiDb-6bbrqgNj<2%bc=Q}6o-gB!j z%Wqtki&sQZh3IeEcfT!q@sOz3WiHK_;VE=`GK%uu`6cNKmgFygCqH9cp{Hnh>9UMv z^h;?;esRWp*PQ~*Y1UQL(^CPgvU4Yf;YLMevw*^GJ(;W*uzTh4%roc^wr?8;3WT7WTfpwl_ zob8zg6L6g;D{OI#vs0fz+C95?u#vK|Ei$-H!pk!__=)7LIthy{yy~{aCh=5CVJKm+ zq+ps7>FtuhG!-&NOKPTRkijB}Ow%H3R8x`9k}Bz#sYl__O)GrXB+0-`BeK{f6VvD) z)%IGLmQISR4#+@G?5iKiKug56V*#F!*Q)~nPW(#E3`il(H75YF@XYn|!9|X(-y?%O zl3#lZ;5D36e+fnr8EXE`V!cf17vZ;-s^i883cjhjA%wb;D*XTXQI_&M`= z4k3@4o>?W@!S9*g8RM!%_`$X|Xv3}BcfmC>_j5DQQFvOa0B+&l9bNDPxw>;1zyp%A z+bfF#IVG@Cg8S%kC2EhId~n6Kq^>yE^*EO=b~5hS`&rT>R%2hN1|6M7Upso;=xgdY zzbV`=8fs^+o867nf*rT)Tg07;?8KV=c2$sh0t`s{{y6|VsX3qnFp-U4=m9p9{a;Si zK`Qy<1RYNc8S{0cjNCk(4=@R5pE&|cN#IN}*xzHVW%bw98v9CtkdD*OIcN#01sISi z=L|4r<^M!GZ<)fIMmQd&z9U_OYJbF1vwC$jKaw%oKM|;z`CY;(W-lgEsBh@Qn-tp&o%(pHH45Dd`YEXE&mbSP zx5&fJu`(NRd{#x3#FbXwP6@l&dRhgfD7Dotn-_9Es<5O;u7Uu_)Zy zbqOBgD!&K*B)$FxO3;xvzaPQb-{L9Z_`ZP{QU6hKf(!4sJ6NQW&A>$;1Hnbw@3w*c zU6wGVFF`+$zzeDP@V#Lol|e+In*sUd-gJe%j3tx-yXaEpKtc?yQ1v976#be395c2& z3|CSqAqwR9!!z=Pqb#wxuaXnlBD@v#6?j#(X5j9MLK5E8Q)r`7ia>%`t68V{R2z(B zHljc*y%XgL-!PiQzWUn#qA?3YX)Dh~DuakZHv_WzsT1HCIrI!bhQi2K&%@a=wEZ5( z*-T-SaXf7-w0Qxfu!r6rn^y@iRL)bg^(BB+*^u5+t#MDF zB?|!I9}`U8qa1X&(pV#@)LV&e_dgLJq|g_m%ar6ZC3TpR*#f4p1x#TJn9_Pg4jXt! zCQCdPO8mzu>x41jouh&^u}qU<{ywDjTE8yxnldsNA95pxtZV4&l$fWNl#y7HnW*oQTAW>yU!Y$Al*!La%+b$C&B@6x&o9bJ*=)#SV9cmGImx_t l@)z@L#@5LR7Ol*|6ZI#*v`}PxI+@$@7N;cxi&POPNC8G-T4n$M diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc index fed872a77444a0c3ab758e169431a56a497ee890..8fc7f272eb73203161db34c0105b956218a69601 100644 GIT binary patch delta 99 zcmbQtx0;XVG%qg~0}$9UGNy0jdCTb0svlaMT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{pJBhxDu0LfMxD*ylh diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc index 6d3b5da06339acb4b3fcaa4fddd9df274b21c8c6..def8ffb7937f7329c1225cce4cc84cf6a783e6ad 100644 GIT binary patch delta 98 zcmX@b@`#1!G%qg~0}$9UGNy0jacA^s)(JFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fHsf&sq(B<) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc index 48e261e415ff68a66ff298383aad2b1f197e27bd..8c058ba4b063f617fd6bf2680b892db48e1ef04a 100644 GIT binary patch delta 234 zcmexr++f0UnwOW00SIgv8PhlNTxIcS)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tB;cq7qz)S~x(G8K fHs*8@U_NZa@50S|gqsz}J|e*EBD^_NZ~+GZUdKm9 delta 223 zcmZoL`D)B_nwOW00SJQce@olQbCty)Q$MsgwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YqlQo=;k#%w-w*kjxaqUkGyu50Yw{Vv+gJ@lzB1WCb z3wY`nH&2%5y}+EU!7%v)uL)!84ldbtY8Mkh3<=e){_<6F8fC1-aW&2MIT!P_@ zlk)|_881yfE?~+GKQA#yKO;3KC%-(uC?{pJ6Z=FV0QGhof&c&j diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc index 73a374f03fd45ed8a290614d6df8f18723ac235e..16c122e7d6086b74372db5772b142323e6e2d06d 100644 GIT binary patch delta 122 zcmeB_n4z4l78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9ZuIE0uO-%d{E XDq_AZCO!EsS0pooxXflt?hDKS6G10e delta 103 zcmbOu*D1$ynwOW00SJQce@olQBf?>jr5{?HT2!o`omiBZrud`p<;G%qg~0}$9UGNy0jDP{I()(JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{agBy%}4`3?GMhMVF#-Vl{VGWS diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc index b814f3e66d55dcd37610fa5b761c22c2951e3a0b..6552d11f91bec816ec1a3d2104e5c874cf3be7e1 100644 GIT binary patch delta 971 zcmYk2e@s(X6vyv9G-f}tC8MRrnTX)MVi)fp=bU@b z=leY;ck(e@O+)psYPAZ`(+Xj5?gzD8u=lLp6Ap}q?E^mViNKK8-Wl>A9}bK}!uGC# z<9=^sFf?NC^?Q#6M$PSh??7Pqq`kYl(@u*}=a6?K7&}OYLHV>qo^xe2#SRlT%OO7X>&CPQ{<;j2wDDNwijqv zAFTzFC8|hmET1yO3{n2MPQri4Ar9zCf6Yq;UkEAv6!&haN38Yb7R*|vx)FusWG!9Z zXuhH&;f`CUt&c?8Z=x;X#DanTDe%ZIJN44TA_6&E)Vl z4QCB8R-)|sr_7i3CL&2|^GxKLC%)%_Bi1zSo@z@(@Hg9i#sS6}7)y<{pu93#^jK56 zz$6Pq-Du&Y)A{Y*yXiho$nom)nrn(jdRs!q-HxO13;d(Qj1uw!NjY94evCD;ou#z)G>$nCrlp2 zGi{%cH@n*qzrya{;tppmO6#g|*x7@CUMBaPySOqPM|-aP-{rJGZ^lATI|a<-NYB@> zY%>Eke*o0f#*yf8v)ryt{&`H@cS4wj8R{N z?jYf@zQ5m%IM)9X+N+d1W|}g9ruawi(yhk%c2BaoZ<)R25a2}?Hf9v`nsJiYAx8nc zKz{km3;9dTw;gZwS;{W9P86hs%5&OP&^HNVWYzZ_2d|SGfzKg7#{_-2 zDrl*@sG3lu4APWlLX#3qxP(e7sxpP3qVlrp|6WX!Mf4e;3Z8|tSJr~civ2~<6dlR| Smg!!cI>WK@KOfc)ue=4ho;zBA|h zzB6YI_rn6b@&^`eAK-0bwqHb5ztX+YGtC;MqP!kd)#8HU;}Jb!qA?X^EqBX+5ZKSt36=TpXMy^BWNI{LOk!(XetY6)4U$UtCu;ZXdI!wTos&1xCSv z-@D_SQ6R&fWnL>lYI%u|*VXG+__dUuti#+|fi!Fy=H>m2msVRAtnE2(*89xndt&qD zt?l@yhM%SFOaf>a1xp@aw$b`*-y9y>9Mu=?^h!ar;dh&lA&Mlr#l(3=m_h#Z^g?BC z-rGE#y49cC_gi3WN49UgHDB3_uWbv%2!@RoG@F_uUo<*7`RwX6|1Gv)-j#Drm~QdU zEWW&X7yc>`g$eviz=3AnbL3UvU!)ynjv4&A`5VjPp3Y^&*$u^(w!Bf!rl$LI?x)7> zDmk)qKY};Oz1Cg?AK-hf1LV-|ZxMV>?(h8`Y2ULBS8=ejMqf0$RG<^Q_*`cdv4-h=ofnM@BDr~BfY)|0X#&Gw zijGUSzfrK`)4{(GMG_fUhJKf(X?jNqP{?gvf!W62+xqj(L6z0sAfUCeu&%_@W2uW= zI2h2uN%HV;2x_NT^S!tx?6gd@sDKmg8C_ATzAP3c8#a_Rw1B@3UxAm28otZHJLGy~ z1ZroP>o7JCIh!U7%%x;_`e%%rGNz&=;|k_eN_t?eo-!~26dnHy#!Pexq5}^Oorkw? dydKh6dju$_kG}y7>6n~Y;#m66Am&cK`v{~AICKC2 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc index 897102ebfe9679b793f57c6c3a909402317d10b2..fe981cba3cf1b0488b13ad9b3b142380f540823c 100644 GIT binary patch delta 217 zcmX@Ce_NmDG%qg~0}$9UGNy0jxy!E`A1fGw~47?%}d={3hblD(tS;y```W1D*Ydrop6wE)eP7V@RbNkB5%*FPB zje(2r2A|MP9>EF9JzgJ}8Tf@iXfm)!{rn^VH0rwmNDTv!_*EKQA#yKO;3KC%-(uC?{pJI)@y;>SYD-FmTn_|fJ~A`#icIiXShCV(gUn?e zy94Q0)cvmU_lQcKpM>XRV)N_#X(znXI73wmfX%< L%!j#HorT!}f3P%f diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc index 45dbb772ccaa149baab6d2fe0ab48976478e1f17..e91f17d7c46774f53d356e0d389b114748748cb7 100644 GIT binary patch delta 188 zcmX@Ee?y=5G%qg~0}$9UGNyZME{oJt7KMj=qTQJd?l(9E`sF(1E=bs1;k2DBDBfhmz-9MAfq|8$-M7*Af{@i! l7V8hX3@lRLd4LiZIBkCw^8#IXP}zywg_HRRC##DPI{?z9JL3QV delta 171 zcmcbie_WsUG%qg~0}uq?|CZ*tk=L5TAX`7QIJKx)KRdA~F;6ckBe5hiQQsxCIJ+dj zK)(Pelb@HEqo0wQlapVbUzC%wc>;$sALF;lSH#TZpR!0jWl?y@C)%Ca;C_QspkJ<2 z?t+BPWlq}<4E(HulU2l`S*$_50L5-LkpKVy diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc index 9a3de962e32f35dde5868054edd775c3af45b83a..c290f9510a29f98665f750215a62b6c32eb3e046 100644 GIT binary patch delta 279 zcmey{%GBP*#B-XLmx}=iY#ABTH}Z%udo<~X7N-^!>!&0omZxSV>bvA8m*%GCl@#l{ zrj#ZpmSpDV=?5n#=A;%WI3_2iq~=!Y`}nx%0~z@)S&4b+`2j`wS*gh-n**2=l^nu> zMmI2gkYNy$nh?`jw4kJe delta 289 zcmZo~WBS|5#B-XLmx}=ig71Gz+sGrrY>=fNTAW%`te>4&l$fWNl#y7HnW*oQTAW>y zU!Y$Al*!La%+b$C&B@6x&o9bJ*_^?gsKgjJ`IM@>)MX2g>mr^jwN@yvD4kF^LwE-3 zgvbS~7e!SsZ{}3XO*nkJV%`#_y9A0;4%@$SQqePzQ?D1+p?SgBWc=jRpV?!eYPx diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc index 021c733dcbfc229c2dfa0724534668d5ba190ddb..72f0f6241b9cb6dd4271a24203886d0fa81bb451 100644 GIT binary patch delta 99 zcmaDS&?d-pnwOW00SIgv8PhlN++y-*)(F-Nch03xa( A6aWAK delta 75 zcmZn@d?&zjnwOW00SJQce@olQbBoC!TR*fowWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Yqk2!)B0Mr>8uK)l5 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc index 90a5ad8d2c38afc50e3c57596dce3dd661be62da..50d4d5779c40d498ebc557aaaa4edf63aa314510 100644 GIT binary patch delta 2303 zcmZ8jeNY?M5x=L?2_!593-M`?1O{Uv3n@U29aE2q!Io2D^Wjh%XRHXl6Nt(ZzB>#e zxWP6~T^bxRr=6r}>x|XBhe@&y2P-eZqGQm zmN?bdi+?~!HFR%y)Gp>zK{Q8nv}8y>jZxWXvl}^DP0gYS+DZx^7eq(IKsO8tZBAM$ z7SfGk5p}VjK#h@9S~jF_TTi!8w^+=W@*;Y=iFuZ2y!SC)&*ykI&~mYqd94+*@rm%c zEE?P4WgHug+-DEnO7CYj7y2KdKCz5#al8{|UfKFHlMaOs8fYpnCO-1*Ghd0Wmz!&t)|qmXV|@|W$L=gL z3t!*;UTPna*AQ-igW4LKX*l)Use{%5p(_I#_vFI?eshGE+~O}eF!h9;B~l7U;~7Hg z0M}Iv=l86KcVZa^X)ROTKoS}7`~jo7=Al<~hQDJ0THzOgb^LYDPWV$`vyLlQ^BSHd zl4}Z+LcI&2dedrs@}YE^FP@{7o;lUCZAxYuoy+XXhs}HpQvzJkrl6;!alDMQr28i6oZWZT z?t`3`r}VR)olEL;%S$@)SJ>a$L~_*^TTkf7KVjoRnUt!}9lVG~6%T!nY*xu5r+9J` zP6w;4A0zq83|xZrFv|DfcflB`RkuA_!IM8jJe)=T0;j{?0*VLEWG>pdXRKA{#3}mp zmdUz_?dL?83A@Ora5wDEzK1LZmZ)@rNehA$?dVjbOHf1ilLIhDpXJYq*VHmGNDM2k z@Kj_M=~Aypq9&H%j-$CA3)}4?DUt zD@V(!ZsO7u!gCB3j7LI!!QLoUI;BrhHwU|=L|ByNU^qcV>HFyTA$X)SX4dR1XSq8T zRitHjL#ieM+?DdkWyq9$X`h|#CN#<=pDQnu%q0s~>>K^syrXQ+ zR(91^#=5K6rw$%FM)T;4PLL1^!WN_qACQX=7<%o+8)SccsApkpLHtm+-UpO8DFH zW}b6YsWsnxOqY5ESq14`_~oFl(u?KrG0^UYlMU@-COMdC^$Yfeca#f7Cz1}W{$-e? z)?jXwnh?CmUI7S!rMk zbUwKyP4no$bPmJxlQdm({=CsKvhfQ}%_AX$wtg618*!9|kzCuqV#F}%9#1E`UopI6 z9_&o18vZllCl>IZZ6_3_&)U--WR45GoRp=9)Y-F_2)PGSqfP80+#W3^4Uj$d6W3kL zY99hc7}Qh@r@e&{Q~{wLJ{}VdL0qvwXnZ^St1&g6!{WR)UO*<*x$*0Ii{D7f&OCC5 N!+Eh){n><#|1WzPka7S3 delta 2021 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 O9$ex~kJ&EumyL*NQdLqreLwkmk zdn0>^CzajUL!ExE>da1N{)0L+&KUyOPX`V zsp1(EKV{;jl4cZcJPUV-`9>D18%g9)5aG2i=}xS;rDE*5S(6nVj5}yO{;Vxm zFVuD*g)=HMEC2Xqh)%}ZVusoa_Jl`f)HQ!b-es<0t6x3NYW`NUw z+IP~Ij_3N$CC(-!O9PpvpH1ltfB@D5zUr1r>1Su{-n`9|89g$JRlw@b>`d>RL|^rl z7GZ{XQ+o7cUyW8Sub&4Ba~DLe{*ZEswD$Yd`7NE(rY`hEzZ*`XSNpdY%jGe03b%32 z5tFZ0R;)4T!bCX|5&Lm+H$T(uqlHWe!T#$_cIoHSFHY$#q+1xc0a9 zXP?RqrTT;+G&sSvi(l+cDESBJj9vd+CUTSjd&L_Odb8b^HXdy$Fhry6Ph48Hlg2G4 zad(#fqItlC$V4gyl`v9ZfH#zD8SkE4(U@-eY@2LpEilB5Iuq0CHk#)|(c~JXylVX- zN+#V(`L3o#^jebF5<;4CvUBLuq=Srw(3D#IF8P)kJ}(}8%BUzx&~%^>k3YjeS9&wK zUE0uC^A&w*syl0$umq>{736YhL+ISIof^5OoxCaoi_{~n7J}FaLe)za$;78PL5FsZ zR58RM9vbmM_>p*a{}HA70^MR5#Sfg*$d+}aF|7wJ9H?Rlih+YS_1p~_Q1$=T9lALb zK5SQ!HXS;&;qZieEkj}~|BP|c9n006>d0D7KPb6lV%=-+Lf9mJoBEO|`k5BfsnL5! zw<+aNUq3SYnr96)})^X|f9%sU(1lsMG+~ zDTE|5kF`|lsFykPJT9h656IVJUHTqupvnl0R`O2!)BTdci%Y1<1WH{(O*)LtRIz~N zaVcdM;PT;7j#4WqwP71&c3|ePgEA+uITHAt(XuL~2pPgagMKN{e2L-%{hTqLpH|e2kZ1WbA2N{ZelgHmyV1{F@~bvh G7X1YWFJOZJ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc index 8c9a4a07d311cc788c1d82aa7e7383bc7a2b1dc6..a6fa03206f26ee5f34cc500769e4d42060e3b840 100644 GIT binary patch delta 99 zcmZ23wO@+oG%qg~0}$9UGNy0jX=d^0)(JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agI!guz0LRZ8Bme*a diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc index 6a0a9bc9c884b531dcdbb598a03df778ac2956b0..a528181f05af5fcb23d34855ae5af9749edf87de 100644 GIT binary patch delta 12939 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 X8#R*dNT@Ej!QeOeP&(Q1hv5GLAWe5Z delta 11373 zcmb6<3s{`Rwg2pkeZs;nZx)t!76{}W@+KjWK!79?NF+ww@c)Djul3(04?>RP zbLPx>&6zW^`QUx|C%=@3zHKmQIryvm=&$uxF7$@Rkg*Gy4&wbjsaBAF`kC^CV!z&I zppUCQp5w@?atWd%Ayuubv|2<4hUkwt8 zg#d;)aUr(nBgmQrv!UVYrfZBxloOm@xqx0bT0Q?zaaESIf6eGmKL|i=aA;q&G z8~)YAF)S{fGy@wiB=BmA(|L6b~LL`7GblIQ-volJX8(a~tt2tH?q zMrmk9`ZLpP7*l|+@@5z_osG%Od7kjeumGbV)!Z3WnfwF%JZ3KR_56pFHM4jRzW^L( zV?o+^TR<)pw0zi9$RR&9zX)b!{cCE^ZRCrAJR9P_lg}1XA=V>;L31b8`9Pb)9|B7C zOj_poCBYC?@k@bfHouIifeJ1M@pJhV{7QZmi0g@f?WE!h0GS8N9)b{CeTwjFfLsG? zRl*#>Dv7|@79tx6ST(;EcFtS~$0DFE7Qjku{Oi732f-*&uYX8YGoOEuFM)Ly@TIV@ zWbF+eKrH0TrV!=OU&N%V;5WkLdBS333?goVk^C7WO8~bSa7)2Ss11v2VIF^1kiHW1 zUdC?$jI`sW4O;~>mV=s;nZd&aC8-AT6%eai`E3xZcY{FFNu>t$VBXvgdaMLJ?g2Kd z_{01Tpu0C{S`}XlJPN*ny$`Ufzk#&_b`5{n!|xOd`MMcw)I1MEYnd~^0X&CEC}>=C zh>{m(I0Us)@%1pHh<}LR1!5KR4Pdnth#j?HWwv0m83)M*4xn1ce}~@TNXG-9~>D|GOO(*u<0V&dhM25`bUcB(#WIpk>pF^ALMCf^VO=jeeC-KsX%S?|Zn#c+IWa1HWie@AoR@LE9B^$b&WFk+|t4Y^M zDSgG7OB(1Ota;>zG$#4WdNPs?L)*VpDxxC-9DwWe z*^E@#gq)6MRK>1G?zoOW#L>b#>I9d#9Z_|3b!MWf4V(L^khy`p=)I5`N=O|jm`Q%^ z{llyRdFF3n*p&p}58U56xpxi4!)aaa~EKC z&-;q(_=;>7nGv*pRkK}eY;%f-fl4wfb1{YhQ^~JzwTf;LiXKjE0^nEdZgsTSbY{u! zIL)tWZF4)@+@Srb*$J^oB`!gHNL^E_%h9q+ike>Pn;je73j^)CEy6x`uC($PAYA`V zN$$MpSF*> z9L-%bmQXkvUf87?4~y(Fu<9CgkZkRZUGlmt^BG`cBmNMVdw-LoT>ul@Q2?q~z7Q<6 zbosK(X;00_ekhEhS#aC^N~c|PyTtSK)N(($%e!~Qp9$?)be?woGK`+9GSjCD9=qo$ zTvW*-S+W6cVzCsNXzfmC)BajyWiv>!e0#P#k5h*cFrzimp4A10&FF~x0olpjSU`WX zI!8Tjj=jk#G>KHd#wv%eH*XCgF}VFIMBLdnxs*FtVy2i0!!f&bjXi?Ik8EhcAakLqgOqNBOiqbV%M_tsP4U zlnkww#J++E%=O|pUBA6nWrl!uwbSRe7lxc}yvfNl%jnJRwmkR-RGcxgOV1Jk?0P-p zTI&>rddEJ$UKDB@9J?Bt;6JzczW3eQzspl4#~|-41WXs1DEQU&c;vbv<8;wLU54%h z9A&ZbK27FhRQnh;UBx?9vrwD~`XawTGa9+@Ca2ew5&Ajbpc##sbCZ)Bptn`X*J2}J zVuO7`2Kkfsr$RL$YiZ=JYSKg-cTwV^|Je0L+DFLwFaXG8QZ|P72mWh&qnm!#kYlaI zbz^`~%Es|4hZU#RJXLa{WPpEaqc46XUF5J9WA zU0Eb{0oJCI%>Fr2FqQvAPdQ?AA7h{C{R#b~Z*Y5#jCl^TJ%+Y=Mz4@^0%gQmD zvU{m^LN1Ha;%OR9?YrkH;TzD?BwsXre)oRZ$Fmv}B5uLt;4v+_Ah|djz15AclI1Kc zLTkZadmF$9kTU87zse=p#kvMbX5}ui73zsX6bUy7vVPNY;uscwz~9wKy2U$JiBxddg*wy+(ofYLCS|^rdK8)7C43n7mA@F0ZS7T=RVrIP?vvP3l`SPK1XuQ0c zj)~{Ok_)rRcEXd$*F4Gh-2{xPZ4goS`Vv;s zoHl!O1d0^6V9)ys4r~pEztxsVbj;qzqMtgvrWy^W9OO&82Uq- z?fYuoP_@a_-(~+9_Q;y8UQbe7LhPWN{R zmSaFB>QLbX0C(Uv=V!NZD;>%nOdmE+70GR5q3J$D=`Ar47;F*0=iPizNz`S)7XtAJ zz4w7k6&Bm=OX%E=NILL9TH-s%F$!>hlLU<0I9$@dWZ>>A@p-?Z@zDm5Im0{CJ-8vn?<1HlwN;|f+`32b z%OMSmHjvUUZ+AFt(KB){hNWL!TPf^n7Fyg=Au^6QqtMdUEQofuz)N+3XhCCP77@20 z0c2o%U1Kd2J#aqw^%|+`Y;}sW>7~vb3$7<-A;?CMgCG@vD;j3gU%h6D#(goFBY=k> z{u`?OB3*f?K{Z}fb=6!=&mW2+qx2VtQX@x}myH?9p|}rc#r*~{vZQ2;k_V4yMhmKL zaw<&)q2GP5R1OXL-h(TM#~Xe4F?kHLRRk<#Q$X!&hg9@5bVLt*{oz%qpW}Kfp)dJk zJj`^w{b>6KDcOTXqbYD*kcX$z&2iD&SNFpDzLF%CrxHMPW(Nx(+4rENR#}$ zkB)R%A~8h;OB*c7uc0besI1!_LO0yx)EX-lx(lpB@e@iAcmfW+(14mVm>#X`PooZ> zKB>Dn5U$qHpLeIwV~rZ(q&K=#)x7+mtb=swSz66Ks#2A550Va!CSOTV9F%v+>FH#% z{Gg(P-ghNZbx_&C?bgxjf{8XBHEQ78IjHJT0cNw$Oy4?cFobl3tmSs>0ld0HO)nLh zX~qsS)qhtf-z@b#yo?Wt<9KyDD6@-nsB1%@!Tw}ihoVFMEEom<2-hKVhf8gao5r^r zfH_FqA>%deS{Nbiu#K=K^$%(~G%j*%2Xf=p9h!C}&?uh;Tj3wc0JeZ+OpdkQzT~le z3hvnV64T}m zWGHiZo6okwXIXhM+-F(SQ|ynnycd($?;5B+(J@#(7PDYHCcb~q3Bw8bb!78c*^NjL zAfN;Z194omrLU>Cspnq0{rGI-CbW?p>J!m`iLcDte|)}t8@j5(rj}mdGSQZJ8c1Hl zw0N6yY#~ynW-O4SScaQhQwvF5tcPE(#Mcp7N@(C@B+aMM#OB>ZD`iIJUKR_iDy*dC zZ$#6#9y8y|YCO#0>{<`UXYf_%6+pEc+0A9fRd6l(v=fH#6pHCLKNWW(j@EW*KQNlR zlz~t#*7B6@gzm2fb(}V!=fWfD%E#BrZYpW_<4NRW@6hAf1hV9nzJ2se|J+5l%LHt} z67%3AevDuXsuqeBU0nl&cO4YyE^!~#o=A^Jt=rX1IvBqTrFxV}HKC`aCpH*{;=feN z6GHjqnH{AYpG>30r_%1o$=iRb znG`WraPOH?W3t+u;`sF%LWMGiPRbmtQoW^5Qdu2d@n<+5Da9I;F<9x|gNPjnm`xya z!~38MPvJU2tOdLak9c(6r2BA2@Dgr^J5b9(Z^7xaM0UtVKRS~|O=sRBhrA!2iI=kz zY$$kw#j{}eC$O60*V!3-B&2y~QzQQqZG#Syjz>7vQsEVI_gSk44zJXRTjFY1))vOz zG1(J{bl2{H8IqY|vBmNYOGK5}WdVstmtR|LZ)y{YL=h4h%TaYWz6N;)TLrdtTo+#>k#_WxFW*(8XzeG!(-B15s5Kq51oJyvvEOs_mwB|i-+&VK$=a)?HrZy~ejL+AG^ zoOXvuWy2R1-pMyi4pv(Pcjs9ABH!mMo@wybjgMJ3FC=r_&$}|UD36! zr|La@bbrX0-Z~y;9tpG3&I?)aW|iuF?m{eyV9GKF2cL%SrsFT<%087-wbz!q4wmri z?D(sE?an59OQT;iebV8e==5&!S`~>{wZl%t8?^WdfZMJ*fmc#eLll6HhcQ-Y!$X2K zbljTWqwLf4YWj3Hxl94rrJeXUnO|;POpTp~HdqD}lQw{JC(F5bAgb{thwfxmr^Vj?G z*Z)^c$*=+r+xQdlS7WnBW3xwMO6V^y$3_e-yUC?%%85^(*;U%F9!S4NZ(M#~Ga6q2 zZ!v~)LVx{wO*A$Fs|nHtDhOwc9Z|>Jy1CW6^5_2~cd83wHnJqZHhl0c@e#C1B?6Xn za8tOT-sQlDlLt;ADjLR4H}?KgTPLS=sRy6 zpx@JJ)$q@8tmqorIOiU3%iDv*1484^O;UIkqZApi7(4{vM|?(VV=)9L&y0r`9Lz)j zp&fjwVPV1w-wnvdj02?z&`qKoaqK8&8Oad56vyHiJA9|(h!xbE>GQuzHnRQlG}3h9 z{C)JJU&SZrp&7hF?G^3L184_)6oA*WIW+2>D)p!to(qkdG}`h`Y5aIh@=cByGNEua zn)||f!v>UBj2Qtrpy)gAB+bJIpA@86AyF854gJDkbC2PQaXC`0xTX(3Ue;aKAA3cg z8b}7V-nd_PkPLQ;Fm*#rV5jqjXzCa9Z4=ahZ3R>;rNK)Vk~qo93bIQeF?n@ zQx!NZ!}r%%D82Q@;~Tp-_7{!mQ{K}@^ep&ZSwIORUW@N{1c<;4c>9ocsAfhk!p-T| zlvkB)DJd(dD3WS|e;_F=&xsgPA{GmiqJBclM(gTdMcGaPn#mTIfcs!z$MD*hN-vbY zzVnTyOHE_3m4AiHsP>vMazf4-jF8rKy}JI@H1vu-DFF9sZI=OR!B}lTtJEZXY>ax; zH9Y&j67CvQUEDLWY4hdwC#v7231i)4i}&BhK2>~z3O_p~4IaFU99)Ea&%bL?quud4ts|B9Z;kPb0jSBn;q?7LO$LpTPnQW;i=wW{zd5L=c zWhx(<@w-&{{sAfa44Qa)`29EK_^tS0y@9EN0CrXtJ@Y{(GXwni!-@?iQZ6#a);F*f zFbS`v@L?Cv&Ei_5EkaO?U>yLsr_{QdTHUVNT4~!EaU>BzD1r?L)+5j(@UY5o2R3UF zRv8W~L@*x#b2b72{&W39O+Wc?Hc9oGKe7{# zMQOPf8Xi!>7oL5Lkv*0D={+^RFl#`AC@mae0UfsVT#R)56BR=5?fj>Eo0pKmun$}WYPb* zo=}ygG_xOprbP%rlzM6<4R*EDE9tPW$KkZz#DD>Np}1}swm_n&KzJ5y`E67z_9Z!> z6_f*U+q^&c?aPGZdL19~SO2hEqae1V@p89n#=RdJ!p(0)^ZgU_J! z8Fqhxy&G1l{G?YI4$Ly>$xoW%Du^<+zhS_2qB+1}dsz7e``);ZCV!f;El(MFEj%uu zgfHr93WQ)wJEfuyyZUJr4cHGwRl=}koK!X(dl8&A>95D_SL)@EO<{bc_$y!!|L0u)MzcQeT6oPA-(T5Z xG>|`7;!9mLlCa2UT0FuTCsYf`g07_#9DF96q$YyIbSV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bdx0o zS^;{KfCV=Uq<-`T0}&G8CpDQ1lfeZd1=uGw@&&Wy1*icY@BjiT3fVJGp-Z4ds3nMW zh-Q#Om<5n`)C?cdGftDM2Y&?AGfwlfE(k&c0d13U3o#RI|YgmjXIB0001h0Q4LH4ibKQA#yKO;3KC%-(uC?{pIEo&5G>Es!#=3I;GzOyn53O$rio_w2CiRm-*W+t{3 zjB=kCn6$WVs^~9pS)tld(vdd7c?Ro*@+&;@ADMv?lTWbMvs^az`?A@a!-<(OYjPjA zq5NgLkn4h>E2~$OYzUp8GKY0O_e|~uu9qdWE(&Q~5DeY?kb63llr7NN4Gdpo82E%H jsLWtlP;rIV-~$6Arw`-g9zH3a?_lO9Fu8dXpFI}A&&q6 delta 72 zcmaFLbe4(dG%qg~0}uq?|CTn9XQ4s1erR!OQL%n@Vo_qAUQ$M4NoJzHOKNd;Nq&KT Z0Z=ACFEK|yBQ+-{zdXMvCuQQ-0sxRp8!7+* diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc index 4d18e51a9950a74b329f3cff35273fac46ba6027..86678e356c9074395fdb72bf7d258d27476ad5ba 100644 GIT binary patch delta 560 zcmX^Ajq%VoM&8rByj%=GV9UsuzHlS&V}6e|{m|mnqGJ7&q{Q;ntVDg6{N&Qy)Vz{n zebmd)gYZgT~$XoY;?WtS2A$itu= z$~e<&a<;n?#|JJD=QHo*es>#Y25sBT=iL8rGX`%y9lV^8`MR{@9*K ziD-RiW)QQO{4i9U87MR<%pJ`23cDc6AmhaNT?{CBQPlj`cQy!Pvr+gtA=N%628Lo; zxWg~VgrAf>ATlHFx~$nnS+fl#*JW)^%5GN4;$&iEnXH#Hi~G8gR6B@-Xtg06D@0=!gb}4@{fG%Vx5ORkJgSePjTUA8Pm+Sa>?BE-_2q eoy=BkBFfHc_ECs|m8;eLgCipYi&RknP$vMA0lf+U delta 560 zcmX@~jq&_9M&8rByj%=G5Pbhz+LDdDkNFMq^h1kNi;DHL6N?h_^pY|XOEMGnT~dp) zOY#f!3xG2Dd5Jmt8L2rr`Q`aVIVqbh1d>=8J15T;4dl2is``n6nO9-*dr?tl5X~-j zf>B}e1u+@+kIYPFTn!AHKZ@-VWh|P!M&~5^4SDrX44j;k%XQnBIXTrg={*o(jGz3_ zNtWY=lI|x4RzcOtjLs&^Kzg%cviZy)$*VE>u-jbT%UU7ddD&&e zKJqZgs!uL(S7Q3YJb9M84Kq-|=9}(+xEWJ7UkhH&$Z=WP@iT)Sr`Y6%&=8}`qUIkN z7zMR&NNHUX(fZB|WIo^*xz4Y6kzerwzwQlDnd_oz7e&<;)Pq%W3yMwt6Y95}UQd&k3pYGchm}%K*dn#|wrZ4GfoL z!Viedh`TOpc2U-BL&um2bRrVWiwgCYSi8L0csi;sF-tz3 d{IkkLl!MjmqX+{lSF8I6S4IXFsiFX&P5?S&xQYM( diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc index 18e59d56cf7effeee082312d4336e31bef82388d..7eaca4e04861a75ac2f193bed2fe83d0f4331851 100644 GIT binary patch delta 275 zcmX>Uc|DT%G%qg~0}$9UGNzy3$a{&yqftM!IJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`=%+Gm=k1=-h zBXL7U`8J>x#o|EX1;dX9h6|DoJHkVBBmVSIok=V)GKEE+)k|Mpo$?;tC&_!3=F{ z2;%{#_-9s-$Onhb{;Hc(o H3UnO+e2j6Me~BA1%C!THDi#A0FBpC_FkF&!*uXkN z^}3YyRVnR@k`9}_Bukk17c(<3{07T^;9xK@n|wh@Wb;Gm*^JCP#I8)Pm-XkktZe^@ zfk#kk@?BE;CC$-K?)YkC7{vk%2|3NEPT#0E*02F#rGn diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py index 36286df3..608ae3a7 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py @@ -4,6 +4,7 @@ (0, 0, 0), (1, 31, -1), (127, 159, -1), + (173, 173, 0), (768, 879, 0), (1155, 1161, 0), (1425, 1469, 0), @@ -11,13 +12,16 @@ (1473, 1474, 0), (1476, 1477, 0), (1479, 1479, 0), + (1536, 1541, 0), (1552, 1562, 0), + (1564, 1564, 0), (1611, 1631, 0), (1648, 1648, 0), - (1750, 1756, 0), + (1750, 1757, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), + (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -28,149 +32,137 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2259, 2273, 0), - (2275, 2306, 0), - (2362, 2362, 0), - (2364, 2364, 0), - (2369, 2376, 0), - (2381, 2381, 0), + (2192, 2193, 0), + (2200, 2207, 0), + (2250, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), (2385, 2391, 0), (2402, 2403, 0), - (2433, 2433, 0), + (2433, 2435, 0), (2492, 2492, 0), - (2497, 2500, 0), - (2509, 2509, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), (2530, 2531, 0), (2558, 2558, 0), - (2561, 2562, 0), + (2561, 2563, 0), (2620, 2620, 0), - (2625, 2626, 0), + (2622, 2626, 0), (2631, 2632, 0), (2635, 2637, 0), (2641, 2641, 0), (2672, 2673, 0), (2677, 2677, 0), - (2689, 2690, 0), + (2689, 2691, 0), (2748, 2748, 0), - (2753, 2757, 0), - (2759, 2760, 0), - (2765, 2765, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), (2786, 2787, 0), (2810, 2815, 0), - (2817, 2817, 0), + (2817, 2819, 0), (2876, 2876, 0), - (2879, 2879, 0), - (2881, 2884, 0), - (2893, 2893, 0), - (2901, 2902, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), (2914, 2915, 0), (2946, 2946, 0), - (3008, 3008, 0), - (3021, 3021, 0), - (3072, 3072, 0), - (3076, 3076, 0), - (3134, 3136, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3076, 0), + (3132, 3132, 0), + (3134, 3140, 0), (3142, 3144, 0), (3146, 3149, 0), (3157, 3158, 0), (3170, 3171, 0), - (3201, 3201, 0), + (3201, 3203, 0), (3260, 3260, 0), - (3263, 3263, 0), - (3270, 3270, 0), - (3276, 3277, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), (3298, 3299, 0), - (3328, 3329, 0), + (3315, 3315, 0), + (3328, 3331, 0), (3387, 3388, 0), - (3393, 3396, 0), - (3405, 3405, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), (3426, 3427, 0), - (3457, 3457, 0), + (3457, 3459, 0), (3530, 3530, 0), - (3538, 3540, 0), + (3535, 3540, 0), (3542, 3542, 0), + (3544, 3551, 0), + (3570, 3571, 0), (3633, 3633, 0), (3636, 3642, 0), (3655, 3662, 0), (3761, 3761, 0), (3764, 3772, 0), - (3784, 3789, 0), + (3784, 3790, 0), (3864, 3865, 0), (3893, 3893, 0), (3895, 3895, 0), (3897, 3897, 0), - (3953, 3966, 0), - (3968, 3972, 0), + (3902, 3903, 0), + (3953, 3972, 0), (3974, 3975, 0), (3981, 3991, 0), (3993, 4028, 0), (4038, 4038, 0), - (4141, 4144, 0), - (4146, 4151, 0), - (4153, 4154, 0), - (4157, 4158, 0), - (4184, 4185, 0), + (4139, 4158, 0), + (4182, 4185, 0), (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), (4209, 4212, 0), - (4226, 4226, 0), - (4229, 4230, 0), - (4237, 4237, 0), - (4253, 4253, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), (4352, 4447, 2), + (4448, 4607, 0), (4957, 4959, 0), - (5906, 5908, 0), + (5906, 5909, 0), (5938, 5940, 0), (5970, 5971, 0), (6002, 6003, 0), - (6068, 6069, 0), - (6071, 6077, 0), - (6086, 6086, 0), - (6089, 6099, 0), + (6068, 6099, 0), (6109, 6109, 0), - (6155, 6157, 0), + (6155, 6159, 0), (6277, 6278, 0), (6313, 6313, 0), - (6432, 6434, 0), - (6439, 6440, 0), - (6450, 6450, 0), - (6457, 6459, 0), - (6679, 6680, 0), - (6683, 6683, 0), - (6742, 6742, 0), - (6744, 6750, 0), - (6752, 6752, 0), - (6754, 6754, 0), - (6757, 6764, 0), - (6771, 6780, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), (6783, 6783, 0), - (6832, 6848, 0), - (6912, 6915, 0), - (6964, 6964, 0), - (6966, 6970, 0), - (6972, 6972, 0), - (6978, 6978, 0), + (6832, 6862, 0), + (6912, 6916, 0), + (6964, 6980, 0), (7019, 7027, 0), - (7040, 7041, 0), - (7074, 7077, 0), - (7080, 7081, 0), - (7083, 7085, 0), - (7142, 7142, 0), - (7144, 7145, 0), - (7149, 7149, 0), - (7151, 7153, 0), - (7212, 7219, 0), - (7222, 7223, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), (7376, 7378, 0), - (7380, 7392, 0), - (7394, 7400, 0), + (7380, 7400, 0), (7405, 7405, 0), (7412, 7412, 0), - (7416, 7417, 0), - (7616, 7673, 0), - (7675, 7679, 0), + (7415, 7417, 0), + (7616, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8291, 0), + (8288, 8292, 0), + (8294, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -212,17 +204,16 @@ (11904, 11929, 2), (11931, 12019, 2), (12032, 12245, 2), - (12272, 12283, 2), - (12288, 12329, 2), - (12330, 12333, 0), - (12334, 12350, 2), + (12272, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), (12353, 12438, 2), (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), (12593, 12686, 2), (12688, 12771, 2), - (12784, 12830, 2), + (12783, 12830, 2), (12832, 12871, 2), (12880, 19903, 2), (19968, 42124, 2), @@ -234,36 +225,33 @@ (43010, 43010, 0), (43014, 43014, 0), (43019, 43019, 0), - (43045, 43046, 0), + (43043, 43047, 0), (43052, 43052, 0), - (43204, 43205, 0), + (43136, 43137, 0), + (43188, 43205, 0), (43232, 43249, 0), (43263, 43263, 0), (43302, 43309, 0), - (43335, 43345, 0), + (43335, 43347, 0), (43360, 43388, 2), - (43392, 43394, 0), - (43443, 43443, 0), - (43446, 43449, 0), - (43452, 43453, 0), + (43392, 43395, 0), + (43443, 43456, 0), (43493, 43493, 0), - (43561, 43566, 0), - (43569, 43570, 0), - (43573, 43574, 0), + (43561, 43574, 0), (43587, 43587, 0), - (43596, 43596, 0), - (43644, 43644, 0), + (43596, 43597, 0), + (43643, 43645, 0), (43696, 43696, 0), (43698, 43700, 0), (43703, 43704, 0), (43710, 43711, 0), (43713, 43713, 0), - (43756, 43757, 0), - (43766, 43766, 0), - (44005, 44005, 0), - (44008, 44008, 0), - (44013, 44013, 0), + (43755, 43759, 0), + (43765, 43766, 0), + (44003, 44010, 0), + (44012, 44013, 0), (44032, 55203, 2), + (55216, 55295, 0), (63744, 64255, 2), (64286, 64286, 0), (65024, 65039, 0), @@ -272,8 +260,10 @@ (65072, 65106, 2), (65108, 65126, 2), (65128, 65131, 2), + (65279, 65279, 0), (65281, 65376, 2), (65504, 65510, 2), + (65529, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -285,102 +275,108 @@ (68325, 68326, 0), (68900, 68903, 0), (69291, 69292, 0), + (69373, 69375, 0), (69446, 69456, 0), - (69633, 69633, 0), + (69506, 69509, 0), + (69632, 69634, 0), (69688, 69702, 0), - (69759, 69761, 0), - (69811, 69814, 0), - (69817, 69818, 0), + (69744, 69744, 0), + (69747, 69748, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69826, 69826, 0), + (69837, 69837, 0), (69888, 69890, 0), - (69927, 69931, 0), - (69933, 69940, 0), + (69927, 69940, 0), + (69957, 69958, 0), (70003, 70003, 0), - (70016, 70017, 0), - (70070, 70078, 0), + (70016, 70018, 0), + (70067, 70080, 0), (70089, 70092, 0), - (70095, 70095, 0), - (70191, 70193, 0), - (70196, 70196, 0), - (70198, 70199, 0), + (70094, 70095, 0), + (70188, 70199, 0), (70206, 70206, 0), - (70367, 70367, 0), - (70371, 70378, 0), - (70400, 70401, 0), + (70209, 70209, 0), + (70367, 70378, 0), + (70400, 70403, 0), (70459, 70460, 0), - (70464, 70464, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), (70502, 70508, 0), (70512, 70516, 0), - (70712, 70719, 0), - (70722, 70724, 0), - (70726, 70726, 0), + (70709, 70726, 0), (70750, 70750, 0), - (70835, 70840, 0), - (70842, 70842, 0), - (70847, 70848, 0), - (70850, 70851, 0), - (71090, 71093, 0), - (71100, 71101, 0), - (71103, 71104, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), (71132, 71133, 0), - (71219, 71226, 0), - (71229, 71229, 0), - (71231, 71232, 0), - (71339, 71339, 0), - (71341, 71341, 0), - (71344, 71349, 0), - (71351, 71351, 0), - (71453, 71455, 0), - (71458, 71461, 0), - (71463, 71467, 0), - (71727, 71735, 0), - (71737, 71738, 0), - (71995, 71996, 0), - (71998, 71998, 0), - (72003, 72003, 0), - (72148, 72151, 0), - (72154, 72155, 0), - (72160, 72160, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (71724, 71738, 0), + (71984, 71989, 0), + (71991, 71992, 0), + (71995, 71998, 0), + (72000, 72000, 0), + (72002, 72003, 0), + (72145, 72151, 0), + (72154, 72160, 0), + (72164, 72164, 0), (72193, 72202, 0), - (72243, 72248, 0), + (72243, 72249, 0), (72251, 72254, 0), (72263, 72263, 0), - (72273, 72278, 0), - (72281, 72283, 0), - (72330, 72342, 0), - (72344, 72345, 0), - (72752, 72758, 0), - (72760, 72765, 0), - (72767, 72767, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), (72850, 72871, 0), - (72874, 72880, 0), - (72882, 72883, 0), - (72885, 72886, 0), + (72873, 72886, 0), (73009, 73014, 0), (73018, 73018, 0), (73020, 73021, 0), (73023, 73029, 0), (73031, 73031, 0), + (73098, 73102, 0), (73104, 73105, 0), - (73109, 73109, 0), - (73111, 73111, 0), - (73459, 73460, 0), + (73107, 73111, 0), + (73459, 73462, 0), + (73472, 73473, 0), + (73475, 73475, 0), + (73524, 73530, 0), + (73534, 73538, 0), + (78896, 78912, 0), + (78919, 78933, 0), (92912, 92916, 0), (92976, 92982, 0), (94031, 94031, 0), + (94033, 94087, 0), (94095, 94098, 0), (94176, 94179, 2), (94180, 94180, 0), - (94192, 94193, 2), + (94192, 94193, 0), (94208, 100343, 2), (100352, 101589, 2), (101632, 101640, 2), - (110592, 110878, 2), + (110576, 110579, 2), + (110581, 110587, 2), + (110589, 110590, 2), + (110592, 110882, 2), + (110898, 110898, 2), (110928, 110930, 2), + (110933, 110933, 2), (110948, 110951, 2), (110960, 111355, 2), (113821, 113822, 0), - (119143, 119145, 0), - (119163, 119170, 0), + (113824, 113827, 0), + (118528, 118573, 0), + (118576, 118598, 0), + (119141, 119145, 0), + (119149, 119170, 0), (119173, 119179, 0), (119210, 119213, 0), (119362, 119364, 0), @@ -395,8 +391,11 @@ (122907, 122913, 0), (122915, 122916, 0), (122918, 122922, 0), + (123023, 123023, 0), (123184, 123190, 0), + (123566, 123566, 0), (123628, 123631, 0), + (124140, 124143, 0), (125136, 125142, 0), (125252, 125258, 0), (126980, 126980, 2), @@ -416,7 +415,9 @@ (127951, 127955, 2), (127968, 127984, 2), (127988, 127988, 2), - (127992, 128062, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), (128064, 128064, 2), (128066, 128252, 2), (128255, 128317, 2), @@ -430,22 +431,24 @@ (128716, 128716, 2), (128720, 128722, 2), (128725, 128727, 2), + (128732, 128735, 2), (128747, 128748, 2), (128756, 128764, 2), (128992, 129003, 2), + (129008, 129008, 2), (129292, 129338, 2), (129340, 129349, 2), - (129351, 129400, 2), - (129402, 129483, 2), - (129485, 129535, 2), - (129648, 129652, 2), - (129656, 129658, 2), - (129664, 129670, 2), - (129680, 129704, 2), - (129712, 129718, 2), - (129728, 129730, 2), - (129744, 129750, 2), + (129351, 129535, 2), + (129648, 129660, 2), + (129664, 129672, 2), + (129680, 129725, 2), + (129727, 129733, 2), + (129742, 129755, 2), + (129760, 129768, 2), + (129776, 129784, 2), (131072, 196605, 2), (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), (917760, 917999, 0), ] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py index 094d2dc2..e7527e52 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py @@ -1,5 +1,6 @@ CONSOLE_HTML_FORMAT = """\ + - -

      {code}
      +
      {code}
      """ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py index e8a3a674..95267b0c 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py @@ -151,7 +151,6 @@ def ratio_distribute( @dataclass class E: - size: Optional[int] = None ratio: int = 1 minimum_size: int = 1 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py index 10fc0d7e..7520a9f9 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py @@ -30,7 +30,6 @@ class WindowsConsoleFeatures: ) except (AttributeError, ImportError, ValueError): - # Fallback if we can't load the Windows DLL def get_windows_console_features() -> WindowsConsoleFeatures: features = WindowsConsoleFeatures() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py index c45f193f..2e94ff6f 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py @@ -1,5 +1,7 @@ +from __future__ import annotations + import re -from typing import Iterable, List, Tuple +from typing import Iterable from ._loop import loop_last from .cells import cell_len, chop_cells @@ -7,7 +9,11 @@ re_word = re.compile(r"\s*\S+\s*") -def words(text: str) -> Iterable[Tuple[int, int, str]]: +def words(text: str) -> Iterable[tuple[int, int, str]]: + """Yields each word from the text as a tuple + containing (start_index, end_index, word). A "word" in this context may + include the actual word and any whitespace to the right. + """ position = 0 word_match = re_word.match(text, position) while word_match is not None: @@ -17,35 +23,59 @@ def words(text: str) -> Iterable[Tuple[int, int, str]]: word_match = re_word.match(text, end) -def divide_line(text: str, width: int, fold: bool = True) -> List[int]: - divides: List[int] = [] - append = divides.append - line_position = 0 +def divide_line(text: str, width: int, fold: bool = True) -> list[int]: + """Given a string of text, and a width (measured in cells), return a list + of cell offsets which the string should be split at in order for it to fit + within the given width. + + Args: + text: The text to examine. + width: The available cell width. + fold: If True, words longer than `width` will be folded onto a new line. + + Returns: + A list of indices to break the line at. + """ + break_positions: list[int] = [] # offsets to insert the breaks at + append = break_positions.append + cell_offset = 0 _cell_len = cell_len + for start, _end, word in words(text): word_length = _cell_len(word.rstrip()) - if line_position + word_length > width: + remaining_space = width - cell_offset + word_fits_remaining_space = remaining_space >= word_length + + if word_fits_remaining_space: + # Simplest case - the word fits within the remaining width for this line. + cell_offset += _cell_len(word) + else: + # Not enough space remaining for this word on the current line. if word_length > width: + # The word doesn't fit on any line, so we can't simply + # place it on the next line... if fold: - chopped_words = chop_cells(word, max_size=width, position=0) - for last, line in loop_last(chopped_words): + # Fold the word across multiple lines. + folded_word = chop_cells(word, width=width) + for last, line in loop_last(folded_word): if start: append(start) - if last: - line_position = _cell_len(line) + cell_offset = _cell_len(line) else: start += len(line) else: + # Folding isn't allowed, so crop the word. if start: append(start) - line_position = _cell_len(word) - elif line_position and start: + cell_offset = _cell_len(word) + elif cell_offset and start: + # The word doesn't fit within the remaining space on the current + # line, but it *can* fit on to the next (empty) line. append(start) - line_position = _cell_len(word) - else: - line_position += _cell_len(word) - return divides + cell_offset = _cell_len(word) + + return break_positions if __name__ == "__main__": # pragma: no cover @@ -53,4 +83,11 @@ def divide_line(text: str, width: int, fold: bool = True) -> List[int]: console = Console(width=10) console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") - print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2)) + print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10)) + + console = Console(width=20) + console.rule() + console.print("TextualはPythonの高速アプリケーション開発フレームワークです") + + console.rule() + console.print("アプリケーションは1670万色を使用でき") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/align.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/align.py index c310b66e..f7b734fd 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/align.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/align.py @@ -27,7 +27,7 @@ class Align(JupyterMixin): renderable (RenderableType): A console renderable. align (AlignMethod): One of "left", "center", or "right"" style (StyleType, optional): An optional style to apply to the background. - vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. + vertical (Optional[VerticalAlignMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. pad (bool, optional): Pad the right with spaces. Defaults to True. width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py index ed86a552..022284b5 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py @@ -48,7 +48,6 @@ def __repr__(self) -> str: def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: - width = min( self.width if self.width is not None else options.max_width, options.max_width, diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/box.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/box.py index 97d2a944..0511a9e4 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/box.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/box.py @@ -188,260 +188,224 @@ def get_bottom(self, widths: Iterable[int]) -> str: return "".join(parts) +# fmt: off ASCII: Box = Box( - """\ -+--+ -| || -|-+| -| || -|-+| -|-+| -| || -+--+ -""", + "+--+\n" + "| ||\n" + "|-+|\n" + "| ||\n" + "|-+|\n" + "|-+|\n" + "| ||\n" + "+--+\n", ascii=True, ) ASCII2: Box = Box( - """\ -+-++ -| || -+-++ -| || -+-++ -+-++ -| || -+-++ -""", + "+-++\n" + "| ||\n" + "+-++\n" + "| ||\n" + "+-++\n" + "+-++\n" + "| ||\n" + "+-++\n", ascii=True, ) ASCII_DOUBLE_HEAD: Box = Box( - """\ -+-++ -| || -+=++ -| || -+-++ -+-++ -| || -+-++ -""", + "+-++\n" + "| ||\n" + "+=++\n" + "| ||\n" + "+-++\n" + "+-++\n" + "| ||\n" + "+-++\n", ascii=True, ) SQUARE: Box = Box( - """\ -┌─┬┐ -│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" + "┌─┬┐\n" + "│ ││\n" + "├─┼┤\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "└─┴┘\n" ) SQUARE_DOUBLE_HEAD: Box = Box( - """\ -┌─┬┐ -│ ││ -╞═╪╡ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" + "┌─┬┐\n" + "│ ││\n" + "╞═╪╡\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "└─┴┘\n" ) MINIMAL: Box = Box( - """\ - ╷ - │ -╶─┼╴ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" + " ╷ \n" + " │ \n" + "╶─┼╴\n" + " │ \n" + "╶─┼╴\n" + "╶─┼╴\n" + " │ \n" + " ╵ \n" ) MINIMAL_HEAVY_HEAD: Box = Box( - """\ - ╷ - │ -╺━┿╸ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" + " ╷ \n" + " │ \n" + "╺━┿╸\n" + " │ \n" + "╶─┼╴\n" + "╶─┼╴\n" + " │ \n" + " ╵ \n" ) MINIMAL_DOUBLE_HEAD: Box = Box( - """\ - ╷ - │ - ═╪ - │ - ─┼ - ─┼ - │ - ╵ -""" + " ╷ \n" + " │ \n" + " ═╪ \n" + " │ \n" + " ─┼ \n" + " ─┼ \n" + " │ \n" + " ╵ \n" ) SIMPLE: Box = Box( - """\ - - - ── - - - ── - - -""" + " \n" + " \n" + " ── \n" + " \n" + " \n" + " ── \n" + " \n" + " \n" ) SIMPLE_HEAD: Box = Box( - """\ - - - ── - - - - - -""" + " \n" + " \n" + " ── \n" + " \n" + " \n" + " \n" + " \n" + " \n" ) SIMPLE_HEAVY: Box = Box( - """\ - - - ━━ - - - ━━ - - -""" + " \n" + " \n" + " ━━ \n" + " \n" + " \n" + " ━━ \n" + " \n" + " \n" ) HORIZONTALS: Box = Box( - """\ - ── - - ── - - ── - ── - - ── -""" + " ── \n" + " \n" + " ── \n" + " \n" + " ── \n" + " ── \n" + " \n" + " ── \n" ) ROUNDED: Box = Box( - """\ -╭─┬╮ -│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -╰─┴╯ -""" + "╭─┬╮\n" + "│ ││\n" + "├─┼┤\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "╰─┴╯\n" ) HEAVY: Box = Box( - """\ -┏━┳┓ -┃ ┃┃ -┣━╋┫ -┃ ┃┃ -┣━╋┫ -┣━╋┫ -┃ ┃┃ -┗━┻┛ -""" + "┏━┳┓\n" + "┃ ┃┃\n" + "┣━╋┫\n" + "┃ ┃┃\n" + "┣━╋┫\n" + "┣━╋┫\n" + "┃ ┃┃\n" + "┗━┻┛\n" ) HEAVY_EDGE: Box = Box( - """\ -┏━┯┓ -┃ │┃ -┠─┼┨ -┃ │┃ -┠─┼┨ -┠─┼┨ -┃ │┃ -┗━┷┛ -""" + "┏━┯┓\n" + "┃ │┃\n" + "┠─┼┨\n" + "┃ │┃\n" + "┠─┼┨\n" + "┠─┼┨\n" + "┃ │┃\n" + "┗━┷┛\n" ) HEAVY_HEAD: Box = Box( - """\ -┏━┳┓ -┃ ┃┃ -┡━╇┩ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" + "┏━┳┓\n" + "┃ ┃┃\n" + "┡━╇┩\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "└─┴┘\n" ) DOUBLE: Box = Box( - """\ -╔═╦╗ -║ ║║ -╠═╬╣ -║ ║║ -╠═╬╣ -╠═╬╣ -║ ║║ -╚═╩╝ -""" + "╔═╦╗\n" + "║ ║║\n" + "╠═╬╣\n" + "║ ║║\n" + "╠═╬╣\n" + "╠═╬╣\n" + "║ ║║\n" + "╚═╩╝\n" ) DOUBLE_EDGE: Box = Box( - """\ -╔═╤╗ -║ │║ -╟─┼╢ -║ │║ -╟─┼╢ -╟─┼╢ -║ │║ -╚═╧╝ -""" + "╔═╤╗\n" + "║ │║\n" + "╟─┼╢\n" + "║ │║\n" + "╟─┼╢\n" + "╟─┼╢\n" + "║ │║\n" + "╚═╧╝\n" ) MARKDOWN: Box = Box( - """\ - -| || -|-|| -| || -|-|| -|-|| -| || - -""", + " \n" + "| ||\n" + "|-||\n" + "| ||\n" + "|-||\n" + "|-||\n" + "| ||\n" + " \n", ascii=True, ) +# fmt: on # Map Boxes that don't render with raster fonts on to equivalent that do LEGACY_WINDOWS_SUBSTITUTIONS = { @@ -464,7 +428,6 @@ def get_bottom(self, widths: Iterable[int]) -> str: if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.columns import Columns from pip._vendor.rich.panel import Panel diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py index 9354f9e3..f85f928f 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py @@ -1,6 +1,8 @@ +from __future__ import annotations + import re from functools import lru_cache -from typing import Callable, List +from typing import Callable from ._cell_widths import CELL_WIDTHS @@ -119,33 +121,44 @@ def set_cell_size(text: str, total: int) -> str: start = pos -# TODO: This is inefficient -# TODO: This might not work with CWJ type characters -def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: - """Break text in to equal (cell) length strings, returning the characters in reverse - order""" +def chop_cells( + text: str, + width: int, +) -> list[str]: + """Split text into lines such that each line fits within the available (cell) width. + + Args: + text: The text to fold such that it fits in the given width. + width: The width available (number of cells). + + Returns: + A list of strings such that each string in the list has cell width + less than or equal to the available width. + """ _get_character_cell_size = get_character_cell_size - characters = [ - (character, _get_character_cell_size(character)) for character in text - ] - total_size = position - lines: List[List[str]] = [[]] - append = lines[-1].append - - for character, size in reversed(characters): - if total_size + size > max_size: - lines.append([character]) - append = lines[-1].append - total_size = size + lines: list[list[str]] = [[]] + + append_new_line = lines.append + append_to_last_line = lines[-1].append + + total_width = 0 + + for character in text: + cell_width = _get_character_cell_size(character) + char_doesnt_fit = total_width + cell_width > width + + if char_doesnt_fit: + append_new_line([character]) + append_to_last_line = lines[-1].append + total_width = cell_width else: - total_size += size - append(character) + append_to_last_line(character) + total_width += cell_width return ["".join(line) for line in lines] if __name__ == "__main__": # pragma: no cover - print(get_character_cell_size("😽")) for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8): print(line) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/color.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/color.py index dfe45593..4270a278 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/color.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/color.py @@ -592,7 +592,6 @@ def blend_rgb( if __name__ == "__main__": # pragma: no cover - from .console import Console from .table import Table from .text import Text diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/console.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/console.py index e559cbb4..a11c7c13 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/console.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/console.py @@ -278,6 +278,7 @@ def __rich_console__( # A type that may be rendered by Console. RenderableType = Union[ConsoleRenderable, RichCast, str] +"""A string or any object that may be rendered by Rich.""" # The result of calling a __rich_console__ method. RenderResult = Iterable[Union[RenderableType, Segment]] @@ -1925,7 +1926,6 @@ def log( end (str, optional): String to write at end of print data. Defaults to "\\\\n". style (Union[str, Style], optional): A style to apply to output. Defaults to None. justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py index e29cf368..901ff8ba 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py @@ -1,13 +1,13 @@ from itertools import zip_longest from typing import ( - Iterator, + TYPE_CHECKING, Iterable, + Iterator, List, Optional, + TypeVar, Union, overload, - TypeVar, - TYPE_CHECKING, ) if TYPE_CHECKING: @@ -119,7 +119,7 @@ def justify( Args: console (Console): Console instance. - width (int): Number of characters per line. + width (int): Number of cells available per line. justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py index c2646794..27714b25 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py @@ -98,7 +98,7 @@ class ReprHighlighter(RegexHighlighter): r"(?P(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", + r"(?P(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~]*)", ), ] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/json.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/json.py index ea94493f..4087c79b 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/json.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/json.py @@ -103,7 +103,6 @@ def __rich__(self) -> Text: if __name__ == "__main__": - import argparse import sys diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py index 849356ea..a6f1a31b 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py @@ -227,7 +227,6 @@ def tree(self) -> "Tree": from pip._vendor.rich.tree import Tree def summary(layout: "Layout") -> Table: - icon = layout.splitter.get_tree_icon() table = Table.grid(padding=(0, 1, 0, 0)) @@ -403,7 +402,7 @@ def __rich_console__( self._render_map = render_map layout_lines: List[List[Segment]] = [[] for _ in range(height)] _islice = islice - for (region, lines) in render_map.values(): + for region, lines in render_map.values(): _x, y, _layout_width, layout_height = region for row, line in zip( _islice(layout_lines, y, y + layout_height), lines diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/live.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/live.py index 3ebbbc4c..f0529a78 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/live.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/live.py @@ -362,7 +362,7 @@ def process_renderables( table.add_column("Destination Currency") table.add_column("Exchange Rate") - for ((source, dest), exchange_rate) in exchange_rate_dict.items(): + for (source, dest), exchange_rate in exchange_rate_dict.items(): table.add_row( source, dest, diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py index b90fbf7f..e20745df 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py @@ -82,7 +82,6 @@ def restore_cursor(self) -> Control: def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: - renderable = self.renderable style = console.get_style(self.style) lines = console.render_lines(renderable, options, style=style, pad=False) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py index fd80d8c1..f6171878 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py @@ -64,6 +64,9 @@ def escape_backslashes(match: Match[str]) -> str: return f"{backslashes}{backslashes}\\{text}" markup = _escape(escape_backslashes, markup) + if markup.endswith("\\") and not markup.endswith("\\\\"): + return markup + "\\" + return markup @@ -110,7 +113,10 @@ def render( Args: markup (str): A string containing console markup. + style: (Union[str, Style]): The style to use. emoji (bool, optional): Also render emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. + Raises: MarkupError: If there is a syntax error in the markup. @@ -226,7 +232,6 @@ def pop_style(style_name: str) -> Tuple[int, Tag]: if __name__ == "__main__": # pragma: no cover - MARKUP = [ "[red]Hello World[/red]", "[magenta]Hello [b]World[/b]", diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py index d522d80b..95f4c84c 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py @@ -82,7 +82,9 @@ def fit( style: StyleType = "none", border_style: StyleType = "none", width: Optional[int] = None, + height: Optional[int] = None, padding: PaddingDimensions = (0, 1), + highlight: bool = False, ) -> "Panel": """An alternative constructor that sets expand=False.""" return cls( @@ -96,7 +98,9 @@ def fit( style=style, border_style=border_style, width=width, + height=height, padding=padding, + highlight=highlight, expand=False, ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py index 2bd9eb00..9b9e3ba9 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py @@ -211,8 +211,11 @@ def display_hook(value: Any) -> None: ) builtins._ = value # type: ignore[attr-defined] - if "get_ipython" in globals(): + try: ip = get_ipython() # type: ignore[name-defined] + except NameError: + sys.displayhook = display_hook + else: from IPython.core.formatters import BaseFormatter class RichFormatter(BaseFormatter): # type: ignore[misc] @@ -236,8 +239,6 @@ def __call__(self, value: Any) -> Any: # replace plain text formatter with rich formatter rich_formatter = RichFormatter() ip.display_formatter.formatters["text/plain"] = rich_formatter - else: - sys.displayhook = display_hook class Pretty(JupyterMixin): @@ -708,9 +709,9 @@ def iter_rich_args(rich_args: Any) -> Iterable[Union[Any, Tuple[str, Any]]]: last=root, ) - def iter_attrs() -> Iterable[ - Tuple[str, Any, Optional[Callable[[Any], str]]] - ]: + def iter_attrs() -> ( + Iterable[Tuple[str, Any, Optional[Callable[[Any], str]]]] + ): """Iterate over attr fields and values.""" for attr in attr_fields: if attr.repr: @@ -985,7 +986,7 @@ class StockKeepingUnit(NamedTuple): from pip._vendor.rich import print - # print(Pretty(data, indent_guides=True, max_string=20)) + print(Pretty(data, indent_guides=True, max_string=20)) class Thing: def __repr__(self) -> str: diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py index 8b0a315f..2420c24e 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py @@ -681,7 +681,7 @@ def render(self, task: "Task") -> Text: elapsed = task.finished_time if task.finished else task.elapsed if elapsed is None: return Text("-:--:--", style="progress.elapsed") - delta = timedelta(seconds=int(elapsed)) + delta = timedelta(seconds=max(0, int(elapsed))) return Text(str(delta), style="progress.elapsed") @@ -710,7 +710,6 @@ def __init__( table_column: Optional[Column] = None, show_speed: bool = False, ) -> None: - self.text_format_no_percentage = text_format_no_percentage self.show_speed = show_speed super().__init__( @@ -1114,7 +1113,7 @@ def get_default_columns(cls) -> Tuple[ProgressColumn, ...]: progress = Progress( SpinnerColumn(), - *Progress.default_columns(), + *Progress.get_default_columns(), "Elapsed:", TimeElapsedColumn(), ) @@ -1636,7 +1635,6 @@ def remove_task(self, task_id: TaskID) -> None: if __name__ == "__main__": # pragma: no coverage - import random import time @@ -1689,7 +1687,6 @@ def remove_task(self, task_id: TaskID) -> None: console=console, transient=False, ) as progress: - task1 = progress.add_task("[red]Downloading", total=1000) task2 = progress.add_task("[green]Processing", total=1000) task3 = progress.add_task("[yellow]Thinking", total=None) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py index 67361df2..a2bf3261 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py @@ -156,7 +156,6 @@ def _render_pulse( def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: - width = min(self.width or options.max_width, options.max_width) ascii = options.legacy_windows or options.ascii_only should_pulse = self.pulse or self.total is None diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py index 2bd0a772..75ff0481 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py @@ -307,7 +307,7 @@ class IntPrompt(PromptBase[int]): validate_error_message = "[prompt.invalid]Please enter a valid integer number" -class FloatPrompt(PromptBase[int]): +class FloatPrompt(PromptBase[float]): """A prompt that returns a float. Example: @@ -346,7 +346,6 @@ def process_response(self, value: str) -> bool: if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich import print if Confirm.ask("Run [i]prompt[/i] tests?", default=True): diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py index f284bcaf..10efc427 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py @@ -76,7 +76,7 @@ def auto_rich_repr(self: Type[T]) -> Result: param.POSITIONAL_OR_KEYWORD, param.KEYWORD_ONLY, ): - if param.default == param.empty: + if param.default is param.empty: yield getattr(self, param.name) else: yield param.name, getattr(self, param.name), param.default diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py index e1257984..93edbbde 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py @@ -109,7 +109,6 @@ def is_control(self) -> bool: @classmethod @lru_cache(1024 * 16) def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]: - text, style, control = segment _Segment = Segment diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/status.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/status.py index 09eff405..65744838 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/status.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/status.py @@ -107,7 +107,6 @@ def __exit__( if __name__ == "__main__": # pragma: no cover - from time import sleep from .console import Console diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py index 57033766..c26fd878 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py @@ -439,6 +439,16 @@ def lexer(self) -> Optional[Lexer]: except ClassNotFound: return None + @property + def default_lexer(self) -> Lexer: + """A Pygments Lexer to use if one is not specified or invalid.""" + return get_lexer_by_name( + "text", + stripnl=False, + ensurenl=True, + tabsize=self.tab_size, + ) + def highlight( self, code: str, @@ -467,7 +477,7 @@ def highlight( ) _get_theme_style = self._theme.get_style_for_token - lexer = self.lexer + lexer = self.lexer or self.default_lexer if lexer is None: text.append(code) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/table.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/table.py index 17409f2e..43c718eb 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/table.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/table.py @@ -212,7 +212,6 @@ def __init__( caption_justify: "JustifyMethod" = "center", highlight: bool = False, ) -> None: - self.columns: List[Column] = [] self.rows: List[Row] = [] self.title = title @@ -471,7 +470,6 @@ def add_section(self) -> None: def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": - if not self.columns: yield Segment("\n") return @@ -685,7 +683,7 @@ def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]: getattr(renderable, "vertical", None) or column.vertical, ) else: - for (style, renderable) in raw_cells: + for style, renderable in raw_cells: yield _Cell( style, renderable, diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/text.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/text.py index 998cb87d..209aa943 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/text.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/text.py @@ -38,6 +38,7 @@ _re_whitespace = re.compile(r"\s+$") TextType = Union[str, "Text"] +"""A plain string or a :class:`Text` instance.""" GetStyleCallable = Callable[[str], Optional[StyleType]] @@ -97,6 +98,21 @@ def right_crop(self, offset: int) -> "Span": return self return Span(start, min(offset, end), style) + def extend(self, cells: int) -> "Span": + """Extend the span by the given number of cells. + + Args: + cells (int): Additional space to add to end of span. + + Returns: + Span: A span. + """ + if cells: + start, end, style = self + return Span(start, end + cells, style) + else: + return self + class Text(JupyterMixin): """Text with color / style. @@ -108,7 +124,7 @@ class Text(JupyterMixin): overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. + tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None. spans (List[Span], optional). A list of predefined style spans. Defaults to None. """ @@ -133,7 +149,7 @@ def __init__( overflow: Optional["OverflowMethod"] = None, no_wrap: Optional[bool] = None, end: str = "\n", - tab_size: Optional[int] = 8, + tab_size: Optional[int] = None, spans: Optional[List[Span]] = None, ) -> None: sanitized_text = strip_control_codes(text) @@ -255,7 +271,9 @@ def from_markup( Args: text (str): A string containing console markup. + style (Union[str, Style], optional): Base style for text. Defaults to "". emoji (bool, optional): Also render emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. end (str, optional): Character to end text with. Defaults to "\\\\n". @@ -292,7 +310,7 @@ def from_ansi( overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. + tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None. """ from .ansi import AnsiDecoder @@ -353,8 +371,9 @@ def assemble( style (Union[str, Style], optional): Base style for text. Defaults to "". justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. + tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None. meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None Returns: @@ -408,7 +427,7 @@ def spans(self, spans: List[Span]) -> None: self._spans = spans[:] def blank_copy(self, plain: str = "") -> "Text": - """Return a new Text instance with copied meta data (but not the string or spans).""" + """Return a new Text instance with copied metadata (but not the string or spans).""" copy_self = Text( plain, style=self.style, @@ -489,7 +508,7 @@ def stylize_before( def apply_meta( self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None ) -> None: - """Apply meta data to the text, or a portion of the text. + """Apply metadata to the text, or a portion of the text. Args: meta (Dict[str, Any]): A dict of meta information. @@ -549,6 +568,27 @@ def get_style_at_offset(self, console: "Console", offset: int) -> Style: style += get_style(span_style, default="") return style + def extend_style(self, spaces: int) -> None: + """Extend the Text given number of spaces where the spaces have the same style as the last character. + + Args: + spaces (int): Number of spaces to add to the Text. + """ + if spaces <= 0: + return + spans = self.spans + new_spaces = " " * spaces + if spans: + end_offset = len(self) + self._spans[:] = [ + span.extend(spaces) if span.end >= end_offset else span + for span in spans + ] + self._text.append(new_spaces) + self._length += spaces + else: + self.plain += new_spaces + def highlight_regex( self, re_highlight: str, @@ -597,9 +637,9 @@ def highlight_words( """Highlight words with a style. Args: - words (Iterable[str]): Worlds to highlight. + words (Iterable[str]): Words to highlight. style (Union[str, Style]): Style to apply. - case_sensitive (bool, optional): Enable case sensitive matchings. Defaults to True. + case_sensitive (bool, optional): Enable case sensitive matching. Defaults to True. Returns: int: Number of words highlighted. @@ -646,7 +686,7 @@ def set_length(self, new_length: int) -> None: def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> Iterable[Segment]: - tab_size: int = console.tab_size or self.tab_size or 8 + tab_size: int = console.tab_size if self.tab_size is None else self.tab_size justify = self.justify or options.justify or DEFAULT_JUSTIFY overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW @@ -781,27 +821,35 @@ def expand_tabs(self, tab_size: Optional[int] = None) -> None: """ if "\t" not in self.plain: return - pos = 0 if tab_size is None: tab_size = self.tab_size - assert tab_size is not None - result = self.blank_copy() - append = result.append + if tab_size is None: + tab_size = 8 + + new_text: List[Text] = [] + append = new_text.append - _style = self.style for line in self.split("\n", include_separator=True): - parts = line.split("\t", include_separator=True) - for part in parts: - if part.plain.endswith("\t"): - part._text = [part.plain[:-1] + " "] - append(part) - pos += len(part) - spaces = tab_size - ((pos - 1) % tab_size) - 1 - if spaces: - append(" " * spaces, _style) - pos += spaces - else: + if "\t" not in line.plain: + append(line) + else: + cell_position = 0 + parts = line.split("\t", include_separator=True) + for part in parts: + if part.plain.endswith("\t"): + part._text[-1] = part._text[-1][:-1] + " " + cell_position += part.cell_len + tab_remainder = cell_position % tab_size + if tab_remainder: + spaces = tab_size - tab_remainder + part.extend_style(spaces) + cell_position += spaces + else: + cell_position += part.cell_len append(part) + + result = Text("").join(new_text) + self._text = [result.plain] self._length = len(self.plain) self._spans[:] = result._spans @@ -852,6 +900,7 @@ def pad(self, count: int, character: str = " ") -> None: Args: count (int): Width of padding. + character (str): The character to pad with. Must be a string of length 1. """ assert len(character) == 1, "Character must be a string of length 1" if count: @@ -932,7 +981,7 @@ def append( self._text.append(sanitized_text) offset = len(self) text_length = len(sanitized_text) - if style is not None: + if style: self._spans.append(Span(offset, offset + text_length, style)) self._length += text_length elif isinstance(text, Text): @@ -942,7 +991,7 @@ def append( "style must not be set when appending Text instance" ) text_length = self._length - if text.style is not None: + if text.style: self._spans.append( _Span(text_length, text_length + len(text), text.style) ) @@ -958,12 +1007,15 @@ def append_text(self, text: "Text") -> "Text": """Append another Text instance. This method is more performant that Text.append, but only works for Text. + Args: + text (Text): The Text instance to append to this instance. + Returns: Text: Returns self for chaining. """ _Span = Span text_length = self._length - if text.style is not None: + if text.style: self._spans.append(_Span(text_length, text_length + len(text), text.style)) self._text.append(text.plain) self._spans.extend( @@ -979,7 +1031,7 @@ def append_tokens( """Append iterable of str and style. Style may be a Style instance or a str style definition. Args: - pairs (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style. + tokens (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style. Returns: Text: Returns self for chaining. @@ -990,7 +1042,7 @@ def append_tokens( offset = len(self) for content, style in tokens: append_text(content) - if style is not None: + if style: append_span(_Span(offset, offset + len(content), style)) offset += len(content) self._length = offset @@ -1088,7 +1140,6 @@ def divide(self, offsets: Iterable[int]) -> Lines: _Span = Span for span_start, span_end, style in self._spans: - lower_bound = 0 upper_bound = line_count start_line_no = (lower_bound + upper_bound) // 2 @@ -1158,8 +1209,7 @@ def wrap( Args: console (Console): Console instance. - width (int): Number of characters per line. - emoji (bool, optional): Also render emoji code. Defaults to True. + width (int): Number of cells available per line. justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default". overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. tab_size (int, optional): Default tab size. Defaults to 8. diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py index c4ffe1f9..f223ad44 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py @@ -636,7 +636,6 @@ def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: excluded = False for frame_index, frame in enumerate(stack.frames): - if exclude_frames and frame_index in exclude_frames: excluded = True continue @@ -720,7 +719,6 @@ def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: if __name__ == "__main__": # pragma: no cover - from .console import Console console = Console() @@ -744,7 +742,6 @@ def foo(a: Any) -> None: bar(a) def error() -> None: - try: try: foo(0) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py index afe8da1a..64bc75d2 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py @@ -72,7 +72,6 @@ def add( def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": - stack: List[Iterator[Tuple[bool, Tree]]] = [] pop = stack.pop push = stack.append @@ -195,7 +194,6 @@ def __rich_measure__( if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Group from pip._vendor.rich.markdown import Markdown from pip._vendor.rich.panel import Panel diff --git a/env/lib/python3.12/site-packages/pip/_vendor/six.py b/env/lib/python3.12/site-packages/pip/_vendor/six.py deleted file mode 100644 index 4e15675d..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/six.py +++ /dev/null @@ -1,998 +0,0 @@ -# Copyright (c) 2010-2020 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -"""Utilities for writing code that runs on Python 2 and 3""" - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.16.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - -if PY34: - from importlib.util import spec_from_loader -else: - spec_from_loader = None - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def find_spec(self, fullname, path, target=None): - if fullname in self.known_modules: - return spec_from_loader(fullname, self) - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - - def create_module(self, spec): - return self.load_module(spec.name) - - def exec_module(self, module): - pass - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("getoutput", "commands", "subprocess"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("splitvalue", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), - MovedAttribute("parse_http_list", "urllib2", "urllib.request"), - MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - del io - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" - _assertNotRegex = "assertNotRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -def assertNotRegex(self, *args, **kwargs): - return getattr(self, _assertNotRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""") - - -if sys.version_info[:2] > (3,): - exec_("""def raise_from(value, from_value): - try: - raise value from from_value - finally: - value = None -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - # This does exactly the same what the :func:`py3:functools.update_wrapper` - # function does on Python versions after 3.2. It sets the ``__wrapped__`` - # attribute on ``wrapper`` object and it doesn't raise an error if any of - # the attributes mentioned in ``assigned`` and ``updated`` are missing on - # ``wrapped`` object. - def _update_wrapper(wrapper, wrapped, - assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - for attr in assigned: - try: - value = getattr(wrapped, attr) - except AttributeError: - continue - else: - setattr(wrapper, attr, value) - for attr in updated: - getattr(wrapper, attr).update(getattr(wrapped, attr, {})) - wrapper.__wrapped__ = wrapped - return wrapper - _update_wrapper.__doc__ = functools.update_wrapper.__doc__ - - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - return functools.partial(_update_wrapper, wrapped=wrapped, - assigned=assigned, updated=updated) - wraps.__doc__ = functools.wraps.__doc__ - -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - - def __new__(cls, name, this_bases, d): - if sys.version_info[:2] >= (3, 7): - # This version introduced PEP 560 that requires a bit - # of extra care (we mimic what is done by __build_class__). - resolved_bases = types.resolve_bases(bases) - if resolved_bases is not bases: - d['__orig_bases__'] = bases - else: - resolved_bases = bases - return meta(name, resolved_bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - if hasattr(cls, '__qualname__'): - orig_vars['__qualname__'] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def ensure_binary(s, encoding='utf-8', errors='strict'): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, binary_type): - return s - if isinstance(s, text_type): - return s.encode(encoding, errors) - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding='utf-8', errors='strict'): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - # Optimization: Fast return for the common case. - if type(s) is str: - return s - if PY2 and isinstance(s, text_type): - return s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - return s.decode(encoding, errors) - elif not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - return s - - -def ensure_text(s, encoding='utf-8', errors='strict'): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def python_2_unicode_compatible(klass): - """ - A class decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py deleted file mode 100644 index 4f1603ad..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py +++ /dev/null @@ -1,608 +0,0 @@ -# Copyright 2016-2018 Julien Danjou -# Copyright 2017 Elisey Zanko -# Copyright 2016 Étienne Bersac -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import functools -import sys -import threading -import time -import typing as t -import warnings -from abc import ABC, abstractmethod -from concurrent import futures -from inspect import iscoroutinefunction - -# Import all built-in retry strategies for easier usage. -from .retry import retry_base # noqa -from .retry import retry_all # noqa -from .retry import retry_always # noqa -from .retry import retry_any # noqa -from .retry import retry_if_exception # noqa -from .retry import retry_if_exception_type # noqa -from .retry import retry_if_exception_cause_type # noqa -from .retry import retry_if_not_exception_type # noqa -from .retry import retry_if_not_result # noqa -from .retry import retry_if_result # noqa -from .retry import retry_never # noqa -from .retry import retry_unless_exception_type # noqa -from .retry import retry_if_exception_message # noqa -from .retry import retry_if_not_exception_message # noqa - -# Import all nap strategies for easier usage. -from .nap import sleep # noqa -from .nap import sleep_using_event # noqa - -# Import all built-in stop strategies for easier usage. -from .stop import stop_after_attempt # noqa -from .stop import stop_after_delay # noqa -from .stop import stop_all # noqa -from .stop import stop_any # noqa -from .stop import stop_never # noqa -from .stop import stop_when_event_set # noqa - -# Import all built-in wait strategies for easier usage. -from .wait import wait_chain # noqa -from .wait import wait_combine # noqa -from .wait import wait_exponential # noqa -from .wait import wait_fixed # noqa -from .wait import wait_incrementing # noqa -from .wait import wait_none # noqa -from .wait import wait_random # noqa -from .wait import wait_random_exponential # noqa -from .wait import wait_random_exponential as wait_full_jitter # noqa -from .wait import wait_exponential_jitter # noqa - -# Import all built-in before strategies for easier usage. -from .before import before_log # noqa -from .before import before_nothing # noqa - -# Import all built-in after strategies for easier usage. -from .after import after_log # noqa -from .after import after_nothing # noqa - -# Import all built-in after strategies for easier usage. -from .before_sleep import before_sleep_log # noqa -from .before_sleep import before_sleep_nothing # noqa - -# Replace a conditional import with a hard-coded None so that pip does -# not attempt to use tornado even if it is present in the environment. -# If tornado is non-None, tenacity will attempt to execute some code -# that is sensitive to the version of tornado, which could break pip -# if an old version is found. -tornado = None # type: ignore - -if t.TYPE_CHECKING: - import types - - from .retry import RetryBaseT - from .stop import StopBaseT - from .wait import WaitBaseT - - -WrappedFnReturnT = t.TypeVar("WrappedFnReturnT") -WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable[..., t.Any]) - - -class TryAgain(Exception): - """Always retry the executed function when raised.""" - - -NO_RESULT = object() - - -class DoAttempt: - pass - - -class DoSleep(float): - pass - - -class BaseAction: - """Base class for representing actions to take by retry object. - - Concrete implementations must define: - - __init__: to initialize all necessary fields - - REPR_FIELDS: class variable specifying attributes to include in repr(self) - - NAME: for identification in retry object methods and callbacks - """ - - REPR_FIELDS: t.Sequence[str] = () - NAME: t.Optional[str] = None - - def __repr__(self) -> str: - state_str = ", ".join(f"{field}={getattr(self, field)!r}" for field in self.REPR_FIELDS) - return f"{self.__class__.__name__}({state_str})" - - def __str__(self) -> str: - return repr(self) - - -class RetryAction(BaseAction): - REPR_FIELDS = ("sleep",) - NAME = "retry" - - def __init__(self, sleep: t.SupportsFloat) -> None: - self.sleep = float(sleep) - - -_unset = object() - - -def _first_set(first: t.Union[t.Any, object], second: t.Any) -> t.Any: - return second if first is _unset else first - - -class RetryError(Exception): - """Encapsulates the last attempt instance right before giving up.""" - - def __init__(self, last_attempt: "Future") -> None: - self.last_attempt = last_attempt - super().__init__(last_attempt) - - def reraise(self) -> "t.NoReturn": - if self.last_attempt.failed: - raise self.last_attempt.result() - raise self - - def __str__(self) -> str: - return f"{self.__class__.__name__}[{self.last_attempt}]" - - -class AttemptManager: - """Manage attempt context.""" - - def __init__(self, retry_state: "RetryCallState"): - self.retry_state = retry_state - - def __enter__(self) -> None: - pass - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - traceback: t.Optional["types.TracebackType"], - ) -> t.Optional[bool]: - if exc_type is not None and exc_value is not None: - self.retry_state.set_exception((exc_type, exc_value, traceback)) - return True # Swallow exception. - else: - # We don't have the result, actually. - self.retry_state.set_result(None) - return None - - -class BaseRetrying(ABC): - def __init__( - self, - sleep: t.Callable[[t.Union[int, float]], None] = sleep, - stop: "StopBaseT" = stop_never, - wait: "WaitBaseT" = wait_none(), - retry: "RetryBaseT" = retry_if_exception_type(), - before: t.Callable[["RetryCallState"], None] = before_nothing, - after: t.Callable[["RetryCallState"], None] = after_nothing, - before_sleep: t.Optional[t.Callable[["RetryCallState"], None]] = None, - reraise: bool = False, - retry_error_cls: t.Type[RetryError] = RetryError, - retry_error_callback: t.Optional[t.Callable[["RetryCallState"], t.Any]] = None, - ): - self.sleep = sleep - self.stop = stop - self.wait = wait - self.retry = retry - self.before = before - self.after = after - self.before_sleep = before_sleep - self.reraise = reraise - self._local = threading.local() - self.retry_error_cls = retry_error_cls - self.retry_error_callback = retry_error_callback - - def copy( - self, - sleep: t.Union[t.Callable[[t.Union[int, float]], None], object] = _unset, - stop: t.Union["StopBaseT", object] = _unset, - wait: t.Union["WaitBaseT", object] = _unset, - retry: t.Union[retry_base, object] = _unset, - before: t.Union[t.Callable[["RetryCallState"], None], object] = _unset, - after: t.Union[t.Callable[["RetryCallState"], None], object] = _unset, - before_sleep: t.Union[t.Optional[t.Callable[["RetryCallState"], None]], object] = _unset, - reraise: t.Union[bool, object] = _unset, - retry_error_cls: t.Union[t.Type[RetryError], object] = _unset, - retry_error_callback: t.Union[t.Optional[t.Callable[["RetryCallState"], t.Any]], object] = _unset, - ) -> "BaseRetrying": - """Copy this object with some parameters changed if needed.""" - return self.__class__( - sleep=_first_set(sleep, self.sleep), - stop=_first_set(stop, self.stop), - wait=_first_set(wait, self.wait), - retry=_first_set(retry, self.retry), - before=_first_set(before, self.before), - after=_first_set(after, self.after), - before_sleep=_first_set(before_sleep, self.before_sleep), - reraise=_first_set(reraise, self.reraise), - retry_error_cls=_first_set(retry_error_cls, self.retry_error_cls), - retry_error_callback=_first_set(retry_error_callback, self.retry_error_callback), - ) - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__} object at 0x{id(self):x} (" - f"stop={self.stop}, " - f"wait={self.wait}, " - f"sleep={self.sleep}, " - f"retry={self.retry}, " - f"before={self.before}, " - f"after={self.after})>" - ) - - @property - def statistics(self) -> t.Dict[str, t.Any]: - """Return a dictionary of runtime statistics. - - This dictionary will be empty when the controller has never been - ran. When it is running or has ran previously it should have (but - may not) have useful and/or informational keys and values when - running is underway and/or completed. - - .. warning:: The keys in this dictionary **should** be some what - stable (not changing), but there existence **may** - change between major releases as new statistics are - gathered or removed so before accessing keys ensure that - they actually exist and handle when they do not. - - .. note:: The values in this dictionary are local to the thread - running call (so if multiple threads share the same retrying - object - either directly or indirectly) they will each have - there own view of statistics they have collected (in the - future we may provide a way to aggregate the various - statistics from each thread). - """ - try: - return self._local.statistics # type: ignore[no-any-return] - except AttributeError: - self._local.statistics = t.cast(t.Dict[str, t.Any], {}) - return self._local.statistics - - def wraps(self, f: WrappedFn) -> WrappedFn: - """Wrap a function for retrying. - - :param f: A function to wraps for retrying. - """ - - @functools.wraps(f) - def wrapped_f(*args: t.Any, **kw: t.Any) -> t.Any: - return self(f, *args, **kw) - - def retry_with(*args: t.Any, **kwargs: t.Any) -> WrappedFn: - return self.copy(*args, **kwargs).wraps(f) - - wrapped_f.retry = self # type: ignore[attr-defined] - wrapped_f.retry_with = retry_with # type: ignore[attr-defined] - - return wrapped_f # type: ignore[return-value] - - def begin(self) -> None: - self.statistics.clear() - self.statistics["start_time"] = time.monotonic() - self.statistics["attempt_number"] = 1 - self.statistics["idle_for"] = 0 - - def iter(self, retry_state: "RetryCallState") -> t.Union[DoAttempt, DoSleep, t.Any]: # noqa - fut = retry_state.outcome - if fut is None: - if self.before is not None: - self.before(retry_state) - return DoAttempt() - - is_explicit_retry = fut.failed and isinstance(fut.exception(), TryAgain) - if not (is_explicit_retry or self.retry(retry_state)): - return fut.result() - - if self.after is not None: - self.after(retry_state) - - self.statistics["delay_since_first_attempt"] = retry_state.seconds_since_start - if self.stop(retry_state): - if self.retry_error_callback: - return self.retry_error_callback(retry_state) - retry_exc = self.retry_error_cls(fut) - if self.reraise: - raise retry_exc.reraise() - raise retry_exc from fut.exception() - - if self.wait: - sleep = self.wait(retry_state) - else: - sleep = 0.0 - retry_state.next_action = RetryAction(sleep) - retry_state.idle_for += sleep - self.statistics["idle_for"] += sleep - self.statistics["attempt_number"] += 1 - - if self.before_sleep is not None: - self.before_sleep(retry_state) - - return DoSleep(sleep) - - def __iter__(self) -> t.Generator[AttemptManager, None, None]: - self.begin() - - retry_state = RetryCallState(self, fn=None, args=(), kwargs={}) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - yield AttemptManager(retry_state=retry_state) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - self.sleep(do) - else: - break - - @abstractmethod - def __call__( - self, - fn: t.Callable[..., WrappedFnReturnT], - *args: t.Any, - **kwargs: t.Any, - ) -> WrappedFnReturnT: - pass - - -class Retrying(BaseRetrying): - """Retrying controller.""" - - def __call__( - self, - fn: t.Callable[..., WrappedFnReturnT], - *args: t.Any, - **kwargs: t.Any, - ) -> WrappedFnReturnT: - self.begin() - - retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - try: - result = fn(*args, **kwargs) - except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] - else: - retry_state.set_result(result) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - self.sleep(do) - else: - return do # type: ignore[no-any-return] - - -if sys.version_info[1] >= 9: - FutureGenericT = futures.Future[t.Any] -else: - FutureGenericT = futures.Future - - -class Future(FutureGenericT): - """Encapsulates a (future or past) attempted call to a target function.""" - - def __init__(self, attempt_number: int) -> None: - super().__init__() - self.attempt_number = attempt_number - - @property - def failed(self) -> bool: - """Return whether a exception is being held in this future.""" - return self.exception() is not None - - @classmethod - def construct(cls, attempt_number: int, value: t.Any, has_exception: bool) -> "Future": - """Construct a new Future object.""" - fut = cls(attempt_number) - if has_exception: - fut.set_exception(value) - else: - fut.set_result(value) - return fut - - -class RetryCallState: - """State related to a single call wrapped with Retrying.""" - - def __init__( - self, - retry_object: BaseRetrying, - fn: t.Optional[WrappedFn], - args: t.Any, - kwargs: t.Any, - ) -> None: - #: Retry call start timestamp - self.start_time = time.monotonic() - #: Retry manager object - self.retry_object = retry_object - #: Function wrapped by this retry call - self.fn = fn - #: Arguments of the function wrapped by this retry call - self.args = args - #: Keyword arguments of the function wrapped by this retry call - self.kwargs = kwargs - - #: The number of the current attempt - self.attempt_number: int = 1 - #: Last outcome (result or exception) produced by the function - self.outcome: t.Optional[Future] = None - #: Timestamp of the last outcome - self.outcome_timestamp: t.Optional[float] = None - #: Time spent sleeping in retries - self.idle_for: float = 0.0 - #: Next action as decided by the retry manager - self.next_action: t.Optional[RetryAction] = None - - @property - def seconds_since_start(self) -> t.Optional[float]: - if self.outcome_timestamp is None: - return None - return self.outcome_timestamp - self.start_time - - def prepare_for_next_attempt(self) -> None: - self.outcome = None - self.outcome_timestamp = None - self.attempt_number += 1 - self.next_action = None - - def set_result(self, val: t.Any) -> None: - ts = time.monotonic() - fut = Future(self.attempt_number) - fut.set_result(val) - self.outcome, self.outcome_timestamp = fut, ts - - def set_exception( - self, exc_info: t.Tuple[t.Type[BaseException], BaseException, "types.TracebackType| None"] - ) -> None: - ts = time.monotonic() - fut = Future(self.attempt_number) - fut.set_exception(exc_info[1]) - self.outcome, self.outcome_timestamp = fut, ts - - def __repr__(self) -> str: - if self.outcome is None: - result = "none yet" - elif self.outcome.failed: - exception = self.outcome.exception() - result = f"failed ({exception.__class__.__name__} {exception})" - else: - result = f"returned {self.outcome.result()}" - - slept = float(round(self.idle_for, 2)) - clsname = self.__class__.__name__ - return f"<{clsname} {id(self)}: attempt #{self.attempt_number}; slept for {slept}; last result: {result}>" - - -@t.overload -def retry(func: WrappedFn) -> WrappedFn: - ... - - -@t.overload -def retry( - sleep: t.Callable[[t.Union[int, float]], None] = sleep, - stop: "StopBaseT" = stop_never, - wait: "WaitBaseT" = wait_none(), - retry: "RetryBaseT" = retry_if_exception_type(), - before: t.Callable[["RetryCallState"], None] = before_nothing, - after: t.Callable[["RetryCallState"], None] = after_nothing, - before_sleep: t.Optional[t.Callable[["RetryCallState"], None]] = None, - reraise: bool = False, - retry_error_cls: t.Type["RetryError"] = RetryError, - retry_error_callback: t.Optional[t.Callable[["RetryCallState"], t.Any]] = None, -) -> t.Callable[[WrappedFn], WrappedFn]: - ... - - -def retry(*dargs: t.Any, **dkw: t.Any) -> t.Any: - """Wrap a function with a new `Retrying` object. - - :param dargs: positional arguments passed to Retrying object - :param dkw: keyword arguments passed to the Retrying object - """ - # support both @retry and @retry() as valid syntax - if len(dargs) == 1 and callable(dargs[0]): - return retry()(dargs[0]) - else: - - def wrap(f: WrappedFn) -> WrappedFn: - if isinstance(f, retry_base): - warnings.warn( - f"Got retry_base instance ({f.__class__.__name__}) as callable argument, " - f"this will probably hang indefinitely (did you mean retry={f.__class__.__name__}(...)?)" - ) - r: "BaseRetrying" - if iscoroutinefunction(f): - r = AsyncRetrying(*dargs, **dkw) - elif tornado and hasattr(tornado.gen, "is_coroutine_function") and tornado.gen.is_coroutine_function(f): - r = TornadoRetrying(*dargs, **dkw) - else: - r = Retrying(*dargs, **dkw) - - return r.wraps(f) - - return wrap - - -from pip._vendor.tenacity._asyncio import AsyncRetrying # noqa:E402,I100 - -if tornado: - from pip._vendor.tenacity.tornadoweb import TornadoRetrying - - -__all__ = [ - "retry_base", - "retry_all", - "retry_always", - "retry_any", - "retry_if_exception", - "retry_if_exception_type", - "retry_if_exception_cause_type", - "retry_if_not_exception_type", - "retry_if_not_result", - "retry_if_result", - "retry_never", - "retry_unless_exception_type", - "retry_if_exception_message", - "retry_if_not_exception_message", - "sleep", - "sleep_using_event", - "stop_after_attempt", - "stop_after_delay", - "stop_all", - "stop_any", - "stop_never", - "stop_when_event_set", - "wait_chain", - "wait_combine", - "wait_exponential", - "wait_fixed", - "wait_incrementing", - "wait_none", - "wait_random", - "wait_random_exponential", - "wait_full_jitter", - "wait_exponential_jitter", - "before_log", - "before_nothing", - "after_log", - "after_nothing", - "before_sleep_log", - "before_sleep_nothing", - "retry", - "WrappedFn", - "TryAgain", - "NO_RESULT", - "DoAttempt", - "DoSleep", - "BaseAction", - "RetryAction", - "RetryError", - "AttemptManager", - "BaseRetrying", - "Retrying", - "Future", - "RetryCallState", - "AsyncRetrying", -] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e84a4b90ef859a01b298ce696f03b5b3fd080772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27105 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 R;zE+UQ}O)S4G(*H{|n^~4nP0^ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc deleted file mode 100644 index 41124634f8ec69df20cb03989a2cc578307c8c62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1643 zcmZ`3O>Y}TbY|DcJG8avHWCR2vP;P|vXq9Bv_OOi956zgjdyHsvfj03CJ8o4 zxmmtll{63jUy&WQdF5WC1i7IsicoRWjX>0F%q%jBx)((C3D#aLRP4XEnJbVfv6I-5?e|s-o%CUFG6*`fc>zs z%58@MmHv=$+MF>RXMvlX&=6?&VM_Qab<0@jzW_4OeW9_7z@5|@o34O~S_W&CaSHa; zrpjw3S1pe))%AGIcB|U_0fI;ga7vp76JeO}te(31$Ba;>ub9+ywIwjLP5o`cR=C&D z8zAvq)6r|halCbpI+jk{HQlk7^hT4{Ja=dBv;}rZ?<{Zmbd4@~F;< zYnE-^)J>74)@b^vfHKbVqGEnG;AIk^ho}!2YInS9mC#mNoFe=80^W}SZ#ZO)IDVXw zvQhD9-Q;D_l5-H930jl~VjFGaZ3$*C?cg1>BUNMzZzVV74S4|-I64^;^_glq|x%y7**@nsl`e-*aCb1h~t+bt8Z z*OdEl?in7nY}i{reKsh=U9B$>T2QEHi65!Bfft$rj*3cY8W2+escO63rZJ#`Jv40I zx;EHZh^S3D9^}D_8ZaOl6IP!C`n!#e6S+slPO+P~b&|W)nf*DJKgwx`Ic@)oZyy{y zc#dcJdF|}ZYv*@t@IIhr8K{ NLq+>N2C^W9e*i9jlso_c diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc deleted file mode 100644 index e42636ec0e705c736c7b15ef25dbd4d251080583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmZ`&&2Jk;6rb7k=h|^-0K3FU-SlD^CA*@%p~weJaU)U(5jfxio3&@`Y_i_9X2+>) zlFCSx8lQSXIUuAS8}$H3IPnJ{A%`9kEl5EXa}NZg(-n=s1kxz2H$Wc zj1ftY$emCnLZT!_;xtOa5dFezEJ7sIzy#N&SKz1~AqvFAJ2;>GO}Lix*pC=(ZrL7K zsrM*nouX;mo807-g}}p)Fv{D^sbS%NPGqo0!s7@*I;op`lh$2E)f$AW9%qoC(NX!f z$yMS~Pjy_rZ8;6Ce2kz}0;fXq)NUc71^$$GCJbl+>rlVCM&@%P6sJF}AmfnIB z*D-BebyH#${jUdmKMs4trhC+`3HPZ8 zR03o!f^iq!#V}~;5FettMDU&DfwV7eqP*OFB$5iVCNDSy#=x(MmHn>9s6)H`2*aSccL>Puj_nT3pLVe5vj*ac}=ZgK|ThRe>RfV>YQT1Hit* zUBhL>0)F|a3CxDmZdNJFhnTpEAFVq<0GopyOM>zQfU4T-F)@RHCx*qlixW~oUTxKO zp_*6FU;}5DMU)BZ&mKBUr0*5_g+XHJaeAp=dXj$iG_9SawFjSmb^G}Cqjcf0bQVk9 zQ~JtT^5wIXdOveNK1BGn?9bVy)9ms|cKN~0)0NW6O6gJd`e1QwuvQt$crH$ zSOTgXk6RC3F$=?oG85Cw%R&3&i=^R$C$QPtQpfjD{^_3y4qp-;^Pv9fp=S{#tPC%r zzI)9mUcXj+XRTcFqk`BFGVV_B z!j~`U7$E?~kC>}ICt|UNy9$Rg?q;1mz6Kx4zdK;kN<`|DIBb<7Qa*yTsshs&y z&ioWwcpADoieP+Y7@NlngG_FSVEwunEZ@BS-Nv^YgBu?Y);}3+k-<7SS*5=VhoIo! DHbiVe diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc deleted file mode 100644 index 9c759f7228f456e1adfb3c25e3553ff468f343d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2321 zcmbVNO>7fK6rTO@?>Y`KiPMsltkdAcsMr*^fKn?8A)$gs6|_Z7q07cQPS)A%TC?kb zU5ADWDb9)ZP*DjX(NjTG>Xjq+Ue@GbYg?(QS`NLrO8=Bo->hvy(s1e1?)-jl-kbL~ z-*n}S5c-8q+9b3Fn-v(`K?+hB4b9M=)tE(ghGh^&Id2=j-IJh;j;|(CCL-8qoC4hZO5c?GmoD$jQZjTgxj!~E_`zkDC{fcnQGZQQ_ ziSTa}Fr8o=uT-#9&4f|-0=7u;w5(|tE!o0^2ZZA#*eVb`!%+MS#KCxzBJLnKjx7z3 zpM zGLiMlsPavqpy6r%lvMuD$wUu!>fhRTct)t*{lQ zg0h^#+zKsoW$q$MaHUf(w9r(>;Uw(%yRHAZ>Qjqt?PQqi|&= z=cd?BOpe}i7u`h)UuN#2d)zX&%&vJ!-~W)v>oLW%%4$UT7!a6_J9Qfz`uw8a<8G--O$r(#E^fnesi>#VhDY2)-Nyp!;GcXN|7W4((xTdE|0kZ zlcVmTW;)rlcbp#32ig123Tk*!sJA8@tO^HhA^v0Jpgl0P9yx1=&Ta_NnlM-u25sT6 zyMAsxa^4P|ch@PtCLDSy9IAKq*SdzPT|>35WVI`~-gUGxUOzB+pL|pPx?CF`tqzac z@wXmdc)~um?4gOz4^<|9?(D6{-l)Y+RAVPk<*C0mSeXXVx6^BBTZnB$V{22tM*C~gWHp+6@X2>K9^P1wrYln${_ySK zTCg7KsfT;N@_k;s?|;x&ON><$W3|L&H8E+AOg;J3zVwm(!DajM75n3ieMPYqY=^S- zp4S^b6xjbK;sZfKU*dm~PXBOX|oCO&8ryz7IeH)t#o*P=9qu3o(=HodWL$5R1@ zCnK;w0KZA|d}{^$9Ukxm8{-TLMONN%<&k07NidTM!SPzfJcP2-4ewI2^)4mb?@}|u zI^O&6-80hZvu949dwY7y@qrBb&@{EB_0Qo{-E#O@!+^JjzSQ!phFvw>YcxgD(An~j zE*eTf!)bC9rnIh`GBgd2VVKQ9#Dt%r;SDZO<9eTRy+81gXZ-O^FT)&bgi*Bbci#vT xsfYR-9P}HVk%k9)h^x;14Z73tBX4L`x+&SwxZN}Spxf>_QuQSN2*94J!oSBUH&_4w diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc deleted file mode 100644 index 65f6f43e50795b0c51e4d677c6927024e6e40a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1431 zcmZ`&&2Jk;6rb^a*(S!&0x7A4MhH+>D&F$d1FASsqC$}jQiBA(j3zr{d!6;}GBa-2 zD2E_LB0ZpTOONG*P&shqf8YdC1#Ax>aq7*&6-YhtW^9KN=#%~4n|WWqH}CEDtyU8O zUHSFT{=h@%cXL>hyHI8yf^vvB;y6XUxx_sz@M!6=i~uQJ>*w?wUK1{NIPSaL-FJIl z4P8Rq+eh5LRhtL&{1S)3U32JGff8|^aaH+J=!wi?Ja@9(0dD@Y4zNR{k8GnwD(kgi zyXe-!ju8~7?c8V*pev~m1yNcuEe0jgL#7EADJvBbpNM#(lRP8+ToOhG$yJe&Y%<;y zlH`4|fYxc+L>t3I5%}q$fCPOuN%c|MvxH@wj9E!G1sUh@mf$3xXq$JEC7NiVbdn7^ zHd8mORjy9PqVkkM7h-9;R0ck|pGF@jAyu@+B+ELRfHz^$TS9H=yod_0AduEq!KM&ELgn720}$eQbZJ5`k~iL<03NN4*-yF#W(z-Q}L} zMk~vJf20UZ9bV%O?1vBgQ7@gaUOjH#fld^>5fuPc@0|O;!ELidD*^*!8L@6e=jO?k z&>d-Db>jy&!{~N@PJnWVcJVHvpv|d7A?}8_@@yhA5+%~UY=KpoKtg04L{+CWfe})= zv-Tg9ou%!06V(8=hkkx??ZExKDb1-0%$Q*l{sqfGval|I0~%A>`3%B_d9;j;1*KJ!(s9lwsnJ&`{dmICg(aYr=P{+S z4aF*7mj&dh>hBfilVoY-_0ybbc@nH&BU{!EL_Pu+mOTrKdI8uz`o(>H=3?*k)OWn_ zrvFv@%l5b459It5!TGya?-?;qVWPu8`Xzd4PcoYfzl)jRGJQ{Ts@ YzIbhlK-}1v8S&SN1`hu~z-->X0n36=8UO$Q diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc deleted file mode 100644 index 8220a7ff401befd04a6ebc6d18da66ff5a9bc7e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14300 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 AjQ{`u diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py deleted file mode 100644 index 2e50cd7b..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2016 Étienne Bersac -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import functools -import sys -import typing as t -from asyncio import sleep - -from pip._vendor.tenacity import AttemptManager -from pip._vendor.tenacity import BaseRetrying -from pip._vendor.tenacity import DoAttempt -from pip._vendor.tenacity import DoSleep -from pip._vendor.tenacity import RetryCallState - -WrappedFnReturnT = t.TypeVar("WrappedFnReturnT") -WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable[..., t.Awaitable[t.Any]]) - - -class AsyncRetrying(BaseRetrying): - sleep: t.Callable[[float], t.Awaitable[t.Any]] - - def __init__(self, sleep: t.Callable[[float], t.Awaitable[t.Any]] = sleep, **kwargs: t.Any) -> None: - super().__init__(**kwargs) - self.sleep = sleep - - async def __call__( # type: ignore[override] - self, fn: WrappedFn, *args: t.Any, **kwargs: t.Any - ) -> WrappedFnReturnT: - self.begin() - - retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - try: - result = await fn(*args, **kwargs) - except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] - else: - retry_state.set_result(result) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - await self.sleep(do) - else: - return do # type: ignore[no-any-return] - - def __iter__(self) -> t.Generator[AttemptManager, None, None]: - raise TypeError("AsyncRetrying object is not iterable") - - def __aiter__(self) -> "AsyncRetrying": - self.begin() - self._retry_state = RetryCallState(self, fn=None, args=(), kwargs={}) - return self - - async def __anext__(self) -> AttemptManager: - while True: - do = self.iter(retry_state=self._retry_state) - if do is None: - raise StopAsyncIteration - elif isinstance(do, DoAttempt): - return AttemptManager(retry_state=self._retry_state) - elif isinstance(do, DoSleep): - self._retry_state.prepare_for_next_attempt() - await self.sleep(do) - else: - raise StopAsyncIteration - - def wraps(self, fn: WrappedFn) -> WrappedFn: - fn = super().wraps(fn) - # Ensure wrapper is recognized as a coroutine function. - - @functools.wraps(fn) - async def async_wrapped(*args: t.Any, **kwargs: t.Any) -> t.Any: - return await fn(*args, **kwargs) - - # Preserve attributes - async_wrapped.retry = fn.retry # type: ignore[attr-defined] - async_wrapped.retry_with = fn.retry_with # type: ignore[attr-defined] - - return async_wrapped # type: ignore[return-value] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py deleted file mode 100644 index f14ff320..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import typing -from datetime import timedelta - - -# sys.maxsize: -# An integer giving the maximum value a variable of type Py_ssize_t can take. -MAX_WAIT = sys.maxsize / 2 - - -def find_ordinal(pos_num: int) -> str: - # See: https://en.wikipedia.org/wiki/English_numerals#Ordinal_numbers - if pos_num == 0: - return "th" - elif pos_num == 1: - return "st" - elif pos_num == 2: - return "nd" - elif pos_num == 3: - return "rd" - elif 4 <= pos_num <= 20: - return "th" - else: - return find_ordinal(pos_num % 10) - - -def to_ordinal(pos_num: int) -> str: - return f"{pos_num}{find_ordinal(pos_num)}" - - -def get_callback_name(cb: typing.Callable[..., typing.Any]) -> str: - """Get a callback fully-qualified name. - - If no name can be produced ``repr(cb)`` is called and returned. - """ - segments = [] - try: - segments.append(cb.__qualname__) - except AttributeError: - try: - segments.append(cb.__name__) - except AttributeError: - pass - if not segments: - return repr(cb) - else: - try: - # When running under sphinx it appears this can be none? - if cb.__module__: - segments.insert(0, cb.__module__) - except AttributeError: - pass - return ".".join(segments) - - -time_unit_type = typing.Union[int, float, timedelta] - - -def to_seconds(time_unit: time_unit_type) -> float: - return float(time_unit.total_seconds() if isinstance(time_unit, timedelta) else time_unit) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py deleted file mode 100644 index 574c9bce..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import logging - - from pip._vendor.tenacity import RetryCallState - - -def after_nothing(retry_state: "RetryCallState") -> None: - """After call strategy that does nothing.""" - - -def after_log( - logger: "logging.Logger", - log_level: int, - sec_format: str = "%0.3f", -) -> typing.Callable[["RetryCallState"], None]: - """After call strategy that logs to some logger the finished attempt.""" - - def log_it(retry_state: "RetryCallState") -> None: - if retry_state.fn is None: - # NOTE(sileht): can't really happen, but we must please mypy - fn_name = "" - else: - fn_name = _utils.get_callback_name(retry_state.fn) - logger.log( - log_level, - f"Finished call to '{fn_name}' " - f"after {sec_format % retry_state.seconds_since_start}(s), " - f"this was the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.", - ) - - return log_it diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py deleted file mode 100644 index cfd7dc72..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import logging - - from pip._vendor.tenacity import RetryCallState - - -def before_nothing(retry_state: "RetryCallState") -> None: - """Before call strategy that does nothing.""" - - -def before_log(logger: "logging.Logger", log_level: int) -> typing.Callable[["RetryCallState"], None]: - """Before call strategy that logs to some logger the attempt.""" - - def log_it(retry_state: "RetryCallState") -> None: - if retry_state.fn is None: - # NOTE(sileht): can't really happen, but we must please mypy - fn_name = "" - else: - fn_name = _utils.get_callback_name(retry_state.fn) - logger.log( - log_level, - f"Starting call to '{fn_name}', " - f"this is the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.", - ) - - return log_it diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py deleted file mode 100644 index 8c6167fb..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import logging - - from pip._vendor.tenacity import RetryCallState - - -def before_sleep_nothing(retry_state: "RetryCallState") -> None: - """Before call strategy that does nothing.""" - - -def before_sleep_log( - logger: "logging.Logger", - log_level: int, - exc_info: bool = False, -) -> typing.Callable[["RetryCallState"], None]: - """Before call strategy that logs to some logger the attempt.""" - - def log_it(retry_state: "RetryCallState") -> None: - local_exc_info: BaseException | bool | None - - if retry_state.outcome is None: - raise RuntimeError("log_it() called before outcome was set") - - if retry_state.next_action is None: - raise RuntimeError("log_it() called before next_action was set") - - if retry_state.outcome.failed: - ex = retry_state.outcome.exception() - verb, value = "raised", f"{ex.__class__.__name__}: {ex}" - - if exc_info: - local_exc_info = retry_state.outcome.exception() - else: - local_exc_info = False - else: - verb, value = "returned", retry_state.outcome.result() - local_exc_info = False # exc_info does not apply when no exception - - if retry_state.fn is None: - # NOTE(sileht): can't really happen, but we must please mypy - fn_name = "" - else: - fn_name = _utils.get_callback_name(retry_state.fn) - - logger.log( - log_level, - f"Retrying {fn_name} " f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.", - exc_info=local_exc_info, - ) - - return log_it diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py deleted file mode 100644 index 72aa5bfd..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2016 Étienne Bersac -# Copyright 2016 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import time -import typing - -if typing.TYPE_CHECKING: - import threading - - -def sleep(seconds: float) -> None: - """ - Sleep strategy that delays execution for a given number of seconds. - - This is the default strategy, and may be mocked out for unit testing. - """ - time.sleep(seconds) - - -class sleep_using_event: - """Sleep strategy that waits on an event to be set.""" - - def __init__(self, event: "threading.Event") -> None: - self.event = event - - def __call__(self, timeout: typing.Optional[float]) -> None: - # NOTE(harlowja): this may *not* actually wait for timeout - # seconds if the event is set (ie this may eject out early). - self.event.wait(timeout=timeout) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py deleted file mode 100644 index 38988739..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py +++ /dev/null @@ -1,272 +0,0 @@ -# Copyright 2016–2021 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import abc -import re -import typing - -if typing.TYPE_CHECKING: - from pip._vendor.tenacity import RetryCallState - - -class retry_base(abc.ABC): - """Abstract base class for retry strategies.""" - - @abc.abstractmethod - def __call__(self, retry_state: "RetryCallState") -> bool: - pass - - def __and__(self, other: "retry_base") -> "retry_all": - return retry_all(self, other) - - def __or__(self, other: "retry_base") -> "retry_any": - return retry_any(self, other) - - -RetryBaseT = typing.Union[retry_base, typing.Callable[["RetryCallState"], bool]] - - -class _retry_never(retry_base): - """Retry strategy that never rejects any result.""" - - def __call__(self, retry_state: "RetryCallState") -> bool: - return False - - -retry_never = _retry_never() - - -class _retry_always(retry_base): - """Retry strategy that always rejects any result.""" - - def __call__(self, retry_state: "RetryCallState") -> bool: - return True - - -retry_always = _retry_always() - - -class retry_if_exception(retry_base): - """Retry strategy that retries if an exception verifies a predicate.""" - - def __init__(self, predicate: typing.Callable[[BaseException], bool]) -> None: - self.predicate = predicate - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if retry_state.outcome.failed: - exception = retry_state.outcome.exception() - if exception is None: - raise RuntimeError("outcome failed but the exception is None") - return self.predicate(exception) - else: - return False - - -class retry_if_exception_type(retry_if_exception): - """Retries if an exception has been raised of one or more types.""" - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_types = exception_types - super().__init__(lambda e: isinstance(e, exception_types)) - - -class retry_if_not_exception_type(retry_if_exception): - """Retries except an exception has been raised of one or more types.""" - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_types = exception_types - super().__init__(lambda e: not isinstance(e, exception_types)) - - -class retry_unless_exception_type(retry_if_exception): - """Retries until an exception is raised of one or more types.""" - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_types = exception_types - super().__init__(lambda e: not isinstance(e, exception_types)) - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - # always retry if no exception was raised - if not retry_state.outcome.failed: - return True - - exception = retry_state.outcome.exception() - if exception is None: - raise RuntimeError("outcome failed but the exception is None") - return self.predicate(exception) - - -class retry_if_exception_cause_type(retry_base): - """Retries if any of the causes of the raised exception is of one or more types. - - The check on the type of the cause of the exception is done recursively (until finding - an exception in the chain that has no `__cause__`) - """ - - def __init__( - self, - exception_types: typing.Union[ - typing.Type[BaseException], - typing.Tuple[typing.Type[BaseException], ...], - ] = Exception, - ) -> None: - self.exception_cause_types = exception_types - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__ called before outcome was set") - - if retry_state.outcome.failed: - exc = retry_state.outcome.exception() - while exc is not None: - if isinstance(exc.__cause__, self.exception_cause_types): - return True - exc = exc.__cause__ - - return False - - -class retry_if_result(retry_base): - """Retries if the result verifies a predicate.""" - - def __init__(self, predicate: typing.Callable[[typing.Any], bool]) -> None: - self.predicate = predicate - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if not retry_state.outcome.failed: - return self.predicate(retry_state.outcome.result()) - else: - return False - - -class retry_if_not_result(retry_base): - """Retries if the result refutes a predicate.""" - - def __init__(self, predicate: typing.Callable[[typing.Any], bool]) -> None: - self.predicate = predicate - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if not retry_state.outcome.failed: - return not self.predicate(retry_state.outcome.result()) - else: - return False - - -class retry_if_exception_message(retry_if_exception): - """Retries if an exception message equals or matches.""" - - def __init__( - self, - message: typing.Optional[str] = None, - match: typing.Optional[str] = None, - ) -> None: - if message and match: - raise TypeError(f"{self.__class__.__name__}() takes either 'message' or 'match', not both") - - # set predicate - if message: - - def message_fnc(exception: BaseException) -> bool: - return message == str(exception) - - predicate = message_fnc - elif match: - prog = re.compile(match) - - def match_fnc(exception: BaseException) -> bool: - return bool(prog.match(str(exception))) - - predicate = match_fnc - else: - raise TypeError(f"{self.__class__.__name__}() missing 1 required argument 'message' or 'match'") - - super().__init__(predicate) - - -class retry_if_not_exception_message(retry_if_exception_message): - """Retries until an exception message equals or matches.""" - - def __init__( - self, - message: typing.Optional[str] = None, - match: typing.Optional[str] = None, - ) -> None: - super().__init__(message, match) - # invert predicate - if_predicate = self.predicate - self.predicate = lambda *args_, **kwargs_: not if_predicate(*args_, **kwargs_) - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.outcome is None: - raise RuntimeError("__call__() called before outcome was set") - - if not retry_state.outcome.failed: - return True - - exception = retry_state.outcome.exception() - if exception is None: - raise RuntimeError("outcome failed but the exception is None") - return self.predicate(exception) - - -class retry_any(retry_base): - """Retries if any of the retries condition is valid.""" - - def __init__(self, *retries: retry_base) -> None: - self.retries = retries - - def __call__(self, retry_state: "RetryCallState") -> bool: - return any(r(retry_state) for r in self.retries) - - -class retry_all(retry_base): - """Retries if all the retries condition are valid.""" - - def __init__(self, *retries: retry_base) -> None: - self.retries = retries - - def __call__(self, retry_state: "RetryCallState") -> bool: - return all(r(retry_state) for r in self.retries) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py deleted file mode 100644 index bb23effd..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright 2016–2021 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import abc -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - import threading - - from pip._vendor.tenacity import RetryCallState - - -class stop_base(abc.ABC): - """Abstract base class for stop strategies.""" - - @abc.abstractmethod - def __call__(self, retry_state: "RetryCallState") -> bool: - pass - - def __and__(self, other: "stop_base") -> "stop_all": - return stop_all(self, other) - - def __or__(self, other: "stop_base") -> "stop_any": - return stop_any(self, other) - - -StopBaseT = typing.Union[stop_base, typing.Callable[["RetryCallState"], bool]] - - -class stop_any(stop_base): - """Stop if any of the stop condition is valid.""" - - def __init__(self, *stops: stop_base) -> None: - self.stops = stops - - def __call__(self, retry_state: "RetryCallState") -> bool: - return any(x(retry_state) for x in self.stops) - - -class stop_all(stop_base): - """Stop if all the stop conditions are valid.""" - - def __init__(self, *stops: stop_base) -> None: - self.stops = stops - - def __call__(self, retry_state: "RetryCallState") -> bool: - return all(x(retry_state) for x in self.stops) - - -class _stop_never(stop_base): - """Never stop.""" - - def __call__(self, retry_state: "RetryCallState") -> bool: - return False - - -stop_never = _stop_never() - - -class stop_when_event_set(stop_base): - """Stop when the given event is set.""" - - def __init__(self, event: "threading.Event") -> None: - self.event = event - - def __call__(self, retry_state: "RetryCallState") -> bool: - return self.event.is_set() - - -class stop_after_attempt(stop_base): - """Stop when the previous attempt >= max_attempt.""" - - def __init__(self, max_attempt_number: int) -> None: - self.max_attempt_number = max_attempt_number - - def __call__(self, retry_state: "RetryCallState") -> bool: - return retry_state.attempt_number >= self.max_attempt_number - - -class stop_after_delay(stop_base): - """Stop when the time from the first attempt >= limit.""" - - def __init__(self, max_delay: _utils.time_unit_type) -> None: - self.max_delay = _utils.to_seconds(max_delay) - - def __call__(self, retry_state: "RetryCallState") -> bool: - if retry_state.seconds_since_start is None: - raise RuntimeError("__call__() called but seconds_since_start is not set") - return retry_state.seconds_since_start >= self.max_delay diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py deleted file mode 100644 index e19c30b1..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2017 Elisey Zanko -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import typing - -from pip._vendor.tenacity import BaseRetrying -from pip._vendor.tenacity import DoAttempt -from pip._vendor.tenacity import DoSleep -from pip._vendor.tenacity import RetryCallState - -from tornado import gen - -if typing.TYPE_CHECKING: - from tornado.concurrent import Future - -_RetValT = typing.TypeVar("_RetValT") - - -class TornadoRetrying(BaseRetrying): - def __init__(self, sleep: "typing.Callable[[float], Future[None]]" = gen.sleep, **kwargs: typing.Any) -> None: - super().__init__(**kwargs) - self.sleep = sleep - - @gen.coroutine # type: ignore[misc] - def __call__( - self, - fn: "typing.Callable[..., typing.Union[typing.Generator[typing.Any, typing.Any, _RetValT], Future[_RetValT]]]", - *args: typing.Any, - **kwargs: typing.Any, - ) -> "typing.Generator[typing.Any, typing.Any, _RetValT]": - self.begin() - - retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs) - while True: - do = self.iter(retry_state=retry_state) - if isinstance(do, DoAttempt): - try: - result = yield fn(*args, **kwargs) - except BaseException: # noqa: B902 - retry_state.set_exception(sys.exc_info()) # type: ignore[arg-type] - else: - retry_state.set_result(result) - elif isinstance(do, DoSleep): - retry_state.prepare_for_next_attempt() - yield self.sleep(do) - else: - raise gen.Return(do) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py b/env/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py deleted file mode 100644 index f9349c02..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright 2016–2021 Julien Danjou -# Copyright 2016 Joshua Harlow -# Copyright 2013-2014 Ray Holder -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import abc -import random -import typing - -from pip._vendor.tenacity import _utils - -if typing.TYPE_CHECKING: - from pip._vendor.tenacity import RetryCallState - - -class wait_base(abc.ABC): - """Abstract base class for wait strategies.""" - - @abc.abstractmethod - def __call__(self, retry_state: "RetryCallState") -> float: - pass - - def __add__(self, other: "wait_base") -> "wait_combine": - return wait_combine(self, other) - - def __radd__(self, other: "wait_base") -> typing.Union["wait_combine", "wait_base"]: - # make it possible to use multiple waits with the built-in sum function - if other == 0: # type: ignore[comparison-overlap] - return self - return self.__add__(other) - - -WaitBaseT = typing.Union[wait_base, typing.Callable[["RetryCallState"], typing.Union[float, int]]] - - -class wait_fixed(wait_base): - """Wait strategy that waits a fixed amount of time between each retry.""" - - def __init__(self, wait: _utils.time_unit_type) -> None: - self.wait_fixed = _utils.to_seconds(wait) - - def __call__(self, retry_state: "RetryCallState") -> float: - return self.wait_fixed - - -class wait_none(wait_fixed): - """Wait strategy that doesn't wait at all before retrying.""" - - def __init__(self) -> None: - super().__init__(0) - - -class wait_random(wait_base): - """Wait strategy that waits a random amount of time between min/max.""" - - def __init__(self, min: _utils.time_unit_type = 0, max: _utils.time_unit_type = 1) -> None: # noqa - self.wait_random_min = _utils.to_seconds(min) - self.wait_random_max = _utils.to_seconds(max) - - def __call__(self, retry_state: "RetryCallState") -> float: - return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min)) - - -class wait_combine(wait_base): - """Combine several waiting strategies.""" - - def __init__(self, *strategies: wait_base) -> None: - self.wait_funcs = strategies - - def __call__(self, retry_state: "RetryCallState") -> float: - return sum(x(retry_state=retry_state) for x in self.wait_funcs) - - -class wait_chain(wait_base): - """Chain two or more waiting strategies. - - If all strategies are exhausted, the very last strategy is used - thereafter. - - For example:: - - @retry(wait=wait_chain(*[wait_fixed(1) for i in range(3)] + - [wait_fixed(2) for j in range(5)] + - [wait_fixed(5) for k in range(4))) - def wait_chained(): - print("Wait 1s for 3 attempts, 2s for 5 attempts and 5s - thereafter.") - """ - - def __init__(self, *strategies: wait_base) -> None: - self.strategies = strategies - - def __call__(self, retry_state: "RetryCallState") -> float: - wait_func_no = min(max(retry_state.attempt_number, 1), len(self.strategies)) - wait_func = self.strategies[wait_func_no - 1] - return wait_func(retry_state=retry_state) - - -class wait_incrementing(wait_base): - """Wait an incremental amount of time after each attempt. - - Starting at a starting value and incrementing by a value for each attempt - (and restricting the upper limit to some maximum value). - """ - - def __init__( - self, - start: _utils.time_unit_type = 0, - increment: _utils.time_unit_type = 100, - max: _utils.time_unit_type = _utils.MAX_WAIT, # noqa - ) -> None: - self.start = _utils.to_seconds(start) - self.increment = _utils.to_seconds(increment) - self.max = _utils.to_seconds(max) - - def __call__(self, retry_state: "RetryCallState") -> float: - result = self.start + (self.increment * (retry_state.attempt_number - 1)) - return max(0, min(result, self.max)) - - -class wait_exponential(wait_base): - """Wait strategy that applies exponential backoff. - - It allows for a customized multiplier and an ability to restrict the - upper and lower limits to some maximum and minimum value. - - The intervals are fixed (i.e. there is no jitter), so this strategy is - suitable for balancing retries against latency when a required resource is - unavailable for an unknown duration, but *not* suitable for resolving - contention between multiple processes for a shared resource. Use - wait_random_exponential for the latter case. - """ - - def __init__( - self, - multiplier: typing.Union[int, float] = 1, - max: _utils.time_unit_type = _utils.MAX_WAIT, # noqa - exp_base: typing.Union[int, float] = 2, - min: _utils.time_unit_type = 0, # noqa - ) -> None: - self.multiplier = multiplier - self.min = _utils.to_seconds(min) - self.max = _utils.to_seconds(max) - self.exp_base = exp_base - - def __call__(self, retry_state: "RetryCallState") -> float: - try: - exp = self.exp_base ** (retry_state.attempt_number - 1) - result = self.multiplier * exp - except OverflowError: - return self.max - return max(max(0, self.min), min(result, self.max)) - - -class wait_random_exponential(wait_exponential): - """Random wait with exponentially widening window. - - An exponential backoff strategy used to mediate contention between multiple - uncoordinated processes for a shared resource in distributed systems. This - is the sense in which "exponential backoff" is meant in e.g. Ethernet - networking, and corresponds to the "Full Jitter" algorithm described in - this blog post: - - https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ - - Each retry occurs at a random time in a geometrically expanding interval. - It allows for a custom multiplier and an ability to restrict the upper - limit of the random interval to some maximum value. - - Example:: - - wait_random_exponential(multiplier=0.5, # initial window 0.5s - max=60) # max 60s timeout - - When waiting for an unavailable resource to become available again, as - opposed to trying to resolve contention for a shared resource, the - wait_exponential strategy (which uses a fixed interval) may be preferable. - - """ - - def __call__(self, retry_state: "RetryCallState") -> float: - high = super().__call__(retry_state=retry_state) - return random.uniform(0, high) - - -class wait_exponential_jitter(wait_base): - """Wait strategy that applies exponential backoff and jitter. - - It allows for a customized initial wait, maximum wait and jitter. - - This implements the strategy described here: - https://cloud.google.com/storage/docs/retry-strategy - - The wait time is min(initial * 2**n + random.uniform(0, jitter), maximum) - where n is the retry count. - """ - - def __init__( - self, - initial: float = 1, - max: float = _utils.MAX_WAIT, # noqa - exp_base: float = 2, - jitter: float = 1, - ) -> None: - self.initial = initial - self.max = max - self.exp_base = exp_base - self.jitter = jitter - - def __call__(self, retry_state: "RetryCallState") -> float: - jitter = random.uniform(0, self.jitter) - try: - exp = self.exp_base ** (retry_state.attempt_number - 1) - result = self.initial * exp + jitter - except OverflowError: - result = self.max - return max(0, min(result, self.max)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc index e1df8a67c0d2cd870cf6e8154a119c4814c289ea..55ffd34317fcafb17ffaa2de7e9b7f100fa6e2c2 100644 GIT binary patch delta 97 zcmbQtyqcNkG%qg~0}$9UGNw=Dx#iKOA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY yoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}yx zU5K5L(S35iuqe}HiOH*lWtbU+q&A-tKFi41GkJ!nBJ*uQ>B$F0b%DY%n?H&cFv|6U zO}fc1bVFF;2ETBBb!T-4%MC%13BePRfJU^48-b13DSnArBnhnc0}q3!n&LE~#@-Qs)x`Bd6iyIw2`$Aia6E5Idu+4@3pOaDR1YbqC80L6Hf; z6OtxKd}3hcRGqv_ScVx$Z@wvfmXUGd7A+$nCv45T;j6TiePl?k@t0}q3!`jx)+uFt2c05x9c=s=WS1IiJn#hNg^+d6V}Vxd~pj^u8kJbAd(rhKM%M dN>s(VAEw1J0RZ4XbR_@) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc index 9412d20f1d10502c61f01ed0106be6330cab5e5d..5008bbdd2435f02dd8b50858606d9be441830f04 100644 GIT binary patch delta 99 zcmcaE_g;?YG%qg~0}$9UGNy0jSG%qg~0}uq?|CY9qXDz!yrhaH~YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{nzBS#)P0P0y9;s5{u diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc index e5122eb127c157ab75bb9d2ac7ef8782d4e93a0e..3f1d73d2f091e916dc89ee9ffd473f7ccd260418 100644 GIT binary patch delta 96 zcmZoqv a04S56mzblUk(!f}U!Gr-lQNl)u^Rw`y&2^I diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py index 59930f45..86368145 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py @@ -10,4 +10,4 @@ del _api, _sys # type: ignore[name-defined] # noqa: F821 __all__ = ["SSLContext", "inject_into_ssl", "extract_from_ssl"] -__version__ = "0.8.0" +__version__ = "0.9.1" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc index 507fd0e961f81682e042c0f70a3f267c56215685..6f3c67cc241ed43f0f4fa8ffa1b69341193df97e 100644 GIT binary patch delta 106 zcmey%GL@C*G%qg~0}$9UGNy0jv1eqq)H9sy$C%>Ltsh#PT2!o`l9X7Unw6;UlAm0f zo0?ZrtnZpqnw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k_0G%qg~0}uq?|CY9q$DWbdLeF5bA7hF^v3_WAYEiL%c4ARto?cQ$Vo7GA jzDsIxc1eDLegRM>KQA#yKO;3KC%-(uC?{p|FUHvbIRYH$ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc index 861be182171de0906b74c451f2c4e212bf1d1a1a..7fea6006682b9426d357d110cd72a5fd98796acc 100644 GIT binary patch delta 2822 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 H;avX#HlsH} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc index b36ed366861372da984bb594137ebc46b18fe432..77524ae93c03d55e5ecae166b0d1736c29d519c6 100644 GIT binary patch delta 1387 zcmY*ZTTEPK5I%Emdv@2|<+88~?1kmN7uZsSfu8A804R+6Tm@Nn@H&@c5vQ8dK{fO`A3$(WoJfHoi1XG{)2i{QpC_^naLtzM1cv z`Dc=IKAnWS6JY~2ihhhpVcSl%p!X?KmjvR~rl`(?7UCyc4Eg!9N&wEY*7&5N zU_fEBnc17E?=v+RbIck&{It?6E-2M7XJA%&jwwxHgLPq@b-}1tWUiv)c(scZ`FQOT zUNi@6FSCua!*j%j17;`wVRpcN{KxzZ%;U1RP;wJdTlK7lcf?X693%&EKy+DOUDa|N z#q*X&@d?3oa#Nmow8=I0#@)Zp;JIC#T6&68%P#Y)`QBdDL;6%Ji5wPH?jDg z->bYLf(2*m+Hf&aj@Ejs-OOdhwH0ekxacbsBvr=onj%aD3(qVl_Az-AV;f`Ov0w|B za6ahDm&a_w?yO_ILMz)9{u!)-cE)tbm+6Dp8MEg&tpkCouT)!LJ3b#OgBVVS%JVXX zIeRu{u&B|x@Yj&5UQl^jIzUC;YnhEZQ}l>pH&ryk9@fyd(a@274!4ABVJ|M{7vkQa zV$0t&$cqmLDMvl*gM9}2J)GwVt#!%Sa|QijU5wayxjSv6VRSbff`~rSFbJr(R_e=9 zCvTadi8tBOefmn{4A3usrYR!dXy0?o--F*aRTlg$bLRXdW$R64>q7Gv)wh+H{-Eh9 zfCs;7cJnbFe{TL94(rn`Jpg0)%eG1OPioy)oX*k8=?pVRm>Ff}J^Z)zBl#qAC-B3z z59(O^G}};m7c(Ae9w;3{DRpF!Y)^kjA=`guQGfP{DS)GRtNoJxNykya*3vz$EODWm dT@K@NSy))upV>RkN>}Hyb-MxFr2W8I3hDwj`!$&;&@^;Dbp`1M#H~tq&&Zi+6@1HSs>2d(L;h z^PO|=oy>2i;PMn$el(kn3|$@f{^)n^J!2_=^{c*74o~w|7{?==Ol>yrz)v_4CUAvy zpo#YgPErwLv5A)p14Q4n#F`m_>!_`M*T{3L_8V;phBXK-GSVMbTDCuCqmbV3GJiF!|S1?9OY zlc&u0wdn*&_o@s|QA@=*ydlaEqIPpgPAU;xlyV;DMK7L~Hk+DpQu5%lk_~2ckxI&# zMP0;2s;J0A$<2~5-Es7{#7ul%g-$&1}!h zN-^nGOeECLD~>eZbNF%Wp|LZ~@9%jh*pV87gw@oS#_cg8H#;T1W-(Oq?V761;b z%ib$I&iITtU0y{$NbtGvLCA#rO3iq-JdafvjF#m=-=V@#b_{sqyBsl@jbsS zM>=61C>YM#x`X&m{Kj7g_4p{@5G>^C{x#O1MJ$NAC z&P;L&OO<3=(TpDlY)^1oD7P9~siF%GU{25n&(mSp6FFEBbYhoZ#RjV)sBnd5>IvqdF`d-@zn6%H=~K;(P8?ow0&|&Gh>>W z!sT5biW8bUi39cT!a4k_-eFv#0G*LZEva(DG{6{s@$~0qf!eDhD~$(l*R`+sJ0|z9 r@s3sAafdJaxx8vSDplKdk8pUm@jiQ!$8VcTjE!AxX3d?|73Tf{j~!)O diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc index fd1491ae17cb370a9d74b460315faefe97f64aac..ba19a1127ccbe9a9969c5e2f0382a20579205e8b 100644 GIT binary patch delta 162 zcmdlbctVipG%qg~0}$9UGNy0jIm7JHtsh#PT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8khxJ!`dG%qg~0}uq?|CY9q=M1w!v3_WAYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pI0!tEO>Evb>Tdpr$4B}d!7??T5CLd+dUfr(Y3gXIpl@^x;_i`<$kRIYOC-xL=AzzP)Kyo-&G2>@!pFJ=G$ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc index 850fcae4d0a6046f2eeb9afdf19377f20b7ec081..ccfb17f592534da224167e343e623a55402faefa 100644 GIT binary patch delta 99 zcmcb|@r{G$G%qg~0}$9UGNy0jF=XJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#mFXiR0L%0nP5=M^ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc index 3f9ead51ee77e86dd0587d2e1962092c1f9ee663..c38f2c72e476d2a65f6cee70e4e5cb249555a9d7 100644 GIT binary patch delta 1824 zcma)6ZA?>F7(VCTe$vuXTPU;^Y6~bWqXL#iog`=rL~#R!EG$`?uJ`IdXqS60B6vHD z+YghmDLZ~_(QNF8GY&F`o%?djTr$yY$%MFQ!&t)NZ<7w0F}h?sFZ3cYCfiBwbD#I) zJnwnWx#yl8ICs$Wb8c=9qGJojd+&rNOksWVTY(Od7sLSfO0=Kvjs`-BSYIz6m&8Dr z>x)IDu0%YrI~MKX1$RR%%JIDeftHp~fRaS0I~w1cXcZFOd`wEcq2Hc2^b?EFDI{Yt zU&2rbMmMwcUWptY%f=65j!CkTT8T;;g>fv$z%!POB~^N=%&9oWfkNnIA3{mBq*tJto#aq#WxlK>cBiXMCu?P0WO<>IcR4Rh zl6qN3UUa%cvOZ!{f|6fhvR)BP=E$hKQt>~2OUtyoikx;91=cH$q#<7ZpL1$pPI$wL zIrPYq20fCVReUny7+EE=a*oW%hH>>6JrNifNn4f}Js}mxl7`h~70dwRMJv|yluxG= z2|JTUa&)zQNHeZo?k`u)6{=|6&C8ld&V72_xbuJ1P+=q+Ip#3aj}EY%s2?9jowSpr z@pa?y{-w90A1gsB_+&Gsq{L;wI^uV2E*tc=^7I0U^j^8+33rSaq^><(^mg&0TS~b1 z^Fr620kX&SjEWV-9RtjqVSzu`*t z74CY&b?K(7eM;rXFgvh1IOixGZ5!Qnx{6$KuVaz3g3P(U$6hkJ#>0d#srNX|4;F$b z&wAVJpEmpFk)7OK<7v+@MoamutvX%kO&6|B7gnVUOVfoO;H824W?g>4g9RHZbl$et zPTOne5w?`49nMkPl&vhoQsZGpgDeFLPMY{AlW*4-JX)xs#aug@X;Ytuv`rfHW8JE- z7hUyQn^^X0ovpE+oiwa!EM_KM7owe?IRDW&){KlqUIvLL7Hm^br-02 z#@4!x{9&<@-)r}8e7x4h^&f}0wPSZfQ#i7-p?zC(q`k8>9C=}va1!)S1H2D8)ub(0 zM9ywFh`%Ijg1_Zogvi$bmjS*7xI`><-qtBfXLM0vuQc!)FV5(AL5RJ|$My-ZYcpDb z7a_2;b0=WhX8>OTdYnROaD6>|z3_MHUfqCdQzyp3w8eI+c%(SPf-#q8JJvB`$f&`fUsyrWdmBbx%4io& R9n$37(=XBkqOoWg)MX4@tppDJDw6{)iZfS3lnqA-$1cOHAq~iNW9? zizMQafnZN;U?4G+5C??xEZ<>0ahOAB8VNYb5eyAs5!J?ykf0JU{8E|?Pg2bz84H|% zi%<)Cwi2PFhHSVAU;LOywZy%i#?@DgN*vhmEhJ+*z9tPE*3lLN7zI}9jR90Nn?EH z|J0$r5dE#VFi`VQjY?1@jXWZCice<$tgMzf*&wTA<7G8Xlstk}^i;`?6L=W=(1Tl` zzIvr*YcE5hA0u{;-CI6I37X4V(GfI$cnHyi z(~-ML8NKKYwB+tae-ebK{_NEi@R#8ld zl=B?LX8N3G%wdVXD3Qbq;b;nb^ZdE8SukMOhQFZy(*a>a6_H z-@LeMQMlQBllGGq5->@LtA{~e1ye_Pg$@(ccSfU?>6 zf_t|s>7zbp03N_}i>}R#zIJbGHKFUK#x?_YL#JY%8$1SW;6R&8+A7kgeQg>%mA+N( z!T3D=r(%!s5~~;A0izB&!?rpZR{Qg_v?T+0H*;HfJwj^dNO!W z`yt3#`b#k6o(H+n71Ra57~nO)C0Z5g*ZvM8y-VK;m08z{DsrsU2aWvnhbTIzwB zrT++B!#l4+%@u$XFa=06RB+-?pf}=lsb+^}nb{tCx8^*aqSKFE!Qax3+7bLdyNI!S8Uy#&F!t>r<=R>J{9gda-cQ5|B!eVn!X8`ft+3Rm3k*l)eUJs2D5^G zRaZ!x>%VX;K+30p&jHr}A5mL_@4$CVuIMA;aWXs@lUDRGQH=J)qWvO_aYZM_BnWJb zl0w-BfKLE#0~P^ufF;0Z^kjqA2+weZ>x~mO<8*@$FVp1)C%%{dyJ1-U_dIZ0 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py index 829aff72..b1ea3b05 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py @@ -2,9 +2,10 @@ import platform import socket import ssl +import sys import typing -import _ssl # type: ignore[import] +import _ssl # type: ignore[import-not-found] from ._ssl_constants import ( _original_SSLContext, @@ -49,7 +50,7 @@ def extract_from_ssl() -> None: try: import pip._vendor.urllib3.util.ssl_ as urllib3_ssl - urllib3_ssl.SSLContext = _original_SSLContext + urllib3_ssl.SSLContext = _original_SSLContext # type: ignore[assignment] except ImportError: pass @@ -171,16 +172,13 @@ def cert_store_stats(self) -> dict[str, int]: @typing.overload def get_ca_certs( self, binary_form: typing.Literal[False] = ... - ) -> list[typing.Any]: - ... + ) -> list[typing.Any]: ... @typing.overload - def get_ca_certs(self, binary_form: typing.Literal[True] = ...) -> list[bytes]: - ... + def get_ca_certs(self, binary_form: typing.Literal[True] = ...) -> list[bytes]: ... @typing.overload - def get_ca_certs(self, binary_form: bool = ...) -> typing.Any: - ... + def get_ca_certs(self, binary_form: bool = ...) -> typing.Any: ... def get_ca_certs(self, binary_form: bool = False) -> list[typing.Any] | list[bytes]: raise NotImplementedError() @@ -276,6 +274,25 @@ def verify_mode(self, value: ssl.VerifyMode) -> None: ) +# Python 3.13+ makes get_unverified_chain() a public API that only returns DER +# encoded certificates. We detect whether we need to call public_bytes() for 3.10->3.12 +# Pre-3.13 returned None instead of an empty list from get_unverified_chain() +if sys.version_info >= (3, 13): + + def _get_unverified_chain_bytes(sslobj: ssl.SSLObject) -> list[bytes]: + unverified_chain = sslobj.get_unverified_chain() or () # type: ignore[attr-defined] + return [ + cert if isinstance(cert, bytes) else cert.public_bytes(_ssl.ENCODING_DER) + for cert in unverified_chain + ] + +else: + + def _get_unverified_chain_bytes(sslobj: ssl.SSLObject) -> list[bytes]: + unverified_chain = sslobj.get_unverified_chain() or () # type: ignore[attr-defined] + return [cert.public_bytes(_ssl.ENCODING_DER) for cert in unverified_chain] + + def _verify_peercerts( sock_or_sslobj: ssl.SSLSocket | ssl.SSLObject, server_hostname: str | None ) -> None: @@ -290,13 +307,7 @@ def _verify_peercerts( except AttributeError: pass - # SSLObject.get_unverified_chain() returns 'None' - # if the peer sends no certificates. This is common - # for the server-side scenario. - unverified_chain: typing.Sequence[_ssl.Certificate] = ( - sslobj.get_unverified_chain() or () # type: ignore[attr-defined] - ) - cert_bytes = [cert.public_bytes(_ssl.ENCODING_DER) for cert in unverified_chain] + cert_bytes = _get_unverified_chain_bytes(sslobj) _verify_peercerts_impl( sock_or_sslobj.context, cert_bytes, server_hostname=server_hostname ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py index 7dc440bf..b234ffec 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py @@ -96,9 +96,6 @@ def _load_cdll(name: str, macos10_16_path: str) -> CDLL: Security.SecTrustSetAnchorCertificatesOnly.argtypes = [SecTrustRef, Boolean] Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)] - Security.SecTrustEvaluate.restype = OSStatus - Security.SecPolicyCreateRevocation.argtypes = [CFOptionFlags] Security.SecPolicyCreateRevocation.restype = SecPolicyRef @@ -259,6 +256,7 @@ def _handle_osstatus(result: OSStatus, _: typing.Any, args: typing.Any) -> typin Security.SecTrustCreateWithCertificates.errcheck = _handle_osstatus # type: ignore[assignment] Security.SecTrustSetAnchorCertificates.errcheck = _handle_osstatus # type: ignore[assignment] +Security.SecTrustSetAnchorCertificatesOnly.errcheck = _handle_osstatus # type: ignore[assignment] Security.SecTrustGetTrustResult.errcheck = _handle_osstatus # type: ignore[assignment] @@ -417,21 +415,21 @@ def _verify_peercerts_impl( CoreFoundation.CFRelease(certs) # If there are additional trust anchors to load we need to transform - # the list of DER-encoded certificates into a CFArray. Otherwise - # pass 'None' to signal that we only want system / fetched certificates. + # the list of DER-encoded certificates into a CFArray. ctx_ca_certs_der: list[bytes] | None = ssl_context.get_ca_certs( binary_form=True ) if ctx_ca_certs_der: ctx_ca_certs = None try: - ctx_ca_certs = _der_certs_to_cf_cert_array(cert_chain) + ctx_ca_certs = _der_certs_to_cf_cert_array(ctx_ca_certs_der) Security.SecTrustSetAnchorCertificates(trust, ctx_ca_certs) finally: if ctx_ca_certs: CoreFoundation.CFRelease(ctx_ca_certs) - else: - Security.SecTrustSetAnchorCertificates(trust, None) + + # We always want system certificates. + Security.SecTrustSetAnchorCertificatesOnly(trust, False) cf_error = CoreFoundation.CFErrorRef() sec_trust_eval_result = Security.SecTrustEvaluateWithError( diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py index 3de4960a..3d00d467 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py @@ -325,6 +325,12 @@ def _verify_peercerts_impl( server_hostname: str | None = None, ) -> None: """Verify the cert_chain from the server using Windows APIs.""" + + # If the peer didn't send any certificates then + # we can't do verification. Raise an error. + if not cert_chain: + raise ssl.SSLCertVerificationError("Peer sent no certificates to verify") + pCertContext = None hIntermediateCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, None, 0, None) try: @@ -375,7 +381,7 @@ def _verify_peercerts_impl( server_hostname, chain_flags=chain_flags, ) - except ssl.SSLCertVerificationError: + except ssl.SSLCertVerificationError as e: # If that fails but custom CA certs have been added # to the SSLContext using load_verify_locations, # try verifying using a custom chain engine @@ -384,15 +390,19 @@ def _verify_peercerts_impl( binary_form=True ) if custom_ca_certs: - _verify_using_custom_ca_certs( - ssl_context, - custom_ca_certs, - hIntermediateCertStore, - pCertContext, - pChainPara, - server_hostname, - chain_flags=chain_flags, - ) + try: + _verify_using_custom_ca_certs( + ssl_context, + custom_ca_certs, + hIntermediateCertStore, + pCertContext, + pChainPara, + server_hostname, + chain_flags=chain_flags, + ) + # Raise the original error, not the new error. + except ssl.SSLCertVerificationError: + raise e from None else: raise finally: diff --git a/env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py b/env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py index 4f93acff..e429384e 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py @@ -1,6 +1,7 @@ import abc import collections import collections.abc +import contextlib import functools import inspect import operator @@ -60,6 +61,7 @@ 'clear_overloads', 'dataclass_transform', 'deprecated', + 'Doc', 'get_overloads', 'final', 'get_args', @@ -82,9 +84,11 @@ 'TypeAlias', 'TypeAliasType', 'TypeGuard', + 'TypeIs', 'TYPE_CHECKING', 'Never', 'NoReturn', + 'ReadOnly', 'Required', 'NotRequired', @@ -113,6 +117,7 @@ 'MutableMapping', 'MutableSequence', 'MutableSet', + 'NoDefault', 'Optional', 'Pattern', 'Reversible', @@ -131,6 +136,7 @@ # for backward compatibility PEP_560 = True GenericMeta = type +_PEP_696_IMPLEMENTED = sys.version_info >= (3, 13, 0, "beta") # The functions below are modified copies of typing internal helpers. # They are needed by _ProtocolMeta and they provide support for PEP 646. @@ -144,27 +150,6 @@ def __repr__(self): _marker = _Sentinel() -def _check_generic(cls, parameters, elen=_marker): - """Check correct count for parameters of a generic cls (internal helper). - This gives a nice error message in case of count mismatch. - """ - if not elen: - raise TypeError(f"{cls} is not a generic class") - if elen is _marker: - if not hasattr(cls, "__parameters__") or not cls.__parameters__: - raise TypeError(f"{cls} is not a generic class") - elen = len(cls.__parameters__) - alen = len(parameters) - if alen != elen: - if hasattr(cls, "__parameters__"): - parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] - num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) - if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): - return - raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" - f" actual {alen}, expected {elen}") - - if sys.version_info >= (3, 10): def _should_collect_from_parameters(t): return isinstance( @@ -178,27 +163,6 @@ def _should_collect_from_parameters(t): return isinstance(t, typing._GenericAlias) and not t._special -def _collect_type_vars(types, typevar_types=None): - """Collect all type variable contained in types in order of - first appearance (lexicographic order). For example:: - - _collect_type_vars((T, List[S, T])) == (T, S) - """ - if typevar_types is None: - typevar_types = typing.TypeVar - tvars = [] - for t in types: - if ( - isinstance(t, typevar_types) and - t not in tvars and - not _is_unpack(t) - ): - tvars.append(t) - if _should_collect_from_parameters(t): - tvars.extend([t for t in t.__parameters__ if t not in tvars]) - return tuple(tvars) - - NoReturn = typing.NoReturn # Some unconstrained type variables. These are used by the container types. @@ -248,32 +212,7 @@ def __repr__(self): return 'typing_extensions.' + self._name -# On older versions of typing there is an internal class named "Final". -# 3.8+ -if hasattr(typing, 'Final') and sys.version_info[:2] >= (3, 7): - Final = typing.Final -# 3.7 -else: - class _FinalForm(_ExtensionsSpecialForm, _root=True): - def __getitem__(self, parameters): - item = typing._type_check(parameters, - f'{self._name} accepts only a single type.') - return typing._GenericAlias(self, (item,)) - - Final = _FinalForm('Final', - doc="""A special typing construct to indicate that a name - cannot be re-assigned or overridden in a subclass. - For example: - - MAX_SIZE: Final = 9000 - MAX_SIZE += 1 # Error reported by type checker - - class Connection: - TIMEOUT: Final[int] = 10 - class FastConnector(Connection): - TIMEOUT = 1 # Error reported by type checker - - There is no runtime checking of these properties.""") +Final = typing.Final if sys.version_info >= (3, 11): final = typing.final @@ -465,31 +404,101 @@ def clear_overloads(): # Various ABCs mimicking those in collections.abc. # A few are simply re-exported for completeness. - - Awaitable = typing.Awaitable Coroutine = typing.Coroutine AsyncIterable = typing.AsyncIterable AsyncIterator = typing.AsyncIterator Deque = typing.Deque -ContextManager = typing.ContextManager -AsyncContextManager = typing.AsyncContextManager DefaultDict = typing.DefaultDict - -# 3.7.2+ -if hasattr(typing, 'OrderedDict'): - OrderedDict = typing.OrderedDict -# 3.7.0-3.7.2 -else: - OrderedDict = typing._alias(collections.OrderedDict, (KT, VT)) - +OrderedDict = typing.OrderedDict Counter = typing.Counter ChainMap = typing.ChainMap -AsyncGenerator = typing.AsyncGenerator Text = typing.Text TYPE_CHECKING = typing.TYPE_CHECKING +if sys.version_info >= (3, 13, 0, "beta"): + from typing import AsyncContextManager, AsyncGenerator, ContextManager, Generator +else: + def _is_dunder(attr): + return attr.startswith('__') and attr.endswith('__') + + # Python <3.9 doesn't have typing._SpecialGenericAlias + _special_generic_alias_base = getattr( + typing, "_SpecialGenericAlias", typing._GenericAlias + ) + + class _SpecialGenericAlias(_special_generic_alias_base, _root=True): + def __init__(self, origin, nparams, *, inst=True, name=None, defaults=()): + if _special_generic_alias_base is typing._GenericAlias: + # Python <3.9 + self.__origin__ = origin + self._nparams = nparams + super().__init__(origin, nparams, special=True, inst=inst, name=name) + else: + # Python >= 3.9 + super().__init__(origin, nparams, inst=inst, name=name) + self._defaults = defaults + + def __setattr__(self, attr, val): + allowed_attrs = {'_name', '_inst', '_nparams', '_defaults'} + if _special_generic_alias_base is typing._GenericAlias: + # Python <3.9 + allowed_attrs.add("__origin__") + if _is_dunder(attr) or attr in allowed_attrs: + object.__setattr__(self, attr, val) + else: + setattr(self.__origin__, attr, val) + + @typing._tp_cache + def __getitem__(self, params): + if not isinstance(params, tuple): + params = (params,) + msg = "Parameters to generic types must be types." + params = tuple(typing._type_check(p, msg) for p in params) + if ( + self._defaults + and len(params) < self._nparams + and len(params) + len(self._defaults) >= self._nparams + ): + params = (*params, *self._defaults[len(params) - self._nparams:]) + actual_len = len(params) + + if actual_len != self._nparams: + if self._defaults: + expected = f"at least {self._nparams - len(self._defaults)}" + else: + expected = str(self._nparams) + if not self._nparams: + raise TypeError(f"{self} is not a generic class") + raise TypeError( + f"Too {'many' if actual_len > self._nparams else 'few'}" + f" arguments for {self};" + f" actual {actual_len}, expected {expected}" + ) + return self.copy_with(params) + + _NoneType = type(None) + Generator = _SpecialGenericAlias( + collections.abc.Generator, 3, defaults=(_NoneType, _NoneType) + ) + AsyncGenerator = _SpecialGenericAlias( + collections.abc.AsyncGenerator, 2, defaults=(_NoneType,) + ) + ContextManager = _SpecialGenericAlias( + contextlib.AbstractContextManager, + 2, + name="ContextManager", + defaults=(typing.Optional[bool],) + ) + AsyncContextManager = _SpecialGenericAlias( + contextlib.AbstractAsyncContextManager, + 2, + name="AsyncContextManager", + defaults=(typing.Optional[bool],) + ) + + _PROTO_ALLOWLIST = { 'collections.abc': [ 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable', @@ -500,28 +509,11 @@ def clear_overloads(): } -_EXCLUDED_ATTRS = { - "__abstractmethods__", "__annotations__", "__weakref__", "_is_protocol", - "_is_runtime_protocol", "__dict__", "__slots__", "__parameters__", - "__orig_bases__", "__module__", "_MutableMapping__marker", "__doc__", - "__subclasshook__", "__orig_class__", "__init__", "__new__", - "__protocol_attrs__", "__callable_proto_members_only__", +_EXCLUDED_ATTRS = frozenset(typing.EXCLUDED_ATTRIBUTES) | { + "__match_args__", "__protocol_attrs__", "__non_callable_proto_members__", + "__final__", } -if sys.version_info < (3, 8): - _EXCLUDED_ATTRS |= { - "_gorg", "__next_in_mro__", "__extra__", "__tree_hash__", "__args__", - "__origin__" - } - -if sys.version_info >= (3, 9): - _EXCLUDED_ATTRS.add("__class_getitem__") - -if sys.version_info >= (3, 12): - _EXCLUDED_ATTRS.add("__type_params__") - -_EXCLUDED_ATTRS = frozenset(_EXCLUDED_ATTRS) - def _get_protocol_attrs(cls): attrs = set() @@ -535,46 +527,6 @@ def _get_protocol_attrs(cls): return attrs -def _maybe_adjust_parameters(cls): - """Helper function used in Protocol.__init_subclass__ and _TypedDictMeta.__new__. - - The contents of this function are very similar - to logic found in typing.Generic.__init_subclass__ - on the CPython main branch. - """ - tvars = [] - if '__orig_bases__' in cls.__dict__: - tvars = _collect_type_vars(cls.__orig_bases__) - # Look for Generic[T1, ..., Tn] or Protocol[T1, ..., Tn]. - # If found, tvars must be a subset of it. - # If not found, tvars is it. - # Also check for and reject plain Generic, - # and reject multiple Generic[...] and/or Protocol[...]. - gvars = None - for base in cls.__orig_bases__: - if (isinstance(base, typing._GenericAlias) and - base.__origin__ in (typing.Generic, Protocol)): - # for error messages - the_base = base.__origin__.__name__ - if gvars is not None: - raise TypeError( - "Cannot inherit from Generic[...]" - " and/or Protocol[...] multiple types.") - gvars = base.__parameters__ - if gvars is None: - gvars = tvars - else: - tvarset = set(tvars) - gvarset = set(gvars) - if not tvarset <= gvarset: - s_vars = ', '.join(str(t) for t in tvars if t not in gvarset) - s_args = ', '.join(str(g) for g in gvars) - raise TypeError(f"Some type variables ({s_vars}) are" - f" not listed in {the_base}[{s_args}]") - tvars = gvars - cls.__parameters__ = tuple(tvars) - - def _caller(depth=2): try: return sys._getframe(depth).f_globals.get('__name__', '__main__') @@ -582,9 +534,9 @@ def _caller(depth=2): return None -# The performance of runtime-checkable protocols is significantly improved on Python 3.12, -# so we backport the 3.12 version of Protocol to Python <=3.11 -if sys.version_info >= (3, 12): +# `__match_args__` attribute was removed from protocol members in 3.13, +# we want to backport this change to older Python versions. +if sys.version_info >= (3, 13): Protocol = typing.Protocol else: def _allow_reckless_class_checks(depth=3): @@ -598,17 +550,26 @@ def _no_init(self, *args, **kwargs): if type(self)._is_protocol: raise TypeError('Protocols cannot be instantiated') - if sys.version_info >= (3, 8): - # Inheriting from typing._ProtocolMeta isn't actually desirable, - # but is necessary to allow typing.Protocol and typing_extensions.Protocol - # to mix without getting TypeErrors about "metaclass conflict" - _typing_Protocol = typing.Protocol - _ProtocolMetaBase = type(_typing_Protocol) - else: - _typing_Protocol = _marker - _ProtocolMetaBase = abc.ABCMeta + def _type_check_issubclass_arg_1(arg): + """Raise TypeError if `arg` is not an instance of `type` + in `issubclass(arg, )`. - class _ProtocolMeta(_ProtocolMetaBase): + In most cases, this is verified by type.__subclasscheck__. + Checking it again unnecessarily would slow down issubclass() checks, + so, we don't perform this check unless we absolutely have to. + + For various error paths, however, + we want to ensure that *this* error message is shown to the user + where relevant, rather than a typing.py-specific error message. + """ + if not isinstance(arg, type): + # Same error message as for issubclass(1, int). + raise TypeError('issubclass() arg 1 must be a class') + + # Inheriting from typing._ProtocolMeta isn't actually desirable, + # but is necessary to allow typing.Protocol and typing_extensions.Protocol + # to mix without getting TypeErrors about "metaclass conflict" + class _ProtocolMeta(type(typing.Protocol)): # This metaclass is somewhat unfortunate, # but is necessary for several reasons... # @@ -618,10 +579,10 @@ class _ProtocolMeta(_ProtocolMetaBase): def __new__(mcls, name, bases, namespace, **kwargs): if name == "Protocol" and len(bases) < 2: pass - elif {Protocol, _typing_Protocol} & set(bases): + elif {Protocol, typing.Protocol} & set(bases): for base in bases: if not ( - base in {object, typing.Generic, Protocol, _typing_Protocol} + base in {object, typing.Generic, Protocol, typing.Protocol} or base.__name__ in _PROTO_ALLOWLIST.get(base.__module__, []) or is_protocol(base) ): @@ -635,11 +596,6 @@ def __init__(cls, *args, **kwargs): abc.ABCMeta.__init__(cls, *args, **kwargs) if getattr(cls, "_is_protocol", False): cls.__protocol_attrs__ = _get_protocol_attrs(cls) - # PEP 544 prohibits using issubclass() - # with protocols that have non-method members. - cls.__callable_proto_members_only__ = all( - callable(getattr(cls, attr, None)) for attr in cls.__protocol_attrs__ - ) def __subclasscheck__(cls, other): if cls is Protocol: @@ -648,21 +604,23 @@ def __subclasscheck__(cls, other): getattr(cls, '_is_protocol', False) and not _allow_reckless_class_checks() ): - if not isinstance(other, type): - # Same error message as for issubclass(1, int). - raise TypeError('issubclass() arg 1 must be a class') - if ( - not cls.__callable_proto_members_only__ - and cls.__dict__.get("__subclasshook__") is _proto_hook - ): - raise TypeError( - "Protocols with non-method members don't support issubclass()" - ) if not getattr(cls, '_is_runtime_protocol', False): + _type_check_issubclass_arg_1(other) raise TypeError( "Instance and class checks can only be used with " "@runtime_checkable protocols" ) + if ( + # this attribute is set by @runtime_checkable: + cls.__non_callable_proto_members__ + and cls.__dict__.get("__subclasshook__") is _proto_hook + ): + _type_check_issubclass_arg_1(other) + non_method_attrs = sorted(cls.__non_callable_proto_members__) + raise TypeError( + "Protocols with non-method members don't support issubclass()." + f" Non-method members: {str(non_method_attrs)[1:-1]}." + ) return abc.ABCMeta.__subclasscheck__(cls, other) def __instancecheck__(cls, instance): @@ -689,7 +647,8 @@ def __instancecheck__(cls, instance): val = inspect.getattr_static(instance, attr) except AttributeError: break - if val is None and callable(getattr(cls, attr, None)): + # this attribute is set by @runtime_checkable: + if val is None and attr not in cls.__non_callable_proto_members__: break else: return True @@ -699,12 +658,10 @@ def __instancecheck__(cls, instance): def __eq__(cls, other): # Hack so that typing.Generic.__class_getitem__ # treats typing_extensions.Protocol - # as equivalent to typing.Protocol on Python 3.8+ + # as equivalent to typing.Protocol if abc.ABCMeta.__eq__(cls, other) is True: return True - return ( - cls is Protocol and other is getattr(typing, "Protocol", object()) - ) + return cls is Protocol and other is typing.Protocol # This has to be defined, or the abc-module cache # complains about classes with this metaclass being unhashable, @@ -737,146 +694,88 @@ def _proto_hook(cls, other): return NotImplemented return True - if sys.version_info >= (3, 8): - class Protocol(typing.Generic, metaclass=_ProtocolMeta): - __doc__ = typing.Protocol.__doc__ - __slots__ = () - _is_protocol = True - _is_runtime_protocol = False - - def __init_subclass__(cls, *args, **kwargs): - super().__init_subclass__(*args, **kwargs) + class Protocol(typing.Generic, metaclass=_ProtocolMeta): + __doc__ = typing.Protocol.__doc__ + __slots__ = () + _is_protocol = True + _is_runtime_protocol = False - # Determine if this is a protocol or a concrete subclass. - if not cls.__dict__.get('_is_protocol', False): - cls._is_protocol = any(b is Protocol for b in cls.__bases__) + def __init_subclass__(cls, *args, **kwargs): + super().__init_subclass__(*args, **kwargs) - # Set (or override) the protocol subclass hook. - if '__subclasshook__' not in cls.__dict__: - cls.__subclasshook__ = _proto_hook + # Determine if this is a protocol or a concrete subclass. + if not cls.__dict__.get('_is_protocol', False): + cls._is_protocol = any(b is Protocol for b in cls.__bases__) - # Prohibit instantiation for protocol classes - if cls._is_protocol and cls.__init__ is Protocol.__init__: - cls.__init__ = _no_init + # Set (or override) the protocol subclass hook. + if '__subclasshook__' not in cls.__dict__: + cls.__subclasshook__ = _proto_hook - else: - class Protocol(metaclass=_ProtocolMeta): - # There is quite a lot of overlapping code with typing.Generic. - # Unfortunately it is hard to avoid this on Python <3.8, - # as the typing module on Python 3.7 doesn't let us subclass typing.Generic! - """Base class for protocol classes. Protocol classes are defined as:: + # Prohibit instantiation for protocol classes + if cls._is_protocol and cls.__init__ is Protocol.__init__: + cls.__init__ = _no_init - class Proto(Protocol): - def meth(self) -> int: - ... - Such classes are primarily used with static type checkers that recognize - structural subtyping (static duck-typing), for example:: +if sys.version_info >= (3, 13): + runtime_checkable = typing.runtime_checkable +else: + def runtime_checkable(cls): + """Mark a protocol class as a runtime protocol. - class C: - def meth(self) -> int: - return 0 + Such protocol can be used with isinstance() and issubclass(). + Raise TypeError if applied to a non-protocol class. + This allows a simple-minded structural check very similar to + one trick ponies in collections.abc such as Iterable. - def func(x: Proto) -> int: - return x.meth() + For example:: - func(C()) # Passes static type check + @runtime_checkable + class Closable(Protocol): + def close(self): ... - See PEP 544 for details. Protocol classes decorated with - @typing_extensions.runtime_checkable act - as simple-minded runtime-checkable protocols that check - only the presence of given attributes, ignoring their type signatures. + assert isinstance(open('/some/file'), Closable) - Protocol classes can be generic, they are defined as:: + Warning: this will check only the presence of the required methods, + not their type signatures! + """ + if not issubclass(cls, typing.Generic) or not getattr(cls, '_is_protocol', False): + raise TypeError(f'@runtime_checkable can be only applied to protocol classes,' + f' got {cls!r}') + cls._is_runtime_protocol = True - class GenProto(Protocol[T]): - def meth(self) -> T: - ... - """ - __slots__ = () - _is_protocol = True - _is_runtime_protocol = False - - def __new__(cls, *args, **kwds): - if cls is Protocol: - raise TypeError("Type Protocol cannot be instantiated; " - "it can only be used as a base class") - return super().__new__(cls) - - @typing._tp_cache - def __class_getitem__(cls, params): - if not isinstance(params, tuple): - params = (params,) - if not params and cls is not typing.Tuple: + # typing.Protocol classes on <=3.11 break if we execute this block, + # because typing.Protocol classes on <=3.11 don't have a + # `__protocol_attrs__` attribute, and this block relies on the + # `__protocol_attrs__` attribute. Meanwhile, typing.Protocol classes on 3.12.2+ + # break if we *don't* execute this block, because *they* assume that all + # protocol classes have a `__non_callable_proto_members__` attribute + # (which this block sets) + if isinstance(cls, _ProtocolMeta) or sys.version_info >= (3, 12, 2): + # PEP 544 prohibits using issubclass() + # with protocols that have non-method members. + # See gh-113320 for why we compute this attribute here, + # rather than in `_ProtocolMeta.__init__` + cls.__non_callable_proto_members__ = set() + for attr in cls.__protocol_attrs__: + try: + is_callable = callable(getattr(cls, attr, None)) + except Exception as e: raise TypeError( - f"Parameter list to {cls.__qualname__}[...] cannot be empty") - msg = "Parameters to generic types must be types." - params = tuple(typing._type_check(p, msg) for p in params) - if cls is Protocol: - # Generic can only be subscripted with unique type variables. - if not all(isinstance(p, typing.TypeVar) for p in params): - i = 0 - while isinstance(params[i], typing.TypeVar): - i += 1 - raise TypeError( - "Parameters to Protocol[...] must all be type variables." - f" Parameter {i + 1} is {params[i]}") - if len(set(params)) != len(params): - raise TypeError( - "Parameters to Protocol[...] must all be unique") + f"Failed to determine whether protocol member {attr!r} " + "is a method member" + ) from e else: - # Subscripting a regular Generic subclass. - _check_generic(cls, params, len(cls.__parameters__)) - return typing._GenericAlias(cls, params) - - def __init_subclass__(cls, *args, **kwargs): - if '__orig_bases__' in cls.__dict__: - error = typing.Generic in cls.__orig_bases__ - else: - error = typing.Generic in cls.__bases__ - if error: - raise TypeError("Cannot inherit from plain Generic") - _maybe_adjust_parameters(cls) - - # Determine if this is a protocol or a concrete subclass. - if not cls.__dict__.get('_is_protocol', None): - cls._is_protocol = any(b is Protocol for b in cls.__bases__) + if not is_callable: + cls.__non_callable_proto_members__.add(attr) - # Set (or override) the protocol subclass hook. - if '__subclasshook__' not in cls.__dict__: - cls.__subclasshook__ = _proto_hook - - # Prohibit instantiation for protocol classes - if cls._is_protocol and cls.__init__ is Protocol.__init__: - cls.__init__ = _no_init - - -if sys.version_info >= (3, 8): - runtime_checkable = typing.runtime_checkable -else: - def runtime_checkable(cls): - """Mark a protocol class as a runtime protocol, so that it - can be used with isinstance() and issubclass(). Raise TypeError - if applied to a non-protocol class. - - This allows a simple-minded structural check very similar to the - one-offs in collections.abc such as Hashable. - """ - if not ( - (isinstance(cls, _ProtocolMeta) or issubclass(cls, typing.Generic)) - and getattr(cls, "_is_protocol", False) - ): - raise TypeError('@runtime_checkable can be only applied to protocol classes,' - f' got {cls!r}') - cls._is_runtime_protocol = True return cls -# Exists for backwards compatibility. +# The "runtime" alias exists for backwards compatibility. runtime = runtime_checkable -# Our version of runtime-checkable protocols is faster on Python 3.7-3.11 +# Our version of runtime-checkable protocols is faster on Python 3.8-3.11 if sys.version_info >= (3, 12): SupportsInt = typing.SupportsInt SupportsFloat = typing.SupportsFloat @@ -968,7 +867,11 @@ def inner(func): return inner -if sys.version_info >= (3, 13): +# Update this to something like >=3.13.0b1 if and when +# PEP 728 is implemented in CPython +_PEP_728_IMPLEMENTED = False + +if _PEP_728_IMPLEMENTED: # The standard library TypedDict in Python 3.8 does not store runtime information # about which (if any) keys are optional. See https://bugs.python.org/issue38834 # The standard library TypedDict in Python 3.9.0/1 does not honour the "total" @@ -979,6 +882,8 @@ def inner(func): # Aaaand on 3.12 we add __orig_bases__ to TypedDict # to enable better runtime introspection. # On 3.13 we deprecate some odd ways of creating TypedDicts. + # Also on 3.13, PEP 705 adds the ReadOnly[] qualifier. + # PEP 728 (still pending) makes more changes. TypedDict = typing.TypedDict _TypedDictMeta = typing._TypedDictMeta is_typeddict = typing.is_typeddict @@ -986,13 +891,29 @@ def inner(func): # 3.10.0 and later _TAKES_MODULE = "module" in inspect.signature(typing._type_check).parameters - if sys.version_info >= (3, 8): - _fake_name = "Protocol" - else: - _fake_name = "_Protocol" + def _get_typeddict_qualifiers(annotation_type): + while True: + annotation_origin = get_origin(annotation_type) + if annotation_origin is Annotated: + annotation_args = get_args(annotation_type) + if annotation_args: + annotation_type = annotation_args[0] + else: + break + elif annotation_origin is Required: + yield Required + annotation_type, = get_args(annotation_type) + elif annotation_origin is NotRequired: + yield NotRequired + annotation_type, = get_args(annotation_type) + elif annotation_origin is ReadOnly: + yield ReadOnly + annotation_type, = get_args(annotation_type) + else: + break class _TypedDictMeta(type): - def __new__(cls, name, bases, ns, total=True): + def __new__(cls, name, bases, ns, *, total=True, closed=False): """Create new typed dict class object. This method is called when TypedDict is subclassed, @@ -1011,17 +932,23 @@ def __new__(cls, name, bases, ns, total=True): generic_base = () # typing.py generally doesn't let you inherit from plain Generic, unless - # the name of the class happens to be "Protocol" (or "_Protocol" on 3.7). - tp_dict = type.__new__(_TypedDictMeta, _fake_name, (*generic_base, dict), ns) + # the name of the class happens to be "Protocol" + tp_dict = type.__new__(_TypedDictMeta, "Protocol", (*generic_base, dict), ns) tp_dict.__name__ = name - if tp_dict.__qualname__ == _fake_name: + if tp_dict.__qualname__ == "Protocol": tp_dict.__qualname__ = name if not hasattr(tp_dict, '__orig_bases__'): tp_dict.__orig_bases__ = bases annotations = {} - own_annotations = ns.get('__annotations__', {}) + if "__annotations__" in ns: + own_annotations = ns["__annotations__"] + elif "__annotate__" in ns: + # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated + own_annotations = ns["__annotate__"](1) + else: + own_annotations = {} msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" if _TAKES_MODULE: own_annotations = { @@ -1035,35 +962,67 @@ def __new__(cls, name, bases, ns, total=True): } required_keys = set() optional_keys = set() + readonly_keys = set() + mutable_keys = set() + extra_items_type = None for base in bases: - annotations.update(base.__dict__.get('__annotations__', {})) - required_keys.update(base.__dict__.get('__required_keys__', ())) - optional_keys.update(base.__dict__.get('__optional_keys__', ())) + base_dict = base.__dict__ + + annotations.update(base_dict.get('__annotations__', {})) + required_keys.update(base_dict.get('__required_keys__', ())) + optional_keys.update(base_dict.get('__optional_keys__', ())) + readonly_keys.update(base_dict.get('__readonly_keys__', ())) + mutable_keys.update(base_dict.get('__mutable_keys__', ())) + base_extra_items_type = base_dict.get('__extra_items__', None) + if base_extra_items_type is not None: + extra_items_type = base_extra_items_type + + if closed and extra_items_type is None: + extra_items_type = Never + if closed and "__extra_items__" in own_annotations: + annotation_type = own_annotations.pop("__extra_items__") + qualifiers = set(_get_typeddict_qualifiers(annotation_type)) + if Required in qualifiers: + raise TypeError( + "Special key __extra_items__ does not support " + "Required" + ) + if NotRequired in qualifiers: + raise TypeError( + "Special key __extra_items__ does not support " + "NotRequired" + ) + extra_items_type = annotation_type annotations.update(own_annotations) for annotation_key, annotation_type in own_annotations.items(): - annotation_origin = get_origin(annotation_type) - if annotation_origin is Annotated: - annotation_args = get_args(annotation_type) - if annotation_args: - annotation_type = annotation_args[0] - annotation_origin = get_origin(annotation_type) - - if annotation_origin is Required: + qualifiers = set(_get_typeddict_qualifiers(annotation_type)) + + if Required in qualifiers: required_keys.add(annotation_key) - elif annotation_origin is NotRequired: + elif NotRequired in qualifiers: optional_keys.add(annotation_key) elif total: required_keys.add(annotation_key) else: optional_keys.add(annotation_key) + if ReadOnly in qualifiers: + mutable_keys.discard(annotation_key) + readonly_keys.add(annotation_key) + else: + mutable_keys.add(annotation_key) + readonly_keys.discard(annotation_key) tp_dict.__annotations__ = annotations tp_dict.__required_keys__ = frozenset(required_keys) tp_dict.__optional_keys__ = frozenset(optional_keys) + tp_dict.__readonly_keys__ = frozenset(readonly_keys) + tp_dict.__mutable_keys__ = frozenset(mutable_keys) if not hasattr(tp_dict, '__total__'): tp_dict.__total__ = total + tp_dict.__closed__ = closed + tp_dict.__extra_items__ = extra_items_type return tp_dict __call__ = dict # static method @@ -1077,7 +1036,7 @@ def __subclasscheck__(cls, other): _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) @_ensure_subclassable(lambda bases: (_TypedDict,)) - def TypedDict(__typename, __fields=_marker, *, total=True, **kwargs): + def TypedDict(typename, fields=_marker, /, *, total=True, closed=False, **kwargs): """A simple typed namespace. At runtime it is equivalent to a plain dict. TypedDict creates a dictionary type such that a type checker will expect all @@ -1124,24 +1083,29 @@ class Point2D(TypedDict): See PEP 655 for more details on Required and NotRequired. """ - if __fields is _marker or __fields is None: - if __fields is _marker: + if fields is _marker or fields is None: + if fields is _marker: deprecated_thing = "Failing to pass a value for the 'fields' parameter" else: deprecated_thing = "Passing `None` as the 'fields' parameter" - example = f"`{__typename} = TypedDict({__typename!r}, {{}})`" + example = f"`{typename} = TypedDict({typename!r}, {{}})`" deprecation_msg = ( f"{deprecated_thing} is deprecated and will be disallowed in " "Python 3.15. To create a TypedDict class with 0 fields " "using the functional syntax, pass an empty dictionary, e.g. " ) + example + "." warnings.warn(deprecation_msg, DeprecationWarning, stacklevel=2) - __fields = kwargs + if closed is not False and closed is not True: + kwargs["closed"] = closed + closed = False + fields = kwargs elif kwargs: raise TypeError("TypedDict takes either a dict or keyword arguments," " but not both") if kwargs: + if sys.version_info >= (3, 13): + raise TypeError("TypedDict takes no keyword arguments") warnings.warn( "The kwargs-based syntax for TypedDict definitions is deprecated " "in Python 3.11, will be removed in Python 3.13, and may not be " @@ -1150,13 +1114,13 @@ class Point2D(TypedDict): stacklevel=2, ) - ns = {'__annotations__': dict(__fields)} + ns = {'__annotations__': dict(fields)} module = _caller() if module is not None: # Setting correct module is necessary to make typed dict classes pickleable. ns['__module__'] = module - td = _TypedDictMeta(__typename, (), ns, total=total) + td = _TypedDictMeta(typename, (), ns, total=total, closed=closed) td.__orig_bases__ = (TypedDict,) return td @@ -1186,7 +1150,7 @@ class Film(TypedDict): assert_type = typing.assert_type else: - def assert_type(__val, __typ): + def assert_type(val, typ, /): """Assert (to the type checker) that the value is of the given type. When the type checker encounters a call to assert_type(), it @@ -1199,18 +1163,18 @@ def greet(name: str) -> None: At runtime this returns the first argument unchanged and otherwise does nothing. """ - return __val + return val -if hasattr(typing, "Required"): +if hasattr(typing, "ReadOnly"): # 3.13+ get_type_hints = typing.get_type_hints -else: +else: # <=3.13 # replaces _strip_annotations() def _strip_extras(t): """Strips Annotated, Required and NotRequired from a given type.""" if isinstance(t, _AnnotatedAlias): return _strip_extras(t.__origin__) - if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired): + if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired, ReadOnly): return _strip_extras(t.__args__[0]) if isinstance(t, typing._GenericAlias): stripped_args = tuple(_strip_extras(a) for a in t.__args__) @@ -1262,11 +1226,11 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False): - If two dict arguments are passed, they specify globals and locals, respectively. """ - if hasattr(typing, "Annotated"): + if hasattr(typing, "Annotated"): # 3.9+ hint = typing.get_type_hints( obj, globalns=globalns, localns=localns, include_extras=True ) - else: + else: # 3.8 hint = typing.get_type_hints(obj, globalns=globalns, localns=localns) if include_extras: return hint @@ -1279,7 +1243,7 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False): # Not exported and not a public API, but needed for get_origin() and get_args() # to work. _AnnotatedAlias = typing._AnnotatedAlias -# 3.7-3.8 +# 3.8 else: class _AnnotatedAlias(typing._GenericAlias, _root=True): """Runtime representation of an annotated type. @@ -1307,7 +1271,7 @@ def __repr__(self): def __reduce__(self): return operator.getitem, ( - Annotated, (self.__origin__,) + self.__metadata__ + Annotated, (self.__origin__, *self.__metadata__) ) def __eq__(self, other): @@ -1384,7 +1348,7 @@ def __init_subclass__(cls, *args, **kwargs): if sys.version_info[:2] >= (3, 10): get_origin = typing.get_origin get_args = typing.get_args -# 3.7-3.9 +# 3.8-3.9 else: try: # 3.9+ @@ -1433,7 +1397,7 @@ def get_args(tp): get_args(Callable[[], T][int]) == ([], int) """ if isinstance(tp, _AnnotatedAlias): - return (tp.__origin__,) + tp.__metadata__ + return (tp.__origin__, *tp.__metadata__) if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias)): if getattr(tp, "_special", False): return () @@ -1462,7 +1426,7 @@ def TypeAlias(self, parameters): It's invalid when used anywhere except as in the example above. """ raise TypeError(f"{self} is not subscriptable") -# 3.7-3.8 +# 3.8 else: TypeAlias = _ExtensionsSpecialForm( 'TypeAlias', @@ -1479,14 +1443,37 @@ def TypeAlias(self, parameters): ) +if hasattr(typing, "NoDefault"): + NoDefault = typing.NoDefault +else: + class NoDefaultTypeMeta(type): + def __setattr__(cls, attr, value): + # TypeError is consistent with the behavior of NoneType + raise TypeError( + f"cannot set {attr!r} attribute of immutable type {cls.__name__!r}" + ) + + class NoDefaultType(metaclass=NoDefaultTypeMeta): + """The type of the NoDefault singleton.""" + + __slots__ = () + + def __new__(cls): + return globals().get("NoDefault") or object.__new__(cls) + + def __repr__(self): + return "typing_extensions.NoDefault" + + def __reduce__(self): + return "NoDefault" + + NoDefault = NoDefaultType() + del NoDefaultType, NoDefaultTypeMeta + + def _set_default(type_param, default): - if isinstance(default, (tuple, list)): - type_param.__default__ = tuple((typing._type_check(d, "Default must be a type") - for d in default)) - elif default != _marker: - type_param.__default__ = typing._type_check(default, "Default must be a type") - else: - type_param.__default__ = None + type_param.has_default = lambda: default is not NoDefault + type_param.__default__ = default def _set_module(typevarlike): @@ -1509,39 +1496,53 @@ def __instancecheck__(cls, __instance: Any) -> bool: return isinstance(__instance, cls._backported_typevarlike) -# Add default and infer_variance parameters from PEP 696 and 695 -class TypeVar(metaclass=_TypeVarLikeMeta): - """Type variable.""" +if _PEP_696_IMPLEMENTED: + from typing import TypeVar +else: + # Add default and infer_variance parameters from PEP 696 and 695 + class TypeVar(metaclass=_TypeVarLikeMeta): + """Type variable.""" - _backported_typevarlike = typing.TypeVar + _backported_typevarlike = typing.TypeVar - def __new__(cls, name, *constraints, bound=None, - covariant=False, contravariant=False, - default=_marker, infer_variance=False): - if hasattr(typing, "TypeAliasType"): - # PEP 695 implemented, can pass infer_variance to typing.TypeVar - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant, - infer_variance=infer_variance) - else: - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant) - if infer_variance and (covariant or contravariant): - raise ValueError("Variance cannot be specified with infer_variance.") - typevar.__infer_variance__ = infer_variance - _set_default(typevar, default) - _set_module(typevar) - return typevar + def __new__(cls, name, *constraints, bound=None, + covariant=False, contravariant=False, + default=NoDefault, infer_variance=False): + if hasattr(typing, "TypeAliasType"): + # PEP 695 implemented (3.12+), can pass infer_variance to typing.TypeVar + typevar = typing.TypeVar(name, *constraints, bound=bound, + covariant=covariant, contravariant=contravariant, + infer_variance=infer_variance) + else: + typevar = typing.TypeVar(name, *constraints, bound=bound, + covariant=covariant, contravariant=contravariant) + if infer_variance and (covariant or contravariant): + raise ValueError("Variance cannot be specified with infer_variance.") + typevar.__infer_variance__ = infer_variance + + _set_default(typevar, default) + _set_module(typevar) + + def _tvar_prepare_subst(alias, args): + if ( + typevar.has_default() + and alias.__parameters__.index(typevar) == len(args) + ): + args += (typevar.__default__,) + return args - def __init_subclass__(cls) -> None: - raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type") + typevar.__typing_prepare_subst__ = _tvar_prepare_subst + return typevar + + def __init_subclass__(cls) -> None: + raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type") # Python 3.10+ has PEP 612 if hasattr(typing, 'ParamSpecArgs'): ParamSpecArgs = typing.ParamSpecArgs ParamSpecKwargs = typing.ParamSpecKwargs -# 3.7-3.9 +# 3.8-3.9 else: class _Immutable: """Mixin to indicate that object should not be copied.""" @@ -1599,8 +1600,12 @@ def __eq__(self, other): return NotImplemented return self.__origin__ == other.__origin__ + +if _PEP_696_IMPLEMENTED: + from typing import ParamSpec + # 3.10+ -if hasattr(typing, 'ParamSpec'): +elif hasattr(typing, 'ParamSpec'): # Add default parameter - PEP 696 class ParamSpec(metaclass=_TypeVarLikeMeta): @@ -1610,7 +1615,7 @@ class ParamSpec(metaclass=_TypeVarLikeMeta): def __new__(cls, name, *, bound=None, covariant=False, contravariant=False, - infer_variance=False, default=_marker): + infer_variance=False, default=NoDefault): if hasattr(typing, "TypeAliasType"): # PEP 695 implemented, can pass infer_variance to typing.TypeVar paramspec = typing.ParamSpec(name, bound=bound, @@ -1625,12 +1630,30 @@ def __new__(cls, name, *, bound=None, _set_default(paramspec, default) _set_module(paramspec) + + def _paramspec_prepare_subst(alias, args): + params = alias.__parameters__ + i = params.index(paramspec) + if i == len(args) and paramspec.has_default(): + args = [*args, paramspec.__default__] + if i >= len(args): + raise TypeError(f"Too few arguments for {alias}") + # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. + if len(params) == 1 and not typing._is_param_expr(args[0]): + assert i == 0 + args = (args,) + # Convert lists to tuples to help other libraries cache the results. + elif isinstance(args[i], list): + args = (*args[:i], tuple(args[i]), *args[i + 1:]) + return args + + paramspec.__typing_prepare_subst__ = _paramspec_prepare_subst return paramspec def __init_subclass__(cls) -> None: raise TypeError(f"type '{__name__}.ParamSpec' is not an acceptable base type") -# 3.7-3.9 +# 3.8-3.9 else: # Inherits from list as a workaround for Callable checks in Python < 3.9.2. @@ -1693,8 +1716,8 @@ def kwargs(self): return ParamSpecKwargs(self) def __init__(self, name, *, bound=None, covariant=False, contravariant=False, - infer_variance=False, default=_marker): - super().__init__([self]) + infer_variance=False, default=NoDefault): + list.__init__(self, [self]) self.__name__ = name self.__covariant__ = bool(covariant) self.__contravariant__ = bool(contravariant) @@ -1735,7 +1758,7 @@ def __call__(self, *args, **kwargs): pass -# 3.7-3.9 +# 3.8-3.9 if not hasattr(typing, 'Concatenate'): # Inherits from list as a workaround for Callable checks in Python < 3.9.2. class _ConcatenateGenericAlias(list): @@ -1770,7 +1793,7 @@ def __parameters__(self): ) -# 3.7-3.9 +# 3.8-3.9 @typing._tp_cache def _concatenate_getitem(self, parameters): if parameters == (): @@ -1788,7 +1811,7 @@ def _concatenate_getitem(self, parameters): # 3.10+ if hasattr(typing, 'Concatenate'): Concatenate = typing.Concatenate - _ConcatenateGenericAlias = typing._ConcatenateGenericAlias # noqa: F811 + _ConcatenateGenericAlias = typing._ConcatenateGenericAlias # 3.9 elif sys.version_info[:2] >= (3, 9): @_ExtensionsSpecialForm @@ -1804,7 +1827,7 @@ def Concatenate(self, parameters): See PEP 612 for detailed information. """ return _concatenate_getitem(self, parameters) -# 3.7-8 +# 3.8 else: class _ConcatenateForm(_ExtensionsSpecialForm, _root=True): def __getitem__(self, parameters): @@ -1874,7 +1897,7 @@ def is_str(val: Union[str, float]): """ item = typing._type_check(parameters, f'{self} accepts only a single type.') return typing._GenericAlias(self, (item,)) -# 3.7-3.8 +# 3.8 else: class _TypeGuardForm(_ExtensionsSpecialForm, _root=True): def __getitem__(self, parameters): @@ -1927,6 +1950,98 @@ def is_str(val: Union[str, float]): PEP 647 (User-Defined Type Guards). """) +# 3.13+ +if hasattr(typing, 'TypeIs'): + TypeIs = typing.TypeIs +# 3.9 +elif sys.version_info[:2] >= (3, 9): + @_ExtensionsSpecialForm + def TypeIs(self, parameters): + """Special typing form used to annotate the return type of a user-defined + type narrower function. ``TypeIs`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeIs[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeIs`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the intersection of the type inside ``TypeGuard`` and the argument's + previously known type. + + For example:: + + def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]: + return hasattr(val, '__await__') + + def f(val: Union[int, Awaitable[int]]) -> int: + if is_awaitable(val): + assert_type(val, Awaitable[int]) + else: + assert_type(val, int) + + ``TypeIs`` also works with type variables. For more information, see + PEP 742 (Narrowing types with TypeIs). + """ + item = typing._type_check(parameters, f'{self} accepts only a single type.') + return typing._GenericAlias(self, (item,)) +# 3.8 +else: + class _TypeIsForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type') + return typing._GenericAlias(self, (item,)) + + TypeIs = _TypeIsForm( + 'TypeIs', + doc="""Special typing form used to annotate the return type of a user-defined + type narrower function. ``TypeIs`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeIs[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeIs`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the intersection of the type inside ``TypeGuard`` and the argument's + previously known type. + + For example:: + + def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]: + return hasattr(val, '__await__') + + def f(val: Union[int, Awaitable[int]]) -> int: + if is_awaitable(val): + assert_type(val, Awaitable[int]) + else: + assert_type(val, int) + + ``TypeIs`` also works with type variables. For more information, see + PEP 742 (Narrowing types with TypeIs). + """) + # Vendored from cpython typing._SpecialFrom class _SpecialForm(typing._Final, _root=True): @@ -1972,7 +2087,7 @@ def __getitem__(self, parameters): return self._getitem(self, parameters) -if hasattr(typing, "LiteralString"): +if hasattr(typing, "LiteralString"): # 3.11+ LiteralString = typing.LiteralString else: @_SpecialForm @@ -1995,7 +2110,7 @@ def query(sql: LiteralString) -> ...: raise TypeError(f"{self} is not subscriptable") -if hasattr(typing, "Self"): +if hasattr(typing, "Self"): # 3.11+ Self = typing.Self else: @_SpecialForm @@ -2016,7 +2131,7 @@ def parse(self, data: bytes) -> Self: raise TypeError(f"{self} is not subscriptable") -if hasattr(typing, "Never"): +if hasattr(typing, "Never"): # 3.11+ Never = typing.Never else: @_SpecialForm @@ -2046,10 +2161,10 @@ def int_or_str(arg: int | str) -> None: raise TypeError(f"{self} is not subscriptable") -if hasattr(typing, 'Required'): +if hasattr(typing, 'Required'): # 3.11+ Required = typing.Required NotRequired = typing.NotRequired -elif sys.version_info[:2] >= (3, 9): +elif sys.version_info[:2] >= (3, 9): # 3.9-3.10 @_ExtensionsSpecialForm def Required(self, parameters): """A special typing construct to mark a key of a total=False TypedDict @@ -2087,7 +2202,7 @@ class Movie(TypedDict): item = typing._type_check(parameters, f'{self._name} accepts only a single type.') return typing._GenericAlias(self, (item,)) -else: +else: # 3.8 class _RequiredForm(_ExtensionsSpecialForm, _root=True): def __getitem__(self, parameters): item = typing._type_check(parameters, @@ -2127,6 +2242,53 @@ class Movie(TypedDict): """) +if hasattr(typing, 'ReadOnly'): + ReadOnly = typing.ReadOnly +elif sys.version_info[:2] >= (3, 9): # 3.9-3.12 + @_ExtensionsSpecialForm + def ReadOnly(self, parameters): + """A special typing construct to mark an item of a TypedDict as read-only. + + For example: + + class Movie(TypedDict): + title: ReadOnly[str] + year: int + + def mutate_movie(m: Movie) -> None: + m["year"] = 1992 # allowed + m["title"] = "The Matrix" # typechecker error + + There is no runtime checking for this property. + """ + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + +else: # 3.8 + class _ReadOnlyForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + + ReadOnly = _ReadOnlyForm( + 'ReadOnly', + doc="""A special typing construct to mark a key of a TypedDict as read-only. + + For example: + + class Movie(TypedDict): + title: ReadOnly[str] + year: int + + def mutate_movie(m: Movie) -> None: + m["year"] = 1992 # allowed + m["title"] = "The Matrix" # typechecker error + + There is no runtime checking for this propery. + """) + + _UNPACK_DOC = """\ Type unpack operator. @@ -2175,7 +2337,7 @@ def foo(**kwargs: Unpack[Movie]): ... def _is_unpack(obj): return get_origin(obj) is Unpack -elif sys.version_info[:2] >= (3, 9): +elif sys.version_info[:2] >= (3, 9): # 3.9+ class _UnpackSpecialForm(_ExtensionsSpecialForm, _root=True): def __init__(self, getitem): super().__init__(getitem) @@ -2184,6 +2346,17 @@ def __init__(self, getitem): class _UnpackAlias(typing._GenericAlias, _root=True): __class__ = typing.TypeVar + @property + def __typing_unpacked_tuple_args__(self): + assert self.__origin__ is Unpack + assert len(self.__args__) == 1 + arg, = self.__args__ + if isinstance(arg, (typing._GenericAlias, _types.GenericAlias)): + if arg.__origin__ is not tuple: + raise TypeError("Unpack[...] must be used with a tuple type") + return arg.__args__ + return None + @_UnpackSpecialForm def Unpack(self, parameters): item = typing._type_check(parameters, f'{self._name} accepts only a single type.') @@ -2192,7 +2365,7 @@ def Unpack(self, parameters): def _is_unpack(obj): return isinstance(obj, _UnpackAlias) -else: +else: # 3.8 class _UnpackAlias(typing._GenericAlias, _root=True): __class__ = typing.TypeVar @@ -2208,7 +2381,20 @@ def _is_unpack(obj): return isinstance(obj, _UnpackAlias) -if hasattr(typing, "TypeVarTuple"): # 3.11+ +if _PEP_696_IMPLEMENTED: + from typing import TypeVarTuple + +elif hasattr(typing, "TypeVarTuple"): # 3.11+ + + def _unpack_args(*args): + newargs = [] + for arg in args: + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs is not None and not (subargs and subargs[-1] is ...): + newargs.extend(subargs) + else: + newargs.append(arg) + return newargs # Add default parameter - PEP 696 class TypeVarTuple(metaclass=_TypeVarLikeMeta): @@ -2216,16 +2402,63 @@ class TypeVarTuple(metaclass=_TypeVarLikeMeta): _backported_typevarlike = typing.TypeVarTuple - def __new__(cls, name, *, default=_marker): + def __new__(cls, name, *, default=NoDefault): tvt = typing.TypeVarTuple(name) _set_default(tvt, default) _set_module(tvt) + + def _typevartuple_prepare_subst(alias, args): + params = alias.__parameters__ + typevartuple_index = params.index(tvt) + for param in params[typevartuple_index + 1:]: + if isinstance(param, TypeVarTuple): + raise TypeError( + f"More than one TypeVarTuple parameter in {alias}" + ) + + alen = len(args) + plen = len(params) + left = typevartuple_index + right = plen - typevartuple_index - 1 + var_tuple_index = None + fillarg = None + for k, arg in enumerate(args): + if not isinstance(arg, type): + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs and len(subargs) == 2 and subargs[-1] is ...: + if var_tuple_index is not None: + raise TypeError( + "More than one unpacked " + "arbitrary-length tuple argument" + ) + var_tuple_index = k + fillarg = subargs[0] + if var_tuple_index is not None: + left = min(left, var_tuple_index) + right = min(right, alen - var_tuple_index - 1) + elif left + right > alen: + raise TypeError(f"Too few arguments for {alias};" + f" actual {alen}, expected at least {plen - 1}") + if left == alen - right and tvt.has_default(): + replacement = _unpack_args(tvt.__default__) + else: + replacement = args[left: alen - right] + + return ( + *args[:left], + *([fillarg] * (typevartuple_index - left)), + replacement, + *([fillarg] * (plen - right - left - typevartuple_index - 1)), + *args[alen - right:], + ) + + tvt.__typing_prepare_subst__ = _typevartuple_prepare_subst return tvt def __init_subclass__(self, *args, **kwds): raise TypeError("Cannot subclass special typing classes") -else: +else: # <=3.10 class TypeVarTuple(_DefaultMixin): """Type variable tuple. @@ -2276,7 +2509,7 @@ def get_shape(self) -> Tuple[*Ts]: def __iter__(self): yield self.__unpacked__ - def __init__(self, name, *, default=_marker): + def __init__(self, name, *, default=NoDefault): self.__name__ = name _DefaultMixin.__init__(self, default) @@ -2304,10 +2537,10 @@ def __init_subclass__(self, *args, **kwds): raise TypeError("Cannot subclass special typing classes") -if hasattr(typing, "reveal_type"): +if hasattr(typing, "reveal_type"): # 3.11+ reveal_type = typing.reveal_type -else: - def reveal_type(__obj: T) -> T: +else: # <=3.10 + def reveal_type(obj: T, /) -> T: """Reveal the inferred type of a variable. When a static type checker encounters a call to ``reveal_type()``, @@ -2323,14 +2556,20 @@ def reveal_type(__obj: T) -> T: argument and returns it unchanged. """ - print(f"Runtime type is {type(__obj).__name__!r}", file=sys.stderr) - return __obj + print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr) + return obj -if hasattr(typing, "assert_never"): +if hasattr(typing, "_ASSERT_NEVER_REPR_MAX_LENGTH"): # 3.11+ + _ASSERT_NEVER_REPR_MAX_LENGTH = typing._ASSERT_NEVER_REPR_MAX_LENGTH +else: # <=3.10 + _ASSERT_NEVER_REPR_MAX_LENGTH = 100 + + +if hasattr(typing, "assert_never"): # 3.11+ assert_never = typing.assert_never -else: - def assert_never(__arg: Never) -> Never: +else: # <=3.10 + def assert_never(arg: Never, /) -> Never: """Assert to the type checker that a line of code is unreachable. Example:: @@ -2350,13 +2589,16 @@ def int_or_str(arg: int | str) -> None: At runtime, this throws an exception when called. """ - raise AssertionError("Expected code to be unreachable") + value = repr(arg) + if len(value) > _ASSERT_NEVER_REPR_MAX_LENGTH: + value = value[:_ASSERT_NEVER_REPR_MAX_LENGTH] + '...' + raise AssertionError(f"Expected code to be unreachable, but got: {value}") -if sys.version_info >= (3, 12): +if sys.version_info >= (3, 12): # 3.12+ # dataclass_transform exists in 3.11 but lacks the frozen_default parameter dataclass_transform = typing.dataclass_transform -else: +else: # <=3.11 def dataclass_transform( *, eq_default: bool = True, @@ -2443,18 +2685,18 @@ def decorator(cls_or_fn): return decorator -if hasattr(typing, "override"): +if hasattr(typing, "override"): # 3.12+ override = typing.override -else: +else: # <=3.11 _F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any]) - def override(__arg: _F) -> _F: + def override(arg: _F, /) -> _F: """Indicate that a method is intended to override a method in a base class. Usage: class Base: - def method(self) -> None: ... + def method(self) -> None: pass class Child(Base): @@ -2475,28 +2717,26 @@ def method(self) -> None: """ try: - __arg.__override__ = True + arg.__override__ = True except (AttributeError, TypeError): # Skip the attribute silently if it is not writable. # AttributeError happens if the object has __slots__ or a # read-only property, TypeError if it's a builtin class. pass - return __arg + return arg -if hasattr(typing, "deprecated"): - deprecated = typing.deprecated +if hasattr(warnings, "deprecated"): + deprecated = warnings.deprecated else: _T = typing.TypeVar("_T") - def deprecated( - __msg: str, - *, - category: typing.Optional[typing.Type[Warning]] = DeprecationWarning, - stacklevel: int = 1, - ) -> typing.Callable[[_T], _T]: + class deprecated: """Indicate that a class, function or overload is deprecated. + When this decorator is applied to an object, the type checker + will generate a diagnostic on usage of the deprecated object. + Usage: @deprecated("Use B instead") @@ -2513,64 +2753,113 @@ def g(x: int) -> int: ... @overload def g(x: str) -> int: ... - When this decorator is applied to an object, the type checker - will generate a diagnostic on usage of the deprecated object. - - The warning specified by ``category`` will be emitted on use - of deprecated objects. For functions, that happens on calls; - for classes, on instantiation. If the ``category`` is ``None``, - no warning is emitted. The ``stacklevel`` determines where the + The warning specified by *category* will be emitted at runtime + on use of deprecated objects. For functions, that happens on calls; + for classes, on instantiation and on creation of subclasses. + If the *category* is ``None``, no warning is emitted at runtime. + The *stacklevel* determines where the warning is emitted. If it is ``1`` (the default), the warning is emitted at the direct caller of the deprecated object; if it is higher, it is emitted further up the stack. + Static type checker behavior is not affected by the *category* + and *stacklevel* arguments. - The decorator sets the ``__deprecated__`` - attribute on the decorated object to the deprecation message - passed to the decorator. If applied to an overload, the decorator + The deprecation message passed to the decorator is saved in the + ``__deprecated__`` attribute on the decorated object. + If applied to an overload, the decorator must be after the ``@overload`` decorator for the attribute to exist on the overload as returned by ``get_overloads()``. See PEP 702 for details. """ - def decorator(__arg: _T) -> _T: + def __init__( + self, + message: str, + /, + *, + category: typing.Optional[typing.Type[Warning]] = DeprecationWarning, + stacklevel: int = 1, + ) -> None: + if not isinstance(message, str): + raise TypeError( + "Expected an object of type str for 'message', not " + f"{type(message).__name__!r}" + ) + self.message = message + self.category = category + self.stacklevel = stacklevel + + def __call__(self, arg: _T, /) -> _T: + # Make sure the inner functions created below don't + # retain a reference to self. + msg = self.message + category = self.category + stacklevel = self.stacklevel if category is None: - __arg.__deprecated__ = __msg - return __arg - elif isinstance(__arg, type): - original_new = __arg.__new__ - has_init = __arg.__init__ is not object.__init__ + arg.__deprecated__ = msg + return arg + elif isinstance(arg, type): + import functools + from types import MethodType + + original_new = arg.__new__ @functools.wraps(original_new) def __new__(cls, *args, **kwargs): - warnings.warn(__msg, category=category, stacklevel=stacklevel + 1) + if cls is arg: + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) if original_new is not object.__new__: return original_new(cls, *args, **kwargs) # Mirrors a similar check in object.__new__. - elif not has_init and (args or kwargs): + elif cls.__init__ is object.__init__ and (args or kwargs): raise TypeError(f"{cls.__name__}() takes no arguments") else: return original_new(cls) - __arg.__new__ = staticmethod(__new__) - __arg.__deprecated__ = __new__.__deprecated__ = __msg - return __arg - elif callable(__arg): - @functools.wraps(__arg) + arg.__new__ = staticmethod(__new__) + + original_init_subclass = arg.__init_subclass__ + # We need slightly different behavior if __init_subclass__ + # is a bound method (likely if it was implemented in Python) + if isinstance(original_init_subclass, MethodType): + original_init_subclass = original_init_subclass.__func__ + + @functools.wraps(original_init_subclass) + def __init_subclass__(*args, **kwargs): + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) + return original_init_subclass(*args, **kwargs) + + arg.__init_subclass__ = classmethod(__init_subclass__) + # Or otherwise, which likely means it's a builtin such as + # object's implementation of __init_subclass__. + else: + @functools.wraps(original_init_subclass) + def __init_subclass__(*args, **kwargs): + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) + return original_init_subclass(*args, **kwargs) + + arg.__init_subclass__ = __init_subclass__ + + arg.__deprecated__ = __new__.__deprecated__ = msg + __init_subclass__.__deprecated__ = msg + return arg + elif callable(arg): + import functools + + @functools.wraps(arg) def wrapper(*args, **kwargs): - warnings.warn(__msg, category=category, stacklevel=stacklevel + 1) - return __arg(*args, **kwargs) + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) + return arg(*args, **kwargs) - __arg.__deprecated__ = wrapper.__deprecated__ = __msg + arg.__deprecated__ = wrapper.__deprecated__ = msg return wrapper else: raise TypeError( "@deprecated decorator with non-None category must be applied to " - f"a class or callable, not {__arg!r}" + f"a class or callable, not {arg!r}" ) - return decorator - # We have to do some monkey patching to deal with the dual nature of # Unpack/TypeVarTuple: @@ -2580,11 +2869,223 @@ def wrapper(*args, **kwargs): # counting generic parameters, so that when we subscript a generic, # the runtime doesn't try to substitute the Unpack with the subscripted type. if not hasattr(typing, "TypeVarTuple"): - typing._collect_type_vars = _collect_type_vars + def _check_generic(cls, parameters, elen=_marker): + """Check correct count for parameters of a generic cls (internal helper). + + This gives a nice error message in case of count mismatch. + """ + if not elen: + raise TypeError(f"{cls} is not a generic class") + if elen is _marker: + if not hasattr(cls, "__parameters__") or not cls.__parameters__: + raise TypeError(f"{cls} is not a generic class") + elen = len(cls.__parameters__) + alen = len(parameters) + if alen != elen: + expect_val = elen + if hasattr(cls, "__parameters__"): + parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] + num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) + if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): + return + + # deal with TypeVarLike defaults + # required TypeVarLikes cannot appear after a defaulted one. + if alen < elen: + # since we validate TypeVarLike default in _collect_type_vars + # or _collect_parameters we can safely check parameters[alen] + if ( + getattr(parameters[alen], '__default__', NoDefault) + is not NoDefault + ): + return + + num_default_tv = sum(getattr(p, '__default__', NoDefault) + is not NoDefault for p in parameters) + + elen -= num_default_tv + + expect_val = f"at least {elen}" + + things = "arguments" if sys.version_info >= (3, 10) else "parameters" + raise TypeError(f"Too {'many' if alen > elen else 'few'} {things}" + f" for {cls}; actual {alen}, expected {expect_val}") +else: + # Python 3.11+ + + def _check_generic(cls, parameters, elen): + """Check correct count for parameters of a generic cls (internal helper). + + This gives a nice error message in case of count mismatch. + """ + if not elen: + raise TypeError(f"{cls} is not a generic class") + alen = len(parameters) + if alen != elen: + expect_val = elen + if hasattr(cls, "__parameters__"): + parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] + + # deal with TypeVarLike defaults + # required TypeVarLikes cannot appear after a defaulted one. + if alen < elen: + # since we validate TypeVarLike default in _collect_type_vars + # or _collect_parameters we can safely check parameters[alen] + if ( + getattr(parameters[alen], '__default__', NoDefault) + is not NoDefault + ): + return + + num_default_tv = sum(getattr(p, '__default__', NoDefault) + is not NoDefault for p in parameters) + + elen -= num_default_tv + + expect_val = f"at least {elen}" + + raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments" + f" for {cls}; actual {alen}, expected {expect_val}") + +if not _PEP_696_IMPLEMENTED: typing._check_generic = _check_generic -# Backport typing.NamedTuple as it exists in Python 3.12. +def _has_generic_or_protocol_as_origin() -> bool: + try: + frame = sys._getframe(2) + # - Catch AttributeError: not all Python implementations have sys._getframe() + # - Catch ValueError: maybe we're called from an unexpected module + # and the call stack isn't deep enough + except (AttributeError, ValueError): + return False # err on the side of leniency + else: + # If we somehow get invoked from outside typing.py, + # also err on the side of leniency + if frame.f_globals.get("__name__") != "typing": + return False + origin = frame.f_locals.get("origin") + # Cannot use "in" because origin may be an object with a buggy __eq__ that + # throws an error. + return origin is typing.Generic or origin is Protocol or origin is typing.Protocol + + +_TYPEVARTUPLE_TYPES = {TypeVarTuple, getattr(typing, "TypeVarTuple", None)} + + +def _is_unpacked_typevartuple(x) -> bool: + if get_origin(x) is not Unpack: + return False + args = get_args(x) + return ( + bool(args) + and len(args) == 1 + and type(args[0]) in _TYPEVARTUPLE_TYPES + ) + + +# Python 3.11+ _collect_type_vars was renamed to _collect_parameters +if hasattr(typing, '_collect_type_vars'): + def _collect_type_vars(types, typevar_types=None): + """Collect all type variable contained in types in order of + first appearance (lexicographic order). For example:: + + _collect_type_vars((T, List[S, T])) == (T, S) + """ + if typevar_types is None: + typevar_types = typing.TypeVar + tvars = [] + + # A required TypeVarLike cannot appear after a TypeVarLike with a default + # if it was a direct call to `Generic[]` or `Protocol[]` + enforce_default_ordering = _has_generic_or_protocol_as_origin() + default_encountered = False + + # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple + type_var_tuple_encountered = False + + for t in types: + if _is_unpacked_typevartuple(t): + type_var_tuple_encountered = True + elif isinstance(t, typevar_types) and t not in tvars: + if enforce_default_ordering: + has_default = getattr(t, '__default__', NoDefault) is not NoDefault + if has_default: + if type_var_tuple_encountered: + raise TypeError('Type parameter with a default' + ' follows TypeVarTuple') + default_encountered = True + elif default_encountered: + raise TypeError(f'Type parameter {t!r} without a default' + ' follows type parameter with a default') + + tvars.append(t) + if _should_collect_from_parameters(t): + tvars.extend([t for t in t.__parameters__ if t not in tvars]) + return tuple(tvars) + + typing._collect_type_vars = _collect_type_vars +else: + def _collect_parameters(args): + """Collect all type variables and parameter specifications in args + in order of first appearance (lexicographic order). + + For example:: + + assert _collect_parameters((T, Callable[P, T])) == (T, P) + """ + parameters = [] + + # A required TypeVarLike cannot appear after a TypeVarLike with default + # if it was a direct call to `Generic[]` or `Protocol[]` + enforce_default_ordering = _has_generic_or_protocol_as_origin() + default_encountered = False + + # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple + type_var_tuple_encountered = False + + for t in args: + if isinstance(t, type): + # We don't want __parameters__ descriptor of a bare Python class. + pass + elif isinstance(t, tuple): + # `t` might be a tuple, when `ParamSpec` is substituted with + # `[T, int]`, or `[int, *Ts]`, etc. + for x in t: + for collected in _collect_parameters([x]): + if collected not in parameters: + parameters.append(collected) + elif hasattr(t, '__typing_subst__'): + if t not in parameters: + if enforce_default_ordering: + has_default = ( + getattr(t, '__default__', NoDefault) is not NoDefault + ) + + if type_var_tuple_encountered and has_default: + raise TypeError('Type parameter with a default' + ' follows TypeVarTuple') + + if has_default: + default_encountered = True + elif default_encountered: + raise TypeError(f'Type parameter {t!r} without a default' + ' follows type parameter with a default') + + parameters.append(t) + else: + if _is_unpacked_typevartuple(t): + type_var_tuple_encountered = True + for x in getattr(t, '__parameters__', ()): + if x not in parameters: + parameters.append(x) + + return tuple(parameters) + + if not _PEP_696_IMPLEMENTED: + typing._collect_parameters = _collect_parameters + +# Backport typing.NamedTuple as it exists in Python 3.13. # In 3.11, the ability to define generic `NamedTuple`s was supported. # This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8. # On 3.12, we added __orig_bases__ to call-based NamedTuples @@ -2616,7 +3117,13 @@ def __new__(cls, typename, bases, ns): raise TypeError( 'can only inherit from a NamedTuple type and Generic') bases = tuple(tuple if base is _NamedTuple else base for base in bases) - types = ns.get('__annotations__', {}) + if "__annotations__" in ns: + types = ns["__annotations__"] + elif "__annotate__" in ns: + # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated + types = ns["__annotate__"](1) + else: + types = {} default_names = [] for field_name in types: if field_name in ns: @@ -2639,11 +3146,35 @@ def __new__(cls, typename, bases, ns): class_getitem = typing.Generic.__class_getitem__.__func__ nm_tpl.__class_getitem__ = classmethod(class_getitem) # update from user namespace without overriding special namedtuple attributes - for key in ns: + for key, val in ns.items(): if key in _prohibited_namedtuple_fields: raise AttributeError("Cannot overwrite NamedTuple attribute " + key) - elif key not in _special_namedtuple_fields and key not in nm_tpl._fields: - setattr(nm_tpl, key, ns[key]) + elif key not in _special_namedtuple_fields: + if key not in nm_tpl._fields: + setattr(nm_tpl, key, ns[key]) + try: + set_name = type(val).__set_name__ + except AttributeError: + pass + else: + try: + set_name(val, nm_tpl, key) + except BaseException as e: + msg = ( + f"Error calling __set_name__ on {type(val).__name__!r} " + f"instance {key!r} in {typename!r}" + ) + # BaseException.add_note() existed on py311, + # but the __set_name__ machinery didn't start + # using add_note() until py312. + # Making sure exceptions are raised in the same way + # as in "normal" classes seems most important here. + if sys.version_info >= (3, 12): + e.add_note(msg) + raise + else: + raise RuntimeError(msg) from e + if typing.Generic in bases: nm_tpl.__init_subclass__() return nm_tpl @@ -2655,7 +3186,7 @@ def _namedtuple_mro_entries(bases): return (_NamedTuple,) @_ensure_subclassable(_namedtuple_mro_entries) - def NamedTuple(__typename, __fields=_marker, **kwargs): + def NamedTuple(typename, fields=_marker, /, **kwargs): """Typed version of namedtuple. Usage:: @@ -2675,7 +3206,7 @@ class Employee(NamedTuple): Employee = NamedTuple('Employee', [('name', str), ('id', int)]) """ - if __fields is _marker: + if fields is _marker: if kwargs: deprecated_thing = "Creating NamedTuple classes using keyword arguments" deprecation_msg = ( @@ -2684,14 +3215,14 @@ class Employee(NamedTuple): ) else: deprecated_thing = "Failing to pass a value for the 'fields' parameter" - example = f"`{__typename} = NamedTuple({__typename!r}, [])`" + example = f"`{typename} = NamedTuple({typename!r}, [])`" deprecation_msg = ( "{name} is deprecated and will be disallowed in Python {remove}. " "To create a NamedTuple class with 0 fields " "using the functional syntax, " "pass an empty list, e.g. " ) + example + "." - elif __fields is None: + elif fields is None: if kwargs: raise TypeError( "Cannot pass `None` as the 'fields' parameter " @@ -2699,7 +3230,7 @@ class Employee(NamedTuple): ) else: deprecated_thing = "Passing `None` as the 'fields' parameter" - example = f"`{__typename} = NamedTuple({__typename!r}, [])`" + example = f"`{typename} = NamedTuple({typename!r}, [])`" deprecation_msg = ( "{name} is deprecated and will be disallowed in Python {remove}. " "To create a NamedTuple class with 0 fields " @@ -2709,32 +3240,22 @@ class Employee(NamedTuple): elif kwargs: raise TypeError("Either list of fields or keywords" " can be provided to NamedTuple, not both") - if __fields is _marker or __fields is None: + if fields is _marker or fields is None: warnings.warn( deprecation_msg.format(name=deprecated_thing, remove="3.15"), DeprecationWarning, stacklevel=2, ) - __fields = kwargs.items() - nt = _make_nmtuple(__typename, __fields, module=_caller()) + fields = kwargs.items() + nt = _make_nmtuple(typename, fields, module=_caller()) nt.__orig_bases__ = (NamedTuple,) return nt - # On 3.8+, alter the signature so that it matches typing.NamedTuple. - # The signature of typing.NamedTuple on >=3.8 is invalid syntax in Python 3.7, - # so just leave the signature as it is on 3.7. - if sys.version_info >= (3, 8): - _new_signature = '(typename, fields=None, /, **kwargs)' - if isinstance(NamedTuple, _types.FunctionType): - NamedTuple.__text_signature__ = _new_signature - else: - NamedTuple.__call__.__text_signature__ = _new_signature - if hasattr(collections.abc, "Buffer"): Buffer = collections.abc.Buffer else: - class Buffer(abc.ABC): + class Buffer(abc.ABC): # noqa: B024 """Base class for classes that implement the buffer protocol. The buffer protocol allows Python objects to expose a low-level @@ -2764,7 +3285,7 @@ class Buffer(abc.ABC): if hasattr(_types, "get_original_bases"): get_original_bases = _types.get_original_bases else: - def get_original_bases(__cls): + def get_original_bases(cls, /): """Return the class's "original" bases prior to modification by `__mro_entries__`. Examples:: @@ -2786,14 +3307,11 @@ class Baz(list[str]): ... assert get_original_bases(int) == (object,) """ try: - return __cls.__orig_bases__ + return cls.__dict__.get("__orig_bases__", cls.__bases__) except AttributeError: - try: - return __cls.__bases__ - except AttributeError: - raise TypeError( - f'Expected an instance of type, not {type(__cls).__name__!r}' - ) from None + raise TypeError( + f'Expected an instance of type, not {type(cls).__name__!r}' + ) from None # NewType is a class on Python 3.10+, making it pickleable @@ -2815,7 +3333,7 @@ def name_by_id(user_id: UserId) -> str: num = UserId(5) + 1 # type: int """ - def __call__(self, obj): + def __call__(self, obj, /): return obj def __init__(self, name, tp): @@ -2920,13 +3438,13 @@ def __init__(self, name: str, value, *, type_params=()): # Setting this attribute closes the TypeAliasType from further modification self.__name__ = name - def __setattr__(self, __name: str, __value: object) -> None: + def __setattr__(self, name: str, value: object, /) -> None: if hasattr(self, "__name__"): - self._raise_attribute_error(__name) - super().__setattr__(__name, __value) + self._raise_attribute_error(name) + super().__setattr__(name, value) - def __delattr__(self, __name: str) -> Never: - self._raise_attribute_error(__name) + def __delattr__(self, name: str, /) -> Never: + self._raise_attribute_error(name) def _raise_attribute_error(self, name: str) -> Never: # Match the Python 3.12 error messages exactly @@ -2987,7 +3505,7 @@ def __ror__(self, left): is_protocol = typing.is_protocol get_protocol_members = typing.get_protocol_members else: - def is_protocol(__tp: type) -> bool: + def is_protocol(tp: type, /) -> bool: """Return True if the given type is a Protocol. Example:: @@ -3002,13 +3520,13 @@ def is_protocol(__tp: type) -> bool: False """ return ( - isinstance(__tp, type) - and getattr(__tp, '_is_protocol', False) - and __tp is not Protocol - and __tp is not getattr(typing, "Protocol", object()) + isinstance(tp, type) + and getattr(tp, '_is_protocol', False) + and tp is not Protocol + and tp is not typing.Protocol ) - def get_protocol_members(__tp: type) -> typing.FrozenSet[str]: + def get_protocol_members(tp: type, /) -> typing.FrozenSet[str]: """Return the set of members defined in a Protocol. Example:: @@ -3022,11 +3540,63 @@ def get_protocol_members(__tp: type) -> typing.FrozenSet[str]: Raise a TypeError for arguments that are not Protocols. """ - if not is_protocol(__tp): - raise TypeError(f'{__tp!r} is not a Protocol') - if hasattr(__tp, '__protocol_attrs__'): - return frozenset(__tp.__protocol_attrs__) - return frozenset(_get_protocol_attrs(__tp)) + if not is_protocol(tp): + raise TypeError(f'{tp!r} is not a Protocol') + if hasattr(tp, '__protocol_attrs__'): + return frozenset(tp.__protocol_attrs__) + return frozenset(_get_protocol_attrs(tp)) + + +if hasattr(typing, "Doc"): + Doc = typing.Doc +else: + class Doc: + """Define the documentation of a type annotation using ``Annotated``, to be + used in class attributes, function and method parameters, return values, + and variables. + + The value should be a positional-only string literal to allow static tools + like editors and documentation generators to use it. + + This complements docstrings. + + The string value passed is available in the attribute ``documentation``. + + Example:: + + >>> from typing_extensions import Annotated, Doc + >>> def hi(to: Annotated[str, Doc("Who to say hi to")]) -> None: ... + """ + def __init__(self, documentation: str, /) -> None: + self.documentation = documentation + + def __repr__(self) -> str: + return f"Doc({self.documentation!r})" + + def __hash__(self) -> int: + return hash(self.documentation) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Doc): + return NotImplemented + return self.documentation == other.documentation + + +_CapsuleType = getattr(_types, "CapsuleType", None) + +if _CapsuleType is None: + try: + import _socket + except ImportError: + pass + else: + _CAPI = getattr(_socket, "CAPI", None) + if _CAPI is not None: + _CapsuleType = type(_CAPI) + +if _CapsuleType is not None: + CapsuleType = _CapsuleType + __all__.append("CapsuleType") # Aliases for items that have always been in typing. @@ -3042,7 +3612,6 @@ def get_protocol_members(__tp: type) -> typing.FrozenSet[str]: Dict = typing.Dict ForwardRef = typing.ForwardRef FrozenSet = typing.FrozenSet -Generator = typing.Generator Generic = typing.Generic Hashable = typing.Hashable IO = typing.IO diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc index 87094c280968199e637f23ef5c0e4fd9710c6da5..b6c41551d8b70f52b5d163363535b70f8619b80d 100644 GIT binary patch delta 99 zcmaDL^+Ss1G%qg~0}$9UGNy0jk>l{_&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7txh02sU= A(EtDd delta 75 zcmew%^+1Z}G%qg~0}uq?|CY9qM~=gwKtHrNwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#h=Yw40MMBlYybcN diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc index 6472027bf320b491eaff6198d357530c1606dadc..af593af126d3e614fea4ae901d8cd203feee2788 100644 GIT binary patch delta 1538 zcmZWoZA?>F7(S;J>^B#BZ7-#SQ!Lc7(h3L$7!0*w=js>5kg|`a-d;)#_QLH&vB5x$ zOG+T&)?=g^v*EHhxBc3hxMXhov!6>ASV22Ai`)FMWXS~0qWiU-UcixflJjxj^E~hS z-se5R5}c6mL{5g!a;L%`FVBvh=Hg<)(;XRO z!(xn&djf2Dm=n-GHXPwjpY!pO_^Dey>NIv1P? z;{B>R^%_vBnYmypm_4HkD9WzMfQL+FN}u0A{i+Enfx(PBwRJ^gCrClt3u}Ecas!m7 znfasXqxWdX679I9%+an?_j8%`M2FT{*sTA{Vc$x6Xf#RU{A7AEXLLMQLiMgSKo&Wd zM#EW!KD-r-?@%?3B>bud=%{;I>rYzigYqh=C{NM%DBBWcTc}x~cC9Ia1+6N9uJXB7 z&J|lq|8+UHI(ld{Uso;ApH$tb$}tT&V`Cw7Qz3LyAvAugYz11d%}7HAw-|5J5$Yls zDCd{~3z-#US~=ztjZnly>^nJo#C#EaP68ChKurpa!-3iWaF%D==oebMjadHxFQ&kv zao>`s>xQ^6ddnsqpYKoi}b6zW=0omspE6~)BQ8S z44gf(jswy(A=d%ALX)n?kZ>}Y+K)l^q1oVA;A9&J{lZi%kDOX}dwmzku|v}5Kl z5obqz_JqAo4Y%W|`T^%%YkgWJDWw1rabA^HWsDhig{mgFO7~;EIa74~?6ThRz-+~x zZj%Wxm5=qbbRyHUtlyb8Tj!JMB$~i|nh#pu+Z{>#FMm_w=FE z0cl5GN6q=BeNrG(v!X*JK!sDFNXj^5H)X$b{|51}UCne7%RGpJ2>b}1hZE2X-ZcVn zUV*!+&DcPdOiloztRi_ugEmGldFE$0#PV^G^hAAPgkxiaF%}JRq!k1-7~_T`33QSh zswVM+dw65HBEK_dYKQvn($}WDbvdCwmT{ z)`o`NE)*agMLG{PG`sh>U;1!vPf`aqQt6Jfe1Z7C#ZRJ-g`?aS3%}mLN!=!^@7xHN zG;DtPxp-6@x?k*#MMp zI4B8>=qBh3a7$=J;6}m%7b4n(*8e^vE5s$8zP`R=K3PIV>7P1@L|XmK)`FqZz-}TxrGQk}_|yWE#@Z zOhOvY$q$%8Yej%&va#kSSlaap@5`1JCAr3bwp@Wd*$aCgLwFTOTeHP)7NDPD)Mi#( zK8icr-md^V>}%D4GD>@ACKgo{a%zH_B;j=6U)rV=!YqEfy+tb#i{LLTm+|#>1V6^# vwl~2=yw-kU`%{K0qE~D2*y~T=P0V$;;B9=VqhCF)gjVUjzri?u+VReRT^QdT delta 1188 zcmaJ=UuauZ7(XZ1bh$}xcbj{cWJ%iQ=Fe_=mnN-Q&Hlw2I&~Jixy2F^M2IG}ZlPI| zK+7mJ$i`AC^oBD`hQhK3$3RiWMFj<)=8FSemWD*_Z+2l1%!5Uy*~4n+X^4K(#-8W~FX$vK30iQrq7;%YkL@p1YF+;=1LjbOTGDv|qOoF&73FB1Kgsj}Be99c( zkCz26D_*uFdkLT)IJ+g~Od2nN53oM@;;tfChH-ZUjF=TS|4=6k;oTp>!veU^g>U4m zi?;;%OgUPLqF5DPJyqkvC~W`S%tmxAx*n^*w@(8(g6mt>lr$Bt@_K`Hkor1z7*j?4-qI!` zHcd7Hm1OE4SgJa8?OcN$Ay8?D;pN%NbDNA4L(3OS7tzZ96Iy-KVAw@4?vfVYKl?A? z2J32JQFp5kScU7}YuO6*MU` zfjHzWxWBmGsZ(?Rsfp-GDPZzqh1nJ7bt^8UnGXcl|WZtu1^6B#6DaSFjP z9t{Qe2=X#{r4y%av{c4RZ&Y$}y8d^C+G>nd!odJE`iRc+kD5VrRCqWpAAX7={>#Jf zz(dOHksS!HqNB$YSCHU8?mn@l2M5OQX&g-hU);0JTglMvg1z)O(jUKU#lGzTEGGxo zSMF)7Sr&7$G&Um#(1*thXgn0qt&=^HZ*~J^LUwo^$)Nzei|&NpQnf5-=ILMH4HTO6 X!rSQFWR#wxpiO@DH!z33o_ysme?VlK diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc index b1b4714a99c6683d524457bb2511416cd61f705a..f35112a3b7d8fd3b070de041a67d7224cbbe69f4 100644 GIT binary patch delta 101 zcmaFM*viCnnwOW00SIgv8Pg~77%*B)w3YDa&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ z)^|-QO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv; eyClCrzW^wcpO=`UpOKoAlV6@+l#?=XZUz9r;u|{v diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc index 14c9597d6b8179176c36af9c6fecb575444e6c9b..47b961060b2b16286e812d803f672ee2011271ba 100644 GIT binary patch delta 308 zcmX>#pYh&&MxN8Wyj%=GV9UsuzLBSs*`rH8v^ce>SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(=7VmRH#;a~ zF)1s+b;)}lG~bc9gn2pNLcSG+>&sV`udckVV0qAd^BE;+M&^U&mp8vsp2KQb!N|bS z!0>^KL0D>%?u?)g_B&#dJJT;qx$R8fAvni)zTHf_6^iTCSE{epyee(7BmLs!&6-it z^Wr;wJKQF?-ry1F_v`eVVYa~ZDv#y|W(GOk$+}uz%(o?FC)aBgGBZfYZT_rvT?GJ! C5OQ4r delta 260 zcmcaNpYhauMxN8Wyj%=G5Pbhz+D4vEW`iRA(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I3Sw>C);dKqFo-{AggfB;>uLaEjH8#3jO)g;g&J zTdh!BQ+-j(>awuaMIrCWIr6WV54c^~9I24S#3K*aB=0@>qLMK4MS1Vd&y=JYnGcv> z+03Fchn2Bz@Z>)cN}F7od{Hw>VRrl{21ZV; zPTvl<39dJI1p56t{bragFuls7`GFZIG1*Pai{pl*>?Z~;UggP?wF;Sm^k#PL>nZ>P CA6`-b diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc index 374f5b9e17eb281ff76e74a172c85484e2a42c56..92c26ba066f9da18b1f436e5573122f752c82939 100644 GIT binary patch delta 5070 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc index bcceeee919d5ee5f4e58a4d55afd03db71ff3afb..a99a45cdd0467b01ca0f54c185cc0e2726ec426c 100644 GIT binary patch delta 295 zcmV+?0oeY$QO!{d%MA?*00000Jpln{u?*A#NQN&}b7gXKFJxk2cV%i}FGO!+b!}yC zbaO97WOZXV-Y-MsFL1STLWo>ycOiV;CWMyq{L~3DfXKzq)Z)#;@bh8ix zGX)tI0002^=m7YD0MHIEp;?%6h;oosjC-M3vs(xj0Ry2~)3bC5ECT^$lc5YG8q_mV z(-KqBGg7D)lron&kvW)F)e|JpGg8sB*$mwg0c4Z69w`Ik8zYnG9w!3;93-<6AFKiu zod5s;fB^6a01*?21>zJ>hzZ*mA(Po5G8F(BBJc7EVz>YR delta 278 zcmX>bxF?Y3G%qg~0}uq?|CY9q=L(ZSo_=U?YEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJ2D34%gecI6A1@ewG%#G^)1Oh)Q8Xd6r}`qF{^k-6 zF-GPEkykeNa_TTM#!ueGqat$IIOv*C@CvahM$;`PTFwZ&Dy(v8^ADc8f{dAyugPh0 zJdjrY#K6R9JDEvdof$}P){$SsB)uAFMFYbJ4hBKt4%SB^{vDh*BosmFd>JRdRWymch#WmcxFAJ%EV`X7w Td%(jtIZH#8=@awhDH@glamQNA diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc index ea070df4b1251514c3afba087a58ab5686221bdd..949d7679de659a486851c1d384b8d0498a8dfa38 100644 GIT binary patch delta 234 zcmX>qe_fvEG%qg~0}$9UGNy0jNn!Hn&<`z6Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7t2s|quNknrXf)(9p!X`qcS7=AP`T;R97sBAIQWQO64#0i2E9H+1Wxs$)M zPmz&?E8$j~SvIj`Lg5U>j=%|wJ#I70CNJYi;=iJ7ahc!p0*B>8kb=vb#W_!~Fg~07 YfLD?EnxOV%PQFf{eL9<`@)JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~2U8~#W5i@9R&9<4ftqJfo0sz$ GFaiL)I7iO_ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc index e7d3fdd6fa4959884bcf6a97ab325e64929e1572..fd9ac88392871142290c9e8fe4ed525cac67b15d 100644 GIT binary patch delta 3748 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc index d83ac8d30ca36ae8789a03693b11183c1b819362..2d000f099ee3992a77a19590afaebad48520e238 100644 GIT binary patch delta 447 zcmX@y$#krfiRUygFBbz4*fKJvZ{%TT@#xSGElw>e)=x=FEKki!)OX2GF3nBND=F4@ zO({)IEXmBz(+^Hg%t~wHaoLy7SuKb z8r{Hf!`flL^-k*p#aFDoFH8DdwD#VRI7eqe;qvl@<%=t?N*P|T_P)4TT5KMpx&~Oo z9YM(%D)aSb>Rl7m>~OpxEHd3@qRj%9%fhOiE+3c~gtRt475C+lkpwD!!SJJj;ev?W zMIGA(!4ra~M^22K9u4Gd_Ezy{X1StcdwKIb^*g+bl9Q`VgGH|xyIhuYy=d&R!g)^d z0^_+A7mQslZoX^U$IN(Sa*ky(?-f~#&#Wx6LJwsvW-v~^Whu{bL)PL0D}$iaCaaf{ zj7F1R1qU);mm;z^6Rcq2`o3nq$YEH zWM+``W8AzTvPYh=ezI<53`qCpiItL!oIq{Yd6g~#x!bEkSs0g3=B<}tz9woqS-0L= kXtwkO#~V`8Gg4=2PWA`-SxR+seZ49(gP7Uo<@GYG0A&xF{{R30 delta 464 zcmX@s$#l4riRUygFBbz41mFLbwvmUO#h^exv^ce>SU)?lC^1hjDI>8YGg03qwK%&Z zzd*kLD3hO;n4_POnv;`Xo?n!cvN@V%v!JRr(1-?x8`ci{t#?`&?`=EU5X3fss?K!|{f&$aI^DHVarT z3#)dzd|(C&ZvH3k%OfcU)bWDhM+3tp5xWJ!6N0BlPK=x$eNn`2bGnK@Gs|Ti+bf%Q zso&vc6rMcYG?@RgvCB0%*A>oliWeBqt+=%LziA&czJT%MCH9$y^_qf$YuOB75W+J0?3<#&CcQ)8sVRyr@!=kr&AL z&HyAnf{4vWszO;5H^RJjLr}Pb?S`o2^yrDv8(1bpUluj}#K6s|I@z?|T6~5y&=x_J h363|Uq-Uhg)ST=O3>`t0$xZdD%s@4pSJlg~0stLpo(2E_ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py index da9857e9..bceb8451 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py @@ -268,6 +268,24 @@ def getlist(self, key, default=__marker): else: return vals[1:] + def _prepare_for_method_change(self): + """ + Remove content-specific header fields before changing the request + method to GET or HEAD according to RFC 9110, Section 15.4. + """ + content_specific_headers = [ + "Content-Encoding", + "Content-Language", + "Content-Location", + "Content-Type", + "Content-Length", + "Digest", + "Last-Modified", + ] + for header in content_specific_headers: + self.discard(header) + return self + # Backwards compatibility for httplib getheaders = getlist getallmatchingheaders = getlist diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py index cad75fb5..85e725ea 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py @@ -1,2 +1,2 @@ # This file is protected via CODEOWNERS -__version__ = "1.26.17" +__version__ = "1.26.18" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py index 96844d93..5a6adcbd 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -9,6 +9,7 @@ from socket import error as SocketError from socket import timeout as SocketTimeout +from ._collections import HTTPHeaderDict from .connection import ( BaseSSLError, BrokenPipeError, @@ -843,7 +844,11 @@ def _is_ssl_error_message_from_http_proxy(ssl_error): redirect_location = redirect and response.get_redirect_location() if redirect_location: if response.status == 303: + # Change the method according to RFC 9110, Section 15.4.4. method = "GET" + # And lose the body not to transfer anything sensitive. + body = None + headers = HTTPHeaderDict(headers)._prepare_for_method_change() try: retries = retries.increment(method, url, response=response, _pool=self) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc index e36780fd8a630f7226e68066ffc039fef25b3521..2de6a5f6b72c920f38a42365d04ab06b3f57c5a9 100644 GIT binary patch delta 96 zcmcb~_>qz4G%qg~0}$9UGNw=DG4hz8A6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOX_8vubI8fpLl diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc index 9bd8a06ad47304ead77d5cec3ba14550c3402350..cbf5bf7a4fa89459f254daba69d0713b20bde3d3 100644 GIT binary patch delta 99 zcmX@j_n438G%qg~0}$9UGNy0j5n=S0r5{?HT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{YKgYh>j0KZck4*&oF diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc index 42723ccaf355f5c2e3acc7a3b50613fde38e91d0..2ee9214d10046e88b74876e0113fffdd692b074f 100644 GIT binary patch delta 99 zcmdlVbv=sbG%qg~0}$9UGNy0jN#yjHs2^IKT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kjQa`jfwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Y~E9W9*0QDvt^#A|> diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc index ac316a33c7c88aa0564b36f9ea65d6c5701cefc8..e5d380d27c398548a18422d7d4df0c120d70ab02 100644 GIT binary patch delta 148 zcmaE*^H+!GG%qg~0}$9UGNy0jIm_xXK|i!OwWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY$u^6Nana@_ z0%nXVw*{3u9B=RoOc0u&*ikxz{W8D&4HeY|i3^ezxLy=c{J_c}q_UY=D4hiWm83F@ delta 129 zcmeyX^Gb*3G%qg~0}uq?|CY9q=Pav1g??ypYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL zegRM>KQA#yKO;3KC%-(uC?{pJBHJu3#^sy$2$(Ty-Vjv&#K6R<)!}%9UtogJ1jUZh f8SIz&B`Yy6JwKo*KPxr4WHTS{8YVeu zpwTZFel###Pzbwd61vi5h2x6C1&Rv-mxuwmo3HXG@d(!d)if}CK7QarE{oW1v|N!mCHT6i+C@>d1%+2dH8)spE(+G*X1QV# KdU^7^xbFZm4r~Mf delta 296 zcmZ3zpK{Ng-^d%L>O8g$ooH1TGP~ zs1UaK1Ah{aWHV4f1H)Gy22RxvEbN>TH>A`*F);JGF-}gEv1I` z#Xo_ii}wRFP`JT$vaG5S%VoXLFPoiJw`y~<1MLPnZAC=`!)C_73??}%uw!l*+guZ| mU6D8?_`0atMNzc{g;zy2FNoM~?g-Z4X1Qzi4hbLU5JWk-Js5*^XGZr=bYy`?Fa;QF6&{*M6oi2ZeQd?W4&>&FdRa@PGjlqD|c%7o@YGUezN`ao?dN|V>0KGH)TJx z6yvhx*XL43mrbsh=b^Ox%vAANO4>~Z*V=_|X-s+n(OJtmin!6*3|vBL?MH z@_!~UuYHq>`P8;RF<(_ZYG9IO~kNe0M0d+tBUOMB5jiQKT}zXZ28 zLG2OX1@3dV0(>R!T3$mEM?6}9)%e_N17L{ay8|M=_k}r_fjf3L0_2mSwr;SHvfwc& zA&-KGVHv3peTS8#COipM#2mQ_R+5NZfz70=eVDGWChCSp#Apn}W{%ceNtSk)jQzRe zI(=#>vpKXpb-@-s7cWx;I~?Y;`HOR6fh`77wEzd zycmBATo_`aF~*x16^-!|lg79JG;ahsWj)?LLM3SOP^Q}NTqSj@@|_m*rWt)M_r1` zx9m`hE97z6HZ=v0hWr6rfL8oImuzckl4XCpUy*h z7$$g#M9XutN2TI81ES@YW73>I5WX6|-f_{8;3z_7%V)GSPOD{{sd%XqVk)nXyx8K@ z|IjmOh0_eLvyxnU1xF+9weJP(sI+LB(Tmw+XluKXqRE!oL<>+Xo-9;WKZ7!4Yl=Wv zOLYpaBF{Z@v2vRUU<1}~k8#2l70x899ow~|;(}?0)1{F!4hyG7bo6U!j3>dG+8$8I z+uGA~O~=l|tk9t{2gqY*?tkWcr!~pc)>Zvu;;uR~z*!9Ku7QdRDrqHkEW%8R(u7zr zEEXi+1)X)uV4N`I4IA>VxCi8`@;k#4s*TQ?VCY4Kp<92i|HA^o_?|Bs7{p1}c@2ET z=4KzjPcq)}8Ghpvj{%?xqpc1AAUX07q~L@c;vf^Z1$F}zlAFg)!(w7l&Os@8p!7mH zSr_~b8%SAb3N{mC+a1_Sp10iwC-H`()a|nNW~j%3_6P|3IQsc&vaqwrLUL8BOp|kr zs(+@qz|1ci$y<6Oe1;#>W+zfqOl=^Z&TrsB=kX{2Pt0A4;8TZeB$vAivnXr59mdV} zhtf@MBEMufzvN!QSpJF;9Pi>-IF7NCR5=M}yX}yX8t?>`9SAr1+h}>W3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9bkxCDd&3dsvlaMT2!o`omiBZr@loFBbz4*fKJvZ{(RE@3Bxnv^ce>SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(@loFBbz41mFLbwvlIoyg{daXmM&$v3_=9QDUB6QbuA)W}?1JYH@Z+ eet~`gP$oYwF-JcmH76&(JijO>W%CpHC=~!04IFd; diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc index ceb786a372a6c6a3589cacfef4d9af12961bd54c..fbf74ad83ec7a2727d1af1605d6d6d5aea53e096 100644 GIT binary patch delta 480 zcmaD-e65)0G%qg~0}$9UGNy0jNoVm`q#s(GT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kUZ+XR1vI>~QQz>~)!`_VY6fP^O7rka6;PHs{F~*+V1{N_mxMx=kqTNSwgf zn=;dFvJJ<7-kEBbxfL5+Zi1vPZ}#AHVq<(Txtl+b`L>AoITvC&rbUK-?iB7(xQ^L$3ra9SDSDy_i ze34UfbAzrMtC%p{i#$3rQzxV>D(MNCnY#J5kuxLEG4dwj{4-N8^XN3Veqd2z)w(Sy zH`&X?5NNafJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~H_Is|aS@;qFBpC_FkIqRoDkUI*pb-la*`_-GXq5?2k3ONUl!H)#K6fp`L<38D<`MMN3qG>x-ydsbOkwpDn5cV zZf@6gV-*#G`<+K;Ldv3&o{)}b_GIqFp0cw!G&ZB#gM|VZ` z4wI`q4jAkzQ< delta 72 zcmeywc#DzeG%qg~0}uq?|CTn9$H<^kKeRZts8~Ncu_!T5FDWCjBr{RpCAB!aB)>qv Z04S56mzblUk(!f}U!Gr-lQOX_2LOTM8g2jp diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc index 2afacdb85114c3613ec529cae0d140f15bfb99a6..f3d99f5595dd43b2ce736c737b75c8c5b613babb 100644 GIT binary patch delta 636 zcmex$i0RTHCZ5y0yj%=GV9UsuzLBR%#-m3+v^ce>SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(jc!|t-6{Y4GC1uPR(rfW{tyr5xsakGZTZ8jrK zu$J2riX9#|Y#lmWuJg!U zCpX6FZgQ)D}??uWSK>9NugQ(18jbbHcAideIIGclU z?&Mw7wqmzsl_qfB5RjbCJCS!r=2ZcW56ld5%A191ws6TvfX!JDa$VK*qN?d-RrBkr zb{AFcc9dUHb>IA?O`naCd9z6GL3Y;991Og2lkZP4X9m)nC8t&~%6_(D;MHz$xyizP zfk$(N$$HC`mK##8vRDI+=hdFPby~LUXD<9Ij5e1{f665H*^7~ZR~KrM_KJ}8kt-v2 zuv}%a1(~Efxn@=sE6}IBdXr|00tNIYOUw?D{mjO|YY5e%zd>ZX~F`L0Swq ZPngZg%6v^+fAYcw7Qk>dn0#l!JOKQ!*jE4m delta 649 zcmca~i0RiMCZ5y0yj%=G5Pbhz+D4ux8G{o2(BjmhV*TvIqQpGCq>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I0e_&fMx|KqDF$ZU{=v@VX$N-obiw&6r;uDeR*3HZ-`5OVqoT#n!tQVSawG867#FV+BcNdC-~eHk^I08l$hL?Z>2mr zAE<~^ywk12v7`7Vzrala(Fw^@xNh#8AYZsKPS!0}0{X&@adS{{HV5OP$@{8prEkb80cCkLCve^nketpt zk#|PsRRN6;%s`>df;C&XImyf2?qIpfVheO0quu1xSyf6v z5A*7Ql-Wa->8waupSdz~hsaeHJCHK_$$w^rsC-~!;57s(b7F+5)88PnU2>!34wtJe ijv#eTjGJ?3bFy+=7T5p8z{M&wxpIL8Gl<@@U>*PxsnWgx diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc index 83ea94a49e9c79246e866fd77cf1e267e485fcf8..f160f0a3a68198a0f1786d6e05d02d0e1ea67b7b 100644 GIT binary patch delta 96 zcmaFD_=l0_G%qg~0}$9UGNw=DG4hzLA6lGRRIHzplvtjcm8kEMpIn-onpaY+@0wDY xoLG{XpQj(3oS2hZq~MsGn39@Xsqf?Cq7P)`yJRKirRN6}qv Z04S56mzblUk(!f}U!Gr-lQOZb3;>CC8kPV6 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc index 567341cdaecfe0ba76a73d7ea8846412e654ba69..34502046e19c59ab73dcc634c57d60e6ba1886c1 100644 GIT binary patch delta 99 zcmdnOcZQGWG%qg~0}$9UGNy0jxx?ZyTR*fowWwG>B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)l9i!79T904(Pq A`~Uy| delta 75 zcmX@Zw}p@AG%qg~0}uq?|CY9q=MIZOvwmoCYEiL%c4ARto?cQ$Vo7GAzDsIxc1eDL cegRM>KQA#yKO;3KC%-(uC?{pJ0jmrX0Ne~3mjD0& diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc index 25bccbcbee708fa19c0d50a17df6896cf9e2edd2..3383f25ce8e80f40575bf57e4d5a28894bf3d4e6 100644 GIT binary patch delta 216 zcmdmHdD)WZG%qg~0}$9UGNy0jIm6B`L8yH7ilyB|o_|H#M)MSl>0J zG&!*(Ge1v1I5{yVwMfA+IWZ+Qw^HB7$3-8=$al#~%uCM?D9X=DO)lBY!I~%_zymb8 zfnfp5g209B%Xt^^POcWMjYKQA#yKO;3KC%-(uC?{pJ0&Ajx5FgNp28IPJ3j!CiFXvsz+rTh+qG+u_JXrVx z8-udia@~cx*Og2!Dw$qZGQZB_GLvnF;0(tdhWjmcTXZB&5bO%Oz~eI6QA~vYhJxaC Vex-?N6AEW2PGY>gIYTU)4FLPzJEQ;r diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py index 14b10daf..fb51bf7d 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py @@ -4,7 +4,7 @@ import functools import logging -from ._collections import RecentlyUsedContainer +from ._collections import HTTPHeaderDict, RecentlyUsedContainer from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, port_by_scheme from .exceptions import ( LocationValueError, @@ -382,9 +382,12 @@ def urlopen(self, method, url, redirect=True, **kw): # Support relative URLs for redirecting. redirect_location = urljoin(url, redirect_location) - # RFC 7231, Section 6.4.4 if response.status == 303: + # Change the method according to RFC 9110, Section 15.4.4. method = "GET" + # And lose the body not to transfer anything sensitive. + kw["body"] = None + kw["headers"] = HTTPHeaderDict(kw["headers"])._prepare_for_method_change() retries = kw.get("retries") if not isinstance(retries, Retry): diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc index 9bdcc2de5e0748b56d7b591cc9f7199f8f275680..3f01179f77d172561196a8d747790cb9b3a6a23d 100644 GIT binary patch delta 98 zcmeC>T*}FFnwOW00SIgv8PhlNY-IN6)ekLBEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr bzW^wcpO=`UpOKoAlV6@+l#?=fV-*fU2?lKkz0WZeQwmf!>YDz#W8yIe|^EK4p;NW}AFV?|)gG0Q7rJui(e}?cS R4%v^)3;P0svG9Gu;3H delta 152 zcmdm{x?Gj#G%qg~0}uq?|CY9qN0Zs0TtBopwWwG>JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Z#miaR~W8CCI?qrV3{GOi}L|A1eU*|4k2GW}YdF&Xq z)q%!0Fx+70YpB1$!S{e)>=Oect6T^34G!@RmVW+D{u#oTIAlLE0|hs4KQA#yKO;3KC%-(uC?{nzE3+9h0K+^QApigX diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc index ecd0de1937e508b3bf621b312c8da2e7f242e23c..18d5f62402897093fa9de88e5fc3ebe0e816370b 100644 GIT binary patch delta 99 zcmcc3^_h$3G%qg~0}$9UGNy0jsbuu%(hn_8Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tm A?*IS* delta 75 zcmey&b(@RlG%qg~0}uq?|CY9qr;^d2NI$eVwWwG>JFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{agEaNg}0NMK+iU0rr diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc index 9f8ee4baa4fbab5de37e61813ffe5389852c1209..e00bf238fd06f9aad78d3e2c65724e936f7b0677 100644 GIT binary patch delta 99 zcmaE*(4@$7nwOW00SIgv8PhlNyk+<3(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{aAk;9P#0OBzk>;M1& diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc index 47825add1c41c8570b39bf7726d90263804b0fd6..b17bcd966c138de4e86876e5939ebc617f3d9085 100644 GIT binary patch delta 139 zcmX>gep{U9G%qg~0}$9UGNy0j*}>$|s~=jNT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{nz53>X-SU)8xu{<>^QQsv$ximL5ucTPt zHKjB;u_QA;Pd_+0F(G-; zd9&Id@tX=(mwBu&Dp<`h>RLp%tU>c)Z*-t z`~v*~piF*VVvc@BYEDjmd45q&%I2jks!EJflTWMt5xk*bb&bb*hG9owe|TqjZ{(%T j_tXVBL1Xxm)DJCAEh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#?>~F>4NE$m9Sv9gfT5W}g@sS>-3!vxzYS>CH3P-spPy z08MXTc*4oskuih$GN;T31{PMC1&lXDL_aYwbINqMJm8m_k#dP&>4v!UcTS)jSiwgo Xpxk$65SNF6NANo@khS@cNjMt-w)Hst diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc index 7d3a1f0968ec6fea051e1172ec14947a4111404f..c028c12e645251d60211b9f98d181c0a91d9d4e7 100644 GIT binary patch delta 204 zcmaE){!E?cG%qg~0}$9UGNy0j31Re@t{+;QT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8k1|Jxu-Zy_nhcCBW1GxRSuO8%s{ElPuN2^87EJ+6!c@hEhag+ zUocpfL0syi5Cf0M2Q~%~iRl&-EoOKwD7q%B)!}?wPH{4)kTyGmyb@5i$YyJy<%|IM C@JFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{Y~1*07+qu1o;Y#+EjurUZqePUo_Rh@i?U4j`%Z~o36 z!pXR3vX7u2#|<&bPYfKa%9G~`2CD<k|Vzr*?<) c4LQY63~apGlX-=-*@5&2W_Hfa_Cm`U0g7fg)c^nh diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc index 28ce02425c8640c9ba234484f0bcdfee95ab90f8..f6d0fe0b7dcb90fa57af073ad4e4986e8a00846b 100644 GIT binary patch delta 151 zcmZ1;vL=M*G%qg~0}$9UGNy0jkznV83(o0khTNCE)EJFzG+PcJDWu_QB5-zBv;yClCr zzW^wcpO=`UpOKoAlV6@+l#{YKhjl*}#r_RxdBl diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc index 85ec6ca196b56711ae9ad05a77b2551f7da8ad16..f2a8fd1d046bd2e1db37b6f1028973f31f8adb14 100644 GIT binary patch delta 99 zcmbOhzAl{SG%qg~0}$9UGNy0jQR4UL(GM+7Eh^SeNlGkF%}UgF$xklLP0cGQ)^|-Q zO-?My%+J#gPEO28EmCkyPE1M7tJFzG+PcJDWu_QB5-zBv;yClCr czW^wcpO=`UpOKoAlV6@+l#{Z#jNd{A0L*Y2wEzGB diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc index 52db13cb7bf567b5b254ea4b6e6e4a07b03f56f7..7309f5e88b08ce2d17f819893433d8adf5bdce32 100644 GIT binary patch delta 333 zcmX?BeWjY`G%qg~0}$9UGNy0jIn3qJp&weDT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKv)Hv32{WR?^KE18fwJ$qvI0>#OB*Tu9hifLUD z)7i`+6UE3VFgaPaocS8B>g30=%|Kmho3rHfn53tHbv@u0?yu^snxWiX-{5hBm%qX7 zv9R>y9SZu)3?ed{Unv-~FzRoXQ)OZlKEi)lF5n>lhSE7TD_pP28y(=kxLIGVh)G5g zXwVCW9}Nr_gbh}jEJ&QKQA#yKO;3KC%-(uC?{pHI5)3U1JHy9h7T$X{K5_HHv~i)Ja6y{e_~)~m71(0 zVZaQeH^)mXWM&kf%qSzudRa`Tfnl?xOcWzfphUKu^D?jMCk9T|aK_2+WSdz)jLju- zdQ1wl!Nxw|7w)g>teTa^qGP5=JyK5ER5Qll~tJ- z`4977lMC2TI;UoZ>s5K9OPej!ikPG&fF`|Q_|d>{N!VaP;uPl@jFa7FBv19dC~UC# tn1%o&^9qwIn{R6N3o=Gd&a~ddw}JbbjLize8G#E#XGdPztZTEJ5dc{-V>bW* diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc index 4ce0b8965f183e9244a453fb3b2d580afcf33a42..2f93bcec74fe1e6355f2f9373b89cef176c9204b 100644 GIT binary patch delta 99 zcmX@6bWe%rG%qg~0}$9UGNy0j*~IA4sUKRLT2!o`l9X7Unw6;UlAm0fo0?ZrtnZpq znw(gYnV+X0oSc}GTBP8ZoS2fDTdD8kKQA#yKO;3KC%-(uC?{nz8&d>70OTPWzyJUM diff --git a/env/lib/python3.12/site-packages/pip/_vendor/vendor.txt b/env/lib/python3.12/site-packages/pip/_vendor/vendor.txt index 5554c38e..fd926906 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/vendor.txt +++ b/env/lib/python3.12/site-packages/pip/_vendor/vendor.txt @@ -1,24 +1,18 @@ -CacheControl==0.13.1 # Make sure to update the license in pyproject.toml for this. -colorama==0.4.6 +CacheControl==0.14.0 distlib==0.3.8 -distro==1.8.0 -msgpack==1.0.5 -packaging==21.3 -platformdirs==3.8.1 -pyparsing==3.1.0 +distro==1.9.0 +msgpack==1.0.8 +packaging==24.1 +platformdirs==4.2.2 pyproject-hooks==1.0.0 -requests==2.31.0 - certifi==2023.7.22 - chardet==5.1.0 - idna==3.4 - urllib3==1.26.17 -rich==13.4.2 - pygments==2.15.1 - typing_extensions==4.7.1 +requests==2.32.3 + certifi==2024.7.4 + idna==3.7 + urllib3==1.26.18 +rich==13.7.1 + pygments==2.18.0 + typing_extensions==4.12.2 resolvelib==1.0.1 -setuptools==68.0.0 -six==1.16.0 -tenacity==8.2.2 +setuptools==70.3.0 tomli==2.0.1 -truststore==0.8.0 -webencodings==0.5.1 +truststore==0.9.1 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py deleted file mode 100644 index d21d697c..00000000 --- a/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py +++ /dev/null @@ -1,342 +0,0 @@ -# coding: utf-8 -""" - - webencodings - ~~~~~~~~~~~~ - - This is a Python implementation of the `WHATWG Encoding standard - `. See README for details. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -import codecs - -from .labels import LABELS - - -VERSION = '0.5.1' - - -# Some names in Encoding are not valid Python aliases. Remap these. -PYTHON_NAMES = { - 'iso-8859-8-i': 'iso-8859-8', - 'x-mac-cyrillic': 'mac-cyrillic', - 'macintosh': 'mac-roman', - 'windows-874': 'cp874'} - -CACHE = {} - - -def ascii_lower(string): - r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. - - :param string: An Unicode string. - :returns: A new Unicode string. - - This is used for `ASCII case-insensitive - `_ - matching of encoding labels. - The same matching is also used, among other things, - for `CSS keywords `_. - - This is different from the :meth:`~py:str.lower` method of Unicode strings - which also affect non-ASCII characters, - sometimes mapping them into the ASCII range: - - >>> keyword = u'Bac\N{KELVIN SIGN}ground' - >>> assert keyword.lower() == u'background' - >>> assert ascii_lower(keyword) != keyword.lower() - >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' - - """ - # This turns out to be faster than unicode.translate() - return string.encode('utf8').lower().decode('utf8') - - -def lookup(label): - """ - Look for an encoding by its label. - This is the spec’s `get an encoding - `_ algorithm. - Supported labels are listed there. - - :param label: A string. - :returns: - An :class:`Encoding` object, or :obj:`None` for an unknown label. - - """ - # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. - label = ascii_lower(label.strip('\t\n\f\r ')) - name = LABELS.get(label) - if name is None: - return None - encoding = CACHE.get(name) - if encoding is None: - if name == 'x-user-defined': - from .x_user_defined import codec_info - else: - python_name = PYTHON_NAMES.get(name, name) - # Any python_name value that gets to here should be valid. - codec_info = codecs.lookup(python_name) - encoding = Encoding(name, codec_info) - CACHE[name] = encoding - return encoding - - -def _get_encoding(encoding_or_label): - """ - Accept either an encoding object or label. - - :param encoding: An :class:`Encoding` object or a label string. - :returns: An :class:`Encoding` object. - :raises: :exc:`~exceptions.LookupError` for an unknown label. - - """ - if hasattr(encoding_or_label, 'codec_info'): - return encoding_or_label - - encoding = lookup(encoding_or_label) - if encoding is None: - raise LookupError('Unknown encoding label: %r' % encoding_or_label) - return encoding - - -class Encoding(object): - """Reresents a character encoding such as UTF-8, - that can be used for decoding or encoding. - - .. attribute:: name - - Canonical name of the encoding - - .. attribute:: codec_info - - The actual implementation of the encoding, - a stdlib :class:`~codecs.CodecInfo` object. - See :func:`codecs.register`. - - """ - def __init__(self, name, codec_info): - self.name = name - self.codec_info = codec_info - - def __repr__(self): - return '' % self.name - - -#: The UTF-8 encoding. Should be used for new content and formats. -UTF8 = lookup('utf-8') - -_UTF16LE = lookup('utf-16le') -_UTF16BE = lookup('utf-16be') - - -def decode(input, fallback_encoding, errors='replace'): - """ - Decode a single string. - - :param input: A byte string - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: - A ``(output, encoding)`` tuple of an Unicode string - and an :obj:`Encoding`. - - """ - # Fail early if `encoding` is an invalid label. - fallback_encoding = _get_encoding(fallback_encoding) - bom_encoding, input = _detect_bom(input) - encoding = bom_encoding or fallback_encoding - return encoding.codec_info.decode(input, errors)[0], encoding - - -def _detect_bom(input): - """Return (bom_encoding, input), with any BOM removed from the input.""" - if input.startswith(b'\xFF\xFE'): - return _UTF16LE, input[2:] - if input.startswith(b'\xFE\xFF'): - return _UTF16BE, input[2:] - if input.startswith(b'\xEF\xBB\xBF'): - return UTF8, input[3:] - return None, input - - -def encode(input, encoding=UTF8, errors='strict'): - """ - Encode a single string. - - :param input: An Unicode string. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: A byte string. - - """ - return _get_encoding(encoding).codec_info.encode(input, errors)[0] - - -def iter_decode(input, fallback_encoding, errors='replace'): - """ - "Pull"-based decoder. - - :param input: - An iterable of byte strings. - - The input is first consumed just enough to determine the encoding - based on the precense of a BOM, - then consumed on demand when the return value is. - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: - An ``(output, encoding)`` tuple. - :obj:`output` is an iterable of Unicode strings, - :obj:`encoding` is the :obj:`Encoding` that is being used. - - """ - - decoder = IncrementalDecoder(fallback_encoding, errors) - generator = _iter_decode_generator(input, decoder) - encoding = next(generator) - return generator, encoding - - -def _iter_decode_generator(input, decoder): - """Return a generator that first yields the :obj:`Encoding`, - then yields output chukns as Unicode strings. - - """ - decode = decoder.decode - input = iter(input) - for chunck in input: - output = decode(chunck) - if output: - assert decoder.encoding is not None - yield decoder.encoding - yield output - break - else: - # Input exhausted without determining the encoding - output = decode(b'', final=True) - assert decoder.encoding is not None - yield decoder.encoding - if output: - yield output - return - - for chunck in input: - output = decode(chunck) - if output: - yield output - output = decode(b'', final=True) - if output: - yield output - - -def iter_encode(input, encoding=UTF8, errors='strict'): - """ - “Pull”-based encoder. - - :param input: An iterable of Unicode strings. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: An iterable of byte strings. - - """ - # Fail early if `encoding` is an invalid label. - encode = IncrementalEncoder(encoding, errors).encode - return _iter_encode_generator(input, encode) - - -def _iter_encode_generator(input, encode): - for chunck in input: - output = encode(chunck) - if output: - yield output - output = encode('', final=True) - if output: - yield output - - -class IncrementalDecoder(object): - """ - “Push”-based decoder. - - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - """ - def __init__(self, fallback_encoding, errors='replace'): - # Fail early if `encoding` is an invalid label. - self._fallback_encoding = _get_encoding(fallback_encoding) - self._errors = errors - self._buffer = b'' - self._decoder = None - #: The actual :class:`Encoding` that is being used, - #: or :obj:`None` if that is not determined yet. - #: (Ie. if there is not enough input yet to determine - #: if there is a BOM.) - self.encoding = None # Not known yet. - - def decode(self, input, final=False): - """Decode one chunk of the input. - - :param input: A byte string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: An Unicode string. - - """ - decoder = self._decoder - if decoder is not None: - return decoder(input, final) - - input = self._buffer + input - encoding, input = _detect_bom(input) - if encoding is None: - if len(input) < 3 and not final: # Not enough data yet. - self._buffer = input - return '' - else: # No BOM - encoding = self._fallback_encoding - decoder = encoding.codec_info.incrementaldecoder(self._errors).decode - self._decoder = decoder - self.encoding = encoding - return decoder(input, final) - - -class IncrementalEncoder(object): - """ - “Push”-based encoder. - - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - .. method:: encode(input, final=False) - - :param input: An Unicode string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: A byte string. - - """ - def __init__(self, encoding=UTF8, errors='strict'): - encoding = _get_encoding(encoding) - self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7480a18051aadc48f0b0ba0599dd908fec21cc5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12020 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 F{{f#Fml^;7 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc deleted file mode 100644 index 69ca3f99faacf619122c0dcd52d4aca05d4a8532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9270 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 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc deleted file mode 100644 index c4708f043ca16863355367ccf95384e694e61009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3314 zcmcguX>c6H6`t8ktMwj|z=sSn1K5riENu{RAPO;uWMfB)l318yIVPi>ku~z{?9wx9 zTfzYw1jrb$Ic=_Pb6dz@4s#p$3za{pTq!wIsmc$2<=0bcH~GP@^y}HRSV^f=Dyeks zzJ1;A_4U2)z1}}05;2LlfxrA?=uDF&eTSV|Ypg2e30abkNV=4jbXgBraz2m^$fyUc zU^W<#Zj|)UxTJ@T;7GJKdG2>A=D$`9 zsefRTGE^XnZn&ChIeh8A;tkWX*Hp4iek((@OxGZq<@D#!Qfq;#QbweXNQRV^IWYrz zNSDXuY>@v3_-}{<752j2e4Sjb%0DqN%q8~ASBvRx6%hJ*j*r&o-yoQ8Ot2Z6i40R zf_-Jj6`dJ}L)Bi?ayzvhhLb6p#f-Yku=N7T{E#G>dXjV$NBLopLB?2IAl2dbmh+R9 zQS6icoLV}QT0NaweQf*j&8Pa$q`JS2c9#*I|2?V%vmqTMSVHDNPzw~%HOn9BW}UJ=J7X3pj8h^nfswzkPdk* zTkRb2Gt$~5VnY^3dYf3|-||-)Imcf3|m>aEYPiZy{LG`#Fo|#dO}DY1|6MI{qzVvW-h;Ls38A zIR2k*yv@*bzA?Fs&z*n4b{s>o9+k^chzsJ-ShD^lOgDHTEDUpH!D}(+^3|`Nq;AZ| zpLlUzb~pt5%TH44?G}KPB+NKD5DbMQ4bjHfl6WGSYHDsd@BF39mak}CdBKHkt1eP5 zzU0!?Yu5f~UHY=i*SB|M_-lLRPd5DYs;ht2_48|fvGLmLuD_wXXVc~zw`~1oZ{M%_ zfBl=^ZX391`^~r9dRzAPJMO$o{hcy#$N`W5A99dl}d(z+MIR8nD-ay#ee^V8?+?0(%SC6tEM(-Ujv#u#>>v z1@<1W_kn!?>=dvMfqew*V_=^E`xMw`z&;0d8rT=Wz6ADFy2)!$RlSh&pQE9YTO#~9 zB0(f1Ry6<75tUBlq(~AZsn;mp?yWZeJ9X~4@?!XE=2R0$v1WLQ+P{>+l4' - '?' - '@' - 'A' - 'B' - 'C' - 'D' - 'E' - 'F' - 'G' - 'H' - 'I' - 'J' - 'K' - 'L' - 'M' - 'N' - 'O' - 'P' - 'Q' - 'R' - 'S' - 'T' - 'U' - 'V' - 'W' - 'X' - 'Y' - 'Z' - '[' - '\\' - ']' - '^' - '_' - '`' - 'a' - 'b' - 'c' - 'd' - 'e' - 'f' - 'g' - 'h' - 'i' - 'j' - 'k' - 'l' - 'm' - 'n' - 'o' - 'p' - 'q' - 'r' - 's' - 't' - 'u' - 'v' - 'w' - 'x' - 'y' - 'z' - '{' - '|' - '}' - '~' - '\x7f' - '\uf780' - '\uf781' - '\uf782' - '\uf783' - '\uf784' - '\uf785' - '\uf786' - '\uf787' - '\uf788' - '\uf789' - '\uf78a' - '\uf78b' - '\uf78c' - '\uf78d' - '\uf78e' - '\uf78f' - '\uf790' - '\uf791' - '\uf792' - '\uf793' - '\uf794' - '\uf795' - '\uf796' - '\uf797' - '\uf798' - '\uf799' - '\uf79a' - '\uf79b' - '\uf79c' - '\uf79d' - '\uf79e' - '\uf79f' - '\uf7a0' - '\uf7a1' - '\uf7a2' - '\uf7a3' - '\uf7a4' - '\uf7a5' - '\uf7a6' - '\uf7a7' - '\uf7a8' - '\uf7a9' - '\uf7aa' - '\uf7ab' - '\uf7ac' - '\uf7ad' - '\uf7ae' - '\uf7af' - '\uf7b0' - '\uf7b1' - '\uf7b2' - '\uf7b3' - '\uf7b4' - '\uf7b5' - '\uf7b6' - '\uf7b7' - '\uf7b8' - '\uf7b9' - '\uf7ba' - '\uf7bb' - '\uf7bc' - '\uf7bd' - '\uf7be' - '\uf7bf' - '\uf7c0' - '\uf7c1' - '\uf7c2' - '\uf7c3' - '\uf7c4' - '\uf7c5' - '\uf7c6' - '\uf7c7' - '\uf7c8' - '\uf7c9' - '\uf7ca' - '\uf7cb' - '\uf7cc' - '\uf7cd' - '\uf7ce' - '\uf7cf' - '\uf7d0' - '\uf7d1' - '\uf7d2' - '\uf7d3' - '\uf7d4' - '\uf7d5' - '\uf7d6' - '\uf7d7' - '\uf7d8' - '\uf7d9' - '\uf7da' - '\uf7db' - '\uf7dc' - '\uf7dd' - '\uf7de' - '\uf7df' - '\uf7e0' - '\uf7e1' - '\uf7e2' - '\uf7e3' - '\uf7e4' - '\uf7e5' - '\uf7e6' - '\uf7e7' - '\uf7e8' - '\uf7e9' - '\uf7ea' - '\uf7eb' - '\uf7ec' - '\uf7ed' - '\uf7ee' - '\uf7ef' - '\uf7f0' - '\uf7f1' - '\uf7f2' - '\uf7f3' - '\uf7f4' - '\uf7f5' - '\uf7f6' - '\uf7f7' - '\uf7f8' - '\uf7f9' - '\uf7fa' - '\uf7fb' - '\uf7fc' - '\uf7fd' - '\uf7fe' - '\uf7ff' -) - -### Encoding table -encoding_table = codecs.charmap_build(decoding_table) diff --git a/env/lib/python3.12/site-packages/rest_framework/__init__.py b/env/lib/python3.12/site-packages/rest_framework/__init__.py new file mode 100644 index 00000000..636f0c8a --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/__init__.py @@ -0,0 +1,31 @@ +r""" +______ _____ _____ _____ __ +| ___ \ ___/ ___|_ _| / _| | | +| |_/ / |__ \ `--. | | | |_ _ __ __ _ _ __ ___ _____ _____ _ __| |__ +| /| __| `--. \ | | | _| '__/ _` | '_ ` _ \ / _ \ \ /\ / / _ \| '__| |/ / +| |\ \| |___/\__/ / | | | | | | | (_| | | | | | | __/\ V V / (_) | | | < +\_| \_\____/\____/ \_/ |_| |_| \__,_|_| |_| |_|\___| \_/\_/ \___/|_| |_|\_| +""" + +__title__ = 'Django REST framework' +__version__ = '3.15.2' +__author__ = 'Tom Christie' +__license__ = 'BSD 3-Clause' +__copyright__ = 'Copyright 2011-2023 Encode OSS Ltd' + +# Version synonym +VERSION = __version__ + +# Header encoding (see RFC5987) +HTTP_HEADER_ENCODING = 'iso-8859-1' + +# Default datetime input and output formats +ISO_8601 = 'iso-8601' + + +class RemovedInDRF316Warning(DeprecationWarning): + pass + + +class RemovedInDRF317Warning(PendingDeprecationWarning): + pass diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02852c1df264c2513fddf871c7b3c1c16e067122 GIT binary patch literal 1376 zcmbVMO=}ZD7@keiWV6W@5iNc*NTC)?r%AO|5TQ2F7D`%@sIUa4>&}>NO?K<4bR67mh5 z@t8OTM-2cUh#(dbnx%<^l@LiQDNtjXN?ept3m&?ltR!LV1_mkbEfQoV`e}pQx=?m8v{B3wgIp(u*kVp zD9lj`F(AMUg)6?tNWBVMi(i2VAl6_#b_auj#ekw~p7CLKGuSlWg4hhFTkv2Ly9Nt0 zLglD3-~$&Mgrp+ptcg!Uvv9?2A{x+J`0`&acsY3Sskh8y~YrKP*~3&p;!@Zx;Yi4Rk3;n1jYl!xg9kpxa9u@XIPHZhv2$&SA##hO>H zJzgj-KDPtU^;*@B$&t>v2hDOmf+N@QMYoMO&-v@F-HtOK$q_Q2yk$>A8H7x{u;0iX zo0Wa1+mT)rvWn)6xe@1cAQOH-%3J|(grDO+IY{Y2b{zj-QSOaJ z2~tRS8BXcUD+tFRiBLXwfY8Mg1sM|FU#FP z#X8Uo#+qZU4Ix{hPB`+3ZH^GOlq3;J(1B;hv$hoJNBuAIdm=qN#d E0{!l6^#A|> literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/apps.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a450fecef0859d315e4828856c8c87bf113124b2 GIT binary patch literal 720 zcmZuuPiqu06i+fU%eLJuN~@w?#)~k58)|!$LUF5?Wsz1da|zibJDuJ6XENI|1#u61 z@e|aqAbu3TKpF5P2)zlTmtHiP*)0eL^4{;|{qoCud0)HTb)eTr2!lV`e>cHuIZIGI z*5Cqgz+nVp=tBq)cm+6G0B#BR#cFsyDs0cWGJyxnwSz2sktX9XU`@KQa2Zq&G`Ii) z_>co1ap+qd`8Kx}z;}#JxpgE|{!-FdoTYNwNR^vXACmFv^!!eLLX#kMj}DLDxHrda z^@@26>1`^kZfT>tfE<}F-s>(3;90{fL)Hb~%V-cLG!N5+s6yo;ChSD8sfWr|4U}9n zOjO!RMB_S8M%;C;Kj61YNQL=`o{0&?{glmOk>m;=@)@f&@iC*3knRDaT*L()4Ek7u zv}xeAOeccnSR|)73P(6A@{=^#?d?3nD$K>xjIt>Wgu?&!k7<^vURIQj6qFa|_y6-} zy*ky_g(@@9Ir!1utuz2buT{1QN%RjBQmzvcr+gL}+#%%Mj7H0hZG71|6>^j+QS)V2 z-~SBcrgpMpjFGO5t%16&%>rC*Je>D0x1P)gm5rRehHZ#L&nh=~J-MFgK$`h9659sd l$X>UfH%0BsyEF*pVgblEidk$PD6naEQMBko$^X&V*~)Mc=u&JK>qGq3_OkZNfY4P1H@-!Ee`9 zX1dEgNZRJ(T(^rG8r40HuwV z(k5E!hteiXX<*qF3}pA$yh&1*Wl>W2%L0*88HE=z>3J!cmSaL%P9^!pR9ue9k`k)< z23Hgb+ElNliKN!gN$F@tkw`R=5~X;MRsF*XnLRH{OQ&T~j7v)bk)YHI?b6bfbTlqx zmtmB^_|(*!(ed!mNce0t92q_{G7%Y5YoseNX%S~uVys32nmZszGHtCvw$9|31zKF5 zE$D=_mf~?4#9U$1#=$ZB&r5`5B4NB;^>;JVeJ({gj|X=cdNboSm2+ znwmHh*}^pkovPz>cxp(s!wIN0vLYvyw2+KRsvQ=gI;A8ILR{F?rn>Y^s17`31=*12 zA6@G`2PdrbiZjBJv>^13q+*!_tWoI=iy4hmdM9H-Tq68X40f7W?tSBpkzRO7jVuVs zxfHP3f)q>lO3BN;ae1b9aT(~7JQ6x|xL1+W(t$-Gc1f6%lwJY^h|UrrAuXlIrCtlG z0Z)V$m(^C}H!L>E8`X$Q0o`sm$j@7~?jTl5`VbKI--t-elbp?3`a%w+K4mLH1N8HoWUz@P#E zLAHY!*;UW*17Gu69bIrF=uq9!XcFiajjAu{k+2Aj%#_rv zbWLgF%s?&Q*5BV}gSPA>og2u^TNb6smd^OR0CN&epanj?lsb^kEXE~1HOucsHP^$Z zQz*i_mZJUB8n7vnN>3zUER-Bc3=@(fpV`Px zSTW@UUD&ik!OdjbtL)u6)gEZ1G(fh>Y`Ym>N4{gMSU;Y3k84b9B@i^yco8+}Ia7J=QR9zI3*i;+}Py2#73IEgukr3cy|B{mNWN5xbu8YOt31P`oI{B~m*X85O|j=9Qw3*zT~=yq@u?3UNbX`|CdF{n3_all)9 zp{P<44LKBDB6pRYc8X4rN*73_TWx|p$}!6U0s*rpD80~#pvcLwO6e5l1hgDH3IS@9 z-bIjBP|~7qf9%4dTqcvK^>Ei)e+%neXG$`eGi9=x#lEd?Z^f3gk(M0jS=3hxrsdYF z;bF8CZI_M#4cTRT8c&3#ob9$Q_oCwxkcaST)3S@4QMY1GqaLJb!E3ygo;kbG@_n}I z*v?BM6=S=M9zSGk5949dK4abm6zPftbZ{UYjL{d+OjIP%ZPczfa*k@W6>CI?;qCk( zoXQHf;sjp`Ikh6?xSSKt3C|DGB-6>H(Z15u#gKjM|HpbgrS)E5{$zTIxnjS-EU_>b z8XcO_sL-`HbN)1{Oqv$Z1XZM22dr;5tgm$5wdOoO;Jl611ijf$YEX?}(i9~+aTn1e zqMA$KV<|$wSev3jZHOTr{Jd~k0(B~ZBFii;f^R39!)3r3o8zA-b0MBT1A37x$%>@g zBt=)5CGAE~3n(ZaGbpx^Z;ctV(1$j zBs*Na)3Bw7ZXk3MolJqZno6cYGw=%da1bYCxlDTY!11gr4!&>lz@bO%K=$O*$JIun zWQ;H4qNTp0yylvUp_z@}*TSo?4QKYL81vm5mZNEL{zhYqL>7j!UBI)CN*L zGkr%z3H@BvsXzVaH1BzY7E@!adZv~aCGEB5JQ_Uh-8~~G1tliSDyJ2+mKhEUL4&T6 zIVY&fReM62(;}v*HZd#;HK;7AZi7Rp9nttpbN{HZ$ZBf1d|zdr#>+5)ate+c%zq8j zu=kb=+}I6YU%}T`^c`Pw{JXE|div(jjivRK8!LbIlUsYg+;R9`(~jTO)~}^M?7zu= zaN@qdDIXXq`on9(_x)`f{zC=-A@Gv@eR*%+{kn$hfe$a-Z2aKIwAqECf4WMuO^3&G zY}011d!4=C{^CY^Z=t>Sj^oZ-KX(<|k8iY}EVQ5e9A3w-dpF$--?PzvsL&2`+v?;iVZyO9a(dC0KeH?*hN{@TahO*=OF zUvPpNcYZQ(x4ZxEj{oY!FHhusuRUaJo?~?V=ZgOG)z;5JgGb7Kpyd~h-NQWd#qs8m z7UtLd!I38WZyIdy{u@7w?@e}mZy9ogciJN{^rMV~!bdILf5D5@(is+N0mZ8#tG89$ATM!vvk0te?cXS23gET&+bNs196=f{u_T-kNVe2*0yE zrylpg%A`AL8R!D^P%c9TlI~^db``yC8{Yi|@BUlo?|EBpx;Hudj+(Vv;QxlUg74)| z$MU|HZ@mj|YmNuCzO_M9xc_E%{^*;eOw{c0ZM1TI>)eE3iJR3Ij;2it?hc8qx_8b=18%+X4zvMN-&h8?c7ymY1qaK>!QLh-jlK#h!iF z)C1LAEet-5INjK2ECXIcG7VnCJVn>ysku3bTfrki;VUVNXYiy(VR?w8xBz1k(g2RR zfg>rVM@FDZ^-4+5Loq2D1BCN4yT#UH&oTr@GvOUokF8A1GuZQ0$UwB~nT8$Lmo|2E z7j|^tYPl0A`uf%!-#WoM-aPtOC;t2d81Dye?}q!ig8R9f-FMv`z;cbvPZUzrJ5)&j z5?)Y9ufkbb!Z0<CwNs)xw3cGqP6;!N7>wM7zw~*3TXT57PSmCQF1is2FbR0`NZY zNRZ3EZk~KtqcV@s7XlBmsA17)1B_Eg#}2@WGGwWA)@9f+Y@R`Vu!U;`=z}4s05r|d zYRC(&L`UBIVkVJTjv~rvAQjmY)sNB24WYq!3II^$MCkGUAHwL=K?jZ0w1a8`4U)+E z=oU3+b%1|S333#OQ+?o=gEOrd?5BE-g3ExbYaVYy3H;Eo59n-SN#rcdsd50E#4Ztv z>!E;CBc$1&2>i@GfjzDJ`eR)C+mNj?58bS%bsIQtXMSf-vEjfP_rP7Z;eNj0e*Wg% zUH6`QjV&9EorT8EPseUe-8p=R6dMQDoWHGY{2jWM2MYcJ`OwMF_Y^|oMgK(JJF&?z zUcW{Su%+d=iKdOIBF2?gVkWO)8D@*{SB{x9fY$A*<6hIXE;g#JbeW>_TBB4DQ=A=I0~K6>ERK^M<= zKxjD%;v`)WaJd88Jp}Sc+0X;L)*OJm*<(WN_>p6xaP;s@|FPM=Lr278$NP^T>YttM zKl0L%V-Vo>33MeYM>|EzgwS*tPEoQ~cNhN1TfKY|Z`a`VEn!<>!CKI(mk5n}gDgSc z2oQCSUO%br-%Wn+CaW`HwgFoz>R^t_xZ2f{r7x0I<~>{ViiV zbbzfiwi%NAkg+|~$3OtB8gORp608@qu)|nI>6tS_tH*$_-2gO|*5)+M@Q19;1e#nL zPZPwJO8^e#-lqaM52U}4{2ao>rJec{5saB<(*mpjIO ze=udT=%1ddI0dV zat9O{qarQfc~>MrFHA*I4c#ayoT`Y3y(+p+5sgmVTNR82@Z@$7^JksaRB47Xc%L;z zoQsfA*bfB1c94f`eVM?82pY#=4f!!VR99*SZ-5oG9`1_a1$;q(R3(w1x>3C&DM^6~ z#qbpwEPFXfL8qV*OVFXYgy;d0Kfp|YOhF@5k{Jz-c$&;u;fR00LH+_Vuzn4J_4*t2 z#Rh(j0~F9R#@-7&w|@G@>5ag_Lg3(?mSW)eMqscI82lWd#=&AB3=9o0Me|45YuOE7 z=a;_DC&CZS>oqrOZie%4vFYykZnF-0ZTNN& z?wX0KzD!dDF|m z&0>8Mcl6=D8m@DzmF3zrd;+^y_mnjvmA-qxdw%0~k>2vRo`nxR(h{O<nW=CT5w^#oHrik+h4DJLx3ba$Q65~TEb_~#4B?lg8Td`$Djlz-7bOB=V4`A- z9{5H^j?II&8;{e`Z~*jrt<%D{Co)MT@%Ej5?Ig^^r4WB1m7(4Eqy+9V%z)Q5bc}A1 ze!3Du*pbLH)Rhd)z=tZ}Su3H^mQQI#=$zw%XjpwNfB4?nu3N-R!iGbxiQ-+S9kyc)Y3@!DpPse_- z<5z9JY}@FcDD+SKW7ogz|EK-M{_}TzZ?8FiTkE?%vL5+3g66a9`e5GMzG-KgJJ*hW zZ-|+|MbqV@bEruIf(1l2vVVmaiYFQ()ymZGS{>bT*g0Nnk4=NkTF817yA435HdSFC zZ6;K|YKvZ-Fh7zDA*w_$PFGv?%1m00E1@(Ik_uj@rIG~AwT493mq$AE11`-F;68z0e6lpfR$Dg18i@QkI2p5m?8TlVR)sjq!cW41UGD z^cBDWw~?*;mVs=0?{W537I1=X24A)>vt8_KY`!hD e&EU&+gdJqtXf-^y-(&qOpKm|(-wZq{P5%$cORoq3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/checks.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/checks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2325f92b4e2bc9ceef0ea0a5ee5a1ed9970dded GIT binary patch literal 1225 zcmZ`&&ube;6rS0YC0ViZ!!B_TahXF2Y)G_88*&N-5!Ko8BS$6R|Y?qAZLk{%qELJFma-V~fuPJO$UQ^z3>=FPmBH{bi-do#b+>otP% zl+xfgn~=YA<3!Ldx_Avfq zdsxDQGol>aFQ3^&Q?ER>hVvipn><1xzU`O%xnIi%v)oUzz(`h`IF**N(9faS0#8I& zgE2^5@9upsM{K~yz;pth=nL=}XFl}#C^T%Vd4H|j-sr5cga;z#M#z{c(5Bm0Jc5Z- zJ8TAZolS%p$dQ==r3lY>s3pR!uB|s8ZfwHw;Q{!wg>PoT3@P< zx-y|zOUBS(8!<~1jD;L&HU_1Ul4fRr=M%2k77w5`ih7`MHDio-`YgpfCqfUHk$FH7 z!>R0oQ1*Bjrff10p*F`3c>@2Z-StAQHN*TlOF-Qi3z)DT*BCd4j(Ezn2qE_1n2a|7 zZ>O=l^nSG(k8a+)fDi`ynW(6)L2B<@9_x?xw|U8Q3SEk?wUXHiiW#w zkB6XG)8jrwsk^zk>f%DK4tX5NEhUHG85iQQ8;YKrr1%QrFB`YMaJ4XSBjMf-_C&ky zXXzI8(Tya{mQNK~r}&SeZgHp3+>vUSOFMmg;Rq~1R=0df8{*7ImuT3wLg~k1Eju48pud3vbrau1WV8pp)hGd=NF=ua;HnE-d68M(jSHJm0CtK|NHtH rs;NyWeMRm(CwE?#iB literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/compat.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ab6fb5d66c5092baeea3f098a7dade2bb216d64 GIT binary patch literal 5781 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 N<9g432zc?y{s+g8$M^sM literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/documentation.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/documentation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e67191bca2cfefcb7f903f2843159960ce29a4b GIT binary patch literal 2304 zcmbVNy>Ht_6hBfF#ShuCBY!)I(*lOUwicTNMT<5q;8<>B!*znlUerNg$g@mGl!QAf zsZ$2<(81lZIYWnxP3<9L|A#ILU?9XHMTd6jQn;{z0GaxZA}u>;;3g;V>D{}>r}y6d zeow#l^k@jy4}wtrTSw>*zDZVe0-J+g0ikW=AV;VnPbdqXSQZ7o7i%d`Dob9voc83h z9NAK}jHi?pPc5s_UaD!HUe-ZR#~;~AV+HH$BgqeSzri}z-6finUe%n;_d>b%?PIK} zjsg*KZyzDbLWLN88)-xPizjD@EaTSgTFb#qYFhr9kz#$b4T2X+*OzYMx`PQOY_Qm{ zTOO|amhU#|N9Mkgy@ow&p_Eu4TCQXJ3fD2Q{03pUD)uWha;)5O@m)h;S*z(*DE57~ zUZqRRc5+QTp)5Qpcn+?C*hYc6ne{>IEMH8ts(4@Z)5$JCff%F$Ay5M;NC$F|36x!7 zCyrY}kHsZJV`<;@YnY{4q{cEJ>_&Z+=?N;fWI!#AA*0aJ>%%)8Z~c zY9z<4XSm37F~G$j7eie1gP^>+3rFkambpSPp{8@ox{KE>Gr2Nq&N;14YG%o{YM5M@ zu`LIC8|LC-(FCPYT(|1g#tqU~$F^_c`W>_8-ZGmT{#v7cxp484NnIaLH!b_NRmIdK znEI7fVtM#(gWNWqlh5u0;IkmpA7RN6^sJYdyg&uMNqYOW>yVY~6e?`snPQQh2Upx4wB;`02Yn z<+J^CDl2am4;7TnKPWzYubrQKGPb8*X-iika2owEFr#Tvh%)8fiu%SzPELhFGD&G? z*hOQHV}=dA;@IgGB?=G4amj{X^@#r|2%jSCd~xo}nU%%m%FN30wYjC``PrG}`RhxS z*~OVsX|BY^lJgsLH@}`Qm5!YqyKCO!$0({Px`vm^6|dp6YWNE>4M&`3^hXf;DM1i^ zN0TokQ4s$@AYRBwC5k8Ny{};?|G57!g literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc4377a203178a935a3c2e3c4f76a0db0b7cedfb GIT binary patch literal 12438 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/fields.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbf9d47b3e26cce393c98a9c333f4d2ad73cd42b GIT binary patch literal 88349 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

      _RQFJX45+>p;Xy}oB(05N6NFW5RBD$Y; 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⪚Gty3T|ZzR%~Jvb`E>4(Jn%Qc&tyV$8{PnA_>}fc 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/generics.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/generics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b15b687bbe34196877f490755dfde22a5a3dafdf GIT binary patch literal 13232 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/mixins.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/mixins.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ea380e8dccc0c085089046f3eb29989770e2684 GIT binary patch literal 5448 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/negotiation.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/negotiation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f006907c07d7f08f2dd44c16d50d2b7ee19376ff GIT binary patch literal 4792 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 DjXj}} literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/pagination.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/pagination.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad62d8c287af6b21cd20b9413ebe2a2dbf36ef35 GIT binary patch literal 36069 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
      g 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/relations.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/relations.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d68495f70a023d60d3a2acbd18e3f0d79d474889 GIT binary patch literal 27360 zcmd6Q32<9Sdggn$2m&BM61-3FCUuaqOq~{OOQKFolt+^7G3Njw0;E8J1m`_a5+Tqd zPbm{>qKT<-c13TTn2wdT9D5TwnOZwryBph^Op=;p7ck@@=S8kK6<2m=lS)w{eZ;d{ zyWija4gdt@q_VrU&t{`vzwUnh`uP9vKf3kff&zzt>#8V@e0ow4{+e#I%c@3Jek2OQ z4Iv-|#IP{Hf5ib2_olFE%sgNgDa{+Pj=2ZiV?_f+W5ol-EZrV18S@Ny#!3fD*?oSvY^;2sg2f%-%CV|} zsam)Enz7n}+OfKUy0Q9!diLBIZW!|pcv;*PZX9bGXkzh#aPwHpKnvo9SA>C9 zlW<4~xUUF-qF~$WX8xrE?JTtzsU^V)WvNX_ZBEPk zAWLmQYHL~>dZxtAwx3Z``#VL&;g3e8kzh0$lyGOA@Jn*A)1;Ih8JmzI6G16FwLdaG z92%LFf&r!E#F^3HP_!=+l=~ym0~bSb6ovAR`^Wtwti1gzlR;_fR503UQ40GbCxhpM zsPDKxI&@ZXo(#&7FcNyU^eDx6rB5D`LK9KngcKYOT~zWU{v2=5m&g1Po<}9cF)4+7 z(TFc3h43mDYw5+PFYJ#^b=nl`!B8+9Q1VZm3r+B-H8?gAol**@e)_b~naOBSDGA9w zIW#sA4*G`t;jsTqIHZA{vT}%k&u%Z!NvXKN0fD=#5TaNb{ECZlL7NEE=CpKkK#ZHU0h_kOEosk8MwwA{5^43(@1%H2=rqN8 z99~>~K{R_TG#>PZhP{68STK4v67Zh&%ic4=;J7z}4wgcJKybW^WmoJz-|*!4kk5yH z%|owHr%2VPwbQCNd1>Fce=Mk2&xQT6tk^^2a@0RQ6jW^dsZtmS4*Ms=Q6ImT>D#F# z-Y>3nKOtj)y8~zZ7lNby?!L&-}XS+|K!-JA{?~p$b9GmJscC4=( zkx1XDe|#kJxD=rY)g2r^-yIH}>7JOv*Ni{d^}yC{8N;)A!asBlQ%ml~+=%*yCA9NG zL^_AtFsohenwV0G)vqu}M{rqKwF`x1vro)DmMZADeDF?L?c9^|0}JJ; zvYnUvmz-5MD{fUTJd|pDWU=vZvhi@jc{pJ?yn>R#5Cz($jqyqmQf>%Afr#ILDIgA* zr%at@rHHSNC;j2c-~maBNU?v#hTx<>BnJcD3uiGrgWsYBf~nPoq3Gxw^bY$&VLS{> z2EEaU*FWx^91qZ{!_4yz8dVMQ(R@nsPfXAwteNxF(O#O)lrR(t1QCo6Q^(*wdNw3` zFNC6JQ6cLsyaY2NBFVg_{?{xtHE860KE>hljYR^JSROvb<@0@O(jQiz7HRy)r_kN-(M=jJ_kdTK)LxEKDJ9jDjyf4<+OHv0ID z6c`=SMYj~Np4p^7q@;|V&{p@#9z6NQtXVW842uEN75jiCU&f}2p7eHe9!}%l7ATeC1Lc>#r~M}*Iq9uCJlZ#bS~(PFj|d?;E#I!fk22>BPPof zqZOEFSnQFZkUxrvL1V2>u%LHR##E%)GaQk;XSG)#*Apj?$-KHT|CCn>(nLiqUOy`z zz+1=9v37*Uy>euXO~+{PVpQJbMNR4XC>@L498QM51RwL-^}6XsiVvZN}dUE#iM6 zg398TUso-0;rpONaUm`m)HZI4n|)dj3vu%);We=z3)3o3qN5Z{`4%MA!VzbxD-^jsae z8krlKe=t?pK4V@gDVs50%Ug1n%sAL&8PZ4y^0QB4pSJ}!87xG2UCkF4ad-Qfo51}0EcBz+MZM0dUg%K+>8cN@`oAQ(( z04a9}XkgEco!58%(saUJ%i4Cj(;>CvvD869Cj}cQpfQskL7><5!R+hSwBiNLM))ql{X{!{EBebWU<;;9cHWNo

      @E!zZJA*I!= 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/renderers.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/renderers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc03bad1fa117d2c2485e9c769bdac999a4f2919 GIT binary patch literal 46585 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 ZW2NTD);RiItF!C&Ewuet4nGWK{lD{phbjO7 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/request.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88cffb289101f32e34527cfc32578c6f6e99e272 GIT binary patch literal 20847 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 IW(W7b00~~rBme*a literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..780b1f225a6dd2c1f49e73da5fd88d0fa36b0036 GIT binary patch literal 4287 zcmZu!U2NOd6}}WHiTd%c>?F3EgmIkMYHewCG89Xbt!~mLO#?58y$utVGBkN@(~(H^ zlCmR}!n`fOlp;f&0YhA%So63cd&t8c`ndPK$Z&wDL?05YedwDqw^-4a?Hp31oh;Yz z)%`j5-1Gb0!+&;lB?+`!9JlnOi;#ceBxupjVCPL3+$9<*5RKC!MXnSnL^vGtMZP2y z1aB-9qor6O#*qj)PqgSwqQ$6ipZ9qb;?;OotbLuFU#8L(YL!jHqLNxvEKAZ2>B?Jk z^U@+yN_5R+*CpMOEWM-`6(-rHbYXt}a&Tl)qBm4pwk3O6v6H%uq`INox>D3@RFl?p zds(U&j2aqcFxM1YnFI>Urivz+i;^Oh8J!CEEt~1aQZDJqrIgFeEHhoPsnnrhc!8=E zi^!{jw9>g1#aJ@OEy<>(a?z*l=;I&q7=Dd;E#~(f^O2nb%zqC~prpWoBO)4C;1dM@w0MIof?IAT3WCPpB!wuAX~Io%zr&{x zhdH<-oQocP?50>qG{_CEkenk~(G>$}YFCpIv>8LXVB6(j)ibyRhA`K_;rSbK+oe0*Q_ z#E^%;4mrX~CYbO31|~g6u0j_53S_K{^@Njfh$Ef`vfF8aRJkgb6>9(Wl=lo0I$gWAtH~?`dCamEyJFSsUz!!E45<%ErGR`vH3 zhDs&HkFQB-p<+YAnhVMTh*hGB0hw=lXW{nFIZe8jL#3}tV6AI85Zh$ea*)B0=@u9k zq%)0NHt9yKN|`cOlw~x$EW1hFLet@u3no;4VQZ;|+ z(z!egOdql?GjoNicAgrm`J%p%FIVkl(>RfPbvkc>cMrc zTxBR!tuFwDTwuuoShhZZ?z?sJ%>YSs-->UE2Q~-pEjGmi55=i3Q-d4YCl?>4#@j-q zZ?eskuHJ8wBy;3mX1o7bGkxswz=4KvJJCA$azl714!4FzVcOk#X#%H1Pg4D@!^c0Z ze_a3bukWNbgbms{I0`@We@s5*iIfL^>C6sXPt;DfYUBp|7?pfj2 zktVihg*dzxN0@TBl@7eZBy4p7))AneYjuFil@K_0H|sGcwm#@Yf0NO~l@Ne;_Z`8B z1~6TZ83Is8905;(4H6wWFutB^a9jGhC73!9hYzh5x6#dBbK*AUm)C;Z*sv4z?2+7~ zef&j$4ia`eGe?}b1y6*QI0GXHoYbt_r>IzaP)!b?)XjuTyKw6E2HUa+4>#=E@mxq3 z>`8`cdkAVm`P0d;+Qcs1F25I29?J!cf=gaR=88e`*1A8azb>iE3Io(W^Fh6qKI=o* z)I7WZwVwps05yLl{-MpWrZoNF+;;zu8u2GR`gdRRF$+K6u?x5Sahg9jfCPHYWMG?K0U;YaqP^^f&t_Vi~<+ud(B_%8r@)lW`5Odb9_Gu$S8S9d$Y^&Q>eVYKmD zTOtl9jpf?Zg85r{zYz5qfrE=WyC ztVnGwtTC>5!Dm4bDi-90O>fweYC;`?FOY^c2fY4fg?ZluK-HY@<-MfiRXjhj8^5 z7)B$|!6TR^y+a?>Z`C*FA03?9Iym(gw%s$`6sQ0HX+Qz+f9Dc(&(**HKv)9@uvO^t+tZangC#aj2W$*%;lge^d@G&6j&0YRF zt+E3^WnnZyj<0*qG&=*c+FAY>AM;1C6xjv21J>+S{{G+(G$>6&se1vRpE? z3aBEZ^zT=cVrM5V%bKamvR5xL38ZjE{I-PJvdVq{Q-+Y^iSKrGN)443i=a5?>xqH) zhOZQjqp*iog^>kT2rsK@+ZEHjzo|C`!pBLv|}XJ{WNkon%UuD z)W%W!P0m}4Mo)AWVf3Hwbab#ypz~Dpu9yYzJqtIusb%>1%lRJlbL4>LefZ{rVi-`= zPd|n}afe~Lr)tcFc~^=d-1eyz#p@BU=4M)Ftpk{$8k?1QBL?a cO}Npo$m?H`SHFo}<+#CS&#`X_4m>XZ1565u7XSbN literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/reverse.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/reverse.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a65ac9ff3ede5d9d6a4f3556062edb603b9edbf GIT binary patch literal 2465 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/serializers.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80c30c1a7503618b798c1571d17175b4730ec919 GIT binary patch literal 68678 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 I;ivU~04l^NB>(^b literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/test.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/test.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4885d6d25a33765d092ba97b398e72688e56c4b GIT binary patch literal 20039 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 Px=(A}_XURpBfS3&(>PvA literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/throttling.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/throttling.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f6a693a2e81c5059f1845ee97c4655ccd4b5a77 GIT binary patch literal 11199 zcmds7drTbHdY{<`EV~PfSp$iU?Xiu4#RTFZlmJU{*iJ2>uN>B1^rvvF@3jYUr4 zMmUL=TnT=J$GEDF)k)uokLO(6DNd?-nUkt-xeQJtHLTBv zz8bmamfP(0vtB=X1G3-l4Y1xIdTUF1gRHj>y`hrc+N>*5pKJG@Q_@%BlB^0>L?xci zsDd`3q%|!OPmK#x=|nshm(_0nSM=PW2(No%Vr)W2WAi|AN=Z-2N+NqAof?aeXB1gN ze^8u?M^#zVz(9=|(=}?|ytuaujYUr8uqNDyOX5e|lIvw|#3Q*;dnFI*s;oCsr3ar9 zRe9K$kDP1s3n=GBO)i~ddQ4E{mol=dVVXn`GuMbcjoS3P_YixgX3YURaLa7}J|A)A zhS^ZYU)C~8N*EnhGV-VpAH%a`>j{E7k&xM$nkQJdf zCQ5QL+cP-W*Mmm7Z&FN+r?Kyoa!l)yQ&)Nt@k>2ZS#2VnI?%mue~%j1^ikt_w3itoVy3uLo2$l;ZQ6_2qD3yxPqOavYLX}_N^w(XT))OBmn8}_Zp~w{oUF21#s3*k z-t*HFc?jy|4!n&k@0xYx-50pLYqF+DWwj)a&DWdvY5}W1@6l@Qw%4Mu6h6Q`jGHr6 z`Krl~MOFO2Wj5)V$_~jpNy}PMoM&T=w4MhJn0cfs_obg?mC69bQHzgdnaC%h=kb&* zB*n`F1*KYWDJx8gib~y24-cP<{xEv-?D^+=&-eBBQOo8B<(Y!?fTY{=r^!)Kk`z6FWr&&! zpnIuH)dR6a9IM0#RFZzS9fF{c1n4!GL=+I6(sE5@`epYwgG^mUHOt)za-pVciTT7@ z-S$G=_LUuvt=9cu&b{8WZ85QsSZiu4G_@_ytTsJ17x=7c*IH9|p{aW=@OhwVC9rEf zv}H;BB(!7s!19yp&AV3Wcdc)3UL05$Sc+XAn(JTRvg7CB*O2?v6g>X=5r3yI0DQ#5I(y$FzNCH?za-`Dc zzRZ2?a(R7seID-se>b?vd*oi5*K0hSQN}=I7i)d*<T{v}q4+4hL>y5|)63UlGiw-w?knh9G?0#}J9 zh6&pK9j$-{Es;RUCe9YtP>o!RNhnA6bf__SdJz>ZhC>l`s7#3oA(;{{p|Qvny{tTW zx}4>os*QQh$!uGuDbGc1Hvp8R1{DRpwt+6*x@8LdMT`ayn*wdiALp`M#5JUQXq(|! zRzr$t2X!Bb6Ll(&f}iduyC$;^JxD-p$&K!lG9UvODeWLEMG7c>JQdfX(cIRJvfgdo z?4wbSqnhPD3pKr_Ej_n9{As9j{h^jOYhSPZv(Q}Ms{`wMdwy~J=JEFret7tU!>fDy z3%-sy&!@hJmk$2sE+P=$Vmn_N!!+W)XG?R+MaW<6i5onVzJrR#h z;5tRxbArRJlu-;22h%gHEA>n_S}R-7{|#d{2)fG_^j66YQMH8`#Ab04-yA&6 z8D6u+Jzo-<)Igvoeb(sWKYCdZTI`_~d5#yj-JE9Qdn>1GMTqHfrvI)dPjgq@FL2X* z#G5O6bbT^31zrzrnrwldBAZ^G0W>BCngNn!Zy633Hy9ohLCR3>@C)gTvA2Z9avXdW zpgg;apo-cCG!t~S?@`-ramno+N(+)aCT0?v-D$u*v9jq6?5bAwVR7`DXq2HiY;XkE z3Sos_H~jSZv%|xK{n7Ki!~GYOC#chRTF$aaEaGC$0lYnRT%|2F{W4`g+KxJJVajz`kiJ`L?%4-c(}n-`BQ99s)_7Q&rhyZOy~=T3al(6+3uHtbyq?!Dvj z)O3MnE!wIbpW(TP zN9R?YPwM=H&PyyRfDCK_jqZ-8v`CfV-!p^Z#su^#<9W(KkSLF#QYm&MB(y~30IqY} z9Dt~3Z$ujRG%Ds;2J7dJtcQ23H*Hy*T$o%AUr)~m=G=47eb&5X>A>}?bHVk8w=6fj z-Fo}kLiow|PkyxTgMmW$)vDp_YVlw2gQxCcR~ zEa)W*QBiWh;L8vU<(xCe$#BI0Tw3$w=}8V4u5>#0{}!|3Up=QaS~GFxe#_K++;#B% zFJHtv*5e*6P(`uc2l)hUa%;s+To&&~+__t}{@M91W=W7zj9sSCO_iap56ZcfI0`nO zv(W8KEGDZe{FX!l5rRb(HTy@4RtLmm$QU3~xq;a1FCiZO>VHupb<8tV4&haFH=HDe zG)N(zORt`Yllz?2y&7Of(cP)^G}C|GJ(ZqPT8NM^L9e&xWIm>($DHLxKZXT~j@}Cc zKg%^u;sNS^paO2xal!g)hvyHk1X^G_J}2|Brx4z=JpQ(}8a_DZdDXWb2wgige`qDJ zl?a-*F6I_;i$7WT$+Gm;#EpsDuGQuPAPbUpdSc;;>qltJ9i;2R*AlNJmb5qXujk)> zs<5Ny_QCfKy>sY&>BHm)$-;rtpX@ljjzgKd- z`T6{6pk>*!ChRK+`#uTmW0tR@5bjtFcdi6G*F)j8P-`L7x*BR*@wI)2U-s8nhzB8? zQ|KY_kXi@iv2cfJ>93Aq4*CrKm{VmzukE81?^*sM&mlSQ&PleE52TRn)hIU)$;~JV zrPNG=*N$FDpQ?$;DP*P7h(f2~MKMx{tIYzI3zn3|Qv$!J6U@F1BWZO8^U$l}>`BU5 zTrf%3-EgLqLAoT%RvG;$`Q8D{gQ+q8qA6)ZoE%>%B^+K?& zzJB#nU&p#Hc+EfWzg9P2_nNkNb>Zsr=C@jIw7jkTV&>+|r@o^QgpHdIo`zYYeKb=@ z=j``B0c}BmJ3Rq+L$nr+poZ3>_uPOmA*u`&KqMg=Vt1?vxwuRxjU-J)@TWY3M}GI~ zn;L%&gjU|j$JIA(d<~jCv(DeJ*Kn2_W*tl$3^KboOR+N#i6|D1q|68UlA?}hZhi4%h??TR;EG3`y;7f<_V9Zb-?_ND@2SGJ zr#^b7u{8(j`@YiJwZ51F3)qD&Xg8!?XSOJk?%< zHKY1X<@Z@EVwwE@`)?}0<1B=yO(_vwx)kEDw-tgaZV*$;&o@S>Y!+o3i%k1TBz=l% zVukp0GVpy$!q}NvOhX}*F)V4BK9JlJhTr=KR1Z35Rv!5^^x;9e{+3IrBVmiYY?U3CQ!?2w zeCLuCaHvWsn?i0Ekp-T}cv)IrZk@W=F+a_U#U_18rtu<+)MYc%uh&^~in0M^ zXG++ZGOwPC@I%f%IJq3i!*19Q`|RZ(L16jbRa{N2;d_(jTgA4FchK`QzAUrvf(}~p zV$tKjc&zpPxiFQotB$&U%j8&oY&A(XtfDw0!7bBsF^|4rJB+cboVj1iy^@1Ph9?ah zd}iUy^|QED^Wf97H;&%Nu*UgmWDu60e_L7&9a!-l*eC`6kL>}zs#s^5OUOPjCXA9& zc9*Lkj_FkP5e*{#E#9|r^GBzI+Jfd5GYhfx_>wD1N8@V7Q% zks3#LP@`$HpotX3NHf-&hg2~+k%&ekyu#FpH2rrBU78|Ns{S57bvvqW$XE2j_650y zU9-PS0a5LJf1UT>e+wbY3eo_iGb!{_E~3&mN$g9&?ifA+=w`v5k=*{A@oI5BH3|0u8<62rdtWC5b_{R#zh%u!`Fn$5Ptf`98fVtglaO!+a0>HX9fP~CC! zJdf{Pc+b5mjt_px9sFnR@h`bY|EFp=W8xYh17WixDQlw;i z&enAY@X_VH_dM^p=iKApH#K<)fSV*a_E8H#{1t!LKv{#8VHnI2Ji(J9F+rxt2`WWR zI8u%YIz>+~DTc&rl<1srrCjFNA-X3#DG!Y48$`;>yLsmgGUekvybFH)(@f0!6=oh| z4Bz>YQzL>Ri`N8XxUy14%=3alPjc$G;X*>%9Be_tSXNO5l+MT!Y=lvaH2foSUKP%8 zDtt=#o14t06+u zYKOG~C53ngPvMm zV$a^Bl2wJCNiK7h8xxcy5)|+Q;wFSC8C^~0kqBXlqfSXoP8%LoPS;3hj(uy7CF)E< zV4d;;pjo0CjLh}j?weQ3!OoJua|JtVoolftOxJFK0bEg1BWGa5Qy7CI9mA_+VwFtZ zArR(hc@AL_h7%-$B{N6=FP(uy7<0B2Zkunt-M0|bO@&b#EDgt;hC7{>z|LD^}wes3#}WSj2)D1rh?pD!|d2-dmsVZL|yax-d~5(6d?M3s+#-7bs4B zba;NxAAH-Z9bF6D&vG|UKkDdS4E`!|C$bbR$9naS-s0(M`;LXQ-oF24;8A<582Bgc zV!BocKu@+1ZL!&5U{!Uu&A+nX_|*N0dof&Q_vl;q=lNPgTyWJ(mxA6YqgpwRAna_1sv479%gy4N!*1CCo9!z& zfgWqH0SYddH!Iirg@POA{p;uOSHYt;+q19(D&0oVNR84QcP(8D-nDjZrkRQZ%!InF z-%;_sGGUfFN&Jvh@y##+WNzXGyXq8tDvtWvPM?YkPi^eg+@qA{vL$GqyZ9sk3Vx|w z#h1hc&H2q}G&=X9P1E?*{I(t>@$ug`*Yum7SMH?-UwhQZ?3=Dqw)9%+GEbbfX&b+V zCeUn0Hv!0gX~#c#g%4Et4d^#W}yT@tifs|90M+`k`L`HeGFa$$?Y* z`iRk*G>;aj$F5%rtc{J0tIzStnkcwMe*A)--PRa-f2cqG! z5;MZbZg_AaSDj2sS)}lVahhZps!_xDRc-36r6U< z{NF%kAwYXEPmFLiQho=e4eGtuKYMJs?d76(+1Gk2_sds5^CcdIIx3-VJ=9$Z#r06U z656ka_7~r*Ms`#paXk_*o~VXju7r2#;a$bIs;w_oS`&I}qB!(89A8XTdIt5L!D>%m zwdZiP=g^AF5$P+w_0&(aY@Od#*&5fk#_x%rHTNxtx0S-tQcD!@a%9{5$;$SGzCBTn zByTax9Xl3YyBA$Lc>lf9-l2z{@~)B6xm3C1{oB6BP?3at7na5!xJ$2{czCGXbG~%p zQn}-Mw|tNM%|AJL^W?4Xf9`+fiIV`m{>_L=s80{|-9J_i9j%0p>!ITh9p%uehd^RW z$x=%a@OtYikpp_-pq^i?8n=#e)b>?=o(KLo$NYZ<=Sx#YZ0mpfj!tX({}bm0E} za>vm%CjJpjJWCSc9Z%jR34inKNwbV*tXvJpOAt7E@%PFzKy!o&xCXg;&9rCWb~`i* z?N#vwFhQ%|{(65xS^WuZ^(Xk*umKuWW`9CMf8zK#$vZU~uw3lxOr=wfu~!AZlwkqp)pWZ-F9BWy$kmx#JLw= zg|m6c0|I`ov%+=g?Vx948`n-@r?Toen~@Pby(eXf$IJGWW7Tm^Wuf_yO-@$N$Z~8n zQR`KrZ0(XKSaw8EImlUSShF(X1qA#OUXy%{&|Y%_Yd64(pc5;Pve2H^1zQvwGDw5! z#3+0D9LfuqqE6Gw%jibQVcR*=m=O+rGm*wTs27j>Fp6T-jS)2TgqizM3`Rzab$s>5Iywx~3KoY?-h|py zz0K-;Edo3I&`H?(4yGvrnkAmHM2M{f_vyiXv!|Z_Wba&1KE3|Q^(9w1dQk5;SUmmA zNcR0EU21amYq*tRI$mmg|n-^CJr(M&lpayUi}4ab@cA8&TJ35agRtktz5ic^YNNlmXA zt!s8A;HH`Xg{hTaBfP%pP1yffF%PEZd9#FJZ=kIh;bzbD+^YL5$A`g7v+pNPcYh}~a1!{nZo{XJy!)63*bsYCdLpepw5lmHeC`I+ga6J zfE(P#X}%TCzoN-5w&{QT_i`F-E#e9UGoO^!FZ-e?$_ z_DwDNW8@SZe~@5H!&*hdIyOArH!6m%aKcOYX2q1)tRxMMm^ev{)>vO)Ft^4BxR3D2 zPHJ24t#Ep0bUV?*v5qBm&h}3Z=KtwzpKjyKK%-$)M!RFhEV?T%u*$UI1^@*Zc(g%7 z0oGm8;h;_#5KRJVjCMGxc?6Ue@7b1B!dUT~06{^Qh72%D1z3Jic4$xsZe5WDMnK5j zpz*JSy2*;;q#j`8dFV320ScvPAY2Ctmj<^i3&;^NuZ@HtEa2b{coK7pw{813mIswEOV5GEU!|oTYC{?Xu>Qt*y4!2Oyptfv=U~bJ;`7rf% zqRi=zDg`qYlSb`!?}pK`a`i|yK1v~8RVhU3VMz6u%>2=bciOQ^_2dOy=7e#GYp6q7 z2+mU{^koYDxZVp+{!fIq66JD||(MjuN`A|1idM^XCOkzx-Ld z^d)ogW%{d`etmxP#@5{1xx?J_UT%8#=EL3G^nPx6_o;JW;!kpaVsqgzKe?BmJj~DR YN=Il{2F>budu$)x?1qTB&f&c&j literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/validators.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/validators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09fa4d76c30c98ff206b55c2dc071ba76dfdf952 GIT binary patch literal 16149 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/versioning.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/versioning.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d86fc675991a55aa4252ae38d4973fd0a199d25 GIT binary patch literal 9281 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 OvzIdbFF5*TPyfHSrC?hC literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/__pycache__/viewsets.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/__pycache__/viewsets.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b27b888e3d4d5fad53f8f2be105e77556ce48051 GIT binary patch literal 9575 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 A1poj5 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/apps.py b/env/lib/python3.12/site-packages/rest_framework/apps.py new file mode 100644 index 00000000..f6013eb7 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/apps.py @@ -0,0 +1,10 @@ +from django.apps import AppConfig + + +class RestFrameworkConfig(AppConfig): + name = 'rest_framework' + verbose_name = "Django REST framework" + + def ready(self): + # Add System checks + from .checks import pagination_system_check # NOQA diff --git a/env/lib/python3.12/site-packages/rest_framework/authentication.py b/env/lib/python3.12/site-packages/rest_framework/authentication.py new file mode 100644 index 00000000..3f3bd222 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authentication.py @@ -0,0 +1,232 @@ +""" +Provides various authentication policies. +""" +import base64 +import binascii + +from django.contrib.auth import authenticate, get_user_model +from django.middleware.csrf import CsrfViewMiddleware +from django.utils.translation import gettext_lazy as _ + +from rest_framework import HTTP_HEADER_ENCODING, exceptions + + +def get_authorization_header(request): + """ + Return request's 'Authorization:' header, as a bytestring. + + Hide some test client ickyness where the header can be unicode. + """ + auth = request.META.get('HTTP_AUTHORIZATION', b'') + if isinstance(auth, str): + # Work around django test client oddness + auth = auth.encode(HTTP_HEADER_ENCODING) + return auth + + +class CSRFCheck(CsrfViewMiddleware): + def _reject(self, request, reason): + # Return the failure reason instead of an HttpResponse + return reason + + +class BaseAuthentication: + """ + All authentication classes should extend BaseAuthentication. + """ + + def authenticate(self, request): + """ + Authenticate the request and return a two-tuple of (user, token). + """ + raise NotImplementedError(".authenticate() must be overridden.") + + def authenticate_header(self, request): + """ + Return a string to be used as the value of the `WWW-Authenticate` + header in a `401 Unauthenticated` response, or `None` if the + authentication scheme should return `403 Permission Denied` responses. + """ + pass + + +class BasicAuthentication(BaseAuthentication): + """ + HTTP Basic authentication against username/password. + """ + www_authenticate_realm = 'api' + + def authenticate(self, request): + """ + Returns a `User` if a correct username and password have been supplied + using HTTP Basic authentication. Otherwise returns `None`. + """ + auth = get_authorization_header(request).split() + + if not auth or auth[0].lower() != b'basic': + return None + + if len(auth) == 1: + msg = _('Invalid basic header. No credentials provided.') + raise exceptions.AuthenticationFailed(msg) + elif len(auth) > 2: + msg = _('Invalid basic header. Credentials string should not contain spaces.') + raise exceptions.AuthenticationFailed(msg) + + try: + try: + auth_decoded = base64.b64decode(auth[1]).decode('utf-8') + except UnicodeDecodeError: + auth_decoded = base64.b64decode(auth[1]).decode('latin-1') + + userid, password = auth_decoded.split(':', 1) + except (TypeError, ValueError, UnicodeDecodeError, binascii.Error): + msg = _('Invalid basic header. Credentials not correctly base64 encoded.') + raise exceptions.AuthenticationFailed(msg) + + return self.authenticate_credentials(userid, password, request) + + def authenticate_credentials(self, userid, password, request=None): + """ + Authenticate the userid and password against username and password + with optional request for context. + """ + credentials = { + get_user_model().USERNAME_FIELD: userid, + 'password': password + } + user = authenticate(request=request, **credentials) + + if user is None: + raise exceptions.AuthenticationFailed(_('Invalid username/password.')) + + if not user.is_active: + raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) + + return (user, None) + + def authenticate_header(self, request): + return 'Basic realm="%s"' % self.www_authenticate_realm + + +class SessionAuthentication(BaseAuthentication): + """ + Use Django's session framework for authentication. + """ + + def authenticate(self, request): + """ + Returns a `User` if the request session currently has a logged in user. + Otherwise returns `None`. + """ + + # Get the session-based user from the underlying HttpRequest object + user = getattr(request._request, 'user', None) + + # Unauthenticated, CSRF validation not required + if not user or not user.is_active: + return None + + self.enforce_csrf(request) + + # CSRF passed with authenticated user + return (user, None) + + def enforce_csrf(self, request): + """ + Enforce CSRF validation for session based authentication. + """ + def dummy_get_response(request): # pragma: no cover + return None + + check = CSRFCheck(dummy_get_response) + # populates request.META['CSRF_COOKIE'], which is used in process_view() + check.process_request(request) + reason = check.process_view(request, None, (), {}) + if reason: + # CSRF failed, bail with explicit error message + raise exceptions.PermissionDenied('CSRF Failed: %s' % reason) + + +class TokenAuthentication(BaseAuthentication): + """ + Simple token based authentication. + + Clients should authenticate by passing the token key in the "Authorization" + HTTP header, prepended with the string "Token ". For example: + + Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a + """ + + keyword = 'Token' + model = None + + def get_model(self): + if self.model is not None: + return self.model + from rest_framework.authtoken.models import Token + return Token + + """ + A custom token model may be used, but must have the following properties. + + * key -- The string identifying the token + * user -- The user to which the token belongs + """ + + def authenticate(self, request): + auth = get_authorization_header(request).split() + + if not auth or auth[0].lower() != self.keyword.lower().encode(): + return None + + if len(auth) == 1: + msg = _('Invalid token header. No credentials provided.') + raise exceptions.AuthenticationFailed(msg) + elif len(auth) > 2: + msg = _('Invalid token header. Token string should not contain spaces.') + raise exceptions.AuthenticationFailed(msg) + + try: + token = auth[1].decode() + except UnicodeError: + msg = _('Invalid token header. Token string should not contain invalid characters.') + raise exceptions.AuthenticationFailed(msg) + + return self.authenticate_credentials(token) + + def authenticate_credentials(self, key): + model = self.get_model() + try: + token = model.objects.select_related('user').get(key=key) + except model.DoesNotExist: + raise exceptions.AuthenticationFailed(_('Invalid token.')) + + if not token.user.is_active: + raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) + + return (token.user, token) + + def authenticate_header(self, request): + return self.keyword + + +class RemoteUserAuthentication(BaseAuthentication): + """ + REMOTE_USER authentication. + + To use this, set up your web server to perform authentication, which will + set the REMOTE_USER environment variable. You will need to have + 'django.contrib.auth.backends.RemoteUserBackend in your + AUTHENTICATION_BACKENDS setting + """ + + # Name of request header to grab username from. This will be the key as + # used in the request.META dictionary, i.e. the normalization of headers to + # all uppercase and the addition of "HTTP_" prefix apply. + header = "REMOTE_USER" + + def authenticate(self, request): + user = authenticate(request=request, remote_user=request.META.get(self.header)) + if user and user.is_active: + return (user, None) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/__init__.py similarity index 100% rename from env/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py rename to env/lib/python3.12/site-packages/rest_framework/authtoken/__init__.py diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..965df9d065269534cf3bbfcba146e5cf3f7e3c8d GIT binary patch literal 238 zcmZ9GO-chn5QV2r1QBwFY_l+hW-EcfWEVsb*G;9TGU@s08memya|9QzJ%eZQ7@k0~ z%gUau531f*kGH7r+3Yq;dN-yV{byYNb)Kf=GaIsndHTxaDqZKXbNPVRND`sgruI;0M`28)!Jn@Ty7p)F8YSna-F_2Y2paK6Jv}_68!=6 C|3lsY literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/admin.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec35b8c896fd27cd0bcf3253570f47ff022a100e GIT binary patch literal 3508 zcma)8|7#n`6`$4a>YF7?iR@TSn#4YZOLaL*cX4{9cR9C7?50-|b0xX9*_2y0yJK7O zN~_GSVoS)NLg1W2dkLlZ%2Dcr!X+f7{TEvLTYs@|iKJ)$(k4Fi7cO+@f3K8-T>~uf1qip{hlvQF8OR`Bx(j*D>fE_5w znk;nLR!XX-3SF^-rH~d9x@w0@5iKJ0pdBp@XahnI*|Abw8x(rjPLz^bvUET@Advu} zp@*Hn)eZ*8MPfy66Dvy9hq7ZQRd?882Ed1$+lC3fv}|Qj@a^Pl(yO`>KyzHY%f@Gg>k{bG}fX8~p%wI9jmG&Kbq35O0FF zy8TS7-H?jHyjK+aXLN>^16~&!fQbev2KUavUNQW#?NiAL{10z|!o4%VTmH4`#k=AH6H?#gM6!J$;tJjusuZkTdhDWUjlISD<2<{OKgeT=;gp7ceR1c4L+-LUWJ!TOea~lu5 zN<5JMcZEEVX0npFjI7L#fEB6hW);xEgA0q85M6MJyYt!4&lnr{u>KW+3bF4T665aB zC@kh;&NRuB#Ig18F>$jd=1BKL77=_j4?A2XkmFtU>v}-jkh&MTtav?cD)z6_@!pS> zmemMpsKrR%f*p02U4Y%X;U&d=c&QkBdA21NaNT`4sSzkhzmQ2=hv&sp=;Kja1YJo+vBwr(oQdX&dJqlzaK72K1 znN#wgi}$AXJRu^qxt=e}!kRPe1juYmJZq3{l+|47aRouhRlP(#Lr@xzc#iI~4-Yvv zkd$05147tgn9o%~k~}u$P<$NFr6 z+7=J@wx9}w$PyP<>YUJrZ4|NTuTUR;0kXb115@04Ae!W9m<**iQzu%f6Kg-*NR6+A zpCpG?qxYh#@q6(V^=Uwjq}%DEze)TmaX+$=KE3kZlhnxS*?VU|qv$F&jiCErIe&sXxc} zd(Vr#*BsnCUn8(z{_J9PS@wD_{2ir1em0D`*^s+c6wp`zx#T3Qmklz^BlZ@GZ=gUc zSKVp_U=o9}iF&kCKdF5|mLV2g^+bUb(RI@{Tvyj!+%1N)>GSt_=+;O2qS(LQ8!+gi zc-ACeB!@9%o5`_Oa%|1~eD1Tk_2k$_GPj~WNetatY$Y;l7w>?) zm{=pa47bO=g#wSlhvQ{R6*>t|-zt@HU8Nw@EuS-n`U~A8LN5 zJ#?~p`SD2llf%DQURQ?NiLW-l+a5gFy!fResmHg218Vv|hh_B)Jfi9u|CqSgOg7C2 zEm1b)OsDLz!VQKP;)nMdbACxs^$ND@mpI4wb+}cai*BxD6v_+(##1kPL5;zX^7*0O z2%|Z=WYUU%FMZ3=6d|qjL~%$^_T>7lwty^YB@})|g~Jf-VL~R6LNTlC(ue zx5(>Tr|OZFheZ)H~zS9K4nb5N-42t^#f7 zzG68XNwo->ts7Tg_MCLsXkU!F^%kYViYTpnl;)C`nZw(ZzAIU_t^_XE*j^uknn?|f znWSW)P(s8rX^(**Zl`kD>L z=v)8phspOFH&5Swdh&6qu5Ki5`95z32%TTKH?McsH>F849U8@i&YBfe;Eer^TMZm) rn(bJ0x%H@hyT|IfrS5a|EgOFM7~>0c`vN`u-SzOD)ASFrsWJWqil?j5 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7da49dc6a36254964a63bd115d768d03f27d5fe GIT binary patch literal 3130 zcmb6bOKcm*b(Z_#@*}Nc$(Cxn5tH;|sx}!Xwc-LnQB`E@qO@XEa?$Q(vEq&-Qp;Ut zc4>)%4mt=Z)n8H+g&pMLAOUJaIr!LP@4bj{04b9ODA4xcn_Q_);8Wk5B`HdVfp&m> z`)20NoA-b7mw|yKfw3h?i`O+m{*IIGP&>%MDj;`=LmbH^X7ra#3Fa|3R+CLx!Zq1d zYO1LUTyeEp+|(r!BiD$dZW2eMYV}l?@zH-(`0Wo)s(V{$4D}hmAD?z zFsyis0pMEAcc_b4dJ$IXYG}FkTC;q_nh?D+IXEK`@(a*_5|rAEIg%;I2vw>=_x>XU zB&M1Z+lCW39NAGmQG4>l#i^lauOHGxb)aD$+%)ppiq8W!S*bO(#*o|<>XO%TOtoU9gM5>IidQOmX`Ny>R_yRDV%f@)J zX0KW<^%lb=o~pA-&1Ow&nKpS6*;wKzW{r*Bg> z?*}y6h)*+$Wawnz;#;1-V%d&!%*mYqA_vz&l71Icx!MhYj`H}sEt%?Z7n|r*&5^st zHT9;FRi7q>S#mdMXg?ieGzhH)2GXwhY&nN235{4BSaMB}1~b_N*DWEsW$~nCfw3Ac z1w3t8?=)-|wY4mU67#_y&CJeCl}g2eHFfjmEZ6P%AY^tq#Ev&lRV7B{! z9KaTN`l~!zGRQmg_6n`q`GQ|=)TkE*`J&S(3y0-r%eG5dW~yvEwARd*N`*WiexYi6 zi~ddKS7|xSQ}1@(t<2}^P4Kn%dhYUT`JfWgOLe=vY%kIve_Zo?PxE|~f4O>-D`+Ez z;g4VNZ2+5OKTSq*4}Z3MrPRJs+8Hjj^v_1e?vDO`t(E@l#qoRk2g_~!92*B(_7Z?{ zC*J@i1nZ6g-+=?*57Hg7PO5;N9KmT=@4CNlvm5K{#Okev-C9PrQ^u9RzDN?v0+?9lg*Vz3^ysqE-0y^}iY; zTPs`ZcjtDDi}!xoHZJby7lnoss~{y>X;?70Ua`;Yi)6@BXWa zlQg7PJfK{}W*(!Hvnto;E1n&cD-|AJqN{FYp~+)@z~d06p5xcJ=Fl>fXvkf;>;?e} znTZVZO+eR9Md{UV?N?wu_y&Lt@(*Kl*BEab;~&TVnEWt#|Fw?>9~t>wW3p{bJ~FQE z=vSXL3*I2ig5~phF*8dTUXzs=Ui3g>Siky&<8km~$SiAZAQG@MMP~*n03F|Lt+osy zLiRKpg=IE|;A;SogX5PW&lQ{{rk8B?R)x9_JC7uIEgyK>qjNrhXal9@#?-C3>(;H= z;!ms_Zx@Os9-p3?ot`Qbxzd1K=K}=@%DGA{I>Y1Ts5Xl15wXToA`WX5GTC8hWHu=- z>jY?-x~^q`=HG!;q4EzRe_#z0g$!LEya(W`P4XlbQ}um~q|UXzwVOQKPM&@L^4(h> zTzwe(v+`-OxG}w#8gEVRrpDW;@jZQLSI@Nd%>DJfQ)72>zso&%=i!;{=AkO5wT;5Q zPK;Mt3%i3aw+CPT@bbN%fAr>`oKFX*H?DoD=<3810^o2&Rxj-*iT1*in52I1Kn83d zvHxh2Iu_Lll(P(9Z=iv39DEl*f9W@6syMN}t_LL_-XSvdNTt^!wWgZYc$A<}4p*CN zZ-~Ao@J!9F*Wsy=sV_t4%b*7kUGN#=nTnUOom$01R4$0Yzd`+2-&)`4l+a^V!DzxEs%O7dp3@MCsXEeg_9Rn-<`_SE z51G1{A2rK_XqJXZmPk<14NijqBBmHVe`d1D6ImjfAj3@MY8{Qw&fy7>BG~=d*AZaJ zjC`L#>?H)(0K5)gfCk$ndqWfVmv(c-cCNTHRBWkx!~> zWJQ=p_nwgDhq!@2WD{oFQO;hzBu<&wr^Y>cqbYfJhrWmrXNl2JBS;JmrY4 zoGbg@Li9dJbXJ`CsE&+v=8dr8203^scmX`2;9J5AoM`joD9hdp3{$}(d z`97NgatzeqGJt(qlBCax@i|HSlVrXi=f5D6huXL_)_UvR(pKq^0D4%E($d6xr~ggh HCzSXvzE8Vs literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/serializers.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3df3a9eeb89c81ff14e4f6b3c93e8c898a3d4379 GIT binary patch literal 1877 zcmbVM%}*Og6rcUF*T%-kCWg{PSqN>g61<_6qC`p~MFENwLZg!O;LB>+8O)mXt}{D^ zni>gJ9316B)dTcDNCZ-Qs`wvz0TBszM5I=2551*=UUKTpu5Cz_=FmC3d2imw%=`Gw zPswB)u=PX`iVF$=zj2|xm>jI*&)K#KAb^4c%0fX9I4?S4St`f@FF8s%QiupZ1fK#Z zuLG!{NU6K!e`ed3LZP76BDv_FT*wJDVOGfka*1u31aY~D2ti*G!!cKCOz!d#woS)g zLD;v>L<5nQaQq`!1*;C2~ocxx>%QXJ#Q_IaP?Xq4w27n(0Dqs68Y@c`9>NEOs?GnY}x)Wq<=a}GjsGnpYoM9w z-@N(F&8@;gW~8CMDgD}&`A$8`Tzn>fpLm`)9J#SSa%1#LDBHK!KXH(q+>nm4gNNC%{p{Eemv%pUk)7V_nf^VU+3Wq}Abq=W_b7egFg?1T z9(`u*re36{_7YRS^q+4ijrk|ZW~#T5IA+fRGr2fb4TFCYhC$5# z)P!A(-CZ#8q>UVi2bk|^*QgQ{32W^1IlzNld65&2q=0b7FEO$XnyKN&SBI(L{nYT! z-KmZE({eM@ccMr=k+rE;D(Ly(-`dpsTZO&uk!Jq|ZWvPn!vshUHSQfI2KN(#JWTXy zshQ5QFv-Z;#Bn^MoC}}9FP_Q8Xa)v@kmr+$?YTVfY&fj_Elri!3=IUEuI~gRh52t1 zWJgv45QLZD>Pv9_5Afkh&oH4wf%u>e*-225&i*(b7&-6`mz`$t6W{Ntr)lBsp}f#H1~ec526HW3&*gCP?8ZLS!ewBEVwB9nniI zxyA~`t)3N$GSRDlHa+GFkk0xlGQ>>xr6^wgUg>6BC7%r5n3IY0;4 z+4nbp?|bjfe3MMZ5wuSPp|L3=^l!!tniLTGe+A+RGLRuys3oXEE2M@5#)qtMOH@Tp zhb^fUQ6rodt!PVDor6-wH_e-0Dyz@gK%jLNwaZiGztlV+6MiOn|HiRJv;~;WiNG zrkCCOoSDbO)Gc!j6E>=D6RdYk8fS!4zmHowSj+EXr(?Gr40Pgcy}hhk^MQ^;*?Izv zPS3sdo{3lL!EX335it873e0;Lse*yjkRhmH_(Uu<2NuUhfi!iD4M>otpOr3#)fkR9 z^Ji!THGz|ADul4oEIq3qc#V7j78&@4o3A`;WrU2dA%ZsBynKdMG9ug2t&p$TmbXNo zdhTqopPemk44pMwBV;7DlY>>%ypej0)PkWvKVqbzFRo@P!&G@^!PU+7A+BE`DlbC> zwDlIgOT|T-w5WV95UgEz4=^`M1A`K%OFD!EZo6h(cTKwu(IB~|YhgNMKqL^e!=)k> z*^E>s_@iZ$V1vq*?T?@lKVYcb(H&>SCZL-OsKJ5*%^3@>rS(q73RbT*9lnLgqKPfT zp)zjQZNqFg>JUkXjrp5p$Np>3JwfZJd8j%fKpG%)Btu|p2!9UGL#oVH!ZgZGgB_Pf zn4ff)iVq-`DEqzeMxU%rv~}xYKsJ%53XIRF|=Hk%{8`Fr`lPi`3811*iDenTHS8D_+xkN zl~bWnJ=^XI9LRYQx<}|~Vf4xRXY2j^3%&d$FMp|@9rni=RNW&jB%!*dxZL9rQX<0Z|vsI*e^FC8>^mN z>?;!+Zcmx;l!-5lu5x2@(Nk`8alsaYrrl#%W}ogUHvW)3eimmYxv_j=9PqstoT#}QiU0z)bNWbMp&68 zlT0L=j`o06DVpLx-NlB+W+TiQG-@xfym4rfVQUku4mX#JNsKAOOL(;+^RVD4Ov-H9 z3RA_8!iO(SYJ4_-wBayELD=x-$Bx*s9d|8zI%1fVl^w@~4&o$N?B&W{uDsd!hxL`! z&6Rg@uW!Wr@^DWc_2kjbnXWwgoqVmY6nje9Q_7opPr14weqTKQm+?Q1_lnoO;`M({ zbc@$_iof|JwIOY+e6JKfFMRRx-z#5Mx+9Z2%2ZdL;xRT`d4bBB#_F)9(YU6yY-8DC zbVAcUg3CG3q}}_(cA?R(zsd)?gok7oNL7kVRAZ=~8STxCNFm!W?eEj{{u zFIw`VrSGCI{VOy6G(G-l^hxrwWWRW^KYpP)6dubT z#N^EI-Z09X|3A!g=d!82GRl_^uH=W~8<8KcN>cpCR7iSlUzVh*e^hqL*-DnCPF@Hc zN5bKF@ua4DcvVy(P_X6r2{iFstD_8Y2!oF1PMOy2R!4U^Rz66DQwG5D_oAPT`BPdS zd&dX-Hd`Qj%7R~Mgu%%1q){De0bFx5WAj&z#*U=%nsF)!ev)tb+3;&J2g6wnbzX;V zFDwYc4`^x^UE4)7KcE}CXmS_TcG0a}R6dAY6{?>$4iNnI76p`>=w+{X*(*EQDGz11 G+y4i%!XAwP literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/admin.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/admin.py new file mode 100644 index 00000000..eabb8fca --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/admin.py @@ -0,0 +1,54 @@ +from django.contrib import admin +from django.contrib.admin.utils import quote +from django.contrib.admin.views.main import ChangeList +from django.contrib.auth import get_user_model +from django.core.exceptions import ValidationError +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from rest_framework.authtoken.models import Token, TokenProxy + +User = get_user_model() + + +class TokenChangeList(ChangeList): + """Map to matching User id""" + def url_for_result(self, result): + pk = result.user.pk + return reverse('admin:%s_%s_change' % (self.opts.app_label, + self.opts.model_name), + args=(quote(pk),), + current_app=self.model_admin.admin_site.name) + + +class TokenAdmin(admin.ModelAdmin): + list_display = ('key', 'user', 'created') + fields = ('user',) + search_fields = ('user__username',) + search_help_text = _('Username') + ordering = ('-created',) + actions = None # Actions not compatible with mapped IDs. + + def get_changelist(self, request, **kwargs): + return TokenChangeList + + def get_object(self, request, object_id, from_field=None): + """ + Map from User ID to matching Token. + """ + queryset = self.get_queryset(request) + field = User._meta.pk + try: + object_id = field.to_python(object_id) + user = User.objects.get(**{field.name: object_id}) + return queryset.get(user=user) + except (queryset.model.DoesNotExist, User.DoesNotExist, ValidationError, ValueError): + return None + + def delete_model(self, request, obj): + # Map back to actual Token, since delete() uses pk. + token = Token.objects.get(key=obj.key) + return super().delete_model(request, token) + + +admin.site.register(TokenProxy, TokenAdmin) diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/apps.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/apps.py new file mode 100644 index 00000000..f90fe961 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + + +class AuthTokenConfig(AppConfig): + name = 'rest_framework.authtoken' + verbose_name = _("Auth Token") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/management/__init__.py similarity index 100% rename from env/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py rename to env/lib/python3.12/site-packages/rest_framework/authtoken/management/__init__.py diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/management/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccff78e2ea0ee9356878a0f3c77e5362a1adaabe GIT binary patch literal 249 zcmZ9GK}rNc3`M&f1rg>BZe2J*-HITzyFmnTU1X|bPjz=ynpE1MkKhUP3ZBJdcmkQ- ztgPDlA^9)iL-M^`o>f`z#C;0->b#RWQ(wr3ajJtK3tBfH4QkQLxrWuhy={`EYt0xS0mJlau_Y$(0KHE{rj< G$n*zJw@5Vr literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/chardet/py.typed b/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__init__.py similarity index 100% rename from env/lib/python3.12/site-packages/pip/_vendor/chardet/py.typed rename to env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__init__.py diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..184c6abd300b5efb54229f99a72656a9e29147c8 GIT binary patch literal 258 zcmZ9G!Ab)`42E}X1rhoVz4l;(dKE#~-iip~c}QpCc6N6r%S_g?kKhw{_UN1!1mff*rPM`3SC?>EwJWz{J zvl%@FNwBe_L2(@5*=?Sd1n*TZzWxbtksp6=s${#fNo M1%78rsW{8@2QS}CzW@LL literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__pycache__/drf_create_token.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/__pycache__/drf_create_token.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a2a33fa9aedf75824c9de212f5f22c013082ce7 GIT binary patch literal 2447 zcmai0O>7fK6rT0|cx|tLk~nEXXjlqVT0*?#M^%MTr9eUlW|)b`MxA`DW+sWY?QB#2ZU$unGtt&&gyQ(6%lJb5I80cQy$do%7bYMu!am0TjxhBIE^u$&qrTBId=4l$ZEiEXx%o zuLvLlkg(Y`%||2P0|2Gl0Ln<*6ociwT2qYZUuAXdS4S+yifFK`%LSBTC+aNDNk@hkRBd^qC zLm|lL&XHgZpLGv@1%zmA}`AI%sWL+t;Bkl;L zFo8QO05pWnZnP_6BZ70j5^k2%P}&_!iCsCA8shyOAEjitx;uuc7r_7cPVd@;(q7*y zQbU4~A-Z(~7~(X|yu{Lh*+mVN#6G5ztE^xoV?i`)SIfRd3uezDOnO;KXKI#X`&De0 ztp!xW?4l&<&XiEW_lPoEEc;Ybp$?FbNRnB&*edXH7&4JORGuX&JJPW$h$JxbsEW^u zj~Ql(%w>-yS!eC#J(I=cnQ+ElLM7Xra0}H6a(vI6gw=xW7hT7^QLxJh>*EC*qDsxY za%IA#f;&;NojLa!c3E^La&DRB;*7ai^XFaXbnfIS(<}ODY|$<((EE8Njm5WSF^y}< z#S5lg_2+poW{?1Os96Z`OT)pl-D?HW=N4OwO2+LlId=-s5jX7oY!QD$^2^X{75PG`UQaD90#-J#AwVK0Ok7&*{CqrwJ-Z7FGLhj6(H(Y_kh|0n~sIpT>REDZ`jwTSWE97_LXh#(2p|-1A+G zEFV`9&Qh(5_1txa1syFHJ-_J8>8$KJ&!SElLk|+D+q#36bk{+KL=?Ng%1i&&K>hNRrwa)2KW zkGgrmb{y9aVc^fBfZ5M-I@iBg(V>exovCmH)ki)+4#M;+0J|WfD(ox3xQD76Dt?2; zh8Y(VZGzfPyZ$7@9%kG_sm#R{+b4?WL$~S^c?napAR;9_LkUnMQEYjX{1zDqJ&tuA zE9NL+Rb>Pg;!ByQC@!OVDg;(AKTOrUuV_aR)py|T*=FC{YifJo&AXN6z=^fQwxq;T z?d)JHd%T%F{{4FoKHbWWuT5@iAeOw7SWmRnp{6?2)=spv(@pL4gUKH+|8V)?@|Je# zg($?PgnynVKxU|wKGsYhdj_Of>PhcNJ2T$OTxw=6wX+91qR=za5yigLHV~7kZIPbf*||?a=(J{Kf%eT+JPHgYfj0&TNKH2?qr literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/drf_create_token.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/drf_create_token.py new file mode 100644 index 00000000..3d653924 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/management/commands/drf_create_token.py @@ -0,0 +1,45 @@ +from django.contrib.auth import get_user_model +from django.core.management.base import BaseCommand, CommandError + +from rest_framework.authtoken.models import Token + +UserModel = get_user_model() + + +class Command(BaseCommand): + help = 'Create DRF Token for a given user' + + def create_user_token(self, username, reset_token): + user = UserModel._default_manager.get_by_natural_key(username) + + if reset_token: + Token.objects.filter(user=user).delete() + + token = Token.objects.get_or_create(user=user) + return token[0] + + def add_arguments(self, parser): + parser.add_argument('username', type=str) + + parser.add_argument( + '-r', + '--reset', + action='store_true', + dest='reset_token', + default=False, + help='Reset existing User token and create a new one', + ) + + def handle(self, *args, **options): + username = options['username'] + reset_token = options['reset_token'] + + try: + token = self.create_user_token(username, reset_token) + except UserModel.DoesNotExist: + raise CommandError( + 'Cannot create the Token: user {} does not exist'.format( + username) + ) + self.stdout.write( + 'Generated token {} for user {}'.format(token.key, username)) diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0001_initial.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0001_initial.py new file mode 100644 index 00000000..6a46ccff --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0001_initial.py @@ -0,0 +1,23 @@ +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Token', + fields=[ + ('key', models.CharField(primary_key=True, serialize=False, max_length=40)), + ('created', models.DateTimeField(auto_now_add=True)), + ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, related_name='auth_token', on_delete=models.CASCADE)), + ], + options={ + }, + bases=(models.Model,), + ), + ] diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0002_auto_20160226_1747.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0002_auto_20160226_1747.py new file mode 100644 index 00000000..43119099 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0002_auto_20160226_1747.py @@ -0,0 +1,31 @@ +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authtoken', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='token', + options={'verbose_name_plural': 'Tokens', 'verbose_name': 'Token'}, + ), + migrations.AlterField( + model_name='token', + name='created', + field=models.DateTimeField(verbose_name='Created', auto_now_add=True), + ), + migrations.AlterField( + model_name='token', + name='key', + field=models.CharField(verbose_name='Key', max_length=40, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='token', + name='user', + field=models.OneToOneField(to=settings.AUTH_USER_MODEL, verbose_name='User', related_name='auth_token', on_delete=models.CASCADE), + ), + ] diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0003_tokenproxy.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0003_tokenproxy.py new file mode 100644 index 00000000..79405a7c --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0003_tokenproxy.py @@ -0,0 +1,25 @@ +# Generated by Django 3.1.1 on 2020-09-28 09:34 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('authtoken', '0002_auto_20160226_1747'), + ] + + operations = [ + migrations.CreateModel( + name='TokenProxy', + fields=[ + ], + options={ + 'verbose_name': 'token', + 'proxy': True, + 'indexes': [], + 'constraints': [], + }, + bases=('authtoken.token',), + ), + ] diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py new file mode 100644 index 00000000..0ca9f5d7 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/0004_alter_tokenproxy_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.3 on 2022-11-24 21:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('authtoken', '0003_tokenproxy'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tokenproxy', + options={'verbose_name': 'Token', 'verbose_name_plural': 'Tokens'}, + ), + ] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pyparsing/py.typed b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__init__.py similarity index 100% rename from env/lib/python3.12/site-packages/pip/_vendor/pyparsing/py.typed rename to env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__init__.py diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0001_initial.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bab40089749282c238eb53ba013e025a9c6874b7 GIT binary patch literal 1340 zcmZux&2Jk;6rcU@dUx%lb{m3SnbJc=Y@uYGa*a?eJAqb7i-;q@J&eXXV`rWHVt3tO z4h5th;8sq}fj(>D>X<}lo#Bn2viM86j^RJtcX;1tZslJ%X34jI36Z;XeOLQW@g6OO@Svv zKuf@&C5nJusGbKVI!X1i7rn=f%U4%urDJ9;vCm5^U>;TLEuHr!I+n1EQ$uB5PDjK% zj@Da#8+NG9?_)SE#uYB&-kvGeS=6f+(ZkG}yStLb?=D?Lb%bH|SWf(`)=Pth$|BWv z<}XZBP49rXR5~Do=GKcc16CxO@dL|2!2mKZ)j|?j$hN*EtTX5vXcM;^?bEaw5EK#2 znwLfW$b+tT2oc6q?lS__nQtFPJU9y|Mjp)u#O4I(B8O1Tb0O<2iAY7Ja_mw%7O`{UVox6vW#A*11$eTTSFXl&xX z84tU$Ya*Kj*J~!i#2Fad+YN&$UZaQHuJ>8s^@tf6#C>4cR@?9g(Z1(?w6=cJ2(5^$ z`p7&$T@o4r2_x7E*qa=B!GXcs5O=|N^HmwuYIPl2t`)JquK9x?%~Fg7uR9zv@d!*6 zpp}2rC+f;rUHMg=ly8m8xBgaZQ%PJ>zTckeKzpAbUmL5}PV zwE4&0=!>sT3awG@{%QW|s8l`Lnv|;JQuTLyQmT(~jnn+QqvGn(@}#&rF0MW;OxACY z*Kd!$#3TQ~#D6&UAD$Gyn*xxpiPN;av^dp;cNU*tDL&cwdE>G1@`|qMQz?5{`Qc8m zGEe_*MWGoSzt@`Sxt*l(+RTI7@r=aHO-lZN6Js_X{8#EmGFl%8A2O5wAj0>Um`Z{m c`~$8(1Lc>>WkGqYPjWZLxf}lhX2kUW0Y)%c*Z=?k literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0002_auto_20160226_1747.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0002_auto_20160226_1747.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10767d9e49374d9ba005de8b41b20f320652e64e GIT binary patch literal 1545 zcma)6&2Jk;6rcU@+Pksy;h46Hlu|{hm8~G_xK(>WNN(%`B_FhLisZ{^y)&`b*$*?j zZZH=>>H%)Oap4XqKJ-uM5s6DIRf;tdLMo@;j1p9-CuVlNxQGuihk3tw`^TRs0%a`;4rkkR-lVibL|!}L)-TPs<=MFPGE6bGIA4e_CVml zV9*c{XoyH?2@OdESpKJDk%%NDqtv(JKsgp;g@~I?WT%#K)9hQiGe7ku2xX8u&=Q5g zOp?xjXk{ak!@* zkv5s*gw%nJ9Ym!=+^5oqxc_2}dGF|Qyj^q6PoaaoR@kO9U1GZ?=|fIc158*J_Gg&N zJ%*{g&u5Ki3!}_*nTnx5iGpB<#}}PTRo{aw2pr-aeU4^eoGGLlgeV;p2z!=|1Hvm#7b;GO$u`escXA6_8jjsG zy8W>2d)L=D%0^&^`0cJ~9hxm17z76)JRq#zM?N_;{%j{>`qmBBSY;Shx?I}0St^%r z!i`%uZmoCwB+a6YCVnHqh)s{cSOIErEQtl>i>`$XO z=R75;+BgH$%lzZ=Fta?mczLw2G|Cqr7fGj pTxU!6rv$+=o5qqL2tR`>zks!KWl2yTYp3(8!}-7-M3@kPsjy;$<&QxARfDblckL0_#Z= z4tn#(#l*A0|HKm~Hgomltp>PoaysmSlXT|2%=hMf^QON>Ml2-87mWP{1)<*s84SG- z&YlTygeamoL~Y!_7%6BKQRNU(6>v)%2yWJ6^$ItXu4e0h3Swh!wF5tOvmlO`cTV=1DzFN zU4AF;7^IBQrn?Uk&(y% zD@ivkela;20ZXt8_vvpdYIVsQdZcpb5o){Gca|^wx>E46s z-t638Q=c5ohtc@s^T{F8%GHrO#;3J(YH;$Vt#Xsf+f-;%=5}R!uc(k^_XWBvKflWT kMfy-sEIw9%T*Vk)7zodu8{^pcYMqYFpN!34AVH-1AIoCokN^Mx literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0004_alter_tokenproxy_options.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/0004_alter_tokenproxy_options.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fca7b17f9f499988717db14c5fd1e25f18d801df GIT binary patch literal 783 zcmYjPF>ljA6uz@#Co!#Pp@5J;0x2CVK`yjR2q6^(A)z!N0TRk`y7(Sx65D6ac8kRV zQU}=By6^{3;Xkl5WoqS>i7isvr4#2%LUY5r@6&zn-h1EO@8x9&sr3cp-Up1(pMuPn zH3O3e3LGGgIQCJ1I~XGaJw@EuN8AKFD9sbj_d|1vJ4RM=t-l3vaqa~Do@7a1gt2$7 zMaZ6!$zuf$5TFj`sAF*4!yVH=P#Wka7gLZb&rM$9);HsaeP~S2l-|zDZY8g7&nvk` zUS(;rlZYXN`Nc+~u}L+KqjWMCrSf`GvY*93luggkB$FS-6$2ZutqwZNb5RKD{h= zL+FbI|V?M}RTOQ*OWTe$<5(Pwa zz`~w*A;kc^gh04U{C<~2S+XO-&HB9!6896h8!>OldJq!{aYElp)$g8=L-OB5a{h`$ z*?FI`qVEM$>CB6Il*!@`=}^3JyrIHA8r!Jqj!k3D{@5BjsJi~yIjYn~mD=&@&Exeu zzut`2+9#G-b;hQ3$^P_AUY%dkcFnxX^%!;D)wWG5TqzVF#`x4m`1Xl?0oz}lqm|ldrFM!G(b@k1W%}5{ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/authtoken/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..369dedd8092e6870ba42a90ffe4219aea0801b33 GIT binary patch literal 249 zcmZ9G!Ab)`42E~Cf(U&FuO4hrucaWYw<3ag9@5#ko!y9qJC+u3(5-Sy5rVJf|4;&Jee`PWq8|_E%fQvp(Mrzpqb55|@H;cc H$Sl(zRWe9b literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/models.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/models.py new file mode 100644 index 00000000..6a17c245 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/models.py @@ -0,0 +1,55 @@ +import binascii +import os + +from django.conf import settings +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class Token(models.Model): + """ + The default authorization token model. + """ + key = models.CharField(_("Key"), max_length=40, primary_key=True) + user = models.OneToOneField( + settings.AUTH_USER_MODEL, related_name='auth_token', + on_delete=models.CASCADE, verbose_name=_("User") + ) + created = models.DateTimeField(_("Created"), auto_now_add=True) + + class Meta: + # Work around for a bug in Django: + # https://code.djangoproject.com/ticket/19422 + # + # Also see corresponding ticket: + # https://github.com/encode/django-rest-framework/issues/705 + abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS + verbose_name = _("Token") + verbose_name_plural = _("Tokens") + + def save(self, *args, **kwargs): + if not self.key: + self.key = self.generate_key() + return super().save(*args, **kwargs) + + @classmethod + def generate_key(cls): + return binascii.hexlify(os.urandom(20)).decode() + + def __str__(self): + return self.key + + +class TokenProxy(Token): + """ + Proxy mapping pk to user pk for use in admin. + """ + @property + def pk(self): + return self.user_id + + class Meta: + proxy = 'rest_framework.authtoken' in settings.INSTALLED_APPS + abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS + verbose_name = _("Token") + verbose_name_plural = _("Tokens") diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/serializers.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/serializers.py new file mode 100644 index 00000000..63e64d66 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/serializers.py @@ -0,0 +1,42 @@ +from django.contrib.auth import authenticate +from django.utils.translation import gettext_lazy as _ + +from rest_framework import serializers + + +class AuthTokenSerializer(serializers.Serializer): + username = serializers.CharField( + label=_("Username"), + write_only=True + ) + password = serializers.CharField( + label=_("Password"), + style={'input_type': 'password'}, + trim_whitespace=False, + write_only=True + ) + token = serializers.CharField( + label=_("Token"), + read_only=True + ) + + def validate(self, attrs): + username = attrs.get('username') + password = attrs.get('password') + + if username and password: + user = authenticate(request=self.context.get('request'), + username=username, password=password) + + # The authenticate call simply returns None for is_active=False + # users. (Assuming the default ModelBackend authentication + # backend.) + if not user: + msg = _('Unable to log in with provided credentials.') + raise serializers.ValidationError(msg, code='authorization') + else: + msg = _('Must include "username" and "password".') + raise serializers.ValidationError(msg, code='authorization') + + attrs['user'] = user + return attrs diff --git a/env/lib/python3.12/site-packages/rest_framework/authtoken/views.py b/env/lib/python3.12/site-packages/rest_framework/authtoken/views.py new file mode 100644 index 00000000..50f9acbd --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/authtoken/views.py @@ -0,0 +1,62 @@ +from rest_framework import parsers, renderers +from rest_framework.authtoken.models import Token +from rest_framework.authtoken.serializers import AuthTokenSerializer +from rest_framework.compat import coreapi, coreschema +from rest_framework.response import Response +from rest_framework.schemas import ManualSchema +from rest_framework.schemas import coreapi as coreapi_schema +from rest_framework.views import APIView + + +class ObtainAuthToken(APIView): + throttle_classes = () + permission_classes = () + parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) + renderer_classes = (renderers.JSONRenderer,) + serializer_class = AuthTokenSerializer + + if coreapi_schema.is_enabled(): + schema = ManualSchema( + fields=[ + coreapi.Field( + name="username", + required=True, + location='form', + schema=coreschema.String( + title="Username", + description="Valid username for authentication", + ), + ), + coreapi.Field( + name="password", + required=True, + location='form', + schema=coreschema.String( + title="Password", + description="Valid password for authentication", + ), + ), + ], + encoding="application/json", + ) + + def get_serializer_context(self): + return { + 'request': self.request, + 'format': self.format_kwarg, + 'view': self + } + + def get_serializer(self, *args, **kwargs): + kwargs['context'] = self.get_serializer_context() + return self.serializer_class(*args, **kwargs) + + def post(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + user = serializer.validated_data['user'] + token, created = Token.objects.get_or_create(user=user) + return Response({'token': token.key}) + + +obtain_auth_token = ObtainAuthToken.as_view() diff --git a/env/lib/python3.12/site-packages/rest_framework/checks.py b/env/lib/python3.12/site-packages/rest_framework/checks.py new file mode 100644 index 00000000..d5d77bc5 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/checks.py @@ -0,0 +1,21 @@ +from django.core.checks import Tags, Warning, register + + +@register(Tags.compatibility) +def pagination_system_check(app_configs, **kwargs): + errors = [] + # Use of default page size setting requires a default Paginator class + from rest_framework.settings import api_settings + if api_settings.PAGE_SIZE and not api_settings.DEFAULT_PAGINATION_CLASS: + errors.append( + Warning( + "You have specified a default PAGE_SIZE pagination rest_framework setting, " + "without specifying also a DEFAULT_PAGINATION_CLASS.", + hint="The default for DEFAULT_PAGINATION_CLASS is None. " + "In previous versions this was PageNumberPagination. " + "If you wish to define PAGE_SIZE globally whilst defining " + "pagination_class on a per-view basis you may silence this check.", + id="rest_framework.W001" + ) + ) + return errors diff --git a/env/lib/python3.12/site-packages/rest_framework/compat.py b/env/lib/python3.12/site-packages/rest_framework/compat.py new file mode 100644 index 00000000..27c5632b --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/compat.py @@ -0,0 +1,173 @@ +""" +The `compat` module provides support for backwards compatibility with older +versions of Django/Python, and compatibility wrappers around optional packages. +""" +import django +from django.views.generic import View + + +def unicode_http_header(value): + # Coerce HTTP header value to unicode. + if isinstance(value, bytes): + return value.decode('iso-8859-1') + return value + + +# django.contrib.postgres requires psycopg2 +try: + from django.contrib.postgres import fields as postgres_fields +except ImportError: + postgres_fields = None + + +# coreapi is required for CoreAPI schema generation +try: + import coreapi +except ImportError: + coreapi = None + +# uritemplate is required for OpenAPI and CoreAPI schema generation +try: + import uritemplate +except ImportError: + uritemplate = None + + +# coreschema is optional +try: + import coreschema +except ImportError: + coreschema = None + + +# pyyaml is optional +try: + import yaml +except ImportError: + yaml = None + +# inflection is optional +try: + import inflection +except ImportError: + inflection = None + + +# requests is optional +try: + import requests +except ImportError: + requests = None + + +# PATCH method is not implemented by Django +if 'patch' not in View.http_method_names: + View.http_method_names = View.http_method_names + ['patch'] + + +# Markdown is optional (version 3.0+ required) +try: + import markdown + + HEADERID_EXT_PATH = 'markdown.extensions.toc' + LEVEL_PARAM = 'baselevel' + + def apply_markdown(text): + """ + Simple wrapper around :func:`markdown.markdown` to set the base level + of '#' style headers to

      . + """ + extensions = [HEADERID_EXT_PATH] + extension_configs = { + HEADERID_EXT_PATH: { + LEVEL_PARAM: '2' + } + } + md = markdown.Markdown( + extensions=extensions, extension_configs=extension_configs + ) + md_filter_add_syntax_highlight(md) + return md.convert(text) +except ImportError: + apply_markdown = None + markdown = None + + +try: + import pygments + from pygments.formatters import HtmlFormatter + from pygments.lexers import TextLexer, get_lexer_by_name + + def pygments_highlight(text, lang, style): + lexer = get_lexer_by_name(lang, stripall=False) + formatter = HtmlFormatter(nowrap=True, style=style) + return pygments.highlight(text, lexer, formatter) + + def pygments_css(style): + formatter = HtmlFormatter(style=style) + return formatter.get_style_defs('.highlight') + +except ImportError: + pygments = None + + def pygments_highlight(text, lang, style): + return text + + def pygments_css(style): + return None + +if markdown is not None and pygments is not None: + # starting from this blogpost and modified to support current markdown extensions API + # https://zerokspot.com/weblog/2008/06/18/syntax-highlighting-in-markdown-with-pygments/ + + import re + + from markdown.preprocessors import Preprocessor + + class CodeBlockPreprocessor(Preprocessor): + pattern = re.compile( + r'^\s*``` *([^\n]+)\n(.+?)^\s*```', re.M | re.S) + + formatter = HtmlFormatter() + + def run(self, lines): + def repl(m): + try: + lexer = get_lexer_by_name(m.group(1)) + except (ValueError, NameError): + lexer = TextLexer() + code = m.group(2).replace('\t', ' ') + code = pygments.highlight(code, lexer, self.formatter) + code = code.replace('\n\n', '\n \n').replace('\n', '
      ').replace('\\@', '@') + return '\n\n%s\n\n' % code + ret = self.pattern.sub(repl, "\n".join(lines)) + return ret.split("\n") + + def md_filter_add_syntax_highlight(md): + md.preprocessors.register(CodeBlockPreprocessor(), 'highlight', 40) + return True +else: + def md_filter_add_syntax_highlight(md): + return False + + +if django.VERSION >= (5, 1): + # Django 5.1+: use the stock ip_address_validators function + # Note: Before Django 5.1, ip_address_validators returns a tuple containing + # 1) the list of validators and 2) the error message. Starting from + # Django 5.1 ip_address_validators only returns the list of validators + from django.core.validators import ip_address_validators +else: + # Django <= 5.1: create a compatibility shim for ip_address_validators + from django.core.validators import \ + ip_address_validators as _ip_address_validators + + def ip_address_validators(protocol, unpack_ipv4): + return _ip_address_validators(protocol, unpack_ipv4)[0] + + +# `separators` argument to `json.dumps()` differs between 2.x and 3.x +# See: https://bugs.python.org/issue22767 +SHORT_SEPARATORS = (',', ':') +LONG_SEPARATORS = (', ', ': ') +INDENT_SEPARATORS = (',', ': ') diff --git a/env/lib/python3.12/site-packages/rest_framework/decorators.py b/env/lib/python3.12/site-packages/rest_framework/decorators.py new file mode 100644 index 00000000..864ff739 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/decorators.py @@ -0,0 +1,233 @@ +""" +The most important decorator in this module is `@api_view`, which is used +for writing function-based views with REST framework. + +There are also various decorators for setting the API policies on function +based views, as well as the `@action` decorator, which is used to annotate +methods on viewsets that should be included by routers. +""" +import types + +from django.forms.utils import pretty_name + +from rest_framework.views import APIView + + +def api_view(http_method_names=None): + """ + Decorator that converts a function-based view into an APIView subclass. + Takes a list of allowed methods for the view as an argument. + """ + http_method_names = ['GET'] if (http_method_names is None) else http_method_names + + def decorator(func): + + WrappedAPIView = type( + 'WrappedAPIView', + (APIView,), + {'__doc__': func.__doc__} + ) + + # Note, the above allows us to set the docstring. + # It is the equivalent of: + # + # class WrappedAPIView(APIView): + # pass + # WrappedAPIView.__doc__ = func.doc <--- Not possible to do this + + # api_view applied without (method_names) + assert not isinstance(http_method_names, types.FunctionType), \ + '@api_view missing list of allowed HTTP methods' + + # api_view applied with eg. string instead of list of strings + assert isinstance(http_method_names, (list, tuple)), \ + '@api_view expected a list of strings, received %s' % type(http_method_names).__name__ + + allowed_methods = set(http_method_names) | {'options'} + WrappedAPIView.http_method_names = [method.lower() for method in allowed_methods] + + def handler(self, *args, **kwargs): + return func(*args, **kwargs) + + for method in http_method_names: + setattr(WrappedAPIView, method.lower(), handler) + + WrappedAPIView.__name__ = func.__name__ + WrappedAPIView.__module__ = func.__module__ + + WrappedAPIView.renderer_classes = getattr(func, 'renderer_classes', + APIView.renderer_classes) + + WrappedAPIView.parser_classes = getattr(func, 'parser_classes', + APIView.parser_classes) + + WrappedAPIView.authentication_classes = getattr(func, 'authentication_classes', + APIView.authentication_classes) + + WrappedAPIView.throttle_classes = getattr(func, 'throttle_classes', + APIView.throttle_classes) + + WrappedAPIView.permission_classes = getattr(func, 'permission_classes', + APIView.permission_classes) + + WrappedAPIView.schema = getattr(func, 'schema', + APIView.schema) + + return WrappedAPIView.as_view() + + return decorator + + +def renderer_classes(renderer_classes): + def decorator(func): + func.renderer_classes = renderer_classes + return func + return decorator + + +def parser_classes(parser_classes): + def decorator(func): + func.parser_classes = parser_classes + return func + return decorator + + +def authentication_classes(authentication_classes): + def decorator(func): + func.authentication_classes = authentication_classes + return func + return decorator + + +def throttle_classes(throttle_classes): + def decorator(func): + func.throttle_classes = throttle_classes + return func + return decorator + + +def permission_classes(permission_classes): + def decorator(func): + func.permission_classes = permission_classes + return func + return decorator + + +def schema(view_inspector): + def decorator(func): + func.schema = view_inspector + return func + return decorator + + +def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs): + """ + Mark a ViewSet method as a routable action. + + `@action`-decorated functions will be endowed with a `mapping` property, + a `MethodMapper` that can be used to add additional method-based behaviors + on the routed action. + + :param methods: A list of HTTP method names this action responds to. + Defaults to GET only. + :param detail: Required. Determines whether this action applies to + instance/detail requests or collection/list requests. + :param url_path: Define the URL segment for this action. Defaults to the + name of the method decorated. + :param url_name: Define the internal (`reverse`) URL name for this action. + Defaults to the name of the method decorated with underscores + replaced with dashes. + :param kwargs: Additional properties to set on the view. This can be used + to override viewset-level *_classes settings, equivalent to + how the `@renderer_classes` etc. decorators work for function- + based API views. + """ + methods = ['get'] if methods is None else methods + methods = [method.lower() for method in methods] + + assert detail is not None, ( + "@action() missing required argument: 'detail'" + ) + + # name and suffix are mutually exclusive + if 'name' in kwargs and 'suffix' in kwargs: + raise TypeError("`name` and `suffix` are mutually exclusive arguments.") + + def decorator(func): + func.mapping = MethodMapper(func, methods) + + func.detail = detail + func.url_path = url_path if url_path else func.__name__ + func.url_name = url_name if url_name else func.__name__.replace('_', '-') + + # These kwargs will end up being passed to `ViewSet.as_view()` within + # the router, which eventually delegates to Django's CBV `View`, + # which assigns them as instance attributes for each request. + func.kwargs = kwargs + + # Set descriptive arguments for viewsets + if 'name' not in kwargs and 'suffix' not in kwargs: + func.kwargs['name'] = pretty_name(func.__name__) + func.kwargs['description'] = func.__doc__ or None + + return func + return decorator + + +class MethodMapper(dict): + """ + Enables mapping HTTP methods to different ViewSet methods for a single, + logical action. + + Example usage: + + class MyViewSet(ViewSet): + + @action(detail=False) + def example(self, request, **kwargs): + ... + + @example.mapping.post + def create_example(self, request, **kwargs): + ... + """ + + def __init__(self, action, methods): + self.action = action + for method in methods: + self[method] = self.action.__name__ + + def _map(self, method, func): + assert method not in self, ( + "Method '%s' has already been mapped to '.%s'." % (method, self[method])) + assert func.__name__ != self.action.__name__, ( + "Method mapping does not behave like the property decorator. You " + "cannot use the same method name for each mapping declaration.") + + self[method] = func.__name__ + + return func + + def get(self, func): + return self._map('get', func) + + def post(self, func): + return self._map('post', func) + + def put(self, func): + return self._map('put', func) + + def patch(self, func): + return self._map('patch', func) + + def delete(self, func): + return self._map('delete', func) + + def head(self, func): + return self._map('head', func) + + def options(self, func): + return self._map('options', func) + + def trace(self, func): + return self._map('trace', func) diff --git a/env/lib/python3.12/site-packages/rest_framework/documentation.py b/env/lib/python3.12/site-packages/rest_framework/documentation.py new file mode 100644 index 00000000..53e5ab55 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/documentation.py @@ -0,0 +1,88 @@ +from django.urls import include, path + +from rest_framework.renderers import ( + CoreJSONRenderer, DocumentationRenderer, SchemaJSRenderer +) +from rest_framework.schemas import SchemaGenerator, get_schema_view +from rest_framework.settings import api_settings + + +def get_docs_view( + title=None, description=None, schema_url=None, urlconf=None, + public=True, patterns=None, generator_class=SchemaGenerator, + authentication_classes=api_settings.DEFAULT_AUTHENTICATION_CLASSES, + permission_classes=api_settings.DEFAULT_PERMISSION_CLASSES, + renderer_classes=None): + + if renderer_classes is None: + renderer_classes = [DocumentationRenderer, CoreJSONRenderer] + + return get_schema_view( + title=title, + url=schema_url, + urlconf=urlconf, + description=description, + renderer_classes=renderer_classes, + public=public, + patterns=patterns, + generator_class=generator_class, + authentication_classes=authentication_classes, + permission_classes=permission_classes, + ) + + +def get_schemajs_view( + title=None, description=None, schema_url=None, urlconf=None, + public=True, patterns=None, generator_class=SchemaGenerator, + authentication_classes=api_settings.DEFAULT_AUTHENTICATION_CLASSES, + permission_classes=api_settings.DEFAULT_PERMISSION_CLASSES): + renderer_classes = [SchemaJSRenderer] + + return get_schema_view( + title=title, + url=schema_url, + urlconf=urlconf, + description=description, + renderer_classes=renderer_classes, + public=public, + patterns=patterns, + generator_class=generator_class, + authentication_classes=authentication_classes, + permission_classes=permission_classes, + ) + + +def include_docs_urls( + title=None, description=None, schema_url=None, urlconf=None, + public=True, patterns=None, generator_class=SchemaGenerator, + authentication_classes=api_settings.DEFAULT_AUTHENTICATION_CLASSES, + permission_classes=api_settings.DEFAULT_PERMISSION_CLASSES, + renderer_classes=None): + docs_view = get_docs_view( + title=title, + description=description, + schema_url=schema_url, + urlconf=urlconf, + public=public, + patterns=patterns, + generator_class=generator_class, + authentication_classes=authentication_classes, + renderer_classes=renderer_classes, + permission_classes=permission_classes, + ) + schema_js_view = get_schemajs_view( + title=title, + description=description, + schema_url=schema_url, + urlconf=urlconf, + public=public, + patterns=patterns, + generator_class=generator_class, + authentication_classes=authentication_classes, + permission_classes=permission_classes, + ) + urls = [ + path('', docs_view, name='docs-index'), + path('schema.js', schema_js_view, name='schema-js') + ] + return include((urls, 'api-docs'), namespace='api-docs') diff --git a/env/lib/python3.12/site-packages/rest_framework/exceptions.py b/env/lib/python3.12/site-packages/rest_framework/exceptions.py new file mode 100644 index 00000000..09f11110 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/exceptions.py @@ -0,0 +1,264 @@ +""" +Handled exceptions raised by REST framework. + +In addition, Django's built in 403 and 404 exceptions are handled. +(`django.http.Http404` and `django.core.exceptions.PermissionDenied`) +""" +import math + +from django.http import JsonResponse +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import ngettext + +from rest_framework import status +from rest_framework.utils.serializer_helpers import ReturnDict, ReturnList + + +def _get_error_details(data, default_code=None): + """ + Descend into a nested data structure, forcing any + lazy translation strings or strings into `ErrorDetail`. + """ + if isinstance(data, (list, tuple)): + ret = [ + _get_error_details(item, default_code) for item in data + ] + if isinstance(data, ReturnList): + return ReturnList(ret, serializer=data.serializer) + return ret + elif isinstance(data, dict): + ret = { + key: _get_error_details(value, default_code) + for key, value in data.items() + } + if isinstance(data, ReturnDict): + return ReturnDict(ret, serializer=data.serializer) + return ret + + text = force_str(data) + code = getattr(data, 'code', default_code) + return ErrorDetail(text, code) + + +def _get_codes(detail): + if isinstance(detail, list): + return [_get_codes(item) for item in detail] + elif isinstance(detail, dict): + return {key: _get_codes(value) for key, value in detail.items()} + return detail.code + + +def _get_full_details(detail): + if isinstance(detail, list): + return [_get_full_details(item) for item in detail] + elif isinstance(detail, dict): + return {key: _get_full_details(value) for key, value in detail.items()} + return { + 'message': detail, + 'code': detail.code + } + + +class ErrorDetail(str): + """ + A string-like object that can additionally have a code. + """ + code = None + + def __new__(cls, string, code=None): + self = super().__new__(cls, string) + self.code = code + return self + + def __eq__(self, other): + result = super().__eq__(other) + if result is NotImplemented: + return NotImplemented + try: + return result and self.code == other.code + except AttributeError: + return result + + def __ne__(self, other): + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + return not result + + def __repr__(self): + return 'ErrorDetail(string=%r, code=%r)' % ( + str(self), + self.code, + ) + + def __hash__(self): + return hash(str(self)) + + +class APIException(Exception): + """ + Base class for REST framework exceptions. + Subclasses should provide `.status_code` and `.default_detail` properties. + """ + status_code = status.HTTP_500_INTERNAL_SERVER_ERROR + default_detail = _('A server error occurred.') + default_code = 'error' + + def __init__(self, detail=None, code=None): + if detail is None: + detail = self.default_detail + if code is None: + code = self.default_code + + self.detail = _get_error_details(detail, code) + + def __str__(self): + return str(self.detail) + + def get_codes(self): + """ + Return only the code part of the error details. + + Eg. {"name": ["required"]} + """ + return _get_codes(self.detail) + + def get_full_details(self): + """ + Return both the message & code parts of the error details. + + Eg. {"name": [{"message": "This field is required.", "code": "required"}]} + """ + return _get_full_details(self.detail) + + +# The recommended style for using `ValidationError` is to keep it namespaced +# under `serializers`, in order to minimize potential confusion with Django's +# built in `ValidationError`. For example: +# +# from rest_framework import serializers +# raise serializers.ValidationError('Value was invalid') + +class ValidationError(APIException): + status_code = status.HTTP_400_BAD_REQUEST + default_detail = _('Invalid input.') + default_code = 'invalid' + + def __init__(self, detail=None, code=None): + if detail is None: + detail = self.default_detail + if code is None: + code = self.default_code + + # For validation failures, we may collect many errors together, + # so the details should always be coerced to a list if not already. + if isinstance(detail, tuple): + detail = list(detail) + elif not isinstance(detail, dict) and not isinstance(detail, list): + detail = [detail] + + self.detail = _get_error_details(detail, code) + + +class ParseError(APIException): + status_code = status.HTTP_400_BAD_REQUEST + default_detail = _('Malformed request.') + default_code = 'parse_error' + + +class AuthenticationFailed(APIException): + status_code = status.HTTP_401_UNAUTHORIZED + default_detail = _('Incorrect authentication credentials.') + default_code = 'authentication_failed' + + +class NotAuthenticated(APIException): + status_code = status.HTTP_401_UNAUTHORIZED + default_detail = _('Authentication credentials were not provided.') + default_code = 'not_authenticated' + + +class PermissionDenied(APIException): + status_code = status.HTTP_403_FORBIDDEN + default_detail = _('You do not have permission to perform this action.') + default_code = 'permission_denied' + + +class NotFound(APIException): + status_code = status.HTTP_404_NOT_FOUND + default_detail = _('Not found.') + default_code = 'not_found' + + +class MethodNotAllowed(APIException): + status_code = status.HTTP_405_METHOD_NOT_ALLOWED + default_detail = _('Method "{method}" not allowed.') + default_code = 'method_not_allowed' + + def __init__(self, method, detail=None, code=None): + if detail is None: + detail = force_str(self.default_detail).format(method=method) + super().__init__(detail, code) + + +class NotAcceptable(APIException): + status_code = status.HTTP_406_NOT_ACCEPTABLE + default_detail = _('Could not satisfy the request Accept header.') + default_code = 'not_acceptable' + + def __init__(self, detail=None, code=None, available_renderers=None): + self.available_renderers = available_renderers + super().__init__(detail, code) + + +class UnsupportedMediaType(APIException): + status_code = status.HTTP_415_UNSUPPORTED_MEDIA_TYPE + default_detail = _('Unsupported media type "{media_type}" in request.') + default_code = 'unsupported_media_type' + + def __init__(self, media_type, detail=None, code=None): + if detail is None: + detail = force_str(self.default_detail).format(media_type=media_type) + super().__init__(detail, code) + + +class Throttled(APIException): + status_code = status.HTTP_429_TOO_MANY_REQUESTS + default_detail = _('Request was throttled.') + extra_detail_singular = _('Expected available in {wait} second.') + extra_detail_plural = _('Expected available in {wait} seconds.') + default_code = 'throttled' + + def __init__(self, wait=None, detail=None, code=None): + if detail is None: + detail = force_str(self.default_detail) + if wait is not None: + wait = math.ceil(wait) + detail = ' '.join(( + detail, + force_str(ngettext(self.extra_detail_singular.format(wait=wait), + self.extra_detail_plural.format(wait=wait), + wait)))) + self.wait = wait + super().__init__(detail, code) + + +def server_error(request, *args, **kwargs): + """ + Generic 500 error handler. + """ + data = { + 'error': 'Server Error (500)' + } + return JsonResponse(data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +def bad_request(request, exception, *args, **kwargs): + """ + Generic 400 error handler. + """ + data = { + 'error': 'Bad Request (400)' + } + return JsonResponse(data, status=status.HTTP_400_BAD_REQUEST) diff --git a/env/lib/python3.12/site-packages/rest_framework/fields.py b/env/lib/python3.12/site-packages/rest_framework/fields.py new file mode 100644 index 00000000..cbc02e2c --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/fields.py @@ -0,0 +1,1910 @@ +import contextlib +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections.abc import Mapping +from enum import Enum + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.translation import gettext_lazy as _ + +try: + import pytz +except ImportError: + pytz = None + +from rest_framework import ISO_8601 +from rest_framework.compat import ip_address_validators +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.utils.timezone import valid_datetime +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + """ + This class is used to represent no data being provided for a given input + or output value. + + It is required because `None` may be a valid input or output value. + """ + pass + + +class BuiltinSignatureError(Exception): + """ + Built-in function signatures are not inspectable. This exception is raised + so the serializer can raise a helpful error message. + """ + pass + + +def is_simple_callable(obj): + """ + True if the object is a callable that takes no arguments. + """ + if not callable(obj): + return False + + # Bail early since we cannot inspect built-in function signatures. + if inspect.isbuiltin(obj): + raise BuiltinSignatureError( + 'Built-in function signatures are not inspectable. ' + 'Wrap the function call in a simple, pure Python function.') + + if not (inspect.isfunction(obj) or inspect.ismethod(obj) or isinstance(obj, functools.partial)): + return False + + sig = inspect.signature(obj) + params = sig.parameters.values() + return all( + param.kind == param.VAR_POSITIONAL or + param.kind == param.VAR_KEYWORD or + param.default != param.empty + for param in params + ) + + +def get_attribute(instance, attrs): + """ + Similar to Python's built in `getattr(instance, attr)`, + but takes a list of nested attributes, instead of a single attribute. + + Also accepts either attribute lookup on objects or dictionary lookups. + """ + for attr in attrs: + try: + if isinstance(instance, Mapping): + instance = instance[attr] + else: + instance = getattr(instance, attr) + except ObjectDoesNotExist: + return None + if is_simple_callable(instance): + try: + instance = instance() + except (AttributeError, KeyError) as exc: + # If we raised an Attribute or KeyError here it'd get treated + # as an omitted field in `Field.get_attribute()`. Instead we + # raise a ValueError to ensure the exception is not masked. + raise ValueError('Exception raised in callable attribute "{}"; original exception was: {}'.format(attr, exc)) + + return instance + + +def to_choices_dict(choices): + """ + Convert choices into key/value dicts. + + to_choices_dict([1]) -> {1: 1} + to_choices_dict([(1, '1st'), (2, '2nd')]) -> {1: '1st', 2: '2nd'} + to_choices_dict([('Group', ((1, '1st'), 2))]) -> {'Group': {1: '1st', 2: '2'}} + """ + # Allow single, paired or grouped choices style: + # choices = [1, 2, 3] + # choices = [(1, 'First'), (2, 'Second'), (3, 'Third')] + # choices = [('Category', ((1, 'First'), (2, 'Second'))), (3, 'Third')] + ret = {} + for choice in choices: + if not isinstance(choice, (list, tuple)): + # single choice + ret[choice] = choice + else: + key, value = choice + if isinstance(value, (list, tuple)): + # grouped choices (category, sub choices) + ret[key] = to_choices_dict(value) + else: + # paired choice (key, display value) + ret[key] = value + return ret + + +def flatten_choices_dict(choices): + """ + Convert a group choices dict into a flat dict of choices. + + flatten_choices_dict({1: '1st', 2: '2nd'}) -> {1: '1st', 2: '2nd'} + flatten_choices_dict({'Group': {1: '1st', 2: '2nd'}}) -> {1: '1st', 2: '2nd'} + """ + ret = {} + for key, value in choices.items(): + if isinstance(value, dict): + # grouped choices (category, sub choices) + for sub_key, sub_value in value.items(): + ret[sub_key] = sub_value + else: + # choice (key, display value) + ret[key] = value + return ret + + +def iter_options(grouped_choices, cutoff=None, cutoff_text=None): + """ + Helper function for options and option groups in templates. + """ + class StartOptionGroup: + start_option_group = True + end_option_group = False + + def __init__(self, label): + self.label = label + + class EndOptionGroup: + start_option_group = False + end_option_group = True + + class Option: + start_option_group = False + end_option_group = False + + def __init__(self, value, display_text, disabled=False): + self.value = value + self.display_text = display_text + self.disabled = disabled + + count = 0 + + for key, value in grouped_choices.items(): + if cutoff and count >= cutoff: + break + + if isinstance(value, dict): + yield StartOptionGroup(label=key) + for sub_key, sub_value in value.items(): + if cutoff and count >= cutoff: + break + yield Option(value=sub_key, display_text=sub_value) + count += 1 + yield EndOptionGroup() + else: + yield Option(value=key, display_text=value) + count += 1 + + if cutoff and count >= cutoff and cutoff_text: + cutoff_text = cutoff_text.format(count=cutoff) + yield Option(value='n/a', display_text=cutoff_text, disabled=True) + + +def get_error_detail(exc_info): + """ + Given a Django ValidationError, return a list of ErrorDetail, + with the `code` populated. + """ + code = getattr(exc_info, 'code', None) or 'invalid' + + try: + error_dict = exc_info.error_dict + except AttributeError: + return [ + ErrorDetail((error.message % error.params) if error.params else error.message, + code=error.code if error.code else code) + for error in exc_info.error_list] + return { + k: [ + ErrorDetail((error.message % error.params) if error.params else error.message, + code=error.code if error.code else code) + for error in errors + ] for k, errors in error_dict.items() + } + + +class CreateOnlyDefault: + """ + This class may be used to provide default values that are only used + for create operations, but that do not return any value for update + operations. + """ + requires_context = True + + def __init__(self, default): + self.default = default + + def __call__(self, serializer_field): + is_update = serializer_field.parent.instance is not None + if is_update: + raise SkipField() + if callable(self.default): + if getattr(self.default, 'requires_context', False): + return self.default(serializer_field) + else: + return self.default() + return self.default + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, repr(self.default)) + + +class CurrentUserDefault: + requires_context = True + + def __call__(self, serializer_field): + return serializer_field.context['request'].user + + def __repr__(self): + return '%s()' % self.__class__.__name__ + + +class SkipField(Exception): + pass + + +REGEX_TYPE = type(re.compile('')) + +NOT_READ_ONLY_WRITE_ONLY = 'May not set both `read_only` and `write_only`' +NOT_READ_ONLY_REQUIRED = 'May not set both `read_only` and `required`' +NOT_REQUIRED_DEFAULT = 'May not set both `required` and `default`' +USE_READONLYFIELD = 'Field(read_only=True) should be ReadOnlyField' +MISSING_ERROR_MESSAGE = ( + 'ValidationError raised by `{class_name}`, but error key `{key}` does ' + 'not exist in the `error_messages` dictionary.' +) + + +class Field: + _creation_counter = 0 + + default_error_messages = { + 'required': _('This field is required.'), + 'null': _('This field may not be null.') + } + default_validators = [] + default_empty_html = empty + initial = None + + def __init__(self, *, read_only=False, write_only=False, + required=None, default=empty, initial=empty, source=None, + label=None, help_text=None, style=None, + error_messages=None, validators=None, allow_null=False): + self._creation_counter = Field._creation_counter + Field._creation_counter += 1 + + # If `required` is unset, then use `True` unless a default is provided. + if required is None: + required = default is empty and not read_only + + # Some combinations of keyword arguments do not make sense. + assert not (read_only and write_only), NOT_READ_ONLY_WRITE_ONLY + assert not (read_only and required), NOT_READ_ONLY_REQUIRED + assert not (required and default is not empty), NOT_REQUIRED_DEFAULT + assert not (read_only and self.__class__ == Field), USE_READONLYFIELD + + self.read_only = read_only + self.write_only = write_only + self.required = required + self.default = default + self.source = source + self.initial = self.initial if (initial is empty) else initial + self.label = label + self.help_text = help_text + self.style = {} if style is None else style + self.allow_null = allow_null + + if self.default_empty_html is not empty: + if default is not empty: + self.default_empty_html = default + + if validators is not None: + self.validators = list(validators) + + # These are set up by `.bind()` when the field is added to a serializer. + self.field_name = None + self.parent = None + + # Collect default error message from self and parent classes + messages = {} + for cls in reversed(self.__class__.__mro__): + messages.update(getattr(cls, 'default_error_messages', {})) + messages.update(error_messages or {}) + self.error_messages = messages + + # Allow generic typing checking for fields. + def __class_getitem__(cls, *args, **kwargs): + return cls + + def bind(self, field_name, parent): + """ + Initializes the field name and parent for the field instance. + Called when a field is added to the parent serializer instance. + """ + + # In order to enforce a consistent style, we error if a redundant + # 'source' argument has been used. For example: + # my_field = serializer.CharField(source='my_field') + assert self.source != field_name, ( + "It is redundant to specify `source='%s'` on field '%s' in " + "serializer '%s', because it is the same as the field name. " + "Remove the `source` keyword argument." % + (field_name, self.__class__.__name__, parent.__class__.__name__) + ) + + self.field_name = field_name + self.parent = parent + + # `self.label` should default to being based on the field name. + if self.label is None: + self.label = field_name.replace('_', ' ').capitalize() + + # self.source should default to being the same as the field name. + if self.source is None: + self.source = field_name + + # self.source_attrs is a list of attributes that need to be looked up + # when serializing the instance, or populating the validated data. + if self.source == '*': + self.source_attrs = [] + else: + self.source_attrs = self.source.split('.') + + # .validators is a lazily loaded property, that gets its default + # value from `get_validators`. + @property + def validators(self): + if not hasattr(self, '_validators'): + self._validators = self.get_validators() + return self._validators + + @validators.setter + def validators(self, validators): + self._validators = validators + + def get_validators(self): + return list(self.default_validators) + + def get_initial(self): + """ + Return a value to use when the field is being returned as a primitive + value, without any object instance. + """ + if callable(self.initial): + return self.initial() + return self.initial + + def get_value(self, dictionary): + """ + Given the *incoming* primitive data, return the value for this field + that should be validated and transformed to a native value. + """ + if html.is_html_input(dictionary): + # HTML forms will represent empty fields as '', and cannot + # represent None or False values directly. + if self.field_name not in dictionary: + if getattr(self.root, 'partial', False): + return empty + return self.default_empty_html + ret = dictionary[self.field_name] + if ret == '' and self.allow_null: + # If the field is blank, and null is a valid value then + # determine if we should use null instead. + return '' if getattr(self, 'allow_blank', False) else None + elif ret == '' and not self.required: + # If the field is blank, and emptiness is valid then + # determine if we should use emptiness instead. + return '' if getattr(self, 'allow_blank', False) else empty + return ret + return dictionary.get(self.field_name, empty) + + def get_attribute(self, instance): + """ + Given the *outgoing* object instance, return the primitive value + that should be used for this field. + """ + try: + return get_attribute(instance, self.source_attrs) + except BuiltinSignatureError as exc: + msg = ( + 'Field source for `{serializer}.{field}` maps to a built-in ' + 'function type and is invalid. Define a property or method on ' + 'the `{instance}` instance that wraps the call to the built-in ' + 'function.'.format( + serializer=self.parent.__class__.__name__, + field=self.field_name, + instance=instance.__class__.__name__, + ) + ) + raise type(exc)(msg) + except (KeyError, AttributeError) as exc: + if self.default is not empty: + return self.get_default() + if self.allow_null: + return None + if not self.required: + raise SkipField() + msg = ( + 'Got {exc_type} when attempting to get a value for field ' + '`{field}` on serializer `{serializer}`.\nThe serializer ' + 'field might be named incorrectly and not match ' + 'any attribute or key on the `{instance}` instance.\n' + 'Original exception text was: {exc}.'.format( + exc_type=type(exc).__name__, + field=self.field_name, + serializer=self.parent.__class__.__name__, + instance=instance.__class__.__name__, + exc=exc + ) + ) + raise type(exc)(msg) + + def get_default(self): + """ + Return the default value to use when validating data if no input + is provided for this field. + + If a default has not been set for this field then this will simply + raise `SkipField`, indicating that no value should be set in the + validated data for this field. + """ + if self.default is empty or getattr(self.root, 'partial', False): + # No default, or this is a partial update. + raise SkipField() + if callable(self.default): + if getattr(self.default, 'requires_context', False): + return self.default(self) + else: + return self.default() + + return self.default + + def validate_empty_values(self, data): + """ + Validate empty values, and either: + + * Raise `ValidationError`, indicating invalid data. + * Raise `SkipField`, indicating that the field should be ignored. + * Return (True, data), indicating an empty value that should be + returned without any further validation being applied. + * Return (False, data), indicating a non-empty value, that should + have validation applied as normal. + """ + if self.read_only: + return (True, self.get_default()) + + if data is empty: + if getattr(self.root, 'partial', False): + raise SkipField() + if self.required: + self.fail('required') + return (True, self.get_default()) + + if data is None: + if not self.allow_null: + self.fail('null') + # Nullable `source='*'` fields should not be skipped when its named + # field is given a null value. This is because `source='*'` means + # the field is passed the entire object, which is not null. + elif self.source == '*': + return (False, None) + return (True, None) + + return (False, data) + + def run_validation(self, data=empty): + """ + Validate a simple representation and return the internal value. + + The provided data may be `empty` if no representation was included + in the input. + + May raise `SkipField` if the field should not be included in the + validated data. + """ + (is_empty_value, data) = self.validate_empty_values(data) + if is_empty_value: + return data + value = self.to_internal_value(data) + self.run_validators(value) + return value + + def run_validators(self, value): + """ + Test the given value against all the validators on the field, + and either raise a `ValidationError` or simply return. + """ + errors = [] + for validator in self.validators: + try: + if getattr(validator, 'requires_context', False): + validator(value, self) + else: + validator(value) + except ValidationError as exc: + # If the validation error contains a mapping of fields to + # errors then simply raise it immediately rather than + # attempting to accumulate a list of errors. + if isinstance(exc.detail, dict): + raise + errors.extend(exc.detail) + except DjangoValidationError as exc: + errors.extend(get_error_detail(exc)) + if errors: + raise ValidationError(errors) + + def to_internal_value(self, data): + """ + Transform the *incoming* primitive data into a native value. + """ + raise NotImplementedError( + '{cls}.to_internal_value() must be implemented for field ' + '{field_name}. If you do not need to support write operations ' + 'you probably want to subclass `ReadOnlyField` instead.'.format( + cls=self.__class__.__name__, + field_name=self.field_name, + ) + ) + + def to_representation(self, value): + """ + Transform the *outgoing* native value into primitive data. + """ + raise NotImplementedError( + '{cls}.to_representation() must be implemented for field {field_name}.'.format( + cls=self.__class__.__name__, + field_name=self.field_name, + ) + ) + + def fail(self, key, **kwargs): + """ + A helper method that simply raises a validation error. + """ + try: + msg = self.error_messages[key] + except KeyError: + class_name = self.__class__.__name__ + msg = MISSING_ERROR_MESSAGE.format(class_name=class_name, key=key) + raise AssertionError(msg) + message_string = msg.format(**kwargs) + raise ValidationError(message_string, code=key) + + @property + def root(self): + """ + Returns the top-level serializer for this field. + """ + root = self + while root.parent is not None: + root = root.parent + return root + + @property + def context(self): + """ + Returns the context as passed to the root serializer on initialization. + """ + return getattr(self.root, '_context', {}) + + def __new__(cls, *args, **kwargs): + """ + When a field is instantiated, we store the arguments that were used, + so that we can present a helpful representation of the object. + """ + instance = super().__new__(cls) + instance._args = args + instance._kwargs = kwargs + return instance + + def __deepcopy__(self, memo): + """ + When cloning fields we instantiate using the arguments it was + originally created with, rather than copying the complete state. + """ + # Treat regexes and validators as immutable. + # See https://github.com/encode/django-rest-framework/issues/1954 + # and https://github.com/encode/django-rest-framework/pull/4489 + args = [ + copy.deepcopy(item) if not isinstance(item, REGEX_TYPE) else item + for item in self._args + ] + kwargs = { + key: (copy.deepcopy(value, memo) if (key not in ('validators', 'regex')) else value) + for key, value in self._kwargs.items() + } + return self.__class__(*args, **kwargs) + + def __repr__(self): + """ + Fields are represented using their initial calling arguments. + This allows us to create descriptive representations for serializer + instances that show all the declared fields on the serializer. + """ + return representation.field_repr(self) + + +# Boolean types... + +class BooleanField(Field): + default_error_messages = { + 'invalid': _('Must be a valid boolean.') + } + default_empty_html = False + initial = False + TRUE_VALUES = { + 't', + 'y', + 'yes', + 'true', + 'on', + '1', + 1, + True, + } + FALSE_VALUES = { + 'f', + 'n', + 'no', + 'false', + 'off', + '0', + 0, + 0.0, + False, + } + NULL_VALUES = {'null', '', None} + + def __init__(self, **kwargs): + if kwargs.get('allow_null', False): + self.default_empty_html = None + self.initial = None + super().__init__(**kwargs) + + @staticmethod + def _lower_if_str(value): + if isinstance(value, str): + return value.lower() + return value + + def to_internal_value(self, data): + with contextlib.suppress(TypeError): + if self._lower_if_str(data) in self.TRUE_VALUES: + return True + elif self._lower_if_str(data) in self.FALSE_VALUES: + return False + elif self._lower_if_str(data) in self.NULL_VALUES and self.allow_null: + return None + self.fail("invalid", input=data) + + def to_representation(self, value): + if self._lower_if_str(value) in self.TRUE_VALUES: + return True + elif self._lower_if_str(value) in self.FALSE_VALUES: + return False + if self._lower_if_str(value) in self.NULL_VALUES and self.allow_null: + return None + return bool(value) + + +# String types... + +class CharField(Field): + default_error_messages = { + 'invalid': _('Not a valid string.'), + 'blank': _('This field may not be blank.'), + 'max_length': _('Ensure this field has no more than {max_length} characters.'), + 'min_length': _('Ensure this field has at least {min_length} characters.'), + } + initial = '' + + def __init__(self, **kwargs): + self.allow_blank = kwargs.pop('allow_blank', False) + self.trim_whitespace = kwargs.pop('trim_whitespace', True) + self.max_length = kwargs.pop('max_length', None) + self.min_length = kwargs.pop('min_length', None) + super().__init__(**kwargs) + if self.max_length is not None: + message = lazy_format(self.error_messages['max_length'], max_length=self.max_length) + self.validators.append( + MaxLengthValidator(self.max_length, message=message)) + if self.min_length is not None: + message = lazy_format(self.error_messages['min_length'], min_length=self.min_length) + self.validators.append( + MinLengthValidator(self.min_length, message=message)) + + self.validators.append(ProhibitNullCharactersValidator()) + self.validators.append(ProhibitSurrogateCharactersValidator()) + + def run_validation(self, data=empty): + # Test for the empty string here so that it does not get validated, + # and so that subclasses do not need to handle it explicitly + # inside the `to_internal_value()` method. + if data == '' or (self.trim_whitespace and str(data).strip() == ''): + if not self.allow_blank: + self.fail('blank') + return '' + return super().run_validation(data) + + def to_internal_value(self, data): + # We're lenient with allowing basic numerics to be coerced into strings, + # but other types should fail. Eg. unclear if booleans should represent as `true` or `True`, + # and composites such as lists are likely user error. + if isinstance(data, bool) or not isinstance(data, (str, int, float,)): + self.fail('invalid') + value = str(data) + return value.strip() if self.trim_whitespace else value + + def to_representation(self, value): + return str(value) + + +class EmailField(CharField): + default_error_messages = { + 'invalid': _('Enter a valid email address.') + } + + def __init__(self, **kwargs): + super().__init__(**kwargs) + validator = EmailValidator(message=self.error_messages['invalid']) + self.validators.append(validator) + + +class RegexField(CharField): + default_error_messages = { + 'invalid': _('This value does not match the required pattern.') + } + + def __init__(self, regex, **kwargs): + super().__init__(**kwargs) + validator = RegexValidator(regex, message=self.error_messages['invalid']) + self.validators.append(validator) + + +class SlugField(CharField): + default_error_messages = { + 'invalid': _('Enter a valid "slug" consisting of letters, numbers, underscores or hyphens.'), + 'invalid_unicode': _('Enter a valid "slug" consisting of Unicode letters, numbers, underscores, or hyphens.') + } + + def __init__(self, allow_unicode=False, **kwargs): + super().__init__(**kwargs) + self.allow_unicode = allow_unicode + if self.allow_unicode: + validator = RegexValidator(re.compile(r'^[-\w]+\Z', re.UNICODE), message=self.error_messages['invalid_unicode']) + else: + validator = RegexValidator(re.compile(r'^[-a-zA-Z0-9_]+$'), message=self.error_messages['invalid']) + self.validators.append(validator) + + +class URLField(CharField): + default_error_messages = { + 'invalid': _('Enter a valid URL.') + } + + def __init__(self, **kwargs): + super().__init__(**kwargs) + validator = URLValidator(message=self.error_messages['invalid']) + self.validators.append(validator) + + +class UUIDField(Field): + valid_formats = ('hex_verbose', 'hex', 'int', 'urn') + + default_error_messages = { + 'invalid': _('Must be a valid UUID.'), + } + + def __init__(self, **kwargs): + self.uuid_format = kwargs.pop('format', 'hex_verbose') + if self.uuid_format not in self.valid_formats: + raise ValueError( + 'Invalid format for uuid representation. ' + 'Must be one of "{}"'.format('", "'.join(self.valid_formats)) + ) + super().__init__(**kwargs) + + def to_internal_value(self, data): + if not isinstance(data, uuid.UUID): + try: + if isinstance(data, int): + return uuid.UUID(int=data) + elif isinstance(data, str): + return uuid.UUID(hex=data) + else: + self.fail('invalid', value=data) + except (ValueError): + self.fail('invalid', value=data) + return data + + def to_representation(self, value): + if self.uuid_format == 'hex_verbose': + return str(value) + else: + return getattr(value, self.uuid_format) + + +class IPAddressField(CharField): + """Support both IPAddressField and GenericIPAddressField""" + + default_error_messages = { + 'invalid': _('Enter a valid IPv4 or IPv6 address.'), + } + + def __init__(self, protocol='both', **kwargs): + self.protocol = protocol.lower() + self.unpack_ipv4 = (self.protocol == 'both') + super().__init__(**kwargs) + validators = ip_address_validators(protocol, self.unpack_ipv4) + self.validators.extend(validators) + + def to_internal_value(self, data): + if not isinstance(data, str): + self.fail('invalid', value=data) + + if ':' in data: + try: + if self.protocol in ('both', 'ipv6'): + return clean_ipv6_address(data, self.unpack_ipv4) + except DjangoValidationError: + self.fail('invalid', value=data) + + return super().to_internal_value(data) + + +# Number types... + +class IntegerField(Field): + default_error_messages = { + 'invalid': _('A valid integer is required.'), + 'max_value': _('Ensure this value is less than or equal to {max_value}.'), + 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), + 'max_string_length': _('String value too large.') + } + MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs. + re_decimal = re.compile(r'\.0*\s*$') # allow e.g. '1.0' as an int, but not '1.2' + + def __init__(self, **kwargs): + self.max_value = kwargs.pop('max_value', None) + self.min_value = kwargs.pop('min_value', None) + super().__init__(**kwargs) + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) + if self.min_value is not None: + message = lazy_format(self.error_messages['min_value'], min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) + + def to_internal_value(self, data): + if isinstance(data, str) and len(data) > self.MAX_STRING_LENGTH: + self.fail('max_string_length') + + try: + data = int(self.re_decimal.sub('', str(data))) + except (ValueError, TypeError): + self.fail('invalid') + return data + + def to_representation(self, value): + return int(value) + + +class FloatField(Field): + default_error_messages = { + 'invalid': _('A valid number is required.'), + 'max_value': _('Ensure this value is less than or equal to {max_value}.'), + 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), + 'max_string_length': _('String value too large.'), + 'overflow': _('Integer value too large to convert to float') + } + MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs. + + def __init__(self, **kwargs): + self.max_value = kwargs.pop('max_value', None) + self.min_value = kwargs.pop('min_value', None) + super().__init__(**kwargs) + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) + if self.min_value is not None: + message = lazy_format(self.error_messages['min_value'], min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) + + def to_internal_value(self, data): + + if isinstance(data, str) and len(data) > self.MAX_STRING_LENGTH: + self.fail('max_string_length') + + try: + return float(data) + except (TypeError, ValueError): + self.fail('invalid') + except OverflowError: + self.fail('overflow') + + def to_representation(self, value): + return float(value) + + +class DecimalField(Field): + default_error_messages = { + 'invalid': _('A valid number is required.'), + 'max_value': _('Ensure this value is less than or equal to {max_value}.'), + 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), + 'max_digits': _('Ensure that there are no more than {max_digits} digits in total.'), + 'max_decimal_places': _('Ensure that there are no more than {max_decimal_places} decimal places.'), + 'max_whole_digits': _('Ensure that there are no more than {max_whole_digits} digits before the decimal point.'), + 'max_string_length': _('String value too large.') + } + MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs. + + def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None, + localize=False, rounding=None, normalize_output=False, **kwargs): + self.max_digits = max_digits + self.decimal_places = decimal_places + self.localize = localize + self.normalize_output = normalize_output + if coerce_to_string is not None: + self.coerce_to_string = coerce_to_string + if self.localize: + self.coerce_to_string = True + + self.max_value = max_value + self.min_value = min_value + + if self.max_value is not None and not isinstance(self.max_value, decimal.Decimal): + warnings.warn("max_value should be a Decimal instance.") + if self.min_value is not None and not isinstance(self.min_value, decimal.Decimal): + warnings.warn("min_value should be a Decimal instance.") + + if self.max_digits is not None and self.decimal_places is not None: + self.max_whole_digits = self.max_digits - self.decimal_places + else: + self.max_whole_digits = None + + super().__init__(**kwargs) + + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) + if self.min_value is not None: + message = lazy_format(self.error_messages['min_value'], min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) + + if rounding is not None: + valid_roundings = [v for k, v in vars(decimal).items() if k.startswith('ROUND_')] + assert rounding in valid_roundings, ( + 'Invalid rounding option %s. Valid values for rounding are: %s' % (rounding, valid_roundings)) + self.rounding = rounding + + def validate_empty_values(self, data): + if smart_str(data).strip() == '' and self.allow_null: + return (True, None) + return super().validate_empty_values(data) + + def to_internal_value(self, data): + """ + Validate that the input is a decimal number and return a Decimal + instance. + """ + + data = smart_str(data).strip() + + if self.localize: + data = sanitize_separators(data) + + if len(data) > self.MAX_STRING_LENGTH: + self.fail('max_string_length') + + try: + value = decimal.Decimal(data) + except decimal.DecimalException: + self.fail('invalid') + + if value.is_nan(): + self.fail('invalid') + + # Check for infinity and negative infinity. + if value in (decimal.Decimal('Inf'), decimal.Decimal('-Inf')): + self.fail('invalid') + + return self.quantize(self.validate_precision(value)) + + def validate_precision(self, value): + """ + Ensure that there are no more than max_digits in the number, and no + more than decimal_places digits after the decimal point. + + Override this method to disable the precision validation for input + values or to enhance it in any way you need to. + """ + sign, digittuple, exponent = value.as_tuple() + + if exponent >= 0: + # 1234500.0 + total_digits = len(digittuple) + exponent + whole_digits = total_digits + decimal_places = 0 + elif len(digittuple) > abs(exponent): + # 123.45 + total_digits = len(digittuple) + whole_digits = total_digits - abs(exponent) + decimal_places = abs(exponent) + else: + # 0.001234 + total_digits = abs(exponent) + whole_digits = 0 + decimal_places = total_digits + + if self.max_digits is not None and total_digits > self.max_digits: + self.fail('max_digits', max_digits=self.max_digits) + if self.decimal_places is not None and decimal_places > self.decimal_places: + self.fail('max_decimal_places', max_decimal_places=self.decimal_places) + if self.max_whole_digits is not None and whole_digits > self.max_whole_digits: + self.fail('max_whole_digits', max_whole_digits=self.max_whole_digits) + + return value + + def to_representation(self, value): + coerce_to_string = getattr(self, 'coerce_to_string', api_settings.COERCE_DECIMAL_TO_STRING) + + if value is None: + if coerce_to_string: + return '' + else: + return None + + if not isinstance(value, decimal.Decimal): + value = decimal.Decimal(str(value).strip()) + + quantized = self.quantize(value) + + if self.normalize_output: + quantized = quantized.normalize() + + if not coerce_to_string: + return quantized + if self.localize: + return localize_input(quantized) + + return '{:f}'.format(quantized) + + def quantize(self, value): + """ + Quantize the decimal value to the configured precision. + """ + if self.decimal_places is None: + return value + + context = decimal.getcontext().copy() + if self.max_digits is not None: + context.prec = self.max_digits + return value.quantize( + decimal.Decimal('.1') ** self.decimal_places, + rounding=self.rounding, + context=context + ) + + +# Date & time fields... + +class DateTimeField(Field): + default_error_messages = { + 'invalid': _('Datetime has wrong format. Use one of these formats instead: {format}.'), + 'date': _('Expected a datetime but got a date.'), + 'make_aware': _('Invalid datetime for the timezone "{timezone}".'), + 'overflow': _('Datetime value out of range.') + } + datetime_parser = datetime.datetime.strptime + + def __init__(self, format=empty, input_formats=None, default_timezone=None, **kwargs): + if format is not empty: + self.format = format + if input_formats is not None: + self.input_formats = input_formats + if default_timezone is not None: + self.timezone = default_timezone + super().__init__(**kwargs) + + def enforce_timezone(self, value): + """ + When `self.default_timezone` is `None`, always return naive datetimes. + When `self.default_timezone` is not `None`, always return aware datetimes. + """ + field_timezone = self.timezone if hasattr(self, 'timezone') else self.default_timezone() + + if field_timezone is not None: + if timezone.is_aware(value): + try: + return value.astimezone(field_timezone) + except OverflowError: + self.fail('overflow') + try: + dt = timezone.make_aware(value, field_timezone) + # When the resulting datetime is a ZoneInfo instance, it won't necessarily + # throw given an invalid datetime, so we need to specifically check. + if not valid_datetime(dt): + self.fail('make_aware', timezone=field_timezone) + return dt + except Exception as e: + if pytz and isinstance(e, pytz.exceptions.InvalidTimeError): + self.fail('make_aware', timezone=field_timezone) + raise e + elif (field_timezone is None) and timezone.is_aware(value): + return timezone.make_naive(value, datetime.timezone.utc) + return value + + def default_timezone(self): + return timezone.get_current_timezone() if settings.USE_TZ else None + + def to_internal_value(self, value): + input_formats = getattr(self, 'input_formats', api_settings.DATETIME_INPUT_FORMATS) + + if isinstance(value, datetime.date) and not isinstance(value, datetime.datetime): + self.fail('date') + + if isinstance(value, datetime.datetime): + return self.enforce_timezone(value) + + for input_format in input_formats: + with contextlib.suppress(ValueError, TypeError): + if input_format.lower() == ISO_8601: + parsed = parse_datetime(value) + if parsed is not None: + return self.enforce_timezone(parsed) + + parsed = self.datetime_parser(value, input_format) + return self.enforce_timezone(parsed) + + humanized_format = humanize_datetime.datetime_formats(input_formats) + self.fail('invalid', format=humanized_format) + + def to_representation(self, value): + if not value: + return None + + output_format = getattr(self, 'format', api_settings.DATETIME_FORMAT) + + if output_format is None or isinstance(value, str): + return value + + value = self.enforce_timezone(value) + + if output_format.lower() == ISO_8601: + value = value.isoformat() + if value.endswith('+00:00'): + value = value[:-6] + 'Z' + return value + return value.strftime(output_format) + + +class DateField(Field): + default_error_messages = { + 'invalid': _('Date has wrong format. Use one of these formats instead: {format}.'), + 'datetime': _('Expected a date but got a datetime.'), + } + datetime_parser = datetime.datetime.strptime + + def __init__(self, format=empty, input_formats=None, **kwargs): + if format is not empty: + self.format = format + if input_formats is not None: + self.input_formats = input_formats + super().__init__(**kwargs) + + def to_internal_value(self, value): + input_formats = getattr(self, 'input_formats', api_settings.DATE_INPUT_FORMATS) + + if isinstance(value, datetime.datetime): + self.fail('datetime') + + if isinstance(value, datetime.date): + return value + + for input_format in input_formats: + if input_format.lower() == ISO_8601: + try: + parsed = parse_date(value) + except (ValueError, TypeError): + pass + else: + if parsed is not None: + return parsed + else: + try: + parsed = self.datetime_parser(value, input_format) + except (ValueError, TypeError): + pass + else: + return parsed.date() + + humanized_format = humanize_datetime.date_formats(input_formats) + self.fail('invalid', format=humanized_format) + + def to_representation(self, value): + if not value: + return None + + output_format = getattr(self, 'format', api_settings.DATE_FORMAT) + + if output_format is None or isinstance(value, str): + return value + + # Applying a `DateField` to a datetime value is almost always + # not a sensible thing to do, as it means naively dropping + # any explicit or implicit timezone info. + assert not isinstance(value, datetime.datetime), ( + 'Expected a `date`, but got a `datetime`. Refusing to coerce, ' + 'as this may mean losing timezone information. Use a custom ' + 'read-only field and deal with timezone issues explicitly.' + ) + + if output_format.lower() == ISO_8601: + return value.isoformat() + + return value.strftime(output_format) + + +class TimeField(Field): + default_error_messages = { + 'invalid': _('Time has wrong format. Use one of these formats instead: {format}.'), + } + datetime_parser = datetime.datetime.strptime + + def __init__(self, format=empty, input_formats=None, **kwargs): + if format is not empty: + self.format = format + if input_formats is not None: + self.input_formats = input_formats + super().__init__(**kwargs) + + def to_internal_value(self, value): + input_formats = getattr(self, 'input_formats', api_settings.TIME_INPUT_FORMATS) + + if isinstance(value, datetime.time): + return value + + for input_format in input_formats: + if input_format.lower() == ISO_8601: + try: + parsed = parse_time(value) + except (ValueError, TypeError): + pass + else: + if parsed is not None: + return parsed + else: + try: + parsed = self.datetime_parser(value, input_format) + except (ValueError, TypeError): + pass + else: + return parsed.time() + + humanized_format = humanize_datetime.time_formats(input_formats) + self.fail('invalid', format=humanized_format) + + def to_representation(self, value): + if value in (None, ''): + return None + + output_format = getattr(self, 'format', api_settings.TIME_FORMAT) + + if output_format is None or isinstance(value, str): + return value + + # Applying a `TimeField` to a datetime value is almost always + # not a sensible thing to do, as it means naively dropping + # any explicit or implicit timezone info. + assert not isinstance(value, datetime.datetime), ( + 'Expected a `time`, but got a `datetime`. Refusing to coerce, ' + 'as this may mean losing timezone information. Use a custom ' + 'read-only field and deal with timezone issues explicitly.' + ) + + if output_format.lower() == ISO_8601: + return value.isoformat() + return value.strftime(output_format) + + +class DurationField(Field): + default_error_messages = { + 'invalid': _('Duration has wrong format. Use one of these formats instead: {format}.'), + 'max_value': _('Ensure this value is less than or equal to {max_value}.'), + 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), + 'overflow': _('The number of days must be between {min_days} and {max_days}.'), + } + + def __init__(self, **kwargs): + self.max_value = kwargs.pop('max_value', None) + self.min_value = kwargs.pop('min_value', None) + super().__init__(**kwargs) + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) + if self.min_value is not None: + message = lazy_format(self.error_messages['min_value'], min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) + + def to_internal_value(self, value): + if isinstance(value, datetime.timedelta): + return value + try: + parsed = parse_duration(str(value)) + except OverflowError: + self.fail('overflow', min_days=datetime.timedelta.min.days, max_days=datetime.timedelta.max.days) + if parsed is not None: + return parsed + self.fail('invalid', format='[DD] [HH:[MM:]]ss[.uuuuuu]') + + def to_representation(self, value): + return duration_string(value) + + +# Choice types... + +class ChoiceField(Field): + default_error_messages = { + 'invalid_choice': _('"{input}" is not a valid choice.') + } + html_cutoff = None + html_cutoff_text = _('More than {count} items...') + + def __init__(self, choices, **kwargs): + self.choices = choices + self.html_cutoff = kwargs.pop('html_cutoff', self.html_cutoff) + self.html_cutoff_text = kwargs.pop('html_cutoff_text', self.html_cutoff_text) + + self.allow_blank = kwargs.pop('allow_blank', False) + + super().__init__(**kwargs) + + def to_internal_value(self, data): + if data == '' and self.allow_blank: + return '' + if isinstance(data, Enum) and str(data) != str(data.value): + data = data.value + try: + return self.choice_strings_to_values[str(data)] + except KeyError: + self.fail('invalid_choice', input=data) + + def to_representation(self, value): + if value in ('', None): + return value + if isinstance(value, Enum) and str(value) != str(value.value): + value = value.value + return self.choice_strings_to_values.get(str(value), value) + + def iter_options(self): + """ + Helper method for use with templates rendering select widgets. + """ + return iter_options( + self.grouped_choices, + cutoff=self.html_cutoff, + cutoff_text=self.html_cutoff_text + ) + + def _get_choices(self): + return self._choices + + def _set_choices(self, choices): + self.grouped_choices = to_choices_dict(choices) + self._choices = flatten_choices_dict(self.grouped_choices) + + # Map the string representation of choices to the underlying value. + # Allows us to deal with eg. integer choices while supporting either + # integer or string input, but still get the correct datatype out. + self.choice_strings_to_values = { + str(key.value) if isinstance(key, Enum) and str(key) != str(key.value) else str(key): key for key in self.choices + } + + choices = property(_get_choices, _set_choices) + + +class MultipleChoiceField(ChoiceField): + default_error_messages = { + 'invalid_choice': _('"{input}" is not a valid choice.'), + 'not_a_list': _('Expected a list of items but got type "{input_type}".'), + 'empty': _('This selection may not be empty.') + } + default_empty_html = [] + + def __init__(self, **kwargs): + self.allow_empty = kwargs.pop('allow_empty', True) + super().__init__(**kwargs) + + def get_value(self, dictionary): + if self.field_name not in dictionary: + if getattr(self.root, 'partial', False): + return empty + # We override the default field access in order to support + # lists in HTML forms. + if html.is_html_input(dictionary): + return dictionary.getlist(self.field_name) + return dictionary.get(self.field_name, empty) + + def to_internal_value(self, data): + if isinstance(data, str) or not hasattr(data, '__iter__'): + self.fail('not_a_list', input_type=type(data).__name__) + if not self.allow_empty and len(data) == 0: + self.fail('empty') + + return { + # Arguments for super() are needed because of scoping inside + # comprehensions. + super(MultipleChoiceField, self).to_internal_value(item) + for item in data + } + + def to_representation(self, value): + return { + self.choice_strings_to_values.get(str(item), item) for item in value + } + + +class FilePathField(ChoiceField): + default_error_messages = { + 'invalid_choice': _('"{input}" is not a valid path choice.') + } + + def __init__(self, path, match=None, recursive=False, allow_files=True, + allow_folders=False, required=None, **kwargs): + # Defer to Django's FilePathField implementation to get the + # valid set of choices. + field = DjangoFilePathField( + path, match=match, recursive=recursive, allow_files=allow_files, + allow_folders=allow_folders, required=required + ) + kwargs['choices'] = field.choices + kwargs['required'] = required + super().__init__(**kwargs) + + +# File types... + +class FileField(Field): + default_error_messages = { + 'required': _('No file was submitted.'), + 'invalid': _('The submitted data was not a file. Check the encoding type on the form.'), + 'no_name': _('No filename could be determined.'), + 'empty': _('The submitted file is empty.'), + 'max_length': _('Ensure this filename has at most {max_length} characters (it has {length}).'), + } + + def __init__(self, **kwargs): + self.max_length = kwargs.pop('max_length', None) + self.allow_empty_file = kwargs.pop('allow_empty_file', False) + if 'use_url' in kwargs: + self.use_url = kwargs.pop('use_url') + super().__init__(**kwargs) + + def to_internal_value(self, data): + try: + # `UploadedFile` objects should have name and size attributes. + file_name = data.name + file_size = data.size + except AttributeError: + self.fail('invalid') + + if not file_name: + self.fail('no_name') + if not self.allow_empty_file and not file_size: + self.fail('empty') + if self.max_length and len(file_name) > self.max_length: + self.fail('max_length', max_length=self.max_length, length=len(file_name)) + + return data + + def to_representation(self, value): + if not value: + return None + + use_url = getattr(self, 'use_url', api_settings.UPLOADED_FILES_USE_URL) + if use_url: + try: + url = value.url + except AttributeError: + return None + request = self.context.get('request', None) + if request is not None: + return request.build_absolute_uri(url) + return url + + return value.name + + +class ImageField(FileField): + default_error_messages = { + 'invalid_image': _( + 'Upload a valid image. The file you uploaded was either not an image or a corrupted image.' + ), + } + + def __init__(self, **kwargs): + self._DjangoImageField = kwargs.pop('_DjangoImageField', DjangoImageField) + super().__init__(**kwargs) + + def to_internal_value(self, data): + # Image validation is a bit grungy, so we'll just outright + # defer to Django's implementation so we don't need to + # consider it, or treat PIL as a test dependency. + file_object = super().to_internal_value(data) + django_field = self._DjangoImageField() + django_field.error_messages = self.error_messages + return django_field.clean(file_object) + + +# Composite field types... + +class _UnvalidatedField(Field): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.allow_blank = True + self.allow_null = True + + def to_internal_value(self, data): + return data + + def to_representation(self, value): + return value + + +class ListField(Field): + child = _UnvalidatedField() + initial = [] + default_error_messages = { + 'not_a_list': _('Expected a list of items but got type "{input_type}".'), + 'empty': _('This list may not be empty.'), + 'min_length': _('Ensure this field has at least {min_length} elements.'), + 'max_length': _('Ensure this field has no more than {max_length} elements.') + } + + def __init__(self, **kwargs): + self.child = kwargs.pop('child', copy.deepcopy(self.child)) + self.allow_empty = kwargs.pop('allow_empty', True) + self.max_length = kwargs.pop('max_length', None) + self.min_length = kwargs.pop('min_length', None) + + assert not inspect.isclass(self.child), '`child` has not been instantiated.' + assert self.child.source is None, ( + "The `source` argument is not meaningful when applied to a `child=` field. " + "Remove `source=` from the field declaration." + ) + + super().__init__(**kwargs) + self.child.bind(field_name='', parent=self) + if self.max_length is not None: + message = lazy_format(self.error_messages['max_length'], max_length=self.max_length) + self.validators.append(MaxLengthValidator(self.max_length, message=message)) + if self.min_length is not None: + message = lazy_format(self.error_messages['min_length'], min_length=self.min_length) + self.validators.append(MinLengthValidator(self.min_length, message=message)) + + def get_value(self, dictionary): + if self.field_name not in dictionary: + if getattr(self.root, 'partial', False): + return empty + # We override the default field access in order to support + # lists in HTML forms. + if html.is_html_input(dictionary): + val = dictionary.getlist(self.field_name, []) + if len(val) > 0: + # Support QueryDict lists in HTML input. + return val + return html.parse_html_list(dictionary, prefix=self.field_name, default=empty) + + return dictionary.get(self.field_name, empty) + + def to_internal_value(self, data): + """ + List of dicts of native values <- List of dicts of primitive datatypes. + """ + if html.is_html_input(data): + data = html.parse_html_list(data, default=[]) + if isinstance(data, (str, Mapping)) or not hasattr(data, '__iter__'): + self.fail('not_a_list', input_type=type(data).__name__) + if not self.allow_empty and len(data) == 0: + self.fail('empty') + return self.run_child_validation(data) + + def to_representation(self, data): + """ + List of object instances -> List of dicts of primitive datatypes. + """ + return [self.child.to_representation(item) if item is not None else None for item in data] + + def run_child_validation(self, data): + result = [] + errors = {} + + for idx, item in enumerate(data): + try: + result.append(self.child.run_validation(item)) + except ValidationError as e: + errors[idx] = e.detail + except DjangoValidationError as e: + errors[idx] = get_error_detail(e) + + if not errors: + return result + raise ValidationError(errors) + + +class DictField(Field): + child = _UnvalidatedField() + initial = {} + default_error_messages = { + 'not_a_dict': _('Expected a dictionary of items but got type "{input_type}".'), + 'empty': _('This dictionary may not be empty.'), + } + + def __init__(self, **kwargs): + self.child = kwargs.pop('child', copy.deepcopy(self.child)) + self.allow_empty = kwargs.pop('allow_empty', True) + + assert not inspect.isclass(self.child), '`child` has not been instantiated.' + assert self.child.source is None, ( + "The `source` argument is not meaningful when applied to a `child=` field. " + "Remove `source=` from the field declaration." + ) + + super().__init__(**kwargs) + self.child.bind(field_name='', parent=self) + + def get_value(self, dictionary): + # We override the default field access in order to support + # dictionaries in HTML forms. + if html.is_html_input(dictionary): + return html.parse_html_dict(dictionary, prefix=self.field_name) + return dictionary.get(self.field_name, empty) + + def to_internal_value(self, data): + """ + Dicts of native values <- Dicts of primitive datatypes. + """ + if html.is_html_input(data): + data = html.parse_html_dict(data) + if not isinstance(data, dict): + self.fail('not_a_dict', input_type=type(data).__name__) + if not self.allow_empty and len(data) == 0: + self.fail('empty') + + return self.run_child_validation(data) + + def to_representation(self, value): + return { + str(key): self.child.to_representation(val) if val is not None else None + for key, val in value.items() + } + + def run_child_validation(self, data): + result = {} + errors = {} + + for key, value in data.items(): + key = str(key) + + try: + result[key] = self.child.run_validation(value) + except ValidationError as e: + errors[key] = e.detail + + if not errors: + return result + raise ValidationError(errors) + + +class HStoreField(DictField): + child = CharField(allow_blank=True, allow_null=True) + + def __init__(self, **kwargs): + super().__init__(**kwargs) + assert isinstance(self.child, CharField), ( + "The `child` argument must be an instance of `CharField`, " + "as the hstore extension stores values as strings." + ) + + +class JSONField(Field): + default_error_messages = { + 'invalid': _('Value must be valid JSON.') + } + + # Workaround for isinstance calls when importing the field isn't possible + _is_jsonfield = True + + def __init__(self, **kwargs): + self.binary = kwargs.pop('binary', False) + self.encoder = kwargs.pop('encoder', None) + self.decoder = kwargs.pop('decoder', None) + super().__init__(**kwargs) + + def get_value(self, dictionary): + if html.is_html_input(dictionary) and self.field_name in dictionary: + # When HTML form input is used, mark up the input + # as being a JSON string, rather than a JSON primitive. + class JSONString(str): + def __new__(cls, value): + ret = str.__new__(cls, value) + ret.is_json_string = True + return ret + return JSONString(dictionary[self.field_name]) + return dictionary.get(self.field_name, empty) + + def to_internal_value(self, data): + try: + if self.binary or getattr(data, 'is_json_string', False): + if isinstance(data, bytes): + data = data.decode() + return json.loads(data, cls=self.decoder) + else: + json.dumps(data, cls=self.encoder) + except (TypeError, ValueError): + self.fail('invalid') + return data + + def to_representation(self, value): + if self.binary: + value = json.dumps(value, cls=self.encoder) + value = value.encode() + return value + + +# Miscellaneous field types... + +class ReadOnlyField(Field): + """ + A read-only field that simply returns the field value. + + If the field is a method with no parameters, the method will be called + and its return value used as the representation. + + For example, the following would call `get_expiry_date()` on the object: + + class ExampleSerializer(Serializer): + expiry_date = ReadOnlyField(source='get_expiry_date') + """ + + def __init__(self, **kwargs): + kwargs['read_only'] = True + super().__init__(**kwargs) + + def to_representation(self, value): + return value + + +class HiddenField(Field): + """ + A hidden field does not take input from the user, or present any output, + but it does populate a field in `validated_data`, based on its default + value. This is particularly useful when we have a `unique_for_date` + constraint on a pair of fields, as we need some way to include the date in + the validated data. + """ + + def __init__(self, **kwargs): + assert 'default' in kwargs, 'default is a required argument.' + kwargs['write_only'] = True + super().__init__(**kwargs) + + def get_value(self, dictionary): + # We always use the default value for `HiddenField`. + # User input is never provided or accepted. + return empty + + def to_internal_value(self, data): + return data + + +class SerializerMethodField(Field): + """ + A read-only field that get its representation from calling a method on the + parent serializer class. The method called will be of the form + "get_{field_name}", and should take a single argument, which is the + object being serialized. + + For example: + + class ExampleSerializer(Serializer): + extra_info = SerializerMethodField() + + def get_extra_info(self, obj): + return ... # Calculate some data to return. + """ + + def __init__(self, method_name=None, **kwargs): + self.method_name = method_name + kwargs['source'] = '*' + kwargs['read_only'] = True + super().__init__(**kwargs) + + def bind(self, field_name, parent): + # The method name defaults to `get_{field_name}`. + if self.method_name is None: + self.method_name = 'get_{field_name}'.format(field_name=field_name) + + super().bind(field_name, parent) + + def to_representation(self, value): + method = getattr(self.parent, self.method_name) + return method(value) + + +class ModelField(Field): + """ + A generic field that can be used against an arbitrary model field. + + This is used by `ModelSerializer` when dealing with custom model fields, + that do not have a serializer field to be mapped to. + """ + default_error_messages = { + 'max_length': _('Ensure this field has no more than {max_length} characters.'), + } + + def __init__(self, model_field, **kwargs): + self.model_field = model_field + # The `max_length` option is supported by Django's base `Field` class, + # so we'd better support it here. + self.max_length = kwargs.pop('max_length', None) + super().__init__(**kwargs) + if self.max_length is not None: + message = lazy_format(self.error_messages['max_length'], max_length=self.max_length) + self.validators.append( + MaxLengthValidator(self.max_length, message=message)) + + def to_internal_value(self, data): + rel = self.model_field.remote_field + if rel is not None: + return rel.model._meta.get_field(rel.field_name).to_python(data) + return self.model_field.to_python(data) + + def get_attribute(self, obj): + # We pass the object instance onto `to_representation`, + # not just the field attribute. + return obj + + def to_representation(self, obj): + value = self.model_field.value_from_object(obj) + if is_protected_type(value): + return value + return self.model_field.value_to_string(obj) diff --git a/env/lib/python3.12/site-packages/rest_framework/filters.py b/env/lib/python3.12/site-packages/rest_framework/filters.py new file mode 100644 index 00000000..3f4730da --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/filters.py @@ -0,0 +1,379 @@ +""" +Provides generic filtering backends that can be used to filter the results +returned by list views. +""" +import operator +import warnings +from functools import reduce + +from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.template import loader +from django.utils.encoding import force_str +from django.utils.text import smart_split, unescape_string_literal +from django.utils.translation import gettext_lazy as _ + +from rest_framework import RemovedInDRF317Warning +from rest_framework.compat import coreapi, coreschema +from rest_framework.fields import CharField +from rest_framework.settings import api_settings + + +def search_smart_split(search_terms): + """Returns sanitized search terms as a list.""" + split_terms = [] + for term in smart_split(search_terms): + # trim commas to avoid bad matching for quoted phrases + term = term.strip(',') + if term.startswith(('"', "'")) and term[0] == term[-1]: + # quoted phrases are kept together without any other split + split_terms.append(unescape_string_literal(term)) + else: + # non-quoted tokens are split by comma, keeping only non-empty ones + for sub_term in term.split(','): + if sub_term: + split_terms.append(sub_term.strip()) + return split_terms + + +class BaseFilterBackend: + """ + A base class from which all filter backend classes should inherit. + """ + + def filter_queryset(self, request, queryset, view): + """ + Return a filtered queryset. + """ + raise NotImplementedError(".filter_queryset() must be overridden.") + + def get_schema_fields(self, view): + assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`' + return [] + + def get_schema_operation_parameters(self, view): + return [] + + +class SearchFilter(BaseFilterBackend): + # The URL query parameter used for the search. + search_param = api_settings.SEARCH_PARAM + template = 'rest_framework/filters/search.html' + lookup_prefixes = { + '^': 'istartswith', + '=': 'iexact', + '@': 'search', + '$': 'iregex', + } + search_title = _('Search') + search_description = _('A search term.') + + def get_search_fields(self, view, request): + """ + Search fields are obtained from the view, but the request is always + passed to this method. Sub-classes can override this method to + dynamically change the search fields based on request content. + """ + return getattr(view, 'search_fields', None) + + def get_search_terms(self, request): + """ + Search terms are set by a ?search=... query parameter, + and may be whitespace delimited. + """ + value = request.query_params.get(self.search_param, '') + field = CharField(trim_whitespace=False, allow_blank=True) + cleaned_value = field.run_validation(value) + return search_smart_split(cleaned_value) + + def construct_search(self, field_name, queryset): + lookup = self.lookup_prefixes.get(field_name[0]) + if lookup: + field_name = field_name[1:] + else: + # Use field_name if it includes a lookup. + opts = queryset.model._meta + lookup_fields = field_name.split(LOOKUP_SEP) + # Go through the fields, following all relations. + prev_field = None + for path_part in lookup_fields: + if path_part == "pk": + path_part = opts.pk.name + try: + field = opts.get_field(path_part) + except FieldDoesNotExist: + # Use valid query lookups. + if prev_field and prev_field.get_lookup(path_part): + return field_name + else: + prev_field = field + if hasattr(field, "path_infos"): + # Update opts to follow the relation. + opts = field.path_infos[-1].to_opts + # Otherwise, use the field with icontains. + lookup = 'icontains' + return LOOKUP_SEP.join([field_name, lookup]) + + def must_call_distinct(self, queryset, search_fields): + """ + Return True if 'distinct()' should be used to query the given lookups. + """ + for search_field in search_fields: + opts = queryset.model._meta + if search_field[0] in self.lookup_prefixes: + search_field = search_field[1:] + # Annotated fields do not need to be distinct + if isinstance(queryset, models.QuerySet) and search_field in queryset.query.annotations: + continue + parts = search_field.split(LOOKUP_SEP) + for part in parts: + field = opts.get_field(part) + if hasattr(field, 'get_path_info'): + # This field is a relation, update opts to follow the relation + path_info = field.get_path_info() + opts = path_info[-1].to_opts + if any(path.m2m for path in path_info): + # This field is a m2m relation so we know we need to call distinct + return True + else: + # This field has a custom __ query transform but is not a relational field. + break + return False + + def filter_queryset(self, request, queryset, view): + search_fields = self.get_search_fields(view, request) + search_terms = self.get_search_terms(request) + + if not search_fields or not search_terms: + return queryset + + orm_lookups = [ + self.construct_search(str(search_field), queryset) + for search_field in search_fields + ] + + base = queryset + # generator which for each term builds the corresponding search + conditions = ( + reduce( + operator.or_, + (models.Q(**{orm_lookup: term}) for orm_lookup in orm_lookups) + ) for term in search_terms + ) + queryset = queryset.filter(reduce(operator.and_, conditions)) + + # Remove duplicates from results, if necessary + if self.must_call_distinct(queryset, search_fields): + # inspired by django.contrib.admin + # this is more accurate than .distinct form M2M relationship + # also is cross-database + queryset = queryset.filter(pk=models.OuterRef('pk')) + queryset = base.filter(models.Exists(queryset)) + return queryset + + def to_html(self, request, queryset, view): + if not getattr(view, 'search_fields', None): + return '' + + context = { + 'param': self.search_param, + 'term': request.query_params.get(self.search_param, ''), + } + template = loader.get_template(self.template) + return template.render(context) + + def get_schema_fields(self, view): + assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`' + return [ + coreapi.Field( + name=self.search_param, + required=False, + location='query', + schema=coreschema.String( + title=force_str(self.search_title), + description=force_str(self.search_description) + ) + ) + ] + + def get_schema_operation_parameters(self, view): + return [ + { + 'name': self.search_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.search_description), + 'schema': { + 'type': 'string', + }, + }, + ] + + +class OrderingFilter(BaseFilterBackend): + # The URL query parameter used for the ordering. + ordering_param = api_settings.ORDERING_PARAM + ordering_fields = None + ordering_title = _('Ordering') + ordering_description = _('Which field to use when ordering the results.') + template = 'rest_framework/filters/ordering.html' + + def get_ordering(self, request, queryset, view): + """ + Ordering is set by a comma delimited ?ordering=... query parameter. + + The `ordering` query parameter can be overridden by setting + the `ordering_param` value on the OrderingFilter or by + specifying an `ORDERING_PARAM` value in the API settings. + """ + params = request.query_params.get(self.ordering_param) + if params: + fields = [param.strip() for param in params.split(',')] + ordering = self.remove_invalid_fields(queryset, fields, view, request) + if ordering: + return ordering + + # No ordering was included, or all the ordering fields were invalid + return self.get_default_ordering(view) + + def get_default_ordering(self, view): + ordering = getattr(view, 'ordering', None) + if isinstance(ordering, str): + return (ordering,) + return ordering + + def get_default_valid_fields(self, queryset, view, context={}): + # If `ordering_fields` is not specified, then we determine a default + # based on the serializer class, if one exists on the view. + if hasattr(view, 'get_serializer_class'): + try: + serializer_class = view.get_serializer_class() + except AssertionError: + # Raised by the default implementation if + # no serializer_class was found + serializer_class = None + else: + serializer_class = getattr(view, 'serializer_class', None) + + if serializer_class is None: + msg = ( + "Cannot use %s on a view which does not have either a " + "'serializer_class', an overriding 'get_serializer_class' " + "or 'ordering_fields' attribute." + ) + raise ImproperlyConfigured(msg % self.__class__.__name__) + + model_class = queryset.model + model_property_names = [ + # 'pk' is a property added in Django's Model class, however it is valid for ordering. + attr for attr in dir(model_class) if isinstance(getattr(model_class, attr), property) and attr != 'pk' + ] + + return [ + (field.source.replace('.', '__') or field_name, field.label) + for field_name, field in serializer_class(context=context).fields.items() + if ( + not getattr(field, 'write_only', False) and + not field.source == '*' and + field.source not in model_property_names + ) + ] + + def get_valid_fields(self, queryset, view, context={}): + valid_fields = getattr(view, 'ordering_fields', self.ordering_fields) + + if valid_fields is None: + # Default to allowing filtering on serializer fields + return self.get_default_valid_fields(queryset, view, context) + + elif valid_fields == '__all__': + # View explicitly allows filtering on any model field + valid_fields = [ + (field.name, field.verbose_name) for field in queryset.model._meta.fields + ] + valid_fields += [ + (key, key.title().split('__')) + for key in queryset.query.annotations + ] + else: + valid_fields = [ + (item, item) if isinstance(item, str) else item + for item in valid_fields + ] + + return valid_fields + + def remove_invalid_fields(self, queryset, fields, view, request): + valid_fields = [item[0] for item in self.get_valid_fields(queryset, view, {'request': request})] + + def term_valid(term): + if term.startswith("-"): + term = term[1:] + return term in valid_fields + + return [term for term in fields if term_valid(term)] + + def filter_queryset(self, request, queryset, view): + ordering = self.get_ordering(request, queryset, view) + + if ordering: + return queryset.order_by(*ordering) + + return queryset + + def get_template_context(self, request, queryset, view): + current = self.get_ordering(request, queryset, view) + current = None if not current else current[0] + options = [] + context = { + 'request': request, + 'current': current, + 'param': self.ordering_param, + } + for key, label in self.get_valid_fields(queryset, view, context): + options.append((key, '%s - %s' % (label, _('ascending')))) + options.append(('-' + key, '%s - %s' % (label, _('descending')))) + context['options'] = options + return context + + def to_html(self, request, queryset, view): + template = loader.get_template(self.template) + context = self.get_template_context(request, queryset, view) + return template.render(context) + + def get_schema_fields(self, view): + assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`' + return [ + coreapi.Field( + name=self.ordering_param, + required=False, + location='query', + schema=coreschema.String( + title=force_str(self.ordering_title), + description=force_str(self.ordering_description) + ) + ) + ] + + def get_schema_operation_parameters(self, view): + return [ + { + 'name': self.ordering_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.ordering_description), + 'schema': { + 'type': 'string', + }, + }, + ] diff --git a/env/lib/python3.12/site-packages/rest_framework/generics.py b/env/lib/python3.12/site-packages/rest_framework/generics.py new file mode 100644 index 00000000..16730332 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/generics.py @@ -0,0 +1,295 @@ +""" +Generic views that provide commonly needed behaviour. +""" +from django.core.exceptions import ValidationError +from django.db.models.query import QuerySet +from django.http import Http404 +from django.shortcuts import get_object_or_404 as _get_object_or_404 + +from rest_framework import mixins, views +from rest_framework.settings import api_settings + + +def get_object_or_404(queryset, *filter_args, **filter_kwargs): + """ + Same as Django's standard shortcut, but make sure to also raise 404 + if the filter_kwargs don't match the required types. + """ + try: + return _get_object_or_404(queryset, *filter_args, **filter_kwargs) + except (TypeError, ValueError, ValidationError): + raise Http404 + + +class GenericAPIView(views.APIView): + """ + Base class for all other generic views. + """ + # You'll need to either set these attributes, + # or override `get_queryset()`/`get_serializer_class()`. + # If you are overriding a view method, it is important that you call + # `get_queryset()` instead of accessing the `queryset` property directly, + # as `queryset` will get evaluated only once, and those results are cached + # for all subsequent requests. + queryset = None + serializer_class = None + + # If you want to use object lookups other than pk, set 'lookup_field'. + # For more complex lookup requirements override `get_object()`. + lookup_field = 'pk' + lookup_url_kwarg = None + + # The filter backend classes to use for queryset filtering + filter_backends = api_settings.DEFAULT_FILTER_BACKENDS + + # The style to use for queryset pagination. + pagination_class = api_settings.DEFAULT_PAGINATION_CLASS + + # Allow generic typing checking for generic views. + def __class_getitem__(cls, *args, **kwargs): + return cls + + def get_queryset(self): + """ + Get the list of items for this view. + This must be an iterable, and may be a queryset. + Defaults to using `self.queryset`. + + This method should always be used rather than accessing `self.queryset` + directly, as `self.queryset` gets evaluated only once, and those results + are cached for all subsequent requests. + + You may want to override this if you need to provide different + querysets depending on the incoming request. + + (Eg. return a list of items that is specific to the user) + """ + assert self.queryset is not None, ( + "'%s' should either include a `queryset` attribute, " + "or override the `get_queryset()` method." + % self.__class__.__name__ + ) + + queryset = self.queryset + if isinstance(queryset, QuerySet): + # Ensure queryset is re-evaluated on each request. + queryset = queryset.all() + return queryset + + def get_object(self): + """ + Returns the object the view is displaying. + + You may want to override this if you need to provide non-standard + queryset lookups. Eg if objects are referenced using multiple + keyword arguments in the url conf. + """ + queryset = self.filter_queryset(self.get_queryset()) + + # Perform the lookup filtering. + lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field + + assert lookup_url_kwarg in self.kwargs, ( + 'Expected view %s to be called with a URL keyword argument ' + 'named "%s". Fix your URL conf, or set the `.lookup_field` ' + 'attribute on the view correctly.' % + (self.__class__.__name__, lookup_url_kwarg) + ) + + filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} + obj = get_object_or_404(queryset, **filter_kwargs) + + # May raise a permission denied + self.check_object_permissions(self.request, obj) + + return obj + + def get_serializer(self, *args, **kwargs): + """ + Return the serializer instance that should be used for validating and + deserializing input, and for serializing output. + """ + serializer_class = self.get_serializer_class() + kwargs.setdefault('context', self.get_serializer_context()) + return serializer_class(*args, **kwargs) + + def get_serializer_class(self): + """ + Return the class to use for the serializer. + Defaults to using `self.serializer_class`. + + You may want to override this if you need to provide different + serializations depending on the incoming request. + + (Eg. admins get full serialization, others get basic serialization) + """ + assert self.serializer_class is not None, ( + "'%s' should either include a `serializer_class` attribute, " + "or override the `get_serializer_class()` method." + % self.__class__.__name__ + ) + + return self.serializer_class + + def get_serializer_context(self): + """ + Extra context provided to the serializer class. + """ + return { + 'request': self.request, + 'format': self.format_kwarg, + 'view': self + } + + def filter_queryset(self, queryset): + """ + Given a queryset, filter it with whichever filter backend is in use. + + You are unlikely to want to override this method, although you may need + to call it either from a list view, or from a custom `get_object` + method if you want to apply the configured filtering backend to the + default queryset. + """ + for backend in list(self.filter_backends): + queryset = backend().filter_queryset(self.request, queryset, self) + return queryset + + @property + def paginator(self): + """ + The paginator instance associated with the view, or `None`. + """ + if not hasattr(self, '_paginator'): + if self.pagination_class is None: + self._paginator = None + else: + self._paginator = self.pagination_class() + return self._paginator + + def paginate_queryset(self, queryset): + """ + Return a single page of results, or `None` if pagination is disabled. + """ + if self.paginator is None: + return None + return self.paginator.paginate_queryset(queryset, self.request, view=self) + + def get_paginated_response(self, data): + """ + Return a paginated style `Response` object for the given output data. + """ + assert self.paginator is not None + return self.paginator.get_paginated_response(data) + + +# Concrete view classes that provide method handlers +# by composing the mixin classes with the base view. + +class CreateAPIView(mixins.CreateModelMixin, + GenericAPIView): + """ + Concrete view for creating a model instance. + """ + def post(self, request, *args, **kwargs): + return self.create(request, *args, **kwargs) + + +class ListAPIView(mixins.ListModelMixin, + GenericAPIView): + """ + Concrete view for listing a queryset. + """ + def get(self, request, *args, **kwargs): + return self.list(request, *args, **kwargs) + + +class RetrieveAPIView(mixins.RetrieveModelMixin, + GenericAPIView): + """ + Concrete view for retrieving a model instance. + """ + def get(self, request, *args, **kwargs): + return self.retrieve(request, *args, **kwargs) + + +class DestroyAPIView(mixins.DestroyModelMixin, + GenericAPIView): + """ + Concrete view for deleting a model instance. + """ + def delete(self, request, *args, **kwargs): + return self.destroy(request, *args, **kwargs) + + +class UpdateAPIView(mixins.UpdateModelMixin, + GenericAPIView): + """ + Concrete view for updating a model instance. + """ + def put(self, request, *args, **kwargs): + return self.update(request, *args, **kwargs) + + def patch(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) + + +class ListCreateAPIView(mixins.ListModelMixin, + mixins.CreateModelMixin, + GenericAPIView): + """ + Concrete view for listing a queryset or creating a model instance. + """ + def get(self, request, *args, **kwargs): + return self.list(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + return self.create(request, *args, **kwargs) + + +class RetrieveUpdateAPIView(mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + GenericAPIView): + """ + Concrete view for retrieving, updating a model instance. + """ + def get(self, request, *args, **kwargs): + return self.retrieve(request, *args, **kwargs) + + def put(self, request, *args, **kwargs): + return self.update(request, *args, **kwargs) + + def patch(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) + + +class RetrieveDestroyAPIView(mixins.RetrieveModelMixin, + mixins.DestroyModelMixin, + GenericAPIView): + """ + Concrete view for retrieving or deleting a model instance. + """ + def get(self, request, *args, **kwargs): + return self.retrieve(request, *args, **kwargs) + + def delete(self, request, *args, **kwargs): + return self.destroy(request, *args, **kwargs) + + +class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.DestroyModelMixin, + GenericAPIView): + """ + Concrete view for retrieving, updating or deleting a model instance. + """ + def get(self, request, *args, **kwargs): + return self.retrieve(request, *args, **kwargs) + + def put(self, request, *args, **kwargs): + return self.update(request, *args, **kwargs) + + def patch(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) + + def delete(self, request, *args, **kwargs): + return self.destroy(request, *args, **kwargs) diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/ach/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/ach/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..0fe8c3e93a7058da492d7ff8452b42a578db63e0 GIT binary patch literal 472 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 B_B#Lo literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/az/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..08648351e8ed72361f7148ed5f2e38e412dea206 GIT binary patch literal 10428 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 OM2QKMStIZS>i+>T@S}zR literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/be/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/be/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..62321f7a4047ff74e384431a3e49417131b17693 GIT binary patch literal 614 zcmZutO>Y`85TzfdJ@(wgRBEH3#;i?AOAIDe5+X$^Dx%xo%`z-bckPvJN+RWNJxdR^hh`QOP5Yv&`Igu*P?#kvSAa}tv2cQ(U6rctsh9Z^D;i_eUI zVWJD-REpk5PL_PrA+pSC8%iCWmyoSor2|~9ya~}D45O>Q67pT5le=m}GFz;5fhivt t@bDxViC&u|Vkc3GH(y)cNSz+!XYGBS>QbBMoMKD7r)>mN#et{DIT literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/bg/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..71a0d8a74863adbce4792dd85f71dd318fa09d8c GIT binary patch literal 13083 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 Z)7DY7BZU1%)5`JoOQlb%aFFP}{9nBZ#RUKW literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/ca/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/ca/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..7da9971a8ec201a5e8907883c09508c10db7c4d9 GIT binary patch literal 9300 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/el/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..f434e6fc9067325f42f365893ffa52e35dd577bc GIT binary patch literal 12933 zcmd6seT*FEUB@TbEzPB+O-j>10)2dGsNH(^>?BU&bKTgE?cl_YUB3jU5Zt-F@$KYx zch@G=pXo{m-w*HFC6`+;*T<`q5?vykosQ`QH6x65+nql z@AJ&=&f0q~wwuD}=Ds^K&-47=U*?&Axo!T79>>$1cX7_2=Xt*izWpBlalG~Oo@c;+ z1@8g--sgFDfJ;D)-vHhT?gsn7!(a|P0WJnFf=u<^0@r~54z369yV>FIfRA$hZEzKM zGmAV4J_bGr{u#Ie{AciS@FTZ)-XQ3Mdj2QiM)3RK-Qa@vd){r}I#B%W1a-fW;@3c} zcNts;z5|NCfe$$O9t5@i)8Iqk%izP{_rOQMTYtgx^571TKkq32H0}?ldt zPl6x)pyx5wTLUfuw}5%@5V!&S7Pu1pFOVtTLm%?IUj`oqbv*=%|2?4Oc`?N|()&$t z9{2wPl-xf7e--Sz)vdD#`~=r)!P~(SXuu=jhr!pu`QUjF6?>P#0q}1@Oy&J&iZ`*i z=J$c`1s8xH1s8%#z*V5^xCa!Ulj-w+Os{_g%1>^A=mX#KYv2pu{JTBx_rR}#MeySvcYbvO z{5;pMf}(%ZJq{lQpWylgh$_4vfKP!x1~q^4ub~t0Jh%s3jx$P6e+hmX{0@l8ym>IS z8oUF%AN(B1pZ8_{Nzdm&@&7gmtKK`{3h=H)ER z2~hOD3a$sgnO^@0RJ_f@nPAns4a8-=<=`@KBUl6vgD-*q2Ce~*EO!3?9Z>xI1bh&@ zFNZIIqu>zu1F!%-3{*TCiA57X;A2|C5aQ{XZ155V_;w-a3N1@8iPf_H_O4H-ayKxUBa>Q2e|DZU&d(>^Fg}Lps&*K~7xX@}g_`5+=5>q3b@*4{=JT zvMbAZJ2-WGj#D~%Kj&vSae15jp9FC?ZxbhOWRK6LxC;C*=La}(>8=CSS>4P28`3AY zq$t^CKiTYw^xkiQ@|mYO=W)s}P^XPo+|TA~=|b}VCTHuA{@=&BmQ%KB9kTN}PD0Pt z1YEOy$OhR%zP>$kL%M&A6SuI(R{qP+QD?kY=60bH>bb1fbs|2 z-1_U!fp>Baa{fB!t(>F`d&uwQ6S#2uAT8K@Z9rTE!%P>OpO9P%}ZT7S&8tC^TxdU^wrsPL~TSaWKMjsMLZzjj-!s zrBNQb>RE&3w@0Hv#aqqKpc01#KMtdcDKJ-;eyMKu1+~DkU9ClX!(mZ;Bx;m~?Y%nV z>$}Gcvn|n}9-GyLLQsuOG4O|j8iQ+r9|yzUTK=1&&w{n6GGcZ|wXz@Q&5n9tq6+73 zEy9I+P&Z+v9<#)tIpFRb%-bd6uzbVIG-^)F8{=kOrQSd_anX;(IzN4@DN~Nz?TR^2 z_V@1^4hmt}FYT(9{6bJaXwqxruJhiU*9k|$So1BS9}`EhUz+;@`-)L1*yX0Tml+CB zucQb%j77LoW?39+cNk!C=?h^?fsdIFl*7udQcxL*iwAL1zvdU>pjMx5UM0FxFSE~O zgr8a)vgOE9MWa{GGz&vK4)zYD&lYv_LBKTvMaGEr#+s~FF@zC;;+IgQ6UPq2(b^_q zMtf>0sMmYVgQ3nmRM3v^{(7k~(r*e;r5@Jf5U0n_`}1DzG}>ltsBLAc3M#O!%}Aa{%U}khT(Bo@i^3o&4^7& zx>RhjK=&9MaNXm&$Akst48Jxe@xnML*W1g+W7WW<`EQpl4)%A=Euoh=&RQRqq&IIv z1x?iu!uZqXtbAsasOC*uCRAkVaSdZECSetVa4*U@fbhQKZ-%MWQRfTOPs9yK>qCA$ zEVR;}A^o*esgi%neQ8YNf(Pz50Rq{qx}h@Le8;${7u)$4-->-QLA|QnBIbLo@kG>> z(L0H}HJnmXk817NQb$H-_)6Qxi`%xfO0zcYki~a{S}ClInw;qvN;)Uk7mB?H!rd$* zHV-``gAYeUh;$h2$8S1|Rs9j%wj~Q@>OW8&O=GejPNJEo$EtvBd(En=?%}q4rXJPH zFkxztY=UfYdTlFRX<|FOBX)!CK-qGj>euW0q8eqoMaO2R%q3x@B9GhjyIS4flD;#g zGe)*iBhqt$A~{)9dp_LL2uKQ5DnmIScJtoj!I-znFR7jrb!t-R7xLbwATCD3SdC%) zpi#12QmGW}Q@63HQ%(y}qY@uf_~#ySgxfAQVvGl9hL&K zj|x$543$H2Fe|6GZINMVD%_B&AiPrB(g7}^Q6TC;2`AK~O2EIEMup6s_fqHF7t%}} zP{!Y-^$xB)VAW2Yy~1lZ*GTu|A8$))C~vD%gyk+S)}lBriTJj_uN8{kHk+-|G89LV zDfu<|`*td}Ez1-=i!#j*?LR)yHf8SEHy0+@cn@5U4Vbt~l zHY=%Q*%Xeqs6mk7u3X3Jl`bo$WD{jxu14UDdbN`7UuYf|Q6rBNz% zKa*h0N`-QJQLxME0N>HYbxbRhN%8S4pK~HNhLvWRmOiqDE+bo3Th6f*k<$#Y zj@0p^vQnv)yro{nCr(>|*o}9`Hlum=f8EOE=uLK`tSmSf|wZJVFSdrv`p zII^^gKGP{|<*;rOC)(gj!GIO;auJA7{+3##I+fcnoO{yc&q1^H8NV_TnXT)#Z8y7> z2uaPOeOm+RDYvOU5)S9qG)C&V?a`p=+p;;gHP{=9NNz1|JZSD+a_^GdQvU8UOP3Gc zzwA>>IQllyf9JN>{7Sv#$5Cz2?DY4BD2CJ$?P-jePwyxH>(?r3F)wX?z7Ul^!?ems z1D)lz2Yz|bJX#BaQM0fZ$JN1sfqnb-%6nJva-}CL7go%Im1gOp z6@6avdNS4OMM)FM*<>QQZ1{I3xtxqAlO{QpyqR2R9%~*-&T+r_Y%-Z#Os2SbI)6j6 zMQaigXIXhFxs;r49%jMUn$IOCA#f=fZw=-EUlM1{!&%OzbUB_}NKUaB zTqpKMMu>6v9=FfVu*x}3MnG=bwHP~@oKG$_k8A1KSF)MGNIRC#DSl0%!*k6eoQJ*S z1*g}u&Eu?k4o=6VW~+hrqzSZ)h?ev?%%yWqbJLA(9g0xZW%<$5HnUj@vL2?BDo#CeoAMBt9C>|HV1Zf(<3|%`)JaK940;82F2#&ev_bQ@kp0}YZ z+VI0_qI$%-g$;6CLV4B3rnP#yjbv_&jpHN^B@i3;@;9YdM9-+=c?i!+(JXB1F0;Wk z2WLBHGYuS&M>DCN)JDQ1S2jJV&6k_tr7IbINJky4XXP$_*2&cwYI%D%I}ap=0ge^;)IVd`xLO zgdwjn_Y%Y}l3osFk{NQ$gUxX)g>?N<@!)ebkb2HT$*b#^3 zq?a4uXhcKS+Fe_r8Je>$Wfg7n%mr+!Za`cTUb7HDUx+nMj5u8pJU#n4x2=jCuPfMQ z(10FZ+1X#f?3zM@E%WkAPMx|89tra&)BRZd>lGRC-C>FXbBI)~nn;FGTGMZvjZ~mq zI|7>skes|eR$MQARgW{1$}FLlce%abu3J{4XKf|3I-ACutlcxg*CUx^H;uF2b%b1b zS!8Uk%vl?%4ylb(sy>^n)<1FYPNlQUQDSYIE>IeV?!IyUKRSBCl2|7M6TE5bDsdL30+qTTLpgMinoG~{ij zBlsn~E6crmz-x%lmZTj9S{9o*5G`jjg<&dBuVg_P>GXZgFXF%M9q`-$RVmFwbVKT9 zGrp@jMf&WzNrt)rzf(3SY=PlTbh`Z5+RLA9g*16~b|cbuqr=P9WT#ALqd&v+)dR&J z@u~hw9T)8ezoxw8k2}8JTV=$TeLH88`iYnH9(+pm&dRTH-2OO_TF{jVOTZ>nmo1q4 zs!OQotJC1CFuUeH{e;jnp2zh~A$b*+r%%!HjQ(j1+~4XQ`?HqrXU$Afp5pEFVrR2K zjJ4kk+(?tWAr_Ec+b0uQcghZK9_wB>`$pSaJWL~VsK<3Rw!OV&KWd1}D`-POq0@7@ zsh*!ZTJhC+$95T!vTYl)%jk}fmrLUo*?4G^YCD4K`6sCi6YR9Q4(wx7#VmudT{rg|ydMH!-}0T!i+Us5IT-Koy$R z&M>U4I+T@r7h92-nXPdX}H(xQ1>UO ztF>~y1c^Lqf;@`^nElH2QzdZ<(UcT^x-@JO&%7ATYAfedwgi&?yAqV^2j}1=>1+hD z)zr=7>Z(4HL?DY!bv~U@bKL7}XLE)aYjwrg;b*eXYj@XMU*B5$;u+^Ws|^Jk^K93! zRny(_D!)mrnct9b9x^??>{1VFC^;M=SI}fTWjWnU{}s>9(2kj_+RElOp(r(L`}L$< zRDo?{$EK>zrxot;el9ue`<&{_)j5c@+iO{YT?T?OKX4|+Vn#7knbxBAz8lxt^~1O9 z-jCQ)Mqjj~Cxy!!LWMi-coHn<#uPPzPuC%#`veDq0n3(-(fLjNVCx#Y0BcterFLq*Eyn6eK=xk4F+hm F{uh`!wfF!4 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/el_GR/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/el_GR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..2f23ce5f267bd9cba20cce38ac773030ea9ef256 GIT binary patch literal 486 zcmZvYOHRWu5Qagp%91sUL1NJg+$0r`;u3`DOO>doLSTzbGELkjc4WJx9E4kNCeDIW zs&>OKeHwc_R+6BR?Z{ShD3@9oiig9g(#B+)6mNl*M=k98d=<1;!UCz%i_+qiFCN}==4&DIcw^(<$a fFBQwlP^v;x5aoKSgLW7GmO(?nNdSJc>+Jmk>`0VZ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/en/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..0770a9d5e7d6269e71717c100aa98d02275cfa7e GIT binary patch literal 12285 zcmeI2dyFMjoyQLdqCLYyM0~S{UU6n%?(Lb88KB3(fq7`dyqxKt0okRu`rgxhi>_OB zsjAx#dfTYUDhVX)DyXXwHAX`e6N$!uG||Km6IXWKhx>@`65ZWojf7xK)J>G^=X>hh zd%K680mQ#HUFmZ_b*j$ucYeR$`PG^Ek4w*c$Z)-v^d{2A^Njg2{Otw&aD8RS7z-bR zSHXXPb@&^25!|%FnAgEwQ1y?(H^KyNg7-p-nyEf#VDL6s?0eA@h zH~eF`;}T;og(soEs=7H{1u8U>$x7GF0<4RJq^55xDEs#%zYu@Jjdqyc#|RRsP3N{r((ogZ~TF-qn{G zGX`&md*J7w%Krqu0X`G*8(ve*^9@k*z7c9Y?g;sZ!~1W*m+|~b$k5Dx!YkmfpxS%Q zS{YUUq9{$HW=`$0HL{=-n^ zpMVqae2iK4eh1{wJi?Fk`1?@(KN+6?Hqc_+YJWdefA53*nXmIBx%>!9j^~ikye@`% z{#t(2{~mZfT!8O@kHLNL7f|xt`PNFFO{j7Ol>R&lW$!sd zEUihP+Pe?R-oF5)58s4zZGH%4pTC0^UdG^M?>pgna4h7Hz#;Ne5RsTR)cijJUje@p z_B^*av0rCDgngf$xNmhx~;oq2zfrRQ*Fx<(g3X`+g{U z{}fca{}l2YF*?n6A5^(Jp@sKAjrWsK^7|WjKD>y<&^RxH8{iuuLol15?EM6kz5fN2 zJf4KI_y2;L_p>2?0gcn7xf06WkHS~N55NoH{cs3A2sgq{L-qS;$bU8P+wel3KLKU$ zKMK#Ef#;C#T{$<>&v%iQNVk&IuP&{RWTop*Nw@gBs=u4K#}v%9r2VA3NE#Pr=jFBx zr9ZkPhohu~B%RlVn)^$0y@(_o>iQ?uk91I%bXHec!Ry44a4-2uwzAjW)#Bz367I#^ zO`0b;Qc7x&4v?lv1*t>QwLm&Vk{)U8BGSrhoQ!1HyJY9hkU0jmuF?fv(gj_zjX&{s z)sJ*9CdnqW{<_{ zBV9?-bpuH@`DW6^B>7ccW27n4dz1-R8~$0im;O$W=9C{^iqlTFTpqS@VbiR%k)4Z@ zxM>@$EN-~^nG1BHvehqjlkG$^&Zgb=l*{dWT(;uWmMy2paT=AbX>(U}lhPKhtecxa zls8(oba}hV=5thZd7kAqYc#rf?wWd04JJ-YH^Y0zn7g~X@v4`h)6?E9QM2nN%f*gc zwsF&?WjwtYr!$O-l1pjScFT0oWfJ4rtV{i^N;RS~&QjZ;4`rjIu=6fwZV0E7XLGd0 z$o6I3r0Jg(lrN?i{cJTjSCsaqM#FVV+j3FU$ zY?hLy)d-pDMPcK#C~0EUE>%w$u$n02_8+VnFD09GOZA>d=?qK0znfPwcxgjDkQQC! zR<@#2^Wrx0Vzlk7dYsy&cC;|rbd9(jC6k>bYPe$AhP%Y=4Z(YKDST1IY#{v$5ME=W%ax( zwL@?--ZXM)Nouiu3@A!ixJrD!7+T*~0c!NCCax&fs>gr^^$>aAr41KJcV^f&vb2bc zQoaD4pGf0I)^sddspZ)kd>A*~6yq%#tUeir)>`beTAv2V)uRL4(O5=s*cjrO3J?+#6 z=sm8q@*ZuC!%Mx}Wpu08FBa+YBu-~-%?=h;Ys9|VXsun4**s5)qf>WDL7JJXLL#?- z0uLJV0n;F>z-L8nma%qbg9jRBVAD8iuo+ZN_+iyU%VoV6)L_$>xQc^X}CB0L6t!nEtMk8H5=%^ zwEKH&7pf`^c`tfe)MZL(P9%*i8Wsm%;E1kY~5{#_o$m&-J&@hC5py;MC+ry zx;gC1R@P+UDaH-Kw2!2dB%4>Pcz6)+G_r1rC-eTZUguR8*EmIF6aw9eiLw39eL9s9 zm_%uK5vPr$%Z@eN6Z$aorT3obF%Z;fI>vX-vjZ31sdmiX#z4Yjzlk#vA{M%CYHGwP zp+M!@*?@MTcB5xpoeRCY;jtGHhwq>u91mosk5Zk}39)PEe*O|UC{ z9oQx9#giJz@}4SGC*tZYVlcR)IU6vp)*K5;WsZmVTJtJfc~+K*hJC_+OqdhiF^2%5 z%rcuqxoqeSEvPo4*0%GlSf4t5i71u~a;iEBA4&eR!@JUI4%N&4 z`e`qZ{E~X@@+(}o`&zCs>z$?F3H%q1_G3&;{YX_$Z^x?!k(6t9%0<28e&C{+*rL~8 zbYo?SD#WGe;0w&xte&r^G?hf@Y-sj5FVk+4tbP|PAjq-j`G>VXxJh3hds622sMcnG z!*#42=L_m?5rsNSweZTvH7h2*Qd*VuXhqLZz`MnP%D1&)`4#JlS8fl>#OlXi`uCpS zD2)FtjGRo^G|WWmgDjLY$!6q~y><4s_?7#9ow7x@)5&s0miWIovLW*GnGpG@jqn*v zjZTt93PY=~g3mnc(N=bads@u8w(E<~qHNmX8gLh0zu6*GT+wjk!=7$O9an7_zL|6X zLw|f&5r?T@6QAWhonFhin3FmMs0(}EJ97wbp1!|2s!nh zr_tP0l$#(nZ?pYOoK9zCiVjh%ybHNtD!oGyuSva!RpwZpDTJwwHESoUZE)1?zl*Q? z%pN~*VjQ=GY}lq}hmJcfXzg$@6E|x&cV~*)cs6Q>jvcKXcXP4kSKE*6joKaCc5JI{ z=kINH`wgSl?!0Cj*U%xpbZg_B8x%=YX8EYSEt-p2L0orscX!dgeF1UmZZBaPXD3m; zk+pB6S~}BZacko)YLD6j=?u2ivYT6F*%=)fnV+Ap6TI`8HtiNvW2ET^UqcRMtv~qM z_O+jn;DCJdBQ71;GIV(C@PUCCw%4}}?W@+KHjbklb8FBhQnGvb>pmN{nRa-5w4%Q>G*B^)UAKmwDREOMW3J9^;0*6i|eOu z9NDg)y4lmt@Kzswt)IH-;JJ5T#)nD&VC}3&a_gsV>!)t5^;5U%ldw7qSwD5-ux|a- YP5-Y$2gv?EmaLz;`G42^|9|TCe^7Qb5&!@I literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/en_AU/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/en_AU/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..3a595d935c66c95ffa0ede345d185429fde0fd5b GIT binary patch literal 491 zcmZvY-%i3X6vj1rwM(zPI3`{|v}_~(!6HV4k&s9vIJ`A=D_e1Em$q~GAU=pM^@EpQIvz%8-zdJKtC~e8aBqAmcWnxIEC^*w6GUFejc9J2poI>04uZVX|{5JTP z)W10MP|hPWmV}x~lQF9_g)mh)GcZWCFjjE5wJN_yqD`R{sr(LYGAUWYNyu4FA&^NX zObU&DX{=_MU`=SG))v%ttEy^YO&YP_tJ>|x>mWpP9K8)f{Qv82wi)Ge`P!emO=mKm z1iN4HTb?se(sGG8J_`(L`O3OQ#)Rxblrn9&?ajjx>FoOI=PbA;fs9lvWJ00yChRs9 kh4n0Fnw1!ajFip|1zD_*rq}Mm-?rC~aMA<6*>(1Q0bCK5lK=n! literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/en_CA/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/en_CA/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..930db1b4e55435d30687e4309f37a4ff74dd8320 GIT binary patch literal 488 zcmZvYO-{ow5QRao%91sUL1NJgrb#M(ic1iXrcxy;suI{DlemdXVn?=1%0ajWN8&6v zrD``k>66Ff8IPZT4)(uxtadGjmSfAF<`vhh*S2#n@${1!w7Ue{{p>B^t<4n z6aVbQvvMA&HW(`^bU}?&1mawlR7036t_^2!ZDe_CN!E!@BFh`wCb9+17{-j21R{|Y zT<6dVsh}xsLn}9?BCcE4b;mTf^BG$J}loKOnGgf;P5S(k<_jawCzi#{YdRhpULIUZtfTh}~i#uP>(ktr7$f!-T88%qRM ivz$q>P_)3IRHY^$s?}Bp-9G$U-Bt&d7OWG_g!BIxL)J_fbKhk;J1YL@P}*feL-Nrec-Qv zFMvM}4nd9oH28k-55Xz$n_vt4Yj8jKL-1a3@7sdlIq(2@63i>S0e+PCJDB_|I0wEA z{toy!_+9WY_|W}9@FKVf&VtuLeg8-B6!_rVgW#9J5PUcIDNy`1iuL$06zz|!EbkUx*`Fl`u{6Y18=w1H% zIq*(?Uj?=QtKctzp8-YhPr--5Z-MUxzYiMl9tOV$d>Fh7JPac8;8}16d=W&2!A6Cj z1U3INpiJZ|;QPQo0S|zip!E4)p!j_X;`)98)ca*n_VQWqG4PK;r|0VZp$9#`XF-iy z0S)*%D1QD3)c(H>-VMJ0=R6;Kzz_4j7d!|qfEU2u2DPt$1|I_d1=N22w|c*i%{;>U zG>9n%i=g&@5&Zo-g5VPPtGrKP^wQfwPV6exRt13Ux%2ly&@lue5NFM}t* z{{%6?;7Q~C;stP)_s@c|gTDgzf&UF^{~y}p`FR|aA6*8u&#!~p=e^UO-YHP?K2g2D z4vMcYfs*^1;5ztk)q4-;(0ZQ(We?u~AsKuNG~o9@L=#MX$m{E2kgW&vpy;lEkP5yC zN)9)`2f%NF;^S{YLPhXH@P6<~UUPlK}i7<>%;O7;F75ETdSdD!n`2IQyUB~bgk0xp1G1@8v`2fPQo3*j6A?+2xa zIq=uPPlES?-vveYdmyeK+|A}tVemds_WwAj{apgJ-&ODq@J{Yi+|prveUt~>$6bnT zZ{rqEhq)zFU6KW+yYeX%9y!}25fqT$x{aqbh`vK!pP z`QIzxi`=@zzpnG#_qiu;Thgblr?~gKr_rCIJYJ|?KLSeDALD+S`$2A9k~?B^dc6yj zd?mB@a?f+?dI$G8ZuyAp<2ShHxF6!y^*r~p+>-4cZsi7DvWe5~$?LItbU8(Sdy-pv z($(UY4qw#^7b3d?TxWTDrh5As@HuYT zPcXd^CBw3~Hf^HZBxzwnvl_-x*L3=6)UoZI2Moia-;6qHa+|H%%-AeTGm~~YWtQ1) zJ2+aAi;}|j_|7Vsy`!mEKJ{qU7ImDvtePo!EyeYeh9%VO?qZI z%?4r7HjBA6X~MlMBE0wyxrvgzfW)lX@V{JZI}$}Sc*|tU%y09padRTcOGH!j!$Pd{ z7&=LrLF#`_%*G(RaY?EHmzlM>9S=cFTmhUt# zNw>=7)^iyVR@!FSLF!gTqBqYpdm}6k_BN_-`zHCo;Yusd=s9c5q_xE0MmS0sBS^m; zHw;5-RKkpAYHag-yLm7)nuiD)|DMj{vNvryX_7~I5n=Qgd29=bX}|Fv$wQgoCwT`g zPKo#NX?74s@!0q)LyMZa@Yt08>L_M}*}AqD6?Tv}WQ+BoHC6n(sF!Qg6LVwaa+|YGMzQ1; z%q2)FV-qIaF=n;LMrqZyY4(JOOkQLtV?P0_W204svBBm;&)+Unhb!I|cAkhC5Z0H% zJnGcp&k+8aP^#cxaUZX1oPF$3W7&|4s&mP$=6l9X-f!YBwpD~gf_$jhBIdWFaXOud z=%YYh4=0u6Y1Yh^IL2g#tu#8`-{{r}&FOTsEVgU2I7(Jb%ZwBynG@?f{p|JcT+q>GPGB)n-Q^L*u!k=y`ZM)jp0h=lhbgL?moRx25j_oOIb}0cj>dTsO=OJ zRSFpokTs`29;K}+cC$y@E~yR_EoX*dp0A}DX}Vs=MW?Y>+(=0tvzhj}db-~IXv%1e zbfZFKTLR5TbG%lL)3gbbbwjb@77|;I`)x_|3F{iM?Z?ZdC9VufE(44Ew}Th$dN3cx zDhY60)j5{p=l1oaY@Jf2D2Kbmrj>&C|9cxlz z`BPBq5d7OgW#4NN_1K1z#zoP)c4Wh8j#ORCwle%P85x5R7M!hg9h~!maNHIBEG>#y zi=Ve)*69c5UBIg{S&^nD4l}vT0!iOxcJih}w=N~dKtdUWE0i>(rwAd#JB({Wvw3BZ z(5>iX?ZneI$NILj;>rmZ*p&5L7QoxCy(k|1g zPcB!E?QL9I-mv7DPJXlP^CHw~SkJFxl zjx+N*2aPADHe>U0I7~BDDEN02dfSm(^HNn1qR}}1;xJA_l`}r?QD|e>#v3-PuBW9b z-4H0sbuB(diRLVp5UAm*szR5S%b^zbGy)DLnft?fl(rNK8ra2!o#X4Xyfk>(m6pz9 zFf7l;3+Ks!jE8(@~^Ip_#Jy-Vf)>(?F$bTVee}?W4{%MLqONZ(WMPuWVUcFD=40V%gtUk^>E&|W zJavV#a!NDE*8Jo}So0^}SKQR)+!S;cvW4IlM)z$*V$E+#rm12gY zRg@fdrxN1Uk;R3RttUp~#LKeHS|?O_A?sQ5#8Ol=+n6;rpE?_JNQ_%2(NI2XlA(Le zk34diW1GGl*_)U>N6f)}ho{EQ?@7vBf=g%=={wQppC@K@^Ey>wIDX9EZW!4oD~YGg z@bfz68vLYNb|TEEOsbPV#fptxGk~879CJybL03D9)h5}zF|ZkY=opYzeXKF3znhb80ol*pwavxZppsG;Df&h%53|7nvxj+J-=_-RuVe@Nr9=sH*mcwmQ*wS$rqk|bx)o}uKc8Yi0 zOp)jy^B4?MoI2@+hJ*URCh#%YdZ;=N+iz@)2vYKNCdAbA5_TsOBjmvnzJthBQ$?!^ z?6*hI>@BcIJKmevVYg%tatww`8s{N3m@>N#C%Y53oQ#krCy%u#CZk2wqNt)k-KvmI z^k3Dt`rozQYWK|%BbIVp?9o~{7Zx_@(sMzHehbb zI{4Z$XF=k>a`rOAyGl&e?j(3;vA(B5(|K3gL=~jwV}86fzp+x+Qppjv2^VB6cXo|r zcBi7@xdl) zF^?$G`#44~m-4~c2p?*J$r}j4XuKWlH1)L0D$X}MH5HQT&J%QurLbk=?wraI>g?wA z9@TTh5k7is(mp0yHMI!Bs%bMxtdYL!e2mfD&04m~zP5{PXw+8WKe3BRGw3u4qFH*v zCVqU1Bg0y7EvS0?RAZ-`WK-s)BFv1;kzi~$-x!Hg>vQ}d*pE$hM+6m~^=}lTgmSFC z-h18kVX}@B+l_Ul=$MV1qA;z;D#Ugw7pzE64tEwnk1gRmJ-cQEHZPHkJUliWgvCN=5_i)_>JNd-S{%5zv(S8INubbVy!9|kzM5} z=wg2Jt3^r?JJDS7hq;2{Rs*WCtLiN^VO;&CT-Hm!bII#3Nu&5H)c}RByKFVpb})2jnq6NsJrusvK2#|{8Lrw>e0xqw2jJr zC5G*qP-AYb{u5_k71=5O7}yx*m@o;}q>)}36Z5El>XsD$Ec0BM<4VL*7lOO|14SOO zzUxV$l~aU5SM+V|Ny!^41-ZS$=OtQssX5JdC>y2s`-OaCsnCN&PYl7-d^JvZfB-6sp zH{=nwyPRVsG``Z=A_W8p@70LPP!*GQ9_HFCL_J1K1Qx_V8%t&3xcs00|2W>ci0u!} zxg5!>l{8N+mf>zbtjd>eDlj-G)1`3<-PHrGuEHkN#xSuyt*#QMs5mw|9D*9LQB zsJq;loAQ+Wq^<>VFBz(uVWU38B5tDpcL2B3nTV=|o*42|l;X4>M_1(-Du_dWfM}Xx Ms_}xlE#_YS4>48Gc>n+a literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/et/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/et/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..e14ea9e270d7b06ac9ad497bf06c55378c98c170 GIT binary patch literal 10096 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..52d3f3bf84e43fd3972255b9ae363c56677e4d00 GIT binary patch literal 11989 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±5wn zRpHMN{sy5`!N24_+|W3C{HU>P$VJteXs`JN<0kD4;xD$9`9y-Wr`RIqccO729*O96 zAg_j#O42wP%$7KYWQMH_bUZoGtrMElX}v7AYm+dDR!zgyijvHU^{vj%1L1Cu5f_(U zk;2$vDN^oScN$zwKSMXnyJc3)4a$4ECS zM0O-Fcxld5%5j=DezajIR@_2j%W=OWi4I|1BX)dwHMhi-9?7L^asQ_Gyxs85`=Lq# z99MM?B}dacZ?jI^M)3^e3$>Ojw8Ai6SHW_=&d9AekFpy@oN6|Cl@o%3s1@dILRBTj zF*X3XN|r<|>|!|xtyw3@r1?@eAdEw~{MqFxNRuR<|%~^jHokVj?*vwIOz_Ns;9v zqt+q#H@(un*8}RYO(l&*(YtYS(`k-WUCFjI{EG=0gAnG;mAdvW6@qZwWt}9>vQUd( zwtmv;c$ZzkD>GRZ$0qa>xy(FC-(`04rbD+bB}P|5>H4dbG^D2hA;UY2Yr$xm|!KucO;DA^#A5Hhz;;2=bDycV5cx~^4dx%lD+)T! z%&QzUoS2%7P4iwaPE?`b-+^D)j@+7uvVstef#Waq!q`_iQ{+7gZ4BEKhRv!Qac*)q z1d4K9i;q#FIg2F(YPhN@-{s}Jr-cg|9tV@eeXt&-Ero&xwsB$S_Mq zRj~2g<%<`Z-is{Wj@?=vpXubrZjic=h%|VTGoS^mTnoeq-%ndMYRk3TcJOsBiIx8v zGwsHeBBV~6Gq3p3N^CBjy*zK06&(rrtNSlm39oTJT?yKaXY-Y`F&|Hx{c{%^m+V@g zl^bWU?P+u5(2+xp!~8vN4nH}4^w?vExc1Ld*Ei-9KT1PCi<4>dS${1+TEv_9YQABf zx<+2nw`a)l90vVnEABqcv}h$qkd1lkcc;y{1kdl7iB6XFrl+RX*VmhwXa>vnnkG!O z9q$b)*sL+&y>WQw->2|zM}2BJnL4=t{LJ~YwG<9F5A8pV*Kt;D%u{+oF64|DHqN1-blOBc_n4kM za)MKv-kh9>%+u!Z!4vzvtv9!BmM8qJn_GWmqH!I9$s7b3cX+>67zGjKE{2kXS{+O7 z7))B=aLke4<``dI^Z@v(H8_5**(itbLWGrdmpI4i)Q-lS8S=y^=i!uw^_U%AK4&w6 zM|-@gsh7)600n`J)E$@89p1BSq%4+1fy&R>aT_(V{u`Vuw%)870Zt~qlSnT&yoAl7 zZ{U*|)gb8KatnB~<*6hZFNWj5OOAfoD#!wYpuH}^;vR!eL7E3^ew3wKH;0=A6|u)C zZgfunwh_(YcW-jx_+4>%DpeEVdSfllQ*$*R=dc!yZxD}UK-d~Ww>!2Gwr;jM!Sb>W zjealbzn+rR&03JG2eL(1VVGQAH5Trk%4ln$=1h9I6JuDr4Bqed2*6zz`8n5d z)TjG1(qVu<*J0?t&W>-}-!5dF{9F&F>}BS#wM>dxe7L4>$pJ!7a9 zu}zR-muxF9m0K6S-0R;;0%xhDjsC3_-kJVQVvG7LjLa>KiMA(-<`fZv%1VjsvQN56 z3umQ@bnObO<^@fRyl7$+VQBkMohWvGQxUO^u6i2Ppi@XPYO^|F0nSNp6hTUGi5+K-&ZrK!k*bOT;R~%8rQa2{RtfJM^7NY*kho+6V2fI^pa{eRfZ3g$s~Mi?luPgf^MH?5pg# z%CUmArSaUA zK*Ttujckfg+NF&^zJf#kcT$UeBBcXWs9p&_y116f(uHO&=ONi=+}Q|J_32Ex5ggbH6Aw6sRf zIWln!4RlfvbtRkr8Hzbog_Nqecqt54I6AvogEwrqXZc4wF2v?STv@# zQ&SDReGpOCCDEb7q@tkINlXm*R}|+7D9NV3jVC~NQuf>@6_}Pt0~sI&O#miIM0gm+ z>HLR(8SYWZ)MsZ`XhEghzoo{PlkZU5YY>Ra4w*LQS~V*7-It<8 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..77bcff117b96241947f9688adf731ba475b95088 GIT binary patch literal 486 zcmZvYOHRWu5Qd9jl_hHyvtZE*+%y%B;?fG}L#jkYRRUXNl4;_S*pcm$au9C8nK%oR zQk4zA^vU*k#^Zm!4-YW_XEau7#bLM< zD$y_>J%+F_BF9pjH*b!GHjYhgB4c*9N-PUC2XFSk=J+nFN;VV@Ika2B1#4Zhpbfz} z56(_nB=25W$3i2N&4km2LzwDZSQw;6S|<^%oz8EFXd7roI`31NN>(C47NW>Gj18(N zh5A4!5sL=YQ|Aiq`(;@+UG=zJ;JT{xg(wxqqU$|{W7hf0tG=^9!$vC7u~Z3%&Z~4gN1SF$ hy}VhrG9qJRZF0*&6`P~&wY%`U?bQ|ZA!u~H+7I84lyU$7 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/gl/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..87d65da74aecdad411178afb03fdc78291931a79 GIT binary patch literal 474 zcmZvY%TB{E5Jih%l_hHygT$g0Op{bRic1ip4^)YYss#2XaT6EEj%=5d4`I)j@hv!| zYByZz$o6<<_?XJDpPSW0b z=_4R<`(a3*zWU^19yFtf78m9gj11RG;LAGuN${Nti@JTn5K@n=54 zr3#h&KzbC=?WAvc=N(VGkiHS=>zxi+bS$0cnU&gA(iYFyh7OXrv5Qi`4gC z1yBFKpH!PZNm+d#Op|sr8jc1Jza))2(Z10hHHo-vNTtUMpEMOcq6hh0T8F;>B|GH1 z59h*jW@!09=cZ7)6tH`${JkUr>t4~gT3A`}Lt|?vKsW2q^}9W|TlQNTUiBeu_ab&8 eD`P>^0GGGFX}pFeOE=%%=*@6Vm@JkuWc~r^p0}+4 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/he_IL/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/he_IL/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..acd15d9fd06fd6c231092fa08f99d4cac1c19107 GIT binary patch literal 487 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 O=l7tFT-r2P`1=1D((xVu literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/hy/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..c5f3ebcfaa1efa88d9c0bbd02b03d659b1ae662c GIT binary patch literal 12885 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/it/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..6c84273a9228807bff9e2698eaf72d15892722cc GIT binary patch literal 10480 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/ja/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..e949a57f792568f3e4200b448b49a1f59b8b6bab GIT binary patch literal 11759 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 PmBYIz4ch3DeFFan4Gdgt literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..c3aeb27a96e5c3b3ef9e61ac79e9ad229463ec7c GIT binary patch literal 11698 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 Jkc8l#{vR{E`n>=E literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/mk/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4c13e5a3df71ee2357544a6a7386ed8cdce59f37 GIT binary patch literal 12121 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 LebrP-VHW%!`vlCq literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/nb/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..bd983b292c4cb1c0223b45b9624554ca496ec38d GIT binary patch literal 9928 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/ne_NP/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/ne_NP/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..a9071d09e83417e0d10cf349f5e2f9f8d9f9a2d4 GIT binary patch literal 15636 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/nl/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4691ca63fffdb0a1e8a48941f95a499d7f227728 GIT binary patch literal 10163 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/no/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/no/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..808e0a2d54b6c204ca54f542a1969cf7638e1a42 GIT binary patch literal 475 zcmZvYOHRWu5Qd9jl_hHygT$g0Op{bRic1lq52+G`ss#2XaZ{JXj%=5dgKz*Y##xw@ zs@?EQpKOn3JpcIT@ZhUP+9QsL6Jnn@BPz9tZ@RpuwaVFQV)R194o3;T3S*^K4EhVM zQVr9=a|AQPb5UyZ?oCCZjl;1`WrFw1)MBI=c#|ibiVs;;VxK#~pcRCd7+hi4g7AWc z=cfV5d*Ie#WVo^!ciJ$B<~rvVdUGSKlLBs>&hLnL6KKXdzojyjE_o_25RCAxtE$FN*7nf|YPhwJ;s0?z+cfZ%_8Z=KG#>0eB5Vd;Pb()B zS^q3(HYZljFETDw2jV$5R=Dms_zgFxt7_nK|eD&hPx*=j^v0-1eHo^%?G;l>2VS`K;i*{BZ5K&v6vE6Z|mv zJow{a50w7D1U?4-F1Q{12G{`q2Al-{8+IjLYVbku1}OafM)Cbm3j7C9==~44 z7u@&$oWBs1_4Pra{{`?_@NMup@PQw8oTK2!!6x_`$e**ukM#RHa0ht*k2ucb;9l?} z;6)G;&UJ7K{5;qMzYd-R{{x%_XMQxNcNP2z-d`==zXZy<{s5Hq{5>dg{LkWj?*n=J zdGKz&Ujb$P1Mq|3=Rl$Nd*GAcUxFV1{~c7|y>xyEd=lIS?gtUMa|ql8o&r&!vs&OQ zpp5?E4saTr2VVq#5tMa(2YeL#E-35y-{So~7PFi8 z2@q3s7C>45WpL^}jgg2fX6_QV+M*IZ-QdCZ-Ixw?}8V=Cx6;;J`Jvd9q=DP zng4`x97O2+3V0CwBDfd)4k&zo0Af4A^B}5qUIyj+=fOkZUxTN?_fO>XE`gYg^V^{K z%^!k@-uY+n3Gf|Ifsf$~BA){wtT?|0ie7#n6nl6Z6#aawX#XC_Q0GyUC3-mk3g0bI zz7If|=L_IA@Q*=U()lw`?CqN%A;$S0C~~?7V?Z>{{h+)*1&ZExgHMB}z@y+VfT+xQ z3l#d_21PIb1wzVsm_?ld_kkC|S3z0Vw?Wa@ZkUzvp9T??GXNXlZ-OVlzXI<8A7JtK zf{%c+;0M8H!B2vsx7R@7{~eI2tx`nJPoNy(cONKz+Xe3fe+zsc_+{`e@NRC=lZ+{^ zkMbZgluKfp^q=Pz{R;1L?c)|XiEn>~`!e@4+;S1R>?QU>7;-+z{eu0H|FAS`t750( zi;7#WOWen~Kh7;Wmi372PI1d6>y%6ER@NfdF>Z;|avk8Fv`?d-!#uuNyox*!zx7YC zX+n&>L_Ubm`4smy?iudg+@e>}ptp;L;wJ4_eTt3CCAM(Z zKIM8W9<2_={zTVe=W>bu#U_4EUbs+^jUn-ik)ujCrBN3lJzcd^w+xXVjy z=%Mljoa273cz+Lgg!{enKC$Wry)?Ntp}bfHVWPCUqJ6KW+;-@>rnz~Co=)0Tufr-f z(G?RZ6GdU9Lf1{B$h4Zy;ewnOBxad*W{J#8sW;Xbq}|0^+EU2RhaD3*hj}zX;<-BU z!a%uX0G}S_ER2XnC2@ziMhFEz)oIqkmt>#~@H7$w6>%MC;X_PPX z-Eng~h*Lz9v~?n^^Qf()R5#2&2WqveuU>8$*XwHka?jVUiLa^RUFGjh=Z@)k%U&Ym zEg~P4go*a=oIt-F`sQ*zydtw`5U;Glj2H_sr5afbYRNNbT;#=KeWOwHYS#-c`zBaU z+Sf2r9cec)QM}o>AY3n(t;flJM z*jOLA+~KGbo-cB9P6kLSVi8Jj8nc?UUNUP_Rck^-Do!GlF-gF3jdulMtg?8W^LLw} zy-scmn-9bc2-AN^J7*(T195tC?E0vBXE8SY5S)Goi#db~PdqGDv)JRbx zb7H;Q-nb*&ZPDZ0;)*D|72+WxLvt0o84>I0Wz4o*3u>BJ?R5&DoPd+?_QMm&fR(npQf<6vc|2NZ7L6Z%Cp|SeG6fHolY^;!2O? z(lxk$(>Y}_=ZyBHB*1Z{&Y|RJI%iDM4qGUmZah$H*+R?r!@d+OXGR&>4bvdGmdB}P zlctmqFN$(t7Kyp$MS5lUBgC}~Jf z9zuq97?%On;w6J9adC_`V6t~#VB4VR*x%S$ z2=pR;gZca6vIHG#=4B45C#EKS{meyl1telPKFPuBubY5igR%qvHYlf2>yIyQVBGTYZoB=IhMh0lQk3_XZVg(x`ZEOmF;s7yfOj@9O!xc5Xj&^33s(6sDU~+mGUP>{T1{ z)E+Y`F;^3MYA@JtHzkCv*@gKNjb}&wgqI}~HI7T+g{WuLvx{C*tzw3a+4eb~J)++@ zfr8>074+l9LFI1++BbK|0VSeXV@Y9W3HbdU(AP;_A2QM69u;SK7zO23cbKz|$*hH{8rQ z3*Wu4rGt=Q9ApHmTRTZTDgCO z39d2-gHVnWGyzi$hS#&vdBpH$wt~!Bfx*891Ry3CN7V@w>!%SHb(Dm|H<*unk5JvHJU`S{z^qwI5{s`1yt9sWP)oSn6@&AtH1M z!+NF5YFEY&E(U?_px2Gqkr-VJ-&jiJF~n_X1bWcNIef2^3LCBA^>jJ6nVh43hB}0$ z+NnlCPVLa0gu@A$o1wLXjawye>#))qt-p&-JMjR2Oczze3h@woVq+@-jyUdwh?UnZ zL~7?97fIuN-5S1G`ahAQU%3U+vk5#^`ANv6iaW#Wx@CQwo?=XDU{twa+FWn=O5E|> z_M{U1PD&8yL}vH~vc?%?G2M)}!0Sk0SwDToNrxPx*uxU(ET<*6>Bsh^>C6#lR>}pG z6ilPb!3m|gJ1`v&SCl}6munR!#Hw!bK^9Q>{rbMOrpel%B=b9#*4pc1BjVxp5HIcM zNu{yb(JX9g?D=tZeo|veYQjuWl61*{D4DUfkpw*IuB?ar*O8FJlqhqK5Y1mF&`FG? zCSD(gsey|g9PnnnA`&-MjR7m}RQB)nHP+5kwxlpJmyVwjK~)~QCHihc(nkFzO|GBx$T~R3~gKEWK?Nnw7Lzs$%`hD>3U+~3RD(0pVf(2KE|b%C#IBQC!tJ}xMPDWN9e?%@vfDJ zRx)PS&pu=YsCfcpvfL+)}V!Y$h5|#_|(*%sJ>&#%Lnf zO3n$6RA^v~wE^Cyd1O{4CSu?zbrH^%z7e3*mpIRa4h9v=#p2Vz~KnR6&^|15f2$iq(x( zPc39(tNWF_^04|5OQQ~{j;cls-2t^u7+@}m-PkZM<<||D-H+(~|BY@G5(zdTd9kVt zWo`Vk+6n?65mX}hE`U+OXu^hnrsJ$Xh z9vX1pG94;8OOu4pCMX_om?y^=98J8!f1)xDGcanYr^tKgEerCv)O4aS4lwV~;Xm(2 IijC0uKe)U+Pyhe` literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/pt/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..653cce97ebb8df40090f661e659d22b6d322575d GIT binary patch literal 10382 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 E0j)EdlmGw# literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..67da6164b9275741397768929e7284305f1379c1 GIT binary patch literal 493 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 s{gIi!=8h*t99B}|w<J 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 ZO-NI=vUB^V*W5Q;Or=Kiug8s$|By$Gg+)&TQsl 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/tr/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..6386aab5236ae56a95525a2b2c525baa555c3963 GIT binary patch literal 10073 zcmbuEZH!#kS;udP6Ue4ek~Rb=(Bp*=n|fyL*h$=VoO&IO?Ai{#+B^TbbI_0rb;|l@TCGMZ$-f?dbd)>hd4e&7d4hTtb@W+GTr@@n;JTHJE{}oWy^97H8;D7%c z@LqoZFHqL~Kj6=S6AzVqc7u=ed<^^vFa#C&8Sn$(?}9tPKLSy4@J(g60 z56p#r0=ysG2|fz$0{4PPK(XT$P~`lEfBzl-{BNN6$%9P#6!dZse+PA@B~7LT)zp5AN{j`-p!&#Z=V4#fPV?5;7*vo0RA>8e7*;s0vjk-mV+4_qwxJh%t^ z9sm2cK*jTaf)ZCBV3881&w%d(kAc4cejF6}u7bP4FM_B%_!AJ);Jcv2-~WPQ{|5*r zp???@y?huHy<7yvpIYEAg0Fz$XP*Z}Utan)tl?|`^hu_LC zV!Qd;Z(@t*xkcA3;HH?b|# z+F}OeQgfxSV=v<(T6ovH0`~Js z&&0tDUrn6bmdt^THPdRD zey+Mkw@u36)acx_gJXQEu7+Wn#2vMmq>;{>>Oy8z5_2yK6CTPJnX++~!(v)3m%rR- zIu^N&?wU=Jmdm_5X^zKPfok%u&P8;-YNsg`CFRetT8{Mf%Wc!Lkq$5SL)|jj4dtIz z`P>Zdn2+t)T<9I5AC)J$4)2`7wQdrc%O&}c&4NL_vI;X2EWwp(Y;mYXYp}TJi^YaU zW9H?^#+O4Ack=EHoK&Z}m76r%jxJ6%>*e;ejL_cNOdBO`Ry6uQx78adJ)k@;b zX1T@baq`gQqNY8nj7Yu|F>#W$utFvhbq9Sy(dn_y?DXu_1M(VtO6hi+(eD~_;rtnq zy-sE#ZNu95>wSZn+Q`_Jcw8uQ)p03F9woM5Fh0fw-1xZhF}5W+L#G2-p3O~^4cX>{ zzEM8^U6zL%lVh|YdbvZY6E+mR1*c;)m9hw>x6N72+9;W|sfKGpMJmfvjIoD=)iU-f z%2;Ocx|Hu0r2Ss$3)>Uo2Bh@`o!M5E{uJqNm`Wx2d+Ec0j5ALiP=*D$ta>`W9epXd z%DTh+i*MzcOpx^@w}|jt@pv&A%jly-UJa*|WJx-t7IoBghOZ25yk}@zr!;5N(X{xk zNkbd=R6~snB|0b9x4K&oM7rCIIJfYM7`&YjA)-Tb9lsed>+23~Tdf5%O)mF)J|-uT zB)K(tE){TSuiNTse7Gy0-lMiMjP(YoC&)_D_r__ni5>N5*#+H!WXq|(&a!JsN|~
      uxX{zVCrqy%3fXhl!vRn$sTckk{!)@l{^h%jDQ9mEZ%VD>`mr);D`#sVFXJB-_ z5bC%$MpSzl7hyR5P8J50Ulh_fsU{^8nafTG_>MgMKgc37DL!78^Nyw)V5M7-`B$#c z)z((mR_Rz0k=qP#jx_S4NK&a=d8J;7PnW zs({q1N|Ui!(eEdzv=_v;)ur!9So7e^zwj6a{)K*+Xz4}DqD7aCW2@4!nRSp9s># zD4}bJG5Ra#vE(lqE-jIEMYZV5#3he_T}A3Xn2)}cDlY@ugs=;Ic`Z>IyyW^q7cn?i zDaP}2=U!|E7n!`BxVgF-atd2yGnY8g22TNiD12kz z*1t~?%Z~k2o=)waID7i+@sS$#HTOXfUzk79 zI5-+7vMidkaa=kia?!LpxM1_)GT@O;%!X{{!o~@Vkxi?(?;f+mPaI-nkLEc0zs&zMwZ&!u8c&Ns(DK(DC|eUXs!L z@?va+3C*w@57^2Mqi$y_E! z0pi(iQ=#22B9!CdDchugYRi8I%&NWo-AHtf)s}kF85&3XqDhf^n=L$>N9pR-qFxF$ zhL3c6eRX}ssV$}yLWei7*7*b%kI-d#65x06{_U9Fck*ca+YCN~q z9bDTzQs7?x0B@;&m$GqL^ zrvXD}aNfLjbFg-^htJYyD6_Fbux&k4o!9V$V2oF9?dIC+cgXCNP8ZpC>Yk4FV6&X) zTk1&sBSz^yZkecL7qC?VGmSo50I^Y> zR6-oN`eazs!y6)lBMsVi5BBSElp{TwO95_7hqEOz*f1~n=<~Fa7FjciP^c;mvPwrZ zxAx{zC`v46BcHphwXq_5x^i-x%J=b8h%JXp4iGozh$7_NB&N|8uan+Q)N%`MBT6}@ zNNF?DcPDG96U@*IPL*Fo2F^cab8K=_r04IJTRV}!+?7~kgtNmmRZ+@1#XA^|8`M}- zX3y-B8koFC@rc`&O<0xxC3PXnpd$g)Q@xa3PwJ|HKctXmN9V#=6*3BElkA{+Nt+}d z>BtoUU-{nKH0-oo&5~NC77{9!NZ@miRTLUJFB4G&?{FC>rI=FOouHeRlj-%9y1;XK zuqY`|k{cdI?WNB82x1wv1&Me~HFUR;vD$@q>d}FScTQC!UnnO=g&as+tSX)upCl4; zN4Qvhfnx-x(1P?TW8)=e%2q=ZJ~m$Vq#V>xf`}XE(W8MhBa6CDx%Gj`cI4%uh3^|m zzws^0s4X$Q%(AT;&AA1U+hB||J+%0C2H%dw)iV3GWUx@+erB$T9$@s-HqyTr1+T=qvO zq$o06n>^9hU0s${IZ>H>!8dB6of%wb5^^;;>r^zUd^VR@tbDSp(X~!={DrKS1Vsx= z(jkn+Yv)8cG41CdL2f_Z21n}-yX8?z)t0H8zIA<-&e0w2jr-~xu}n-yI@oy4E~X|} zdlkK}-9$@j?e(PRdkCjB3VDBhHFO~|!}d&9$1PP2as<*?G=uR|magebZ%eNZTjJNn zAR$UsC$IXw067J3Bvs;nbZm0)gBF}Yd~f5bRoGOrfpMPYGAgM^>Y4P-Y?|;+h29XM z&ZN}4xPBAOxkgScC8=ca(GT)kEr>#T$T5tLYW!_pZ#r4Q<7`*bb!Y8O{$=DBEkWl( zu41~0O7=c@;(MZj#8t7|P;DWBE7mR{V1xR4{Wfp=6_*w#E~y^asJ(V`$;6ZqyU71B z=_)dVIph$r7_iTa3b$Kx=Ph@$^;mynV}*Yk=Ir0fFVZ@^Z1GFwrq!E(pTwb z<*3qGee=5@xrhC#%NJ}6>xqMXgIz2;vCt3CEN2lBE2v1;SE~fd*T-$=otyDir9o{DY2Wu&+(*OVf literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..3751732bed5bf46bde9aeb814b71f2a8e1d419a5 GIT binary patch literal 10292 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 R>`|G-rtFbCyP_SC_kaCr=^X$7 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/uk/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..18c3242bbed7b0a0ad675349c155e3939d2d3c1d GIT binary patch literal 13245 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 GLH`Rw&L=nk literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/vi/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..6809b650c1d85cfa5ec65341ba957cd98eaa09da GIT binary patch literal 2179 zcmZvcO>Epm6vqcB6qfG-2R`)_4p6oBCIP9{mLO=8qR=J{&9;IAhgo}KPh-y*d%T;d zs#MfNg(^OB;804XMiqymR%rnVkv$;fs28MOxuLojgpjy$-~j*e?zTx(YiEC+ulN4% zy&3<$ZOfMo&ogK*psk_3h!)+0KRh?VtzZf61^)!?x}Enj_8d3~-Us^NOJE4T0-gq+ z0$0EqSbz_LH~Rbyd;tBMptbi0_&m4;#&&=NZUGO1&w}rPcK>|8Z@^LXKLgJ}(=VX) z^WpuBwZIUxc7E;i9}qwGGMtWq+rddN0ImOPpw)W=d>Fh1J_7#T@Ba(#M1L!iVfi|^ z8|2_);8)<=;3d%7`3u|y{s$facR@U4vTbOPT0K^e^|k(a2py!NiXB_4x;))qVD;GN zNi^%z`WZYn_9xIDMYDN&91W5g+m{M%gwMwDPa)5!lWG;voK9nITso2o(h6;kOeoOl zO=KihW(4;ebi6lm!etZ6h?F?Bc_e)jF_#f>-%mxBxolGPhVx9MipQd!@GR@-)OXnd zvB;)`3AIl{$K&ed#1JWMh)0p`2rQY(GXs}il>35)1~!I>E9@Cq8gkjRCTT>Rk*hq9 zm_?TzQM?ri>n_p(6jDc;kdjolr7wK)QsE0_B#)2+?n_NL9q=PB6?|iclOY<%RbOK`MQ!9a%@jT8p|w`T3H3?*;=4b2*x_l%4IXDK87?n zlfH9Qq;_e8#*c9oXgWMG+oZV^E>Va1+F_CC)HqXFAbn?V9%N2aH>fsq$T=+9((ZKZ zA!*R)@aV8Jg5PU+Z48g@7{*gO$TQcprcY4n*^M+S3_fxM!nwYbX;TY$~m!MH`V=0zk`EioZI@H zk-LxAQN+qay)En8Yg3a`6L&H(;ttpLX`EXH?TZP5Gh)HilZZ>ThrE!dnJ{BVn){vI zch*@gb0T#nl&5{1rUvb9Npm}r2DN2vCdyMDIr~wMtU)TNy4l#s9_qc04ezP3wJ(Z` zWXjcL&8CCm!Xjl{(%MqlJ)=VMF|Goa#*3eDALFun){v?0rV7jM3dT0B#OAyjI)wv( zGi<_g_2>21a~cCzlD?&CFGqxB_mlor#p}g{qOyD1WwQ`sif#m2;q|N6A=vuuUh?SH$*%`@`PRwvSX}&2Nxps+ZanLF^_!$; z7pHV@xw?YWo+C<+63ktcJcyPu;tWp@b` zV>HfDzpPmH!VSx9W=;)CG*~>4)Sp|Q?RMEchcfg6GWfQvE#bWMN`cSXhLmjT4itLD zcdDw|vZ)-ORl&|d6)S5{eufrMKz!zGy*DPBy(5d|DzG!ux=V>76k*dT?0u+E&t)|b ov9>fQdR23L0?O{kHX54_o0MxFg%aluQi}^not=TwDtRvZAC2wn00000 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..3bd1fd3efa65ee170719887e0f0eff038e4accb8 GIT binary patch literal 9915 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo b/env/lib/python3.12/site-packages/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..670228a8346076571906d56e43817d7e8354163c GIT binary patch literal 9938 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tenacity/py.typed b/env/lib/python3.12/site-packages/rest_framework/management/__init__.py similarity index 100% rename from env/lib/python3.12/site-packages/pip/_vendor/tenacity/py.typed rename to env/lib/python3.12/site-packages/rest_framework/management/__init__.py diff --git a/env/lib/python3.12/site-packages/rest_framework/management/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/management/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9e00bdf7e75f3474e5ff9851dd10e2556e46fcf GIT binary patch literal 239 zcmZ9G!D<3A5QaCkg(CP4z4p)@s#g(&?M+HSJcltmu30z9GRbz?NATj+XYg727=41` z%~O-BKg`TGKR?X;OeW(j>L^5&=5K2Ex;{qdoDJEl_`GEN5Vvc}+)l9Z#2(5m_EaMj zPIZQC@bFP~3WIhQ)(RWqm!-mz%mAxZ0TEnLqpjQ*yP8x0vft3?Ewn?}J3GtYr{Hy< zw-(g_EAqhPgWNG1>Kz}zppAAq1yX9OgOqtY+@9ygm0d#%ev0pjSU$nuNC?5BNdG%@ BL@59O literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/management/commands/__init__.py b/env/lib/python3.12/site-packages/rest_framework/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/env/lib/python3.12/site-packages/rest_framework/management/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/management/commands/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f857d50232fa7203c5f3d7264daf17d6c0709db GIT binary patch literal 248 zcmZ9GL23gr3`NIH3Z;-cblXKEl5RtwFx`bxC|w)HR;Qkf?Lqb=%n^EmoS|pwF?xcM zT~?L1`5@{2k3jmF&2B5vmr_lczolL3G?nC7jn%z+`L6g%+^OuGkMN#|6WA>ts70uw z89arY;Mooavx@=V40gnKPX;ad5jL9|1Y+G{XyPl!mP`f;d+6L2`Z0gT@Hk&AA-PNs zJ(?Xhlz=H^{lVzz5P1h4gT&<&nCQjX1X{b`vexr{Jm0K*v_nU0zLr0gR4VW{QA+Vd F=pXmTN3#F` literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/management/commands/__pycache__/generateschema.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/management/commands/__pycache__/generateschema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa6fd9cc47728b21c34dce8e8ca7703a08fe33b1 GIT binary patch literal 4234 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 + media_type_wrapper.precedence + ): + # Eg client requests '*/*' + # Accepted media type is 'application/json' + full_media_type = ';'.join( + (renderer.media_type,) + + tuple( + '{}={}'.format(key, value) + for key, value in media_type_wrapper.params.items() + ) + ) + return renderer, full_media_type + else: + # Eg client requests 'application/json; indent=8' + # Accepted media type is 'application/json; indent=8' + return renderer, media_type + + raise exceptions.NotAcceptable(available_renderers=renderers) + + def filter_renderers(self, renderers, format): + """ + If there is a '.json' style format suffix, filter the renderers + so that we only negotiation against those that accept that format. + """ + renderers = [renderer for renderer in renderers + if renderer.format == format] + if not renderers: + raise Http404 + return renderers + + def get_accept_list(self, request): + """ + Given the incoming request, return a tokenized list of media + type strings. + """ + header = request.META.get('HTTP_ACCEPT', '*/*') + return [token.strip() for token in header.split(',')] diff --git a/env/lib/python3.12/site-packages/rest_framework/pagination.py b/env/lib/python3.12/site-packages/rest_framework/pagination.py new file mode 100644 index 00000000..a543ceeb --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/pagination.py @@ -0,0 +1,990 @@ +""" +Pagination serializers determine the structure of the output that should +be used for paginated responses. +""" + +import contextlib +import warnings +from base64 import b64decode, b64encode +from collections import namedtuple +from urllib import parse + +from django.core.paginator import InvalidPage +from django.core.paginator import Paginator as DjangoPaginator +from django.template import loader +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from rest_framework import RemovedInDRF317Warning +from rest_framework.compat import coreapi, coreschema +from rest_framework.exceptions import NotFound +from rest_framework.response import Response +from rest_framework.settings import api_settings +from rest_framework.utils.urls import remove_query_param, replace_query_param + + +def _positive_int(integer_string, strict=False, cutoff=None): + """ + Cast a string to a strictly positive integer. + """ + ret = int(integer_string) + if ret < 0 or (ret == 0 and strict): + raise ValueError() + if cutoff: + return min(ret, cutoff) + return ret + + +def _divide_with_ceil(a, b): + """ + Returns 'a' divided by 'b', with any remainder rounded up. + """ + if a % b: + return (a // b) + 1 + + return a // b + + +def _get_displayed_page_numbers(current, final): + """ + This utility function determines a list of page numbers to display. + This gives us a nice contextually relevant set of page numbers. + + For example: + current=14, final=16 -> [1, None, 13, 14, 15, 16] + + This implementation gives one page to each side of the cursor, + or two pages to the side when the cursor is at the edge, then + ensures that any breaks between non-continuous page numbers never + remove only a single page. + + For an alternative implementation which gives two pages to each side of + the cursor, eg. as in GitHub issue list pagination, see: + + https://gist.github.com/tomchristie/321140cebb1c4a558b15 + """ + assert current >= 1 + assert final >= current + + if final <= 5: + return list(range(1, final + 1)) + + # We always include the first two pages, last two pages, and + # two pages either side of the current page. + included = {1, current - 1, current, current + 1, final} + + # If the break would only exclude a single page number then we + # may as well include the page number instead of the break. + if current <= 4: + included.add(2) + included.add(3) + if current >= final - 3: + included.add(final - 1) + included.add(final - 2) + + # Now sort the page numbers and drop anything outside the limits. + included = [ + idx for idx in sorted(included) + if 0 < idx <= final + ] + + # Finally insert any `...` breaks + if current > 4: + included.insert(1, None) + if current < final - 3: + included.insert(len(included) - 1, None) + return included + + +def _get_page_links(page_numbers, current, url_func): + """ + Given a list of page numbers and `None` page breaks, + return a list of `PageLink` objects. + """ + page_links = [] + for page_number in page_numbers: + if page_number is None: + page_link = PAGE_BREAK + else: + page_link = PageLink( + url=url_func(page_number), + number=page_number, + is_active=(page_number == current), + is_break=False + ) + page_links.append(page_link) + return page_links + + +def _reverse_ordering(ordering_tuple): + """ + Given an order_by tuple such as `('-created', 'uuid')` reverse the + ordering and return a new tuple, eg. `('created', '-uuid')`. + """ + def invert(x): + return x[1:] if x.startswith('-') else '-' + x + + return tuple([invert(item) for item in ordering_tuple]) + + +Cursor = namedtuple('Cursor', ['offset', 'reverse', 'position']) +PageLink = namedtuple('PageLink', ['url', 'number', 'is_active', 'is_break']) + +PAGE_BREAK = PageLink(url=None, number=None, is_active=False, is_break=True) + + +class BasePagination: + display_page_controls = False + + def paginate_queryset(self, queryset, request, view=None): # pragma: no cover + raise NotImplementedError('paginate_queryset() must be implemented.') + + def get_paginated_response(self, data): # pragma: no cover + raise NotImplementedError('get_paginated_response() must be implemented.') + + def get_paginated_response_schema(self, schema): + return schema + + def to_html(self): # pragma: no cover + raise NotImplementedError('to_html() must be implemented to display page controls.') + + def get_results(self, data): + return data['results'] + + def get_schema_fields(self, view): + assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + return [] + + def get_schema_operation_parameters(self, view): + return [] + + +class PageNumberPagination(BasePagination): + """ + A simple page number based style that supports page numbers as + query parameters. For example: + + http://api.example.org/accounts/?page=4 + http://api.example.org/accounts/?page=4&page_size=100 + """ + # The default page size. + # Defaults to `None`, meaning pagination is disabled. + page_size = api_settings.PAGE_SIZE + + django_paginator_class = DjangoPaginator + + # Client can control the page using this query parameter. + page_query_param = 'page' + page_query_description = _('A page number within the paginated result set.') + + # Client can control the page size using this query parameter. + # Default is 'None'. Set to eg 'page_size' to enable usage. + page_size_query_param = None + page_size_query_description = _('Number of results to return per page.') + + # Set to an integer to limit the maximum page size the client may request. + # Only relevant if 'page_size_query_param' has also been set. + max_page_size = None + + last_page_strings = ('last',) + + template = 'rest_framework/pagination/numbers.html' + + invalid_page_message = _('Invalid page.') + + def paginate_queryset(self, queryset, request, view=None): + """ + Paginate a queryset if required, either returning a + page object, or `None` if pagination is not configured for this view. + """ + self.request = request + page_size = self.get_page_size(request) + if not page_size: + return None + + paginator = self.django_paginator_class(queryset, page_size) + page_number = self.get_page_number(request, paginator) + + try: + self.page = paginator.page(page_number) + except InvalidPage as exc: + msg = self.invalid_page_message.format( + page_number=page_number, message=str(exc) + ) + raise NotFound(msg) + + if paginator.num_pages > 1 and self.template is not None: + # The browsable API should display pagination controls. + self.display_page_controls = True + + return list(self.page) + + def get_page_number(self, request, paginator): + page_number = request.query_params.get(self.page_query_param) or 1 + if page_number in self.last_page_strings: + page_number = paginator.num_pages + return page_number + + def get_paginated_response(self, data): + return Response({ + 'count': self.page.paginator.count, + 'next': self.get_next_link(), + 'previous': self.get_previous_link(), + 'results': data, + }) + + def get_paginated_response_schema(self, schema): + return { + 'type': 'object', + 'required': ['count', 'results'], + 'properties': { + 'count': { + 'type': 'integer', + 'example': 123, + }, + 'next': { + 'type': 'string', + 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{page_query_param}=4'.format( + page_query_param=self.page_query_param) + }, + 'previous': { + 'type': 'string', + 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{page_query_param}=2'.format( + page_query_param=self.page_query_param) + }, + 'results': schema, + }, + } + + def get_page_size(self, request): + if self.page_size_query_param: + with contextlib.suppress(KeyError, ValueError): + return _positive_int( + request.query_params[self.page_size_query_param], + strict=True, + cutoff=self.max_page_size + ) + return self.page_size + + def get_next_link(self): + if not self.page.has_next(): + return None + url = self.request.build_absolute_uri() + page_number = self.page.next_page_number() + return replace_query_param(url, self.page_query_param, page_number) + + def get_previous_link(self): + if not self.page.has_previous(): + return None + url = self.request.build_absolute_uri() + page_number = self.page.previous_page_number() + if page_number == 1: + return remove_query_param(url, self.page_query_param) + return replace_query_param(url, self.page_query_param, page_number) + + def get_html_context(self): + base_url = self.request.build_absolute_uri() + + def page_number_to_url(page_number): + if page_number == 1: + return remove_query_param(base_url, self.page_query_param) + else: + return replace_query_param(base_url, self.page_query_param, page_number) + + current = self.page.number + final = self.page.paginator.num_pages + page_numbers = _get_displayed_page_numbers(current, final) + page_links = _get_page_links(page_numbers, current, page_number_to_url) + + return { + 'previous_url': self.get_previous_link(), + 'next_url': self.get_next_link(), + 'page_links': page_links + } + + def to_html(self): + template = loader.get_template(self.template) + context = self.get_html_context() + return template.render(context) + + def get_schema_fields(self, view): + assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`' + fields = [ + coreapi.Field( + name=self.page_query_param, + required=False, + location='query', + schema=coreschema.Integer( + title='Page', + description=force_str(self.page_query_description) + ) + ) + ] + if self.page_size_query_param is not None: + fields.append( + coreapi.Field( + name=self.page_size_query_param, + required=False, + location='query', + schema=coreschema.Integer( + title='Page size', + description=force_str(self.page_size_query_description) + ) + ) + ) + return fields + + def get_schema_operation_parameters(self, view): + parameters = [ + { + 'name': self.page_query_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.page_query_description), + 'schema': { + 'type': 'integer', + }, + }, + ] + if self.page_size_query_param is not None: + parameters.append( + { + 'name': self.page_size_query_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.page_size_query_description), + 'schema': { + 'type': 'integer', + }, + }, + ) + return parameters + + +class LimitOffsetPagination(BasePagination): + """ + A limit/offset based style. For example: + + http://api.example.org/accounts/?limit=100 + http://api.example.org/accounts/?offset=400&limit=100 + """ + default_limit = api_settings.PAGE_SIZE + limit_query_param = 'limit' + limit_query_description = _('Number of results to return per page.') + offset_query_param = 'offset' + offset_query_description = _('The initial index from which to return the results.') + max_limit = None + template = 'rest_framework/pagination/numbers.html' + + def paginate_queryset(self, queryset, request, view=None): + self.request = request + self.limit = self.get_limit(request) + if self.limit is None: + return None + + self.count = self.get_count(queryset) + self.offset = self.get_offset(request) + if self.count > self.limit and self.template is not None: + self.display_page_controls = True + + if self.count == 0 or self.offset > self.count: + return [] + return list(queryset[self.offset:self.offset + self.limit]) + + def get_paginated_response(self, data): + return Response({ + 'count': self.count, + 'next': self.get_next_link(), + 'previous': self.get_previous_link(), + 'results': data + }) + + def get_paginated_response_schema(self, schema): + return { + 'type': 'object', + 'required': ['count', 'results'], + 'properties': { + 'count': { + 'type': 'integer', + 'example': 123, + }, + 'next': { + 'type': 'string', + 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{offset_param}=400&{limit_param}=100'.format( + offset_param=self.offset_query_param, limit_param=self.limit_query_param), + }, + 'previous': { + 'type': 'string', + 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{offset_param}=200&{limit_param}=100'.format( + offset_param=self.offset_query_param, limit_param=self.limit_query_param), + }, + 'results': schema, + }, + } + + def get_limit(self, request): + if self.limit_query_param: + with contextlib.suppress(KeyError, ValueError): + return _positive_int( + request.query_params[self.limit_query_param], + strict=True, + cutoff=self.max_limit + ) + return self.default_limit + + def get_offset(self, request): + try: + return _positive_int( + request.query_params[self.offset_query_param], + ) + except (KeyError, ValueError): + return 0 + + def get_next_link(self): + if self.offset + self.limit >= self.count: + return None + + url = self.request.build_absolute_uri() + url = replace_query_param(url, self.limit_query_param, self.limit) + + offset = self.offset + self.limit + return replace_query_param(url, self.offset_query_param, offset) + + def get_previous_link(self): + if self.offset <= 0: + return None + + url = self.request.build_absolute_uri() + url = replace_query_param(url, self.limit_query_param, self.limit) + + if self.offset - self.limit <= 0: + return remove_query_param(url, self.offset_query_param) + + offset = self.offset - self.limit + return replace_query_param(url, self.offset_query_param, offset) + + def get_html_context(self): + base_url = self.request.build_absolute_uri() + + if self.limit: + current = _divide_with_ceil(self.offset, self.limit) + 1 + + # The number of pages is a little bit fiddly. + # We need to sum both the number of pages from current offset to end + # plus the number of pages up to the current offset. + # When offset is not strictly divisible by the limit then we may + # end up introducing an extra page as an artifact. + final = ( + _divide_with_ceil(self.count - self.offset, self.limit) + + _divide_with_ceil(self.offset, self.limit) + ) + + final = max(final, 1) + else: + current = 1 + final = 1 + + if current > final: + current = final + + def page_number_to_url(page_number): + if page_number == 1: + return remove_query_param(base_url, self.offset_query_param) + else: + offset = self.offset + ((page_number - current) * self.limit) + return replace_query_param(base_url, self.offset_query_param, offset) + + page_numbers = _get_displayed_page_numbers(current, final) + page_links = _get_page_links(page_numbers, current, page_number_to_url) + + return { + 'previous_url': self.get_previous_link(), + 'next_url': self.get_next_link(), + 'page_links': page_links + } + + def to_html(self): + template = loader.get_template(self.template) + context = self.get_html_context() + return template.render(context) + + def get_count(self, queryset): + """ + Determine an object count, supporting either querysets or regular lists. + """ + try: + return queryset.count() + except (AttributeError, TypeError): + return len(queryset) + + def get_schema_fields(self, view): + assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`' + return [ + coreapi.Field( + name=self.limit_query_param, + required=False, + location='query', + schema=coreschema.Integer( + title='Limit', + description=force_str(self.limit_query_description) + ) + ), + coreapi.Field( + name=self.offset_query_param, + required=False, + location='query', + schema=coreschema.Integer( + title='Offset', + description=force_str(self.offset_query_description) + ) + ) + ] + + def get_schema_operation_parameters(self, view): + parameters = [ + { + 'name': self.limit_query_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.limit_query_description), + 'schema': { + 'type': 'integer', + }, + }, + { + 'name': self.offset_query_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.offset_query_description), + 'schema': { + 'type': 'integer', + }, + }, + ] + return parameters + + +class CursorPagination(BasePagination): + """ + The cursor pagination implementation is necessarily complex. + For an overview of the position/offset style we use, see this post: + https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api + """ + cursor_query_param = 'cursor' + cursor_query_description = _('The pagination cursor value.') + page_size = api_settings.PAGE_SIZE + invalid_cursor_message = _('Invalid cursor') + ordering = '-created' + template = 'rest_framework/pagination/previous_and_next.html' + + # Client can control the page size using this query parameter. + # Default is 'None'. Set to eg 'page_size' to enable usage. + page_size_query_param = None + page_size_query_description = _('Number of results to return per page.') + + # Set to an integer to limit the maximum page size the client may request. + # Only relevant if 'page_size_query_param' has also been set. + max_page_size = None + + # The offset in the cursor is used in situations where we have a + # nearly-unique index. (Eg millisecond precision creation timestamps) + # We guard against malicious users attempting to cause expensive database + # queries, by having a hard cap on the maximum possible size of the offset. + offset_cutoff = 1000 + + def paginate_queryset(self, queryset, request, view=None): + self.request = request + self.page_size = self.get_page_size(request) + if not self.page_size: + return None + + self.base_url = request.build_absolute_uri() + self.ordering = self.get_ordering(request, queryset, view) + + self.cursor = self.decode_cursor(request) + if self.cursor is None: + (offset, reverse, current_position) = (0, False, None) + else: + (offset, reverse, current_position) = self.cursor + + # Cursor pagination always enforces an ordering. + if reverse: + queryset = queryset.order_by(*_reverse_ordering(self.ordering)) + else: + queryset = queryset.order_by(*self.ordering) + + # If we have a cursor with a fixed position then filter by that. + if current_position is not None: + order = self.ordering[0] + is_reversed = order.startswith('-') + order_attr = order.lstrip('-') + + # Test for: (cursor reversed) XOR (queryset reversed) + if self.cursor.reverse != is_reversed: + kwargs = {order_attr + '__lt': current_position} + else: + kwargs = {order_attr + '__gt': current_position} + + queryset = queryset.filter(**kwargs) + + # If we have an offset cursor then offset the entire page by that amount. + # We also always fetch an extra item in order to determine if there is a + # page following on from this one. + results = list(queryset[offset:offset + self.page_size + 1]) + self.page = list(results[:self.page_size]) + + # Determine the position of the final item following the page. + if len(results) > len(self.page): + has_following_position = True + following_position = self._get_position_from_instance(results[-1], self.ordering) + else: + has_following_position = False + following_position = None + + if reverse: + # If we have a reverse queryset, then the query ordering was in reverse + # so we need to reverse the items again before returning them to the user. + self.page = list(reversed(self.page)) + + # Determine next and previous positions for reverse cursors. + self.has_next = (current_position is not None) or (offset > 0) + self.has_previous = has_following_position + if self.has_next: + self.next_position = current_position + if self.has_previous: + self.previous_position = following_position + else: + # Determine next and previous positions for forward cursors. + self.has_next = has_following_position + self.has_previous = (current_position is not None) or (offset > 0) + if self.has_next: + self.next_position = following_position + if self.has_previous: + self.previous_position = current_position + + # Display page controls in the browsable API if there is more + # than one page. + if (self.has_previous or self.has_next) and self.template is not None: + self.display_page_controls = True + + return self.page + + def get_page_size(self, request): + if self.page_size_query_param: + with contextlib.suppress(KeyError, ValueError): + return _positive_int( + request.query_params[self.page_size_query_param], + strict=True, + cutoff=self.max_page_size + ) + return self.page_size + + def get_next_link(self): + if not self.has_next: + return None + + if self.page and self.cursor and self.cursor.reverse and self.cursor.offset != 0: + # If we're reversing direction and we have an offset cursor + # then we cannot use the first position we find as a marker. + compare = self._get_position_from_instance(self.page[-1], self.ordering) + else: + compare = self.next_position + offset = 0 + + has_item_with_unique_position = False + for item in reversed(self.page): + position = self._get_position_from_instance(item, self.ordering) + if position != compare: + # The item in this position and the item following it + # have different positions. We can use this position as + # our marker. + has_item_with_unique_position = True + break + + # The item in this position has the same position as the item + # following it, we can't use it as a marker position, so increment + # the offset and keep seeking to the previous item. + compare = position + offset += 1 + + if self.page and not has_item_with_unique_position: + # There were no unique positions in the page. + if not self.has_previous: + # We are on the first page. + # Our cursor will have an offset equal to the page size, + # but no position to filter against yet. + offset = self.page_size + position = None + elif self.cursor.reverse: + # The change in direction will introduce a paging artifact, + # where we end up skipping forward a few extra items. + offset = 0 + position = self.previous_position + else: + # Use the position from the existing cursor and increment + # it's offset by the page size. + offset = self.cursor.offset + self.page_size + position = self.previous_position + + if not self.page: + position = self.next_position + + cursor = Cursor(offset=offset, reverse=False, position=position) + return self.encode_cursor(cursor) + + def get_previous_link(self): + if not self.has_previous: + return None + + if self.page and self.cursor and not self.cursor.reverse and self.cursor.offset != 0: + # If we're reversing direction and we have an offset cursor + # then we cannot use the first position we find as a marker. + compare = self._get_position_from_instance(self.page[0], self.ordering) + else: + compare = self.previous_position + offset = 0 + + has_item_with_unique_position = False + for item in self.page: + position = self._get_position_from_instance(item, self.ordering) + if position != compare: + # The item in this position and the item following it + # have different positions. We can use this position as + # our marker. + has_item_with_unique_position = True + break + + # The item in this position has the same position as the item + # following it, we can't use it as a marker position, so increment + # the offset and keep seeking to the previous item. + compare = position + offset += 1 + + if self.page and not has_item_with_unique_position: + # There were no unique positions in the page. + if not self.has_next: + # We are on the final page. + # Our cursor will have an offset equal to the page size, + # but no position to filter against yet. + offset = self.page_size + position = None + elif self.cursor.reverse: + # Use the position from the existing cursor and increment + # it's offset by the page size. + offset = self.cursor.offset + self.page_size + position = self.next_position + else: + # The change in direction will introduce a paging artifact, + # where we end up skipping back a few extra items. + offset = 0 + position = self.next_position + + if not self.page: + position = self.previous_position + + cursor = Cursor(offset=offset, reverse=True, position=position) + return self.encode_cursor(cursor) + + def get_ordering(self, request, queryset, view): + """ + Return a tuple of strings, that may be used in an `order_by` method. + """ + # The default case is to check for an `ordering` attribute + # on this pagination instance. + ordering = self.ordering + + ordering_filters = [ + filter_cls for filter_cls in getattr(view, 'filter_backends', []) + if hasattr(filter_cls, 'get_ordering') + ] + + if ordering_filters: + # If a filter exists on the view that implements `get_ordering` + # then we defer to that filter to determine the ordering. + filter_cls = ordering_filters[0] + filter_instance = filter_cls() + ordering_from_filter = filter_instance.get_ordering(request, queryset, view) + if ordering_from_filter: + ordering = ordering_from_filter + + assert ordering is not None, ( + 'Using cursor pagination, but no ordering attribute was declared ' + 'on the pagination class.' + ) + assert '__' not in ordering, ( + 'Cursor pagination does not support double underscore lookups ' + 'for orderings. Orderings should be an unchanging, unique or ' + 'nearly-unique field on the model, such as "-created" or "pk".' + ) + + assert isinstance(ordering, (str, list, tuple)), ( + 'Invalid ordering. Expected string or tuple, but got {type}'.format( + type=type(ordering).__name__ + ) + ) + + if isinstance(ordering, str): + return (ordering,) + return tuple(ordering) + + def decode_cursor(self, request): + """ + Given a request with a cursor, return a `Cursor` instance. + """ + # Determine if we have a cursor, and if so then decode it. + encoded = request.query_params.get(self.cursor_query_param) + if encoded is None: + return None + + try: + querystring = b64decode(encoded.encode('ascii')).decode('ascii') + tokens = parse.parse_qs(querystring, keep_blank_values=True) + + offset = tokens.get('o', ['0'])[0] + offset = _positive_int(offset, cutoff=self.offset_cutoff) + + reverse = tokens.get('r', ['0'])[0] + reverse = bool(int(reverse)) + + position = tokens.get('p', [None])[0] + except (TypeError, ValueError): + raise NotFound(self.invalid_cursor_message) + + return Cursor(offset=offset, reverse=reverse, position=position) + + def encode_cursor(self, cursor): + """ + Given a Cursor instance, return an url with encoded cursor. + """ + tokens = {} + if cursor.offset != 0: + tokens['o'] = str(cursor.offset) + if cursor.reverse: + tokens['r'] = '1' + if cursor.position is not None: + tokens['p'] = cursor.position + + querystring = parse.urlencode(tokens, doseq=True) + encoded = b64encode(querystring.encode('ascii')).decode('ascii') + return replace_query_param(self.base_url, self.cursor_query_param, encoded) + + def _get_position_from_instance(self, instance, ordering): + field_name = ordering[0].lstrip('-') + if isinstance(instance, dict): + attr = instance[field_name] + else: + attr = getattr(instance, field_name) + return str(attr) + + def get_paginated_response(self, data): + return Response({ + 'next': self.get_next_link(), + 'previous': self.get_previous_link(), + 'results': data, + }) + + def get_paginated_response_schema(self, schema): + return { + 'type': 'object', + 'required': ['results'], + 'properties': { + 'next': { + 'type': 'string', + 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{cursor_query_param}=cD00ODY%3D"'.format( + cursor_query_param=self.cursor_query_param) + }, + 'previous': { + 'type': 'string', + 'nullable': True, + 'format': 'uri', + 'example': 'http://api.example.org/accounts/?{cursor_query_param}=cj0xJnA9NDg3'.format( + cursor_query_param=self.cursor_query_param) + }, + 'results': schema, + }, + } + + def get_html_context(self): + return { + 'previous_url': self.get_previous_link(), + 'next_url': self.get_next_link() + } + + def to_html(self): + template = loader.get_template(self.template) + context = self.get_html_context() + return template.render(context) + + def get_schema_fields(self, view): + assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`' + fields = [ + coreapi.Field( + name=self.cursor_query_param, + required=False, + location='query', + schema=coreschema.String( + title='Cursor', + description=force_str(self.cursor_query_description) + ) + ) + ] + if self.page_size_query_param is not None: + fields.append( + coreapi.Field( + name=self.page_size_query_param, + required=False, + location='query', + schema=coreschema.Integer( + title='Page size', + description=force_str(self.page_size_query_description) + ) + ) + ) + return fields + + def get_schema_operation_parameters(self, view): + parameters = [ + { + 'name': self.cursor_query_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.cursor_query_description), + 'schema': { + 'type': 'string', + }, + } + ] + if self.page_size_query_param is not None: + parameters.append( + { + 'name': self.page_size_query_param, + 'required': False, + 'in': 'query', + 'description': force_str(self.page_size_query_description), + 'schema': { + 'type': 'integer', + }, + } + ) + return parameters diff --git a/env/lib/python3.12/site-packages/rest_framework/parsers.py b/env/lib/python3.12/site-packages/rest_framework/parsers.py new file mode 100644 index 00000000..0e8e4bcb --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/parsers.py @@ -0,0 +1,206 @@ +""" +Parsers are used to parse the content of incoming HTTP requests. + +They give us a generic way of being able to handle various media types +on the request, such as form content or json encoded data. +""" + +import codecs +import contextlib + +from django.conf import settings +from django.core.files.uploadhandler import StopFutureHandlers +from django.http import QueryDict +from django.http.multipartparser import ChunkIter +from django.http.multipartparser import \ + MultiPartParser as DjangoMultiPartParser +from django.http.multipartparser import MultiPartParserError +from django.utils.http import parse_header_parameters + +from rest_framework import renderers +from rest_framework.exceptions import ParseError +from rest_framework.settings import api_settings +from rest_framework.utils import json + + +class DataAndFiles: + def __init__(self, data, files): + self.data = data + self.files = files + + +class BaseParser: + """ + All parsers should extend `BaseParser`, specifying a `media_type` + attribute, and overriding the `.parse()` method. + """ + media_type = None + + def parse(self, stream, media_type=None, parser_context=None): + """ + Given a stream to read from, return the parsed representation. + Should return parsed data, or a `DataAndFiles` object consisting of the + parsed data and files. + """ + raise NotImplementedError(".parse() must be overridden.") + + +class JSONParser(BaseParser): + """ + Parses JSON-serialized data. + """ + media_type = 'application/json' + renderer_class = renderers.JSONRenderer + strict = api_settings.STRICT_JSON + + def parse(self, stream, media_type=None, parser_context=None): + """ + Parses the incoming bytestream as JSON and returns the resulting data. + """ + parser_context = parser_context or {} + encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) + + try: + decoded_stream = codecs.getreader(encoding)(stream) + parse_constant = json.strict_constant if self.strict else None + return json.load(decoded_stream, parse_constant=parse_constant) + except ValueError as exc: + raise ParseError('JSON parse error - %s' % str(exc)) + + +class FormParser(BaseParser): + """ + Parser for form data. + """ + media_type = 'application/x-www-form-urlencoded' + + def parse(self, stream, media_type=None, parser_context=None): + """ + Parses the incoming bytestream as a URL encoded form, + and returns the resulting QueryDict. + """ + parser_context = parser_context or {} + encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) + return QueryDict(stream.read(), encoding=encoding) + + +class MultiPartParser(BaseParser): + """ + Parser for multipart form data, which may include file data. + """ + media_type = 'multipart/form-data' + + def parse(self, stream, media_type=None, parser_context=None): + """ + Parses the incoming bytestream as a multipart encoded form, + and returns a DataAndFiles object. + + `.data` will be a `QueryDict` containing all the form parameters. + `.files` will be a `QueryDict` containing all the form files. + """ + parser_context = parser_context or {} + request = parser_context['request'] + encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) + meta = request.META.copy() + meta['CONTENT_TYPE'] = media_type + upload_handlers = request.upload_handlers + + try: + parser = DjangoMultiPartParser(meta, stream, upload_handlers, encoding) + data, files = parser.parse() + return DataAndFiles(data, files) + except MultiPartParserError as exc: + raise ParseError('Multipart form parse error - %s' % str(exc)) + + +class FileUploadParser(BaseParser): + """ + Parser for file upload data. + """ + media_type = '*/*' + errors = { + 'unhandled': 'FileUpload parse error - none of upload handlers can handle the stream', + 'no_filename': 'Missing filename. Request should include a Content-Disposition header with a filename parameter.', + } + + def parse(self, stream, media_type=None, parser_context=None): + """ + Treats the incoming bytestream as a raw file upload and returns + a `DataAndFiles` object. + + `.data` will be None (we expect request body to be a file content). + `.files` will be a `QueryDict` containing one 'file' element. + """ + parser_context = parser_context or {} + request = parser_context['request'] + encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) + meta = request.META + upload_handlers = request.upload_handlers + filename = self.get_filename(stream, media_type, parser_context) + + if not filename: + raise ParseError(self.errors['no_filename']) + + # Note that this code is extracted from Django's handling of + # file uploads in MultiPartParser. + content_type = meta.get('HTTP_CONTENT_TYPE', + meta.get('CONTENT_TYPE', '')) + try: + content_length = int(meta.get('HTTP_CONTENT_LENGTH', + meta.get('CONTENT_LENGTH', 0))) + except (ValueError, TypeError): + content_length = None + + # See if the handler will want to take care of the parsing. + for handler in upload_handlers: + result = handler.handle_raw_input(stream, + meta, + content_length, + None, + encoding) + if result is not None: + return DataAndFiles({}, {'file': result[1]}) + + # This is the standard case. + possible_sizes = [x.chunk_size for x in upload_handlers if x.chunk_size] + chunk_size = min([2 ** 31 - 4] + possible_sizes) + chunks = ChunkIter(stream, chunk_size) + counters = [0] * len(upload_handlers) + + for index, handler in enumerate(upload_handlers): + try: + handler.new_file(None, filename, content_type, + content_length, encoding) + except StopFutureHandlers: + upload_handlers = upload_handlers[:index + 1] + break + + for chunk in chunks: + for index, handler in enumerate(upload_handlers): + chunk_length = len(chunk) + chunk = handler.receive_data_chunk(chunk, counters[index]) + counters[index] += chunk_length + if chunk is None: + break + + for index, handler in enumerate(upload_handlers): + file_obj = handler.file_complete(counters[index]) + if file_obj is not None: + return DataAndFiles({}, {'file': file_obj}) + + raise ParseError(self.errors['unhandled']) + + def get_filename(self, stream, media_type, parser_context): + """ + Detects the uploaded file name. First searches a 'filename' url kwarg. + Then tries to parse Content-Disposition header. + """ + with contextlib.suppress(KeyError): + return parser_context['kwargs']['filename'] + + with contextlib.suppress(AttributeError, KeyError, ValueError): + meta = parser_context['request'].META + disposition, params = parse_header_parameters(meta['HTTP_CONTENT_DISPOSITION']) + if 'filename*' in params: + return params['filename*'] + return params['filename'] diff --git a/env/lib/python3.12/site-packages/rest_framework/permissions.py b/env/lib/python3.12/site-packages/rest_framework/permissions.py new file mode 100644 index 00000000..7c15eca5 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/permissions.py @@ -0,0 +1,314 @@ +""" +Provides a set of pluggable permission policies. +""" +from django.http import Http404 + +from rest_framework import exceptions + +SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS') + + +class OperationHolderMixin: + def __and__(self, other): + return OperandHolder(AND, self, other) + + def __or__(self, other): + return OperandHolder(OR, self, other) + + def __rand__(self, other): + return OperandHolder(AND, other, self) + + def __ror__(self, other): + return OperandHolder(OR, other, self) + + def __invert__(self): + return SingleOperandHolder(NOT, self) + + +class SingleOperandHolder(OperationHolderMixin): + def __init__(self, operator_class, op1_class): + self.operator_class = operator_class + self.op1_class = op1_class + + def __call__(self, *args, **kwargs): + op1 = self.op1_class(*args, **kwargs) + return self.operator_class(op1) + + +class OperandHolder(OperationHolderMixin): + def __init__(self, operator_class, op1_class, op2_class): + self.operator_class = operator_class + self.op1_class = op1_class + self.op2_class = op2_class + + def __call__(self, *args, **kwargs): + op1 = self.op1_class(*args, **kwargs) + op2 = self.op2_class(*args, **kwargs) + return self.operator_class(op1, op2) + + def __eq__(self, other): + return ( + isinstance(other, OperandHolder) and + self.operator_class == other.operator_class and + self.op1_class == other.op1_class and + self.op2_class == other.op2_class + ) + + def __hash__(self): + return hash((self.operator_class, self.op1_class, self.op2_class)) + + +class AND: + def __init__(self, op1, op2): + self.op1 = op1 + self.op2 = op2 + + def has_permission(self, request, view): + return ( + self.op1.has_permission(request, view) and + self.op2.has_permission(request, view) + ) + + def has_object_permission(self, request, view, obj): + return ( + self.op1.has_object_permission(request, view, obj) and + self.op2.has_object_permission(request, view, obj) + ) + + +class OR: + def __init__(self, op1, op2): + self.op1 = op1 + self.op2 = op2 + + def has_permission(self, request, view): + return ( + self.op1.has_permission(request, view) or + self.op2.has_permission(request, view) + ) + + def has_object_permission(self, request, view, obj): + return ( + self.op1.has_permission(request, view) + and self.op1.has_object_permission(request, view, obj) + ) or ( + self.op2.has_permission(request, view) + and self.op2.has_object_permission(request, view, obj) + ) + + +class NOT: + def __init__(self, op1): + self.op1 = op1 + + def has_permission(self, request, view): + return not self.op1.has_permission(request, view) + + def has_object_permission(self, request, view, obj): + return not self.op1.has_object_permission(request, view, obj) + + +class BasePermissionMetaclass(OperationHolderMixin, type): + pass + + +class BasePermission(metaclass=BasePermissionMetaclass): + """ + A base class from which all permission classes should inherit. + """ + + def has_permission(self, request, view): + """ + Return `True` if permission is granted, `False` otherwise. + """ + return True + + def has_object_permission(self, request, view, obj): + """ + Return `True` if permission is granted, `False` otherwise. + """ + return True + + +class AllowAny(BasePermission): + """ + Allow any access. + This isn't strictly required, since you could use an empty + permission_classes list, but it's useful because it makes the intention + more explicit. + """ + + def has_permission(self, request, view): + return True + + +class IsAuthenticated(BasePermission): + """ + Allows access only to authenticated users. + """ + + def has_permission(self, request, view): + return bool(request.user and request.user.is_authenticated) + + +class IsAdminUser(BasePermission): + """ + Allows access only to admin users. + """ + + def has_permission(self, request, view): + return bool(request.user and request.user.is_staff) + + +class IsAuthenticatedOrReadOnly(BasePermission): + """ + The request is authenticated as a user, or is a read-only request. + """ + + def has_permission(self, request, view): + return bool( + request.method in SAFE_METHODS or + request.user and + request.user.is_authenticated + ) + + +class DjangoModelPermissions(BasePermission): + """ + The request is authenticated using `django.contrib.auth` permissions. + See: https://docs.djangoproject.com/en/dev/topics/auth/#permissions + + It ensures that the user is authenticated, and has the appropriate + `add`/`change`/`delete` permissions on the model. + + This permission can only be applied against view classes that + provide a `.queryset` attribute. + """ + + # Map methods into required permission codes. + # Override this if you need to also provide 'view' permissions, + # or if you want to provide custom permission codes. + perms_map = { + 'GET': [], + 'OPTIONS': [], + 'HEAD': [], + 'POST': ['%(app_label)s.add_%(model_name)s'], + 'PUT': ['%(app_label)s.change_%(model_name)s'], + 'PATCH': ['%(app_label)s.change_%(model_name)s'], + 'DELETE': ['%(app_label)s.delete_%(model_name)s'], + } + + authenticated_users_only = True + + def get_required_permissions(self, method, model_cls): + """ + Given a model and an HTTP method, return the list of permission + codes that the user is required to have. + """ + kwargs = { + 'app_label': model_cls._meta.app_label, + 'model_name': model_cls._meta.model_name + } + + if method not in self.perms_map: + raise exceptions.MethodNotAllowed(method) + + return [perm % kwargs for perm in self.perms_map[method]] + + def _queryset(self, view): + assert hasattr(view, 'get_queryset') \ + or getattr(view, 'queryset', None) is not None, ( + 'Cannot apply {} on a view that does not set ' + '`.queryset` or have a `.get_queryset()` method.' + ).format(self.__class__.__name__) + + if hasattr(view, 'get_queryset'): + queryset = view.get_queryset() + assert queryset is not None, ( + '{}.get_queryset() returned None'.format(view.__class__.__name__) + ) + return queryset + return view.queryset + + def has_permission(self, request, view): + if not request.user or ( + not request.user.is_authenticated and self.authenticated_users_only): + return False + + # Workaround to ensure DjangoModelPermissions are not applied + # to the root view when using DefaultRouter. + if getattr(view, '_ignore_model_permissions', False): + return True + + queryset = self._queryset(view) + perms = self.get_required_permissions(request.method, queryset.model) + + return request.user.has_perms(perms) + + +class DjangoModelPermissionsOrAnonReadOnly(DjangoModelPermissions): + """ + Similar to DjangoModelPermissions, except that anonymous users are + allowed read-only access. + """ + authenticated_users_only = False + + +class DjangoObjectPermissions(DjangoModelPermissions): + """ + The request is authenticated using Django's object-level permissions. + It requires an object-permissions-enabled backend, such as Django Guardian. + + It ensures that the user is authenticated, and has the appropriate + `add`/`change`/`delete` permissions on the object using .has_perms. + + This permission can only be applied against view classes that + provide a `.queryset` attribute. + """ + perms_map = { + 'GET': [], + 'OPTIONS': [], + 'HEAD': [], + 'POST': ['%(app_label)s.add_%(model_name)s'], + 'PUT': ['%(app_label)s.change_%(model_name)s'], + 'PATCH': ['%(app_label)s.change_%(model_name)s'], + 'DELETE': ['%(app_label)s.delete_%(model_name)s'], + } + + def get_required_object_permissions(self, method, model_cls): + kwargs = { + 'app_label': model_cls._meta.app_label, + 'model_name': model_cls._meta.model_name + } + + if method not in self.perms_map: + raise exceptions.MethodNotAllowed(method) + + return [perm % kwargs for perm in self.perms_map[method]] + + def has_object_permission(self, request, view, obj): + # authentication checks have already executed via has_permission + queryset = self._queryset(view) + model_cls = queryset.model + user = request.user + + perms = self.get_required_object_permissions(request.method, model_cls) + + if not user.has_perms(perms, obj): + # If the user does not have permissions we need to determine if + # they have read permissions to see 403, or not, and simply see + # a 404 response. + + if request.method in SAFE_METHODS: + # Read permissions already checked and failed, no need + # to make another lookup. + raise Http404 + + read_perms = self.get_required_object_permissions('GET', model_cls) + if not user.has_perms(read_perms, obj): + raise Http404 + + # Has read permissions. + return False + + return True diff --git a/env/lib/python3.12/site-packages/rest_framework/relations.py b/env/lib/python3.12/site-packages/rest_framework/relations.py new file mode 100644 index 00000000..4409bce7 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/relations.py @@ -0,0 +1,585 @@ +import contextlib +import sys +from operator import attrgetter +from urllib import parse + +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db.models import Manager +from django.db.models.query import QuerySet +from django.urls import NoReverseMatch, Resolver404, get_script_prefix, resolve +from django.utils.encoding import smart_str, uri_to_iri +from django.utils.translation import gettext_lazy as _ + +from rest_framework.fields import ( + Field, SkipField, empty, get_attribute, is_simple_callable, iter_options +) +from rest_framework.reverse import reverse +from rest_framework.settings import api_settings +from rest_framework.utils import html + + +def method_overridden(method_name, klass, instance): + """ + Determine if a method has been overridden. + """ + method = getattr(klass, method_name) + default_method = getattr(method, '__func__', method) # Python 3 compat + return default_method is not getattr(instance, method_name).__func__ + + +class ObjectValueError(ValueError): + """ + Raised when `queryset.get()` failed due to an underlying `ValueError`. + Wrapping prevents calling code conflating this with unrelated errors. + """ + + +class ObjectTypeError(TypeError): + """ + Raised when `queryset.get()` failed due to an underlying `TypeError`. + Wrapping prevents calling code conflating this with unrelated errors. + """ + + +class Hyperlink(str): + """ + A string like object that additionally has an associated name. + We use this for hyperlinked URLs that may render as a named link + in some contexts, or render as a plain URL in others. + """ + def __new__(cls, url, obj): + ret = super().__new__(cls, url) + ret.obj = obj + return ret + + def __getnewargs__(self): + return (str(self), self.name) + + @property + def name(self): + # This ensures that we only called `__str__` lazily, + # as in some cases calling __str__ on a model instances *might* + # involve a database lookup. + return str(self.obj) + + is_hyperlink = True + + +class PKOnlyObject: + """ + This is a mock object, used for when we only need the pk of the object + instance, but still want to return an object with a .pk attribute, + in order to keep the same interface as a regular model instance. + """ + + def __init__(self, pk): + self.pk = pk + + def __str__(self): + return "%s" % self.pk + + +# We assume that 'validators' are intended for the child serializer, +# rather than the parent serializer. +MANY_RELATION_KWARGS = ( + 'read_only', 'write_only', 'required', 'default', 'initial', 'source', + 'label', 'help_text', 'style', 'error_messages', 'allow_empty', + 'html_cutoff', 'html_cutoff_text' +) + + +class RelatedField(Field): + queryset = None + html_cutoff = None + html_cutoff_text = None + + def __init__(self, **kwargs): + self.queryset = kwargs.pop('queryset', self.queryset) + + cutoff_from_settings = api_settings.HTML_SELECT_CUTOFF + if cutoff_from_settings is not None: + cutoff_from_settings = int(cutoff_from_settings) + self.html_cutoff = kwargs.pop('html_cutoff', cutoff_from_settings) + + self.html_cutoff_text = kwargs.pop( + 'html_cutoff_text', + self.html_cutoff_text or _(api_settings.HTML_SELECT_CUTOFF_TEXT) + ) + if not method_overridden('get_queryset', RelatedField, self): + assert self.queryset is not None or kwargs.get('read_only'), ( + 'Relational field must provide a `queryset` argument, ' + 'override `get_queryset`, or set read_only=`True`.' + ) + assert not (self.queryset is not None and kwargs.get('read_only')), ( + 'Relational fields should not provide a `queryset` argument, ' + 'when setting read_only=`True`.' + ) + kwargs.pop('many', None) + kwargs.pop('allow_empty', None) + super().__init__(**kwargs) + + def __new__(cls, *args, **kwargs): + # We override this method in order to automagically create + # `ManyRelatedField` classes instead when `many=True` is set. + if kwargs.pop('many', False): + return cls.many_init(*args, **kwargs) + return super().__new__(cls, *args, **kwargs) + + @classmethod + def many_init(cls, *args, **kwargs): + """ + This method handles creating a parent `ManyRelatedField` instance + when the `many=True` keyword argument is passed. + + Typically you won't need to override this method. + + Note that we're over-cautious in passing most arguments to both parent + and child classes in order to try to cover the general case. If you're + overriding this method you'll probably want something much simpler, eg: + + @classmethod + def many_init(cls, *args, **kwargs): + kwargs['child'] = cls() + return CustomManyRelatedField(*args, **kwargs) + """ + list_kwargs = {'child_relation': cls(*args, **kwargs)} + for key in kwargs: + if key in MANY_RELATION_KWARGS: + list_kwargs[key] = kwargs[key] + return ManyRelatedField(**list_kwargs) + + def run_validation(self, data=empty): + # We force empty strings to None values for relational fields. + if data == '': + data = None + return super().run_validation(data) + + def get_queryset(self): + queryset = self.queryset + if isinstance(queryset, (QuerySet, Manager)): + # Ensure queryset is re-evaluated whenever used. + # Note that actually a `Manager` class may also be used as the + # queryset argument. This occurs on ModelSerializer fields, + # as it allows us to generate a more expressive 'repr' output + # for the field. + # Eg: 'MyRelationship(queryset=ExampleModel.objects.all())' + queryset = queryset.all() + return queryset + + def use_pk_only_optimization(self): + return False + + def get_attribute(self, instance): + if self.use_pk_only_optimization() and self.source_attrs: + # Optimized case, return a mock object only containing the pk attribute. + with contextlib.suppress(AttributeError): + attribute_instance = get_attribute(instance, self.source_attrs[:-1]) + value = attribute_instance.serializable_value(self.source_attrs[-1]) + if is_simple_callable(value): + # Handle edge case where the relationship `source` argument + # points to a `get_relationship()` method on the model. + value = value() + + # Handle edge case where relationship `source` argument points + # to an instance instead of a pk (e.g., a `@property`). + value = getattr(value, 'pk', value) + + return PKOnlyObject(pk=value) + # Standard case, return the object instance. + return super().get_attribute(instance) + + def get_choices(self, cutoff=None): + queryset = self.get_queryset() + if queryset is None: + # Ensure that field.choices returns something sensible + # even when accessed with a read-only field. + return {} + + if cutoff is not None: + queryset = queryset[:cutoff] + + return { + self.to_representation(item): self.display_value(item) for item in queryset + } + + @property + def choices(self): + return self.get_choices() + + @property + def grouped_choices(self): + return self.choices + + def iter_options(self): + return iter_options( + self.get_choices(cutoff=self.html_cutoff), + cutoff=self.html_cutoff, + cutoff_text=self.html_cutoff_text + ) + + def display_value(self, instance): + return str(instance) + + +class StringRelatedField(RelatedField): + """ + A read only field that represents its targets using their + plain string representation. + """ + + def __init__(self, **kwargs): + kwargs['read_only'] = True + super().__init__(**kwargs) + + def to_representation(self, value): + return str(value) + + +class PrimaryKeyRelatedField(RelatedField): + default_error_messages = { + 'required': _('This field is required.'), + 'does_not_exist': _('Invalid pk "{pk_value}" - object does not exist.'), + 'incorrect_type': _('Incorrect type. Expected pk value, received {data_type}.'), + } + + def __init__(self, **kwargs): + self.pk_field = kwargs.pop('pk_field', None) + super().__init__(**kwargs) + + def use_pk_only_optimization(self): + return True + + def to_internal_value(self, data): + if self.pk_field is not None: + data = self.pk_field.to_internal_value(data) + queryset = self.get_queryset() + try: + if isinstance(data, bool): + raise TypeError + return queryset.get(pk=data) + except ObjectDoesNotExist: + self.fail('does_not_exist', pk_value=data) + except (TypeError, ValueError): + self.fail('incorrect_type', data_type=type(data).__name__) + + def to_representation(self, value): + if self.pk_field is not None: + return self.pk_field.to_representation(value.pk) + return value.pk + + +class HyperlinkedRelatedField(RelatedField): + lookup_field = 'pk' + view_name = None + + default_error_messages = { + 'required': _('This field is required.'), + 'no_match': _('Invalid hyperlink - No URL match.'), + 'incorrect_match': _('Invalid hyperlink - Incorrect URL match.'), + 'does_not_exist': _('Invalid hyperlink - Object does not exist.'), + 'incorrect_type': _('Incorrect type. Expected URL string, received {data_type}.'), + } + + def __init__(self, view_name=None, **kwargs): + if view_name is not None: + self.view_name = view_name + assert self.view_name is not None, 'The `view_name` argument is required.' + self.lookup_field = kwargs.pop('lookup_field', self.lookup_field) + self.lookup_url_kwarg = kwargs.pop('lookup_url_kwarg', self.lookup_field) + self.format = kwargs.pop('format', None) + + # We include this simply for dependency injection in tests. + # We can't add it as a class attributes or it would expect an + # implicit `self` argument to be passed. + self.reverse = reverse + + super().__init__(**kwargs) + + def use_pk_only_optimization(self): + return self.lookup_field == 'pk' + + def get_object(self, view_name, view_args, view_kwargs): + """ + Return the object corresponding to a matched URL. + + Takes the matched URL conf arguments, and should return an + object instance, or raise an `ObjectDoesNotExist` exception. + """ + lookup_value = view_kwargs[self.lookup_url_kwarg] + lookup_kwargs = {self.lookup_field: lookup_value} + queryset = self.get_queryset() + + try: + return queryset.get(**lookup_kwargs) + except ValueError: + exc = ObjectValueError(str(sys.exc_info()[1])) + raise exc.with_traceback(sys.exc_info()[2]) + except TypeError: + exc = ObjectTypeError(str(sys.exc_info()[1])) + raise exc.with_traceback(sys.exc_info()[2]) + + def get_url(self, obj, view_name, request, format): + """ + Given an object, return the URL that hyperlinks to the object. + + May raise a `NoReverseMatch` if the `view_name` and `lookup_field` + attributes are not configured to correctly match the URL conf. + """ + # Unsaved objects will not yet have a valid URL. + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + def to_internal_value(self, data): + request = self.context.get('request') + try: + http_prefix = data.startswith(('http:', 'https:')) + except AttributeError: + self.fail('incorrect_type', data_type=type(data).__name__) + + if http_prefix: + # If needed convert absolute URLs to relative path + data = parse.urlparse(data).path + prefix = get_script_prefix() + if data.startswith(prefix): + data = '/' + data[len(prefix):] + + data = uri_to_iri(parse.unquote(data)) + + try: + match = resolve(data) + except Resolver404: + self.fail('no_match') + + try: + expected_viewname = request.versioning_scheme.get_versioned_viewname( + self.view_name, request + ) + except AttributeError: + expected_viewname = self.view_name + + if match.view_name != expected_viewname: + self.fail('incorrect_match') + + try: + return self.get_object(match.view_name, match.args, match.kwargs) + except (ObjectDoesNotExist, ObjectValueError, ObjectTypeError): + self.fail('does_not_exist') + + def to_representation(self, value): + assert 'request' in self.context, ( + "`%s` requires the request in the serializer" + " context. Add `context={'request': request}` when instantiating " + "the serializer." % self.__class__.__name__ + ) + + request = self.context['request'] + format = self.context.get('format') + + # By default use whatever format is given for the current context + # unless the target is a different type to the source. + # + # Eg. Consider a HyperlinkedIdentityField pointing from a json + # representation to an html property of that representation... + # + # '/snippets/1/' should link to '/snippets/1/highlight/' + # ...but... + # '/snippets/1/.json' should link to '/snippets/1/highlight/.html' + if format and self.format and self.format != format: + format = self.format + + # Return the hyperlink, or error if incorrectly configured. + try: + url = self.get_url(value, self.view_name, request, format) + except NoReverseMatch: + msg = ( + 'Could not resolve URL for hyperlinked relationship using ' + 'view name "%s". You may have failed to include the related ' + 'model in your API, or incorrectly configured the ' + '`lookup_field` attribute on this field.' + ) + if value in ('', None): + value_string = {'': 'the empty string', None: 'None'}[value] + msg += ( + " WARNING: The value of the field on the model instance " + "was %s, which may be why it didn't match any " + "entries in your URL conf." % value_string + ) + raise ImproperlyConfigured(msg % self.view_name) + + if url is None: + return None + + return Hyperlink(url, value) + + +class HyperlinkedIdentityField(HyperlinkedRelatedField): + """ + A read-only field that represents the identity URL for an object, itself. + + This is in contrast to `HyperlinkedRelatedField` which represents the + URL of relationships to other objects. + """ + + def __init__(self, view_name=None, **kwargs): + assert view_name is not None, 'The `view_name` argument is required.' + kwargs['read_only'] = True + kwargs['source'] = '*' + super().__init__(view_name, **kwargs) + + def use_pk_only_optimization(self): + # We have the complete object instance already. We don't need + # to run the 'only get the pk for this relationship' code. + return False + + +class SlugRelatedField(RelatedField): + """ + A read-write field that represents the target of the relationship + by a unique 'slug' attribute. + """ + default_error_messages = { + 'does_not_exist': _('Object with {slug_name}={value} does not exist.'), + 'invalid': _('Invalid value.'), + } + + def __init__(self, slug_field=None, **kwargs): + assert slug_field is not None, 'The `slug_field` argument is required.' + self.slug_field = slug_field + super().__init__(**kwargs) + + def to_internal_value(self, data): + queryset = self.get_queryset() + try: + return queryset.get(**{self.slug_field: data}) + except ObjectDoesNotExist: + self.fail('does_not_exist', slug_name=self.slug_field, value=smart_str(data)) + except (TypeError, ValueError): + self.fail('invalid') + + def to_representation(self, obj): + slug = self.slug_field + if "__" in slug: + # handling nested relationship if defined + slug = slug.replace('__', '.') + return attrgetter(slug)(obj) + + +class ManyRelatedField(Field): + """ + Relationships with `many=True` transparently get coerced into instead being + a ManyRelatedField with a child relationship. + + The `ManyRelatedField` class is responsible for handling iterating through + the values and passing each one to the child relationship. + + This class is treated as private API. + You shouldn't generally need to be using this class directly yourself, + and should instead simply set 'many=True' on the relationship. + """ + initial = [] + default_empty_html = [] + default_error_messages = { + 'not_a_list': _('Expected a list of items but got type "{input_type}".'), + 'empty': _('This list may not be empty.') + } + html_cutoff = None + html_cutoff_text = None + + def __init__(self, child_relation=None, *args, **kwargs): + self.child_relation = child_relation + self.allow_empty = kwargs.pop('allow_empty', True) + + cutoff_from_settings = api_settings.HTML_SELECT_CUTOFF + if cutoff_from_settings is not None: + cutoff_from_settings = int(cutoff_from_settings) + self.html_cutoff = kwargs.pop('html_cutoff', cutoff_from_settings) + + self.html_cutoff_text = kwargs.pop( + 'html_cutoff_text', + self.html_cutoff_text or _(api_settings.HTML_SELECT_CUTOFF_TEXT) + ) + assert child_relation is not None, '`child_relation` is a required argument.' + super().__init__(*args, **kwargs) + self.child_relation.bind(field_name='', parent=self) + + def get_value(self, dictionary): + # We override the default field access in order to support + # lists in HTML forms. + if html.is_html_input(dictionary): + # Don't return [] if the update is partial + if self.field_name not in dictionary: + if getattr(self.root, 'partial', False): + return empty + return dictionary.getlist(self.field_name) + + return dictionary.get(self.field_name, empty) + + def to_internal_value(self, data): + if isinstance(data, str) or not hasattr(data, '__iter__'): + self.fail('not_a_list', input_type=type(data).__name__) + if not self.allow_empty and len(data) == 0: + self.fail('empty') + + return [ + self.child_relation.to_internal_value(item) + for item in data + ] + + def get_attribute(self, instance): + # Can't have any relationships if not created + if hasattr(instance, 'pk') and instance.pk is None: + return [] + + try: + relationship = get_attribute(instance, self.source_attrs) + except (KeyError, AttributeError) as exc: + if self.default is not empty: + return self.get_default() + if self.allow_null: + return None + if not self.required: + raise SkipField() + msg = ( + 'Got {exc_type} when attempting to get a value for field ' + '`{field}` on serializer `{serializer}`.\nThe serializer ' + 'field might be named incorrectly and not match ' + 'any attribute or key on the `{instance}` instance.\n' + 'Original exception text was: {exc}.'.format( + exc_type=type(exc).__name__, + field=self.field_name, + serializer=self.parent.__class__.__name__, + instance=instance.__class__.__name__, + exc=exc + ) + ) + raise type(exc)(msg) + + return relationship.all() if hasattr(relationship, 'all') else relationship + + def to_representation(self, iterable): + return [ + self.child_relation.to_representation(value) + for value in iterable + ] + + def get_choices(self, cutoff=None): + return self.child_relation.get_choices(cutoff) + + @property + def choices(self): + return self.get_choices() + + @property + def grouped_choices(self): + return self.choices + + def iter_options(self): + return iter_options( + self.get_choices(cutoff=self.html_cutoff), + cutoff=self.html_cutoff, + cutoff_text=self.html_cutoff_text + ) diff --git a/env/lib/python3.12/site-packages/rest_framework/renderers.py b/env/lib/python3.12/site-packages/rest_framework/renderers.py new file mode 100644 index 00000000..ea73c665 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/renderers.py @@ -0,0 +1,1081 @@ +""" +Renderers are used to serialize a response into specific media types. + +They give us a generic way of being able to handle various media types +on the response, such as JSON encoded data or HTML output. + +REST framework also provides an HTML renderer that renders the browsable API. +""" + +import base64 +import contextlib +import datetime +from urllib import parse + +from django import forms +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.core.paginator import Page +from django.template import engines, loader +from django.urls import NoReverseMatch +from django.utils.html import mark_safe +from django.utils.http import parse_header_parameters +from django.utils.safestring import SafeString + +from rest_framework import VERSION, exceptions, serializers, status +from rest_framework.compat import ( + INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, coreapi, coreschema, + pygments_css, yaml +) +from rest_framework.exceptions import ParseError +from rest_framework.request import is_form_media_type, override_method +from rest_framework.settings import api_settings +from rest_framework.utils import encoders, json +from rest_framework.utils.breadcrumbs import get_breadcrumbs +from rest_framework.utils.field_mapping import ClassLookupDict + + +def zero_as_none(value): + return None if value == 0 else value + + +class BaseRenderer: + """ + All renderers should extend this class, setting the `media_type` + and `format` attributes, and override the `.render()` method. + """ + media_type = None + format = None + charset = 'utf-8' + render_style = 'text' + + def render(self, data, accepted_media_type=None, renderer_context=None): + raise NotImplementedError('Renderer class requires .render() to be implemented') + + +class JSONRenderer(BaseRenderer): + """ + Renderer which serializes to JSON. + """ + media_type = 'application/json' + format = 'json' + encoder_class = encoders.JSONEncoder + ensure_ascii = not api_settings.UNICODE_JSON + compact = api_settings.COMPACT_JSON + strict = api_settings.STRICT_JSON + + # We don't set a charset because JSON is a binary encoding, + # that can be encoded as utf-8, utf-16 or utf-32. + # See: https://www.ietf.org/rfc/rfc4627.txt + # Also: http://lucumr.pocoo.org/2013/7/19/application-mimetypes-and-encodings/ + charset = None + + def get_indent(self, accepted_media_type, renderer_context): + if accepted_media_type: + # If the media type looks like 'application/json; indent=4', + # then pretty print the result. + # Note that we coerce `indent=0` into `indent=None`. + base_media_type, params = parse_header_parameters(accepted_media_type) + with contextlib.suppress(KeyError, ValueError, TypeError): + return zero_as_none(max(min(int(params['indent']), 8), 0)) + # If 'indent' is provided in the context, then pretty print the result. + # E.g. If we're being called by the BrowsableAPIRenderer. + return renderer_context.get('indent', None) + + def render(self, data, accepted_media_type=None, renderer_context=None): + """ + Render `data` into JSON, returning a bytestring. + """ + if data is None: + return b'' + + renderer_context = renderer_context or {} + indent = self.get_indent(accepted_media_type, renderer_context) + + if indent is None: + separators = SHORT_SEPARATORS if self.compact else LONG_SEPARATORS + else: + separators = INDENT_SEPARATORS + + ret = json.dumps( + data, cls=self.encoder_class, + indent=indent, ensure_ascii=self.ensure_ascii, + allow_nan=not self.strict, separators=separators + ) + + # We always fully escape \u2028 and \u2029 to ensure we output JSON + # that is a strict javascript subset. + # See: https://gist.github.com/damncabbage/623b879af56f850a6ddc + ret = ret.replace('\u2028', '\\u2028').replace('\u2029', '\\u2029') + return ret.encode() + + +class TemplateHTMLRenderer(BaseRenderer): + """ + An HTML renderer for use with templates. + + The data supplied to the Response object should be a dictionary that will + be used as context for the template. + + The template name is determined by (in order of preference): + + 1. An explicit `.template_name` attribute set on the response. + 2. An explicit `.template_name` attribute set on this class. + 3. The return result of calling `view.get_template_names()`. + + For example: + data = {'users': User.objects.all()} + return Response(data, template_name='users.html') + + For pre-rendered HTML, see StaticHTMLRenderer. + """ + media_type = 'text/html' + format = 'html' + template_name = None + exception_template_names = [ + '%(status_code)s.html', + 'api_exception.html' + ] + charset = 'utf-8' + + def render(self, data, accepted_media_type=None, renderer_context=None): + """ + Renders data to HTML, using Django's standard template rendering. + + The template name is determined by (in order of preference): + + 1. An explicit .template_name set on the response. + 2. An explicit .template_name set on this class. + 3. The return result of calling view.get_template_names(). + """ + renderer_context = renderer_context or {} + view = renderer_context['view'] + request = renderer_context['request'] + response = renderer_context['response'] + + if response.exception: + template = self.get_exception_template(response) + else: + template_names = self.get_template_names(response, view) + template = self.resolve_template(template_names) + + if hasattr(self, 'resolve_context'): + # Fallback for older versions. + context = self.resolve_context(data, request, response) + else: + context = self.get_template_context(data, renderer_context) + return template.render(context, request=request) + + def resolve_template(self, template_names): + return loader.select_template(template_names) + + def get_template_context(self, data, renderer_context): + response = renderer_context['response'] + if response.exception: + data['status_code'] = response.status_code + return data + + def get_template_names(self, response, view): + if response.template_name: + return [response.template_name] + elif self.template_name: + return [self.template_name] + elif hasattr(view, 'get_template_names'): + return view.get_template_names() + elif hasattr(view, 'template_name'): + return [view.template_name] + raise ImproperlyConfigured( + 'Returned a template response with no `template_name` attribute set on either the view or response' + ) + + def get_exception_template(self, response): + template_names = [name % {'status_code': response.status_code} + for name in self.exception_template_names] + + try: + # Try to find an appropriate error template + return self.resolve_template(template_names) + except Exception: + # Fall back to using eg '404 Not Found' + body = '%d %s' % (response.status_code, response.status_text.title()) + template = engines['django'].from_string(body) + return template + + +# Note, subclass TemplateHTMLRenderer simply for the exception behavior +class StaticHTMLRenderer(TemplateHTMLRenderer): + """ + An HTML renderer class that simply returns pre-rendered HTML. + + The data supplied to the Response object should be a string representing + the pre-rendered HTML content. + + For example: + data = 'example' + return Response(data) + + For template rendered HTML, see TemplateHTMLRenderer. + """ + media_type = 'text/html' + format = 'html' + charset = 'utf-8' + + def render(self, data, accepted_media_type=None, renderer_context=None): + renderer_context = renderer_context or {} + response = renderer_context.get('response') + + if response and response.exception: + request = renderer_context['request'] + template = self.get_exception_template(response) + if hasattr(self, 'resolve_context'): + context = self.resolve_context(data, request, response) + else: + context = self.get_template_context(data, renderer_context) + return template.render(context, request=request) + + return data + + +class HTMLFormRenderer(BaseRenderer): + """ + Renderers serializer data into an HTML form. + + If the serializer was instantiated without an object then this will + return an HTML form not bound to any object, + otherwise it will return an HTML form with the appropriate initial data + populated from the object. + + Note that rendering of field and form errors is not currently supported. + """ + media_type = 'text/html' + format = 'form' + charset = 'utf-8' + template_pack = 'rest_framework/vertical/' + base_template = 'form.html' + + default_style = ClassLookupDict({ + serializers.Field: { + 'base_template': 'input.html', + 'input_type': 'text' + }, + serializers.EmailField: { + 'base_template': 'input.html', + 'input_type': 'email' + }, + serializers.URLField: { + 'base_template': 'input.html', + 'input_type': 'url' + }, + serializers.IntegerField: { + 'base_template': 'input.html', + 'input_type': 'number' + }, + serializers.FloatField: { + 'base_template': 'input.html', + 'input_type': 'number' + }, + serializers.DateTimeField: { + 'base_template': 'input.html', + 'input_type': 'datetime-local' + }, + serializers.DateField: { + 'base_template': 'input.html', + 'input_type': 'date' + }, + serializers.TimeField: { + 'base_template': 'input.html', + 'input_type': 'time' + }, + serializers.FileField: { + 'base_template': 'input.html', + 'input_type': 'file' + }, + serializers.BooleanField: { + 'base_template': 'checkbox.html' + }, + serializers.ChoiceField: { + 'base_template': 'select.html', # Also valid: 'radio.html' + }, + serializers.MultipleChoiceField: { + 'base_template': 'select_multiple.html', # Also valid: 'checkbox_multiple.html' + }, + serializers.RelatedField: { + 'base_template': 'select.html', # Also valid: 'radio.html' + }, + serializers.ManyRelatedField: { + 'base_template': 'select_multiple.html', # Also valid: 'checkbox_multiple.html' + }, + serializers.Serializer: { + 'base_template': 'fieldset.html' + }, + serializers.ListSerializer: { + 'base_template': 'list_fieldset.html' + }, + serializers.ListField: { + 'base_template': 'list_field.html' + }, + serializers.DictField: { + 'base_template': 'dict_field.html' + }, + serializers.FilePathField: { + 'base_template': 'select.html', + }, + serializers.JSONField: { + 'base_template': 'textarea.html', + }, + }) + + def render_field(self, field, parent_style): + if isinstance(field._field, serializers.HiddenField): + return '' + + style = self.default_style[field].copy() + style.update(field.style) + if 'template_pack' not in style: + style['template_pack'] = parent_style.get('template_pack', self.template_pack) + style['renderer'] = self + + # Get a clone of the field with text-only value representation. + field = field.as_form_field() + + if style.get('input_type') == 'datetime-local' and isinstance(field.value, str): + field.value = field.value.rstrip('Z') + + if 'template' in style: + template_name = style['template'] + else: + template_name = style['template_pack'].strip('/') + '/' + style['base_template'] + + template = loader.get_template(template_name) + context = {'field': field, 'style': style} + return template.render(context) + + def render(self, data, accepted_media_type=None, renderer_context=None): + """ + Render serializer data and return an HTML form, as a string. + """ + renderer_context = renderer_context or {} + form = data.serializer + + style = renderer_context.get('style', {}) + if 'template_pack' not in style: + style['template_pack'] = self.template_pack + style['renderer'] = self + + template_pack = style['template_pack'].strip('/') + template_name = template_pack + '/' + self.base_template + template = loader.get_template(template_name) + context = { + 'form': form, + 'style': style + } + return template.render(context) + + +class BrowsableAPIRenderer(BaseRenderer): + """ + HTML renderer used to self-document the API. + """ + media_type = 'text/html' + format = 'api' + template = 'rest_framework/api.html' + filter_template = 'rest_framework/filters/base.html' + code_style = 'emacs' + charset = 'utf-8' + form_renderer_class = HTMLFormRenderer + + def get_default_renderer(self, view): + """ + Return an instance of the first valid renderer. + (Don't use another documenting renderer.) + """ + renderers = [renderer for renderer in view.renderer_classes + if not issubclass(renderer, BrowsableAPIRenderer)] + non_template_renderers = [renderer for renderer in renderers + if not hasattr(renderer, 'get_template_names')] + + if not renderers: + return None + elif non_template_renderers: + return non_template_renderers[0]() + return renderers[0]() + + def get_content(self, renderer, data, + accepted_media_type, renderer_context): + """ + Get the content as if it had been rendered by the default + non-documenting renderer. + """ + if not renderer: + return '[No renderers were found]' + + renderer_context['indent'] = 4 + content = renderer.render(data, accepted_media_type, renderer_context) + + render_style = getattr(renderer, 'render_style', 'text') + assert render_style in ['text', 'binary'], 'Expected .render_style ' \ + '"text" or "binary", but got "%s"' % render_style + if render_style == 'binary': + return '[%d bytes of binary content]' % len(content) + + return content.decode('utf-8') if isinstance(content, bytes) else content + + def show_form_for_method(self, view, method, request, obj): + """ + Returns True if a form should be shown for this method. + """ + if method not in view.allowed_methods: + return # Not a valid method + + try: + view.check_permissions(request) + if obj is not None: + view.check_object_permissions(request, obj) + except exceptions.APIException: + return False # Doesn't have permissions + return True + + def _get_serializer(self, serializer_class, view_instance, request, *args, **kwargs): + kwargs['context'] = { + 'request': request, + 'format': self.format, + 'view': view_instance + } + return serializer_class(*args, **kwargs) + + def get_rendered_html_form(self, data, view, method, request): + """ + Return a string representing a rendered HTML form, possibly bound to + either the input or output data. + + In the absence of the View having an associated form then return None. + """ + # See issue #2089 for refactoring this. + serializer = getattr(data, 'serializer', None) + if serializer and not getattr(serializer, 'many', False): + instance = getattr(serializer, 'instance', None) + if isinstance(instance, Page): + instance = None + else: + instance = None + + # If this is valid serializer data, and the form is for the same + # HTTP method as was used in the request then use the existing + # serializer instance, rather than dynamically creating a new one. + if request.method == method and serializer is not None: + try: + kwargs = {'data': request.data} + except ParseError: + kwargs = {} + existing_serializer = serializer + else: + kwargs = {} + existing_serializer = None + + with override_method(view, request, method) as request: + if not self.show_form_for_method(view, method, request, instance): + return + + if method in ('DELETE', 'OPTIONS'): + return True # Don't actually need to return a form + + has_serializer = getattr(view, 'get_serializer', None) + has_serializer_class = getattr(view, 'serializer_class', None) + + if ( + (not has_serializer and not has_serializer_class) or + not any(is_form_media_type(parser.media_type) for parser in view.parser_classes) + ): + return + + if existing_serializer is not None: + with contextlib.suppress(TypeError): + return self.render_form_for_serializer(existing_serializer) + if has_serializer: + if method in ('PUT', 'PATCH'): + serializer = view.get_serializer(instance=instance, **kwargs) + else: + serializer = view.get_serializer(**kwargs) + else: + # at this point we must have a serializer_class + if method in ('PUT', 'PATCH'): + serializer = self._get_serializer(view.serializer_class, view, + request, instance=instance, **kwargs) + else: + serializer = self._get_serializer(view.serializer_class, view, + request, **kwargs) + + return self.render_form_for_serializer(serializer) + + def render_form_for_serializer(self, serializer): + if isinstance(serializer, serializers.ListSerializer): + return None + + if hasattr(serializer, 'initial_data'): + serializer.is_valid() + + form_renderer = self.form_renderer_class() + return form_renderer.render( + serializer.data, + self.accepted_media_type, + {'style': {'template_pack': 'rest_framework/horizontal'}} + ) + + def get_raw_data_form(self, data, view, method, request): + """ + Returns a form that allows for arbitrary content types to be tunneled + via standard HTML forms. + (Which are typically application/x-www-form-urlencoded) + """ + # See issue #2089 for refactoring this. + serializer = getattr(data, 'serializer', None) + if serializer and not getattr(serializer, 'many', False): + instance = getattr(serializer, 'instance', None) + if isinstance(instance, Page): + instance = None + else: + instance = None + + with override_method(view, request, method) as request: + # Check permissions + if not self.show_form_for_method(view, method, request, instance): + return + + # If possible, serialize the initial content for the generic form + default_parser = view.parser_classes[0] + renderer_class = getattr(default_parser, 'renderer_class', None) + if hasattr(view, 'get_serializer') and renderer_class: + # View has a serializer defined and parser class has a + # corresponding renderer that can be used to render the data. + + if method in ('PUT', 'PATCH'): + serializer = view.get_serializer(instance=instance) + else: + serializer = view.get_serializer() + + # Render the raw data content + renderer = renderer_class() + accepted = self.accepted_media_type + context = self.renderer_context.copy() + context['indent'] = 4 + + # strip HiddenField from output + is_list_serializer = isinstance(serializer, serializers.ListSerializer) + serializer = serializer.child if is_list_serializer else serializer + data = serializer.data.copy() + for name, field in serializer.fields.items(): + if isinstance(field, serializers.HiddenField): + data.pop(name, None) + data = [data] if is_list_serializer else data + content = renderer.render(data, accepted, context) + # Renders returns bytes, but CharField expects a str. + content = content.decode() + else: + content = None + + # Generate a generic form that includes a content type field, + # and a content field. + media_types = [parser.media_type for parser in view.parser_classes] + choices = [(media_type, media_type) for media_type in media_types] + initial = media_types[0] + + class GenericContentForm(forms.Form): + _content_type = forms.ChoiceField( + label='Media type', + choices=choices, + initial=initial, + widget=forms.Select(attrs={'data-override': 'content-type'}) + ) + _content = forms.CharField( + label='Content', + widget=forms.Textarea(attrs={'data-override': 'content'}), + initial=content, + required=False + ) + + return GenericContentForm() + + def get_name(self, view): + return view.get_view_name() + + def get_description(self, view, status_code): + if status_code in (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN): + return '' + return view.get_view_description(html=True) + + def get_breadcrumbs(self, request): + return get_breadcrumbs(request.path, request) + + def get_extra_actions(self, view, status_code): + if (status_code in (status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN)): + return None + elif not hasattr(view, 'get_extra_action_url_map'): + return None + + return view.get_extra_action_url_map() + + def get_filter_form(self, data, view, request): + if not hasattr(view, 'get_queryset') or not hasattr(view, 'filter_backends'): + return + + # Infer if this is a list view or not. + paginator = getattr(view, 'paginator', None) + if isinstance(data, list): + pass + elif paginator is not None and data is not None: + try: + paginator.get_results(data) + except (TypeError, KeyError): + return + elif not isinstance(data, list): + return + + queryset = view.get_queryset() + elements = [] + for backend in view.filter_backends: + if hasattr(backend, 'to_html'): + html = backend().to_html(request, queryset, view) + if html: + elements.append(html) + + if not elements: + return + + template = loader.get_template(self.filter_template) + context = {'elements': elements} + return template.render(context) + + def get_context(self, data, accepted_media_type, renderer_context): + """ + Returns the context used to render. + """ + view = renderer_context['view'] + request = renderer_context['request'] + response = renderer_context['response'] + + renderer = self.get_default_renderer(view) + + raw_data_post_form = self.get_raw_data_form(data, view, 'POST', request) + raw_data_put_form = self.get_raw_data_form(data, view, 'PUT', request) + raw_data_patch_form = self.get_raw_data_form(data, view, 'PATCH', request) + raw_data_put_or_patch_form = raw_data_put_form or raw_data_patch_form + + response_headers = dict(sorted(response.items())) + renderer_content_type = '' + if renderer: + renderer_content_type = '%s' % renderer.media_type + if renderer.charset: + renderer_content_type += ' ;%s' % renderer.charset + response_headers['Content-Type'] = renderer_content_type + + if getattr(view, 'paginator', None) and view.paginator.display_page_controls: + paginator = view.paginator + else: + paginator = None + + csrf_cookie_name = settings.CSRF_COOKIE_NAME + csrf_header_name = settings.CSRF_HEADER_NAME + if csrf_header_name.startswith('HTTP_'): + csrf_header_name = csrf_header_name[5:] + csrf_header_name = csrf_header_name.replace('_', '-') + + return { + 'content': self.get_content(renderer, data, accepted_media_type, renderer_context), + 'code_style': pygments_css(self.code_style), + 'view': view, + 'request': request, + 'response': response, + 'user': request.user, + 'description': self.get_description(view, response.status_code), + 'name': self.get_name(view), + 'version': VERSION, + 'paginator': paginator, + 'breadcrumblist': self.get_breadcrumbs(request), + 'allowed_methods': view.allowed_methods, + 'available_formats': [renderer_cls.format for renderer_cls in view.renderer_classes], + 'response_headers': response_headers, + + 'put_form': self.get_rendered_html_form(data, view, 'PUT', request), + 'post_form': self.get_rendered_html_form(data, view, 'POST', request), + 'delete_form': self.get_rendered_html_form(data, view, 'DELETE', request), + 'options_form': self.get_rendered_html_form(data, view, 'OPTIONS', request), + + 'extra_actions': self.get_extra_actions(view, response.status_code), + + 'filter_form': self.get_filter_form(data, view, request), + + 'raw_data_put_form': raw_data_put_form, + 'raw_data_post_form': raw_data_post_form, + 'raw_data_patch_form': raw_data_patch_form, + 'raw_data_put_or_patch_form': raw_data_put_or_patch_form, + + 'display_edit_forms': bool(response.status_code != 403), + + 'api_settings': api_settings, + 'csrf_cookie_name': csrf_cookie_name, + 'csrf_header_name': csrf_header_name + } + + def render(self, data, accepted_media_type=None, renderer_context=None): + """ + Render the HTML for the browsable API representation. + """ + self.accepted_media_type = accepted_media_type or '' + self.renderer_context = renderer_context or {} + + template = loader.get_template(self.template) + context = self.get_context(data, accepted_media_type, renderer_context) + ret = template.render(context, request=renderer_context['request']) + + # Munge DELETE Response code to allow us to return content + # (Do this *after* we've rendered the template so that we include + # the normal deletion response code in the output) + response = renderer_context['response'] + if response.status_code == status.HTTP_204_NO_CONTENT: + response.status_code = status.HTTP_200_OK + + return ret + + +class AdminRenderer(BrowsableAPIRenderer): + template = 'rest_framework/admin.html' + format = 'admin' + + def render(self, data, accepted_media_type=None, renderer_context=None): + self.accepted_media_type = accepted_media_type or '' + self.renderer_context = renderer_context or {} + + response = renderer_context['response'] + request = renderer_context['request'] + view = self.renderer_context['view'] + + if response.status_code == status.HTTP_400_BAD_REQUEST: + # Errors still need to display the list or detail information. + # The only way we can get at that is to simulate a GET request. + self.error_form = self.get_rendered_html_form(data, view, request.method, request) + self.error_title = {'POST': 'Create', 'PUT': 'Edit'}.get(request.method, 'Errors') + + with override_method(view, request, 'GET') as request: + response = view.get(request, *view.args, **view.kwargs) + data = response.data + + template = loader.get_template(self.template) + context = self.get_context(data, accepted_media_type, renderer_context) + ret = template.render(context, request=renderer_context['request']) + + # Creation and deletion should use redirects in the admin style. + if response.status_code == status.HTTP_201_CREATED and 'Location' in response: + response.status_code = status.HTTP_303_SEE_OTHER + response['Location'] = request.build_absolute_uri() + ret = '' + + if response.status_code == status.HTTP_204_NO_CONTENT: + response.status_code = status.HTTP_303_SEE_OTHER + try: + # Attempt to get the parent breadcrumb URL. + response['Location'] = self.get_breadcrumbs(request)[-2][1] + except KeyError: + # Otherwise reload current URL to get a 'Not Found' page. + response['Location'] = request.full_path + ret = '' + + return ret + + def get_context(self, data, accepted_media_type, renderer_context): + """ + Render the HTML for the browsable API representation. + """ + context = super().get_context( + data, accepted_media_type, renderer_context + ) + + paginator = getattr(context['view'], 'paginator', None) + if paginator is not None and data is not None: + try: + results = paginator.get_results(data) + except (TypeError, KeyError): + results = data + else: + results = data + + if results is None: + header = {} + style = 'detail' + elif isinstance(results, list): + header = results[0] if results else {} + style = 'list' + else: + header = results + style = 'detail' + + columns = [key for key in header if key != 'url'] + details = [key for key in header if key != 'url'] + + if isinstance(results, list) and 'view' in renderer_context: + for result in results: + url = self.get_result_url(result, context['view']) + if url is not None: + result.setdefault('url', url) + + context['style'] = style + context['columns'] = columns + context['details'] = details + context['results'] = results + context['error_form'] = getattr(self, 'error_form', None) + context['error_title'] = getattr(self, 'error_title', None) + return context + + def get_result_url(self, result, view): + """ + Attempt to reverse the result's detail view URL. + + This only works with views that are generic-like (has `.lookup_field`) + and viewset-like (has `.basename` / `.reverse_action()`). + """ + if not hasattr(view, 'reverse_action') or \ + not hasattr(view, 'lookup_field'): + return + + lookup_field = view.lookup_field + lookup_url_kwarg = getattr(view, 'lookup_url_kwarg', None) or lookup_field + + try: + kwargs = {lookup_url_kwarg: result[lookup_field]} + return view.reverse_action('detail', kwargs=kwargs) + except (KeyError, NoReverseMatch): + return + + +class DocumentationRenderer(BaseRenderer): + media_type = 'text/html' + format = 'html' + charset = 'utf-8' + template = 'rest_framework/docs/index.html' + error_template = 'rest_framework/docs/error.html' + code_style = 'emacs' + languages = ['shell', 'javascript', 'python'] + + def get_context(self, data, request): + return { + 'document': data, + 'langs': self.languages, + 'lang_htmls': ["rest_framework/docs/langs/%s.html" % language for language in self.languages], + 'lang_intro_htmls': ["rest_framework/docs/langs/%s-intro.html" % language for language in self.languages], + 'code_style': pygments_css(self.code_style), + 'request': request + } + + def render(self, data, accepted_media_type=None, renderer_context=None): + if isinstance(data, coreapi.Document): + template = loader.get_template(self.template) + context = self.get_context(data, renderer_context['request']) + return template.render(context, request=renderer_context['request']) + else: + template = loader.get_template(self.error_template) + context = { + "data": data, + "request": renderer_context['request'], + "response": renderer_context['response'], + "debug": settings.DEBUG, + } + return template.render(context, request=renderer_context['request']) + + +class SchemaJSRenderer(BaseRenderer): + media_type = 'application/javascript' + format = 'javascript' + charset = 'utf-8' + template = 'rest_framework/schema.js' + + def render(self, data, accepted_media_type=None, renderer_context=None): + codec = coreapi.codecs.CoreJSONCodec() + schema = base64.b64encode(codec.encode(data)).decode('ascii') + + template = loader.get_template(self.template) + context = {'schema': mark_safe(schema)} + request = renderer_context['request'] + return template.render(context, request=request) + + +class MultiPartRenderer(BaseRenderer): + media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg' + format = 'multipart' + charset = 'utf-8' + BOUNDARY = 'BoUnDaRyStRiNg' + + def render(self, data, accepted_media_type=None, renderer_context=None): + from django.test.client import encode_multipart + + if hasattr(data, 'items'): + for key, value in data.items(): + assert not isinstance(value, dict), ( + "Test data contained a dictionary value for key '%s', " + "but multipart uploads do not support nested data. " + "You may want to consider using format='json' in this " + "test case." % key + ) + return encode_multipart(self.BOUNDARY, data) + + +class CoreJSONRenderer(BaseRenderer): + media_type = 'application/coreapi+json' + charset = None + format = 'corejson' + + def __init__(self): + assert coreapi, 'Using CoreJSONRenderer, but `coreapi` is not installed.' + + def render(self, data, media_type=None, renderer_context=None): + indent = bool(renderer_context.get('indent', 0)) + codec = coreapi.codecs.CoreJSONCodec() + return codec.dump(data, indent=indent) + + +class _BaseOpenAPIRenderer: + def get_schema(self, instance): + CLASS_TO_TYPENAME = { + coreschema.Object: 'object', + coreschema.Array: 'array', + coreschema.Number: 'number', + coreschema.Integer: 'integer', + coreschema.String: 'string', + coreschema.Boolean: 'boolean', + } + + schema = {} + if instance.__class__ in CLASS_TO_TYPENAME: + schema['type'] = CLASS_TO_TYPENAME[instance.__class__] + schema['title'] = instance.title + schema['description'] = instance.description + if hasattr(instance, 'enum'): + schema['enum'] = instance.enum + return schema + + def get_parameters(self, link): + parameters = [] + for field in link.fields: + if field.location not in ['path', 'query']: + continue + parameter = { + 'name': field.name, + 'in': field.location, + } + if field.required: + parameter['required'] = True + if field.description: + parameter['description'] = field.description + if field.schema: + parameter['schema'] = self.get_schema(field.schema) + parameters.append(parameter) + return parameters + + def get_operation(self, link, name, tag): + operation_id = "%s_%s" % (tag, name) if tag else name + parameters = self.get_parameters(link) + + operation = { + 'operationId': operation_id, + } + if link.title: + operation['summary'] = link.title + if link.description: + operation['description'] = link.description + if parameters: + operation['parameters'] = parameters + if tag: + operation['tags'] = [tag] + return operation + + def get_paths(self, document): + paths = {} + + tag = None + for name, link in document.links.items(): + path = parse.urlparse(link.url).path + method = link.action.lower() + paths.setdefault(path, {}) + paths[path][method] = self.get_operation(link, name, tag=tag) + + for tag, section in document.data.items(): + for name, link in section.links.items(): + path = parse.urlparse(link.url).path + method = link.action.lower() + paths.setdefault(path, {}) + paths[path][method] = self.get_operation(link, name, tag=tag) + + return paths + + def get_structure(self, data): + return { + 'openapi': '3.0.0', + 'info': { + 'version': '', + 'title': data.title, + 'description': data.description + }, + 'servers': [{ + 'url': data.url + }], + 'paths': self.get_paths(data) + } + + +class CoreAPIOpenAPIRenderer(_BaseOpenAPIRenderer): + media_type = 'application/vnd.oai.openapi' + charset = None + format = 'openapi' + + def __init__(self): + assert coreapi, 'Using CoreAPIOpenAPIRenderer, but `coreapi` is not installed.' + assert yaml, 'Using CoreAPIOpenAPIRenderer, but `pyyaml` is not installed.' + + def render(self, data, media_type=None, renderer_context=None): + structure = self.get_structure(data) + return yaml.dump(structure, default_flow_style=False).encode() + + +class CoreAPIJSONOpenAPIRenderer(_BaseOpenAPIRenderer): + media_type = 'application/vnd.oai.openapi+json' + charset = None + format = 'openapi-json' + ensure_ascii = not api_settings.UNICODE_JSON + + def __init__(self): + assert coreapi, 'Using CoreAPIJSONOpenAPIRenderer, but `coreapi` is not installed.' + + def render(self, data, media_type=None, renderer_context=None): + structure = self.get_structure(data) + return json.dumps( + structure, indent=4, + ensure_ascii=self.ensure_ascii).encode('utf-8') + + +class OpenAPIRenderer(BaseRenderer): + media_type = 'application/vnd.oai.openapi' + charset = None + format = 'openapi' + + def __init__(self): + assert yaml, 'Using OpenAPIRenderer, but `pyyaml` is not installed.' + + def render(self, data, media_type=None, renderer_context=None): + # disable yaml advanced feature 'alias' for clean, portable, and readable output + class Dumper(yaml.Dumper): + def ignore_aliases(self, data): + return True + Dumper.add_representer(SafeString, Dumper.represent_str) + Dumper.add_representer(datetime.timedelta, encoders.CustomScalar.represent_timedelta) + return yaml.dump(data, default_flow_style=False, sort_keys=False, Dumper=Dumper).encode('utf-8') + + +class JSONOpenAPIRenderer(BaseRenderer): + media_type = 'application/vnd.oai.openapi+json' + charset = None + encoder_class = encoders.JSONEncoder + format = 'openapi-json' + ensure_ascii = not api_settings.UNICODE_JSON + + def render(self, data, media_type=None, renderer_context=None): + return json.dumps( + data, cls=self.encoder_class, indent=2, + ensure_ascii=self.ensure_ascii).encode('utf-8') diff --git a/env/lib/python3.12/site-packages/rest_framework/request.py b/env/lib/python3.12/site-packages/rest_framework/request.py new file mode 100644 index 00000000..f30578fa --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/request.py @@ -0,0 +1,460 @@ +""" +The Request class is used as a wrapper around the standard request object. + +The wrapped request then offers a richer API, in particular : + + - content automatically parsed according to `Content-Type` header, + and available as `request.data` + - full support of PUT method, including support for file uploads + - form overloading of HTTP method, content type and content +""" +import io +import sys +from contextlib import contextmanager + +from django.conf import settings +from django.http import HttpRequest, QueryDict +from django.http.request import RawPostDataException +from django.utils.datastructures import MultiValueDict +from django.utils.http import parse_header_parameters + +from rest_framework import exceptions +from rest_framework.settings import api_settings + + +def is_form_media_type(media_type): + """ + Return True if the media type is a valid form media type. + """ + base_media_type, params = parse_header_parameters(media_type) + return (base_media_type == 'application/x-www-form-urlencoded' or + base_media_type == 'multipart/form-data') + + +class override_method: + """ + A context manager that temporarily overrides the method on a request, + additionally setting the `view.request` attribute. + + Usage: + + with override_method(view, request, 'POST') as request: + ... # Do stuff with `view` and `request` + """ + + def __init__(self, view, request, method): + self.view = view + self.request = request + self.method = method + self.action = getattr(view, 'action', None) + + def __enter__(self): + self.view.request = clone_request(self.request, self.method) + # For viewsets we also set the `.action` attribute. + action_map = getattr(self.view, 'action_map', {}) + self.view.action = action_map.get(self.method.lower()) + return self.view.request + + def __exit__(self, *args, **kwarg): + self.view.request = self.request + self.view.action = self.action + + +class WrappedAttributeError(Exception): + pass + + +@contextmanager +def wrap_attributeerrors(): + """ + Used to re-raise AttributeErrors caught during authentication, preventing + these errors from otherwise being handled by the attribute access protocol. + """ + try: + yield + except AttributeError: + info = sys.exc_info() + exc = WrappedAttributeError(str(info[1])) + raise exc.with_traceback(info[2]) + + +class Empty: + """ + Placeholder for unset attributes. + Cannot use `None`, as that may be a valid value. + """ + pass + + +def _hasattr(obj, name): + return not getattr(obj, name) is Empty + + +def clone_request(request, method): + """ + Internal helper method to clone a request, replacing with a different + HTTP method. Used for checking permissions against other methods. + """ + ret = Request(request=request._request, + parsers=request.parsers, + authenticators=request.authenticators, + negotiator=request.negotiator, + parser_context=request.parser_context) + ret._data = request._data + ret._files = request._files + ret._full_data = request._full_data + ret._content_type = request._content_type + ret._stream = request._stream + ret.method = method + if hasattr(request, '_user'): + ret._user = request._user + if hasattr(request, '_auth'): + ret._auth = request._auth + if hasattr(request, '_authenticator'): + ret._authenticator = request._authenticator + if hasattr(request, 'accepted_renderer'): + ret.accepted_renderer = request.accepted_renderer + if hasattr(request, 'accepted_media_type'): + ret.accepted_media_type = request.accepted_media_type + if hasattr(request, 'version'): + ret.version = request.version + if hasattr(request, 'versioning_scheme'): + ret.versioning_scheme = request.versioning_scheme + return ret + + +class ForcedAuthentication: + """ + This authentication class is used if the test client or request factory + forcibly authenticated the request. + """ + + def __init__(self, force_user, force_token): + self.force_user = force_user + self.force_token = force_token + + def authenticate(self, request): + return (self.force_user, self.force_token) + + +class Request: + """ + Wrapper allowing to enhance a standard `HttpRequest` instance. + + Kwargs: + - request(HttpRequest). The original request instance. + - parsers(list/tuple). The parsers to use for parsing the + request content. + - authenticators(list/tuple). The authenticators used to try + authenticating the request's user. + """ + + def __init__(self, request, parsers=None, authenticators=None, + negotiator=None, parser_context=None): + assert isinstance(request, HttpRequest), ( + 'The `request` argument must be an instance of ' + '`django.http.HttpRequest`, not `{}.{}`.' + .format(request.__class__.__module__, request.__class__.__name__) + ) + + self._request = request + self.parsers = parsers or () + self.authenticators = authenticators or () + self.negotiator = negotiator or self._default_negotiator() + self.parser_context = parser_context + self._data = Empty + self._files = Empty + self._full_data = Empty + self._content_type = Empty + self._stream = Empty + + if self.parser_context is None: + self.parser_context = {} + self.parser_context['request'] = self + self.parser_context['encoding'] = request.encoding or settings.DEFAULT_CHARSET + + force_user = getattr(request, '_force_auth_user', None) + force_token = getattr(request, '_force_auth_token', None) + if force_user is not None or force_token is not None: + forced_auth = ForcedAuthentication(force_user, force_token) + self.authenticators = (forced_auth,) + + def __repr__(self): + return '<%s.%s: %s %r>' % ( + self.__class__.__module__, + self.__class__.__name__, + self.method, + self.get_full_path()) + + # Allow generic typing checking for requests. + def __class_getitem__(cls, *args, **kwargs): + return cls + + def _default_negotiator(self): + return api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS() + + @property + def content_type(self): + meta = self._request.META + return meta.get('CONTENT_TYPE', meta.get('HTTP_CONTENT_TYPE', '')) + + @property + def stream(self): + """ + Returns an object that may be used to stream the request content. + """ + if not _hasattr(self, '_stream'): + self._load_stream() + return self._stream + + @property + def query_params(self): + """ + More semantically correct name for request.GET. + """ + return self._request.GET + + @property + def data(self): + if not _hasattr(self, '_full_data'): + self._load_data_and_files() + return self._full_data + + @property + def user(self): + """ + Returns the user associated with the current request, as authenticated + by the authentication classes provided to the request. + """ + if not hasattr(self, '_user'): + with wrap_attributeerrors(): + self._authenticate() + return self._user + + @user.setter + def user(self, value): + """ + Sets the user on the current request. This is necessary to maintain + compatibility with django.contrib.auth where the user property is + set in the login and logout functions. + + Note that we also set the user on Django's underlying `HttpRequest` + instance, ensuring that it is available to any middleware in the stack. + """ + self._user = value + self._request.user = value + + @property + def auth(self): + """ + Returns any non-user authentication information associated with the + request, such as an authentication token. + """ + if not hasattr(self, '_auth'): + with wrap_attributeerrors(): + self._authenticate() + return self._auth + + @auth.setter + def auth(self, value): + """ + Sets any non-user authentication information associated with the + request, such as an authentication token. + """ + self._auth = value + self._request.auth = value + + @property + def successful_authenticator(self): + """ + Return the instance of the authentication instance class that was used + to authenticate the request, or `None`. + """ + if not hasattr(self, '_authenticator'): + with wrap_attributeerrors(): + self._authenticate() + return self._authenticator + + def _load_data_and_files(self): + """ + Parses the request content into `self.data`. + """ + if not _hasattr(self, '_data'): + self._data, self._files = self._parse() + if self._files: + self._full_data = self._data.copy() + self._full_data.update(self._files) + else: + self._full_data = self._data + + # if a form media type, copy data & files refs to the underlying + # http request so that closable objects are handled appropriately. + if is_form_media_type(self.content_type): + self._request._post = self.POST + self._request._files = self.FILES + + def _load_stream(self): + """ + Return the content body of the request, as a stream. + """ + meta = self._request.META + try: + content_length = int( + meta.get('CONTENT_LENGTH', meta.get('HTTP_CONTENT_LENGTH', 0)) + ) + except (ValueError, TypeError): + content_length = 0 + + if content_length == 0: + self._stream = None + elif not self._request._read_started: + self._stream = self._request + else: + self._stream = io.BytesIO(self.body) + + def _supports_form_parsing(self): + """ + Return True if this requests supports parsing form data. + """ + form_media = ( + 'application/x-www-form-urlencoded', + 'multipart/form-data' + ) + return any(parser.media_type in form_media for parser in self.parsers) + + def _parse(self): + """ + Parse the request content, returning a two-tuple of (data, files) + + May raise an `UnsupportedMediaType`, or `ParseError` exception. + """ + media_type = self.content_type + try: + stream = self.stream + except RawPostDataException: + if not hasattr(self._request, '_post'): + raise + # If request.POST has been accessed in middleware, and a method='POST' + # request was made with 'multipart/form-data', then the request stream + # will already have been exhausted. + if self._supports_form_parsing(): + return (self._request.POST, self._request.FILES) + stream = None + + if stream is None or media_type is None: + if media_type and is_form_media_type(media_type): + empty_data = QueryDict('', encoding=self._request._encoding) + else: + empty_data = {} + empty_files = MultiValueDict() + return (empty_data, empty_files) + + parser = self.negotiator.select_parser(self, self.parsers) + + if not parser: + raise exceptions.UnsupportedMediaType(media_type) + + try: + parsed = parser.parse(stream, media_type, self.parser_context) + except Exception: + # If we get an exception during parsing, fill in empty data and + # re-raise. Ensures we don't simply repeat the error when + # attempting to render the browsable renderer response, or when + # logging the request or similar. + self._data = QueryDict('', encoding=self._request._encoding) + self._files = MultiValueDict() + self._full_data = self._data + raise + + # Parser classes may return the raw data, or a + # DataAndFiles object. Unpack the result as required. + try: + return (parsed.data, parsed.files) + except AttributeError: + empty_files = MultiValueDict() + return (parsed, empty_files) + + def _authenticate(self): + """ + Attempt to authenticate the request using each authentication instance + in turn. + """ + for authenticator in self.authenticators: + try: + user_auth_tuple = authenticator.authenticate(self) + except exceptions.APIException: + self._not_authenticated() + raise + + if user_auth_tuple is not None: + self._authenticator = authenticator + self.user, self.auth = user_auth_tuple + return + + self._not_authenticated() + + def _not_authenticated(self): + """ + Set authenticator, user & authtoken representing an unauthenticated request. + + Defaults are None, AnonymousUser & None. + """ + self._authenticator = None + + if api_settings.UNAUTHENTICATED_USER: + self.user = api_settings.UNAUTHENTICATED_USER() + else: + self.user = None + + if api_settings.UNAUTHENTICATED_TOKEN: + self.auth = api_settings.UNAUTHENTICATED_TOKEN() + else: + self.auth = None + + def __getattr__(self, attr): + """ + If an attribute does not exist on this instance, then we also attempt + to proxy it to the underlying HttpRequest object. + """ + try: + _request = self.__getattribute__("_request") + return getattr(_request, attr) + except AttributeError: + return self.__getattribute__(attr) + + @property + def DATA(self): + raise NotImplementedError( + '`request.DATA` has been deprecated in favor of `request.data` ' + 'since version 3.0, and has been fully removed as of version 3.2.' + ) + + @property + def POST(self): + # Ensure that request.POST uses our request parsing. + if not _hasattr(self, '_data'): + self._load_data_and_files() + if is_form_media_type(self.content_type): + return self._data + return QueryDict('', encoding=self._request._encoding) + + @property + def FILES(self): + # Leave this one alone for backwards compat with Django's request.FILES + # Different from the other two cases, which are not valid property + # names on the WSGIRequest class. + if not _hasattr(self, '_files'): + self._load_data_and_files() + return self._files + + @property + def QUERY_PARAMS(self): + raise NotImplementedError( + '`request.QUERY_PARAMS` has been deprecated in favor of `request.query_params` ' + 'since version 3.0, and has been fully removed as of version 3.2.' + ) + + def force_plaintext_errors(self, value): + # Hack to allow our exception handler to force choice of + # plaintext or html error responses. + self._request.is_ajax = lambda: value diff --git a/env/lib/python3.12/site-packages/rest_framework/response.py b/env/lib/python3.12/site-packages/rest_framework/response.py new file mode 100644 index 00000000..6e756544 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/response.py @@ -0,0 +1,107 @@ +""" +The Response class in REST framework is similar to HTTPResponse, except that +it is initialized with unrendered data, instead of a pre-rendered string. + +The appropriate renderer is called during Django's template response rendering. +""" +from http.client import responses + +from django.template.response import SimpleTemplateResponse + +from rest_framework.serializers import Serializer + + +class Response(SimpleTemplateResponse): + """ + An HttpResponse that allows its data to be rendered into + arbitrary media types. + """ + + def __init__(self, data=None, status=None, + template_name=None, headers=None, + exception=False, content_type=None): + """ + Alters the init arguments slightly. + For example, drop 'template_name', and instead use 'data'. + + Setting 'renderer' and 'media_type' will typically be deferred, + For example being set automatically by the `APIView`. + """ + super().__init__(None, status=status) + + if isinstance(data, Serializer): + msg = ( + 'You passed a Serializer instance as data, but ' + 'probably meant to pass serialized `.data` or ' + '`.error`. representation.' + ) + raise AssertionError(msg) + + self.data = data + self.template_name = template_name + self.exception = exception + self.content_type = content_type + + if headers: + for name, value in headers.items(): + self[name] = value + + # Allow generic typing checking for responses. + def __class_getitem__(cls, *args, **kwargs): + return cls + + @property + def rendered_content(self): + renderer = getattr(self, 'accepted_renderer', None) + accepted_media_type = getattr(self, 'accepted_media_type', None) + context = getattr(self, 'renderer_context', None) + + assert renderer, ".accepted_renderer not set on Response" + assert accepted_media_type, ".accepted_media_type not set on Response" + assert context is not None, ".renderer_context not set on Response" + context['response'] = self + + media_type = renderer.media_type + charset = renderer.charset + content_type = self.content_type + + if content_type is None and charset is not None: + content_type = "{}; charset={}".format(media_type, charset) + elif content_type is None: + content_type = media_type + self['Content-Type'] = content_type + + ret = renderer.render(self.data, accepted_media_type, context) + if isinstance(ret, str): + assert charset, ( + 'renderer returned unicode, and did not specify ' + 'a charset value.' + ) + return ret.encode(charset) + + if not ret: + del self['Content-Type'] + + return ret + + @property + def status_text(self): + """ + Returns reason text corresponding to our HTTP response status code. + Provided for convenience. + """ + return responses.get(self.status_code, '') + + def __getstate__(self): + """ + Remove attributes from the response that shouldn't be cached. + """ + state = super().__getstate__() + for key in ( + 'accepted_renderer', 'renderer_context', 'resolver_match', + 'client', 'request', 'json', 'wsgi_request' + ): + if key in state: + del state[key] + state['_closable_objects'] = [] + return state diff --git a/env/lib/python3.12/site-packages/rest_framework/reverse.py b/env/lib/python3.12/site-packages/rest_framework/reverse.py new file mode 100644 index 00000000..55bf74af --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/reverse.py @@ -0,0 +1,66 @@ +""" +Provide urlresolver functions that return fully qualified URLs or view names +""" +from django.urls import NoReverseMatch +from django.urls import reverse as django_reverse +from django.utils.functional import lazy + +from rest_framework.settings import api_settings +from rest_framework.utils.urls import replace_query_param + + +def preserve_builtin_query_params(url, request=None): + """ + Given an incoming request, and an outgoing URL representation, + append the value of any built-in query parameters. + """ + if request is None: + return url + + overrides = [ + api_settings.URL_FORMAT_OVERRIDE, + ] + + for param in overrides: + if param and (param in request.GET): + value = request.GET[param] + url = replace_query_param(url, param, value) + + return url + + +def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + """ + If versioning is being used then we pass any `reverse` calls through + to the versioning scheme instance, so that the resulting URL + can be modified if needed. + """ + scheme = getattr(request, 'versioning_scheme', None) + if scheme is not None: + try: + url = scheme.reverse(viewname, args, kwargs, request, format, **extra) + except NoReverseMatch: + # In case the versioning scheme reversal fails, fallback to the + # default implementation + url = _reverse(viewname, args, kwargs, request, format, **extra) + else: + url = _reverse(viewname, args, kwargs, request, format, **extra) + + return preserve_builtin_query_params(url, request) + + +def _reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + """ + Same as `django.urls.reverse`, but optionally takes a request + and returns a fully qualified URL, using the request to get the base URL. + """ + if format is not None: + kwargs = kwargs or {} + kwargs['format'] = format + url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) + if request: + return request.build_absolute_uri(url) + return url + + +reverse_lazy = lazy(reverse, str) diff --git a/env/lib/python3.12/site-packages/rest_framework/routers.py b/env/lib/python3.12/site-packages/rest_framework/routers.py new file mode 100644 index 00000000..2b9478e9 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/routers.py @@ -0,0 +1,390 @@ +""" +Routers provide a convenient and consistent way of automatically +determining the URL conf for your API. + +They are used by simply instantiating a Router class, and then registering +all the required ViewSets with that router. + +For example, you might have a `urls.py` that looks something like this: + + router = routers.DefaultRouter() + router.register('users', UserViewSet, 'user') + router.register('accounts', AccountViewSet, 'account') + + urlpatterns = router.urls +""" +import itertools +from collections import namedtuple + +from django.core.exceptions import ImproperlyConfigured +from django.urls import NoReverseMatch, path, re_path + +from rest_framework import views +from rest_framework.response import Response +from rest_framework.reverse import reverse +from rest_framework.schemas import SchemaGenerator +from rest_framework.schemas.views import SchemaView +from rest_framework.settings import api_settings +from rest_framework.urlpatterns import format_suffix_patterns + +Route = namedtuple('Route', ['url', 'mapping', 'name', 'detail', 'initkwargs']) +DynamicRoute = namedtuple('DynamicRoute', ['url', 'name', 'detail', 'initkwargs']) + + +def escape_curly_brackets(url_path): + """ + Double brackets in regex of url_path for escape string formatting + """ + return url_path.replace('{', '{{').replace('}', '}}') + + +def flatten(list_of_lists): + """ + Takes an iterable of iterables, returns a single iterable containing all items + """ + return itertools.chain(*list_of_lists) + + +class BaseRouter: + def __init__(self): + self.registry = [] + + def register(self, prefix, viewset, basename=None): + if basename is None: + basename = self.get_default_basename(viewset) + + if self.is_already_registered(basename): + msg = (f'Router with basename "{basename}" is already registered. ' + f'Please provide a unique basename for viewset "{viewset}"') + raise ImproperlyConfigured(msg) + + self.registry.append((prefix, viewset, basename)) + + # invalidate the urls cache + if hasattr(self, '_urls'): + del self._urls + + def is_already_registered(self, new_basename): + """ + Check if `basename` is already registered + """ + return any(basename == new_basename for _prefix, _viewset, basename in self.registry) + + def get_default_basename(self, viewset): + """ + If `basename` is not specified, attempt to automatically determine + it from the viewset. + """ + raise NotImplementedError('get_default_basename must be overridden') + + def get_urls(self): + """ + Return a list of URL patterns, given the registered viewsets. + """ + raise NotImplementedError('get_urls must be overridden') + + @property + def urls(self): + if not hasattr(self, '_urls'): + self._urls = self.get_urls() + return self._urls + + +class SimpleRouter(BaseRouter): + + routes = [ + # List route. + Route( + url=r'^{prefix}{trailing_slash}$', + mapping={ + 'get': 'list', + 'post': 'create' + }, + name='{basename}-list', + detail=False, + initkwargs={'suffix': 'List'} + ), + # Dynamically generated list routes. Generated using + # @action(detail=False) decorator on methods of the viewset. + DynamicRoute( + url=r'^{prefix}/{url_path}{trailing_slash}$', + name='{basename}-{url_name}', + detail=False, + initkwargs={} + ), + # Detail route. + Route( + url=r'^{prefix}/{lookup}{trailing_slash}$', + mapping={ + 'get': 'retrieve', + 'put': 'update', + 'patch': 'partial_update', + 'delete': 'destroy' + }, + name='{basename}-detail', + detail=True, + initkwargs={'suffix': 'Instance'} + ), + # Dynamically generated detail routes. Generated using + # @action(detail=True) decorator on methods of the viewset. + DynamicRoute( + url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$', + name='{basename}-{url_name}', + detail=True, + initkwargs={} + ), + ] + + def __init__(self, trailing_slash=True, use_regex_path=True): + self.trailing_slash = '/' if trailing_slash else '' + self._use_regex = use_regex_path + if use_regex_path: + self._base_pattern = '(?P<{lookup_prefix}{lookup_url_kwarg}>{lookup_value})' + self._default_value_pattern = '[^/.]+' + self._url_conf = re_path + else: + self._base_pattern = '<{lookup_value}:{lookup_prefix}{lookup_url_kwarg}>' + self._default_value_pattern = 'str' + self._url_conf = path + # remove regex characters from routes + _routes = [] + for route in self.routes: + url_param = route.url + if url_param[0] == '^': + url_param = url_param[1:] + if url_param[-1] == '$': + url_param = url_param[:-1] + + _routes.append(route._replace(url=url_param)) + self.routes = _routes + + super().__init__() + + def get_default_basename(self, viewset): + """ + If `basename` is not specified, attempt to automatically determine + it from the viewset. + """ + queryset = getattr(viewset, 'queryset', None) + + assert queryset is not None, '`basename` argument not specified, and could ' \ + 'not automatically determine the name from the viewset, as ' \ + 'it does not have a `.queryset` attribute.' + + return queryset.model._meta.object_name.lower() + + def get_routes(self, viewset): + """ + Augment `self.routes` with any dynamically generated routes. + + Returns a list of the Route namedtuple. + """ + # converting to list as iterables are good for one pass, known host needs to be checked again and again for + # different functions. + known_actions = list(flatten([route.mapping.values() for route in self.routes if isinstance(route, Route)])) + extra_actions = viewset.get_extra_actions() + + # checking action names against the known actions list + not_allowed = [ + action.__name__ for action in extra_actions + if action.__name__ in known_actions + ] + if not_allowed: + msg = ('Cannot use the @action decorator on the following ' + 'methods, as they are existing routes: %s') + raise ImproperlyConfigured(msg % ', '.join(not_allowed)) + + # partition detail and list actions + detail_actions = [action for action in extra_actions if action.detail] + list_actions = [action for action in extra_actions if not action.detail] + + routes = [] + for route in self.routes: + if isinstance(route, DynamicRoute) and route.detail: + routes += [self._get_dynamic_route(route, action) for action in detail_actions] + elif isinstance(route, DynamicRoute) and not route.detail: + routes += [self._get_dynamic_route(route, action) for action in list_actions] + else: + routes.append(route) + + return routes + + def _get_dynamic_route(self, route, action): + initkwargs = route.initkwargs.copy() + initkwargs.update(action.kwargs) + + url_path = escape_curly_brackets(action.url_path) + + return Route( + url=route.url.replace('{url_path}', url_path), + mapping=action.mapping, + name=route.name.replace('{url_name}', action.url_name), + detail=route.detail, + initkwargs=initkwargs, + ) + + def get_method_map(self, viewset, method_map): + """ + Given a viewset, and a mapping of http methods to actions, + return a new mapping which only includes any mappings that + are actually implemented by the viewset. + """ + bound_methods = {} + for method, action in method_map.items(): + if hasattr(viewset, action): + bound_methods[method] = action + return bound_methods + + def get_lookup_regex(self, viewset, lookup_prefix=''): + """ + Given a viewset, return the portion of URL regex that is used + to match against a single instance. + + Note that lookup_prefix is not used directly inside REST rest_framework + itself, but is required in order to nicely support nested router + implementations, such as drf-nested-routers. + + https://github.com/alanjds/drf-nested-routers + """ + # Use `pk` as default field, unset set. Default regex should not + # consume `.json` style suffixes and should break at '/' boundaries. + lookup_field = getattr(viewset, 'lookup_field', 'pk') + lookup_url_kwarg = getattr(viewset, 'lookup_url_kwarg', None) or lookup_field + lookup_value = None + if not self._use_regex: + # try to get a more appropriate attribute when not using regex + lookup_value = getattr(viewset, 'lookup_value_converter', None) + if lookup_value is None: + # fallback to legacy + lookup_value = getattr(viewset, 'lookup_value_regex', self._default_value_pattern) + return self._base_pattern.format( + lookup_prefix=lookup_prefix, + lookup_url_kwarg=lookup_url_kwarg, + lookup_value=lookup_value + ) + + def get_urls(self): + """ + Use the registered viewsets to generate a list of URL patterns. + """ + ret = [] + + for prefix, viewset, basename in self.registry: + lookup = self.get_lookup_regex(viewset) + routes = self.get_routes(viewset) + + for route in routes: + + # Only actions which actually exist on the viewset will be bound + mapping = self.get_method_map(viewset, route.mapping) + if not mapping: + continue + + # Build the url pattern + regex = route.url.format( + prefix=prefix, + lookup=lookup, + trailing_slash=self.trailing_slash + ) + + # If there is no prefix, the first part of the url is probably + # controlled by project's urls.py and the router is in an app, + # so a slash in the beginning will (A) cause Django to give + # warnings and (B) generate URLS that will require using '//'. + if not prefix: + if self._url_conf is path: + if regex[0] == '/': + regex = regex[1:] + elif regex[:2] == '^/': + regex = '^' + regex[2:] + + initkwargs = route.initkwargs.copy() + initkwargs.update({ + 'basename': basename, + 'detail': route.detail, + }) + + view = viewset.as_view(mapping, **initkwargs) + name = route.name.format(basename=basename) + ret.append(self._url_conf(regex, view, name=name)) + + return ret + + +class APIRootView(views.APIView): + """ + The default basic root view for DefaultRouter + """ + _ignore_model_permissions = True + schema = None # exclude from schema + api_root_dict = None + + def get(self, request, *args, **kwargs): + # Return a plain {"name": "hyperlink"} response. + ret = {} + namespace = request.resolver_match.namespace + for key, url_name in self.api_root_dict.items(): + if namespace: + url_name = namespace + ':' + url_name + try: + ret[key] = reverse( + url_name, + args=args, + kwargs=kwargs, + request=request, + format=kwargs.get('format') + ) + except NoReverseMatch: + # Don't bail out if eg. no list routes exist, only detail routes. + continue + + return Response(ret) + + +class DefaultRouter(SimpleRouter): + """ + The default router extends the SimpleRouter, but also adds in a default + API root view, and adds format suffix patterns to the URLs. + """ + include_root_view = True + include_format_suffixes = True + root_view_name = 'api-root' + default_schema_renderers = None + APIRootView = APIRootView + APISchemaView = SchemaView + SchemaGenerator = SchemaGenerator + + def __init__(self, *args, **kwargs): + if 'root_renderers' in kwargs: + self.root_renderers = kwargs.pop('root_renderers') + else: + self.root_renderers = list(api_settings.DEFAULT_RENDERER_CLASSES) + super().__init__(*args, **kwargs) + + def get_api_root_view(self, api_urls=None): + """ + Return a basic root view. + """ + api_root_dict = {} + list_name = self.routes[0].name + for prefix, viewset, basename in self.registry: + api_root_dict[prefix] = list_name.format(basename=basename) + + return self.APIRootView.as_view(api_root_dict=api_root_dict) + + def get_urls(self): + """ + Generate the list of URL patterns, including a default root view + for the API, and appending `.json` style format suffixes. + """ + urls = super().get_urls() + + if self.include_root_view: + view = self.get_api_root_view(api_urls=urls) + root_url = path('', view, name=self.root_view_name) + urls.append(root_url) + + if self.include_format_suffixes: + urls = format_suffix_patterns(urls) + + return urls diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/__init__.py b/env/lib/python3.12/site-packages/rest_framework/schemas/__init__.py new file mode 100644 index 00000000..b63cb235 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/schemas/__init__.py @@ -0,0 +1,58 @@ +""" +rest_framework.schemas + +schemas: + __init__.py + generators.py # Top-down schema generation + inspectors.py # Per-endpoint view introspection + utils.py # Shared helper functions + views.py # Houses `SchemaView`, `APIView` subclass. + +We expose a minimal "public" API directly from `schemas`. This covers the +basic use-cases: + + from rest_framework.schemas import ( + AutoSchema, + ManualSchema, + get_schema_view, + SchemaGenerator, + ) + +Other access should target the submodules directly +""" +from rest_framework.settings import api_settings + +from . import coreapi, openapi +from .coreapi import AutoSchema, ManualSchema, SchemaGenerator # noqa +from .inspectors import DefaultSchema # noqa + + +def get_schema_view( + title=None, url=None, description=None, urlconf=None, renderer_classes=None, + public=False, patterns=None, generator_class=None, + authentication_classes=api_settings.DEFAULT_AUTHENTICATION_CLASSES, + permission_classes=api_settings.DEFAULT_PERMISSION_CLASSES, + version=None): + """ + Return a schema view. + """ + if generator_class is None: + if coreapi.is_enabled(): + generator_class = coreapi.SchemaGenerator + else: + generator_class = openapi.SchemaGenerator + + generator = generator_class( + title=title, url=url, description=description, + urlconf=urlconf, patterns=patterns, version=version + ) + + # Avoid import cycle on APIView + from .views import SchemaView + return SchemaView.as_view( + renderer_classes=renderer_classes, + schema_generator=generator, + public=public, + authentication_classes=authentication_classes, + permission_classes=permission_classes, + ) diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1cbd4fc96be4302351d983dfcf64de34c2c89c0 GIT binary patch literal 1970 zcmZuy&2JM&6rc6iI%|iRgpkq{dz2P|MdB5$azPc6ApwE{iLhxUUpAB7NxWviG&4(@ z%19h~DD58r#~!KRz_EWo50!dpq)M??R8`eV6}MD@3#Y!>wVe+!*1mo7KIVPQ`>lT+ z9n}!5$BMG~HiyvPax++kKC}NFFi(($TF6qYl%u$*R!Tuu+R8X-H`B_v*;Y2*XPu0j zYvo+ErMmf6K9=R25m#$zz^lVwUUD?mIXwt<@CNAz2fG1hsT&1rGAY^NVVW&vRuZNjL9+tdjt z!yBPz3NYqz40*^=>zjVaDaUJ#xTr5czc!24>Z?mJi+Q+iI)w9@rhQ2<{VMP|#RR)h zt4ka_6NKxIZO&kDz?RJ*e`gzSFyF;%{qC&QaIKgKJ6@RZUxg z6d5L_Njb;7?T3zq1z~WGOkQ@x^{vo>rVR?#Ud!pJDp8RHw!x_owztV&D^i$>RMTe^ z6p`u&)B~oPjSd^R04&<0eDo9M<+lcZ35rQ(0N2(k=&@ovh^ixY3DF?iojYWN4-49hnSBbqu|LT!L;CLtH0_=@8jWhw}m1Y>;5aP7mdIg|f;QF&qUdi~yV)2QET z-dw!XT)I|oF0I@#t}WLajm1Xv;XuE-c=z^Fqj5+V_vA;!D)RKRK;Gp)Pd-6c*m>AW zxbr0-duc^c{!2|NnYXh@x%4k8|B0^bpeui%b9;F-Ht{s`?314|zlh%0si)#)vsbye dTe-DUxz(FKzdL<(XZmWdbm~pvBPADy`X9@+Bu@YU literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/coreapi.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/coreapi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e33ecd8ba8874e9e66b7815fe8a4219669b4944a GIT binary patch literal 25333 zcmb_^3ve6fedjLTFA^ZZ_e&5dkpjhsXvvZ->tRY1^`;bwavi!Z1Y#ix6bLZ8ASF^{ zEN9#nO4OQ6+=#yTY9{qe=-Rz%I-NOX=I)wi+FoCG2N-k#Z|JKsReRUDxfxng)5N__ z@Av-}yI4YyqTb~j^26@;-tX~$|G&Q|D|2uNH+cTyZ=L11zo8d3nDY-0>UfU3#R;6i zN4XLDHAMMw!-#>WXJgbjZW=MMXH(QXZW*z#XLHm#ZX2<&XG_#R?ig{5J4c-3t`QeY zvqsCt%SXz`-6QUC&xnVm*`gKWl_QmSwhNA^cf4w(iak4{)#EiIHSF0HtsSo$sT;2! zsmFWS8{9~PP>#4!a3gLKJR{8p?l31*yuk^T;g%1K%2$kR5WL9uvAineRfnszyp2K) z@>*G5E%NHZHCkR9ORYz0gD!QG(1;qFr+I(V-%|%eeqOd7j8DcAVG)n!iJ&Nj@n9K` z3*o4QC;NrC7zziZgy=WQHD|)(@u{$IG&XQ%aC_gbUkHk^NbI8Q2wx3_ClZl(Op={a zSd0Xtk(sb4p^7yW7sJ7ci0q&TDRe139+aJvVk8kBpNIw%)SC9I>%yI+Vn|#P{kqa4KZRNN*ewH88m(SM|_z&`_WBG+q8>HVt z?t7?)+vI%}OZ z&06YF?D8&-llYtNS);(sS{k@HGtb3%6UHI%V@|c5!tbnEZE*&PXYs8({^$5BoZm3? zIp6EI$Yv~XWCA}E(MUozjz?mMf>&jGI5s&>lOL8%WARALZ=+3;xFpFY`oU^bg@BS| zkoshU^o(o?#mC3vF`19Zd`PmPPhUQK{?*=d*dJ1_FdDoP9t-vk#6xI5mXLZ636r59 zZK2+?pBOaYY^!MAza4ufre&uxOg4CN6GmBqf9VFI z>)a>1_h%|!{NCoSF+oAv#R5OYpQY8@ zM;lx=(dNf8;N)T9ERz!g{aSHE5@LK>wuxb^c6cf*m*c=Ea9RUOk@xA~S%M*Ul4-;H z#5QWrgYy)cloIjrfRZWpAh{X;5;iENE9b0O;|vWJL@tWVmIp}Z)(zT(1a|a(6Av`# zQU~n=s)m5A@5yg{e$J544qf5c@Z8Nx6SYF^76sI9%-1%~nNUVMc7=ko+A+hSN10iE z4>E5yo49H2eSXMqlFbC8B-tZiGR4T~WFicp61yzPX62`XAWv{A7>Nc)qv62i@U-77 z8{?y6vJua+c`6v449jH`V)#N>6vG0Qprt_*w5;q%u=y3YW^(3){Izal0wY@w2&UD(=m@J!57;eDDc!b6vP3)=sOsXVx!>5^*9)G1{m%+f#LZ8^L^*e zobb`H_FZG&5ttOCbG}e87KxrO9^GMBO82t&t3)C)JRr>JJj491v0;S!)YxKhk3uD-nG*XF*2dCl@ z!534$Eu?;%58ncuC5jOt>^onCP-?g^Izn{%1?$8lVZ5X5yC8L zfleTW2b&Q6Dzfq+E4`K~KF^+i0-RHz@) zqgLCEWN8DUpJ3xw*CtIj9jhDKzcrmSt=O7YZDlvCX~y-3S{!D1LV|OK$K_r%Ts2S$fuAV@3^Ilcbg~6QDb$Vr3?JmjGiRJN z=6g4ur1(Ocgrht4K3M*o^(Uc@?5%M zZ}ND~<;l8yX_s%QIpgZR-IsRl!0+A4`dd8ICrujOhR<{fKg zoZHK$9+)0WjUy5c1Y}1b05We9perD|0)a102BS)j_##Fk(wOD4{5A-MqtQU%eO^3( zREbc-i^`YL)QS|*JV=;t?k8_>4-H0he%Fz_9I!G5o13~>d ztgN~YWeMtt1$A2kP8+E=`enO-yV+n;c8Y#i88U!63_U-jun`6}|Q30Gd(uw$%e1R_C zD;>d(E?>teMWK#YyL^4mZ1-zb^2OM@x=*)ULzUe=-RtQ3*O2}-N{DUmD`@pq|J>Z1 z->)=2^!NXQ0Pttm@QCav0Daj+;MZ?sdxSwM5Fis1;g}%Xho>jPheRgG%Q1(YHTEG;0q&aG8)o~rqS^Jl&`4ZP|spTCfHHmx?aeycM%IKTbI@mxji zqH&?|h6Ti&r+&?0Gq>byON;Nx2%?T zWXpTfH6JoV$L}`?Yw=*1T4RYM)EAyT0S= zH*$Yy?B@@dj3K;hLB$3ShLNPlN&-*#NH7W}!7Nw=>pSKVlVBS$3*`)7+262_SOmA= zc!M9Y3Le3UUz^|p{<1Sx)xofs6IiT5b{C=0nKrg(PKl9=kytPaqCyP!pFZjX%2h}U z+NokE1|)V+w1uLr6!{Sm#RO;wZXynf)i^PkVEjesl57D38cu|VLVDVbo*A*+Y{=o{;lSpeLIw>M-rr;352Xe#NgGUaX?8mu1bmripz{x|yM@|g{ zhWbw)IxBla@i5636uN|ACISY8S!Ht~k^mzJ`3?}Qp1rr>b0M&Ru)&IRPo$=7&2Kja zKj~ObJ>61Qv~@M|)faAnw0Hms_tmUb~Jfq)mfQxwye6U-aL8ZWU3*s z61=kFy85ZRK4m+VYCM&(ol4H!%hNZD)l0^uS8i{)b9luzu-ev}Z9A53JC-zkZ1X)z z_h=Y!m|?(2F&(3C^f(j4qcE$9BA8%+_#30dPlIkMiR}tpj(OGu{5k=?2(6MpVa|p+ z`qQO!0FeSj4K@{DLD0}RYa7#WVZIQ4N@7K-TM`F;Xi!_6v(H*|I8YN#2s}g?4%8+- zyeP~%^kbTHCcJ6^oIK~OU2Pj&p$M+fKm_;9ml$Ls_;V%<8b0O=>ai*IO(F=Y7mN@N znJ;lE%s36O5|@GrpL8ic85MABv^FBKP;^qjnZo&@!UW`$gVUpxA$gi@6oM<_XK+x6 zRFUffMDH;XNdV_D0NgeKQA$FRs|7$f5xiKKWe12=j9itgE(Ikfx(a|cACE``MN8YZ||Lp8Q);q)|@mazxZUNP9b$P0JVVB>v#)_pYYA9U1SDb z;hpV^Q{Q@FaZjpdOY$%k-@CAPsdl;j_NI(?S8`z0Rl8_jOe_t5?CJ!`+}5||!BCPe z2um%8F>)o57eEeXBi?P=vK&NP(T z?@HbxRh>cv8q&tu%d)oCw5@f;w&|{?>Q?ze`M0OuPTby=@w|{Uf8wsfZUn3M=A|2# zlEzQmmGf6pwVk=j`fO!ay0R-%*^@kYj|4y~whgQ9nyh<6+PxuHS#zs%p>ugtwsUv7 zb9c_;T|D>DZ1gzRIHTR6Y+C&`BFcoe;e!+4lt4MnOU+m32lK}^ATI1@IswmA!B1PynM5gkz!3b_#B zoAV-kV5vE?06L7x5X=zAJ0Om?K)hap=MtyzttDtPv}XtzE|E$AI|g{zAei$acl)g2 z>xP>yv}uJ@vVeoE>Jb(!mj{UWDLogjJSgaf=40 ziZ$cR@dflz@+ zj0S65wiDMDj{&90)g*Nj6bevFmE>~j5$So6?K(Z0B6}0j+RP(N4WTDGaleCH=@g(m zD6Trr<(=QLShwPAy<1&>>y?F9ZVWyIq1Ci_c-M+4}BuefRQ( z-;KT>{UDaE-#c#s`tsDiId@}j@odJuG3)L~yE~SREAFlbX46K;kKA3*Ni=S{3xT6Q z?QXko=E`bvNHlZymNgC~9=bSJ)8gQYvkfh^cYZhUoxlULv8DV+n|Cbkykq%(d*-<# zU$-m;P@}97$g8FNA$s)A@5{Jbm%i|kyFFKOSUGR~;&8V4*);yV&*qvpD$lnsq?`B7 z59VsSZd;bGrfYYlJiG4Jb}gS>9!=Hu-G1rzk#y~zlxNRfXT|(*wz@lwKWBHYx?Xu+ zzL2hdHaQ3li)Zt)W$9|#-J7!Y{`7tyKIEtOJs6xs`{ED%Wdlv7A5=I7Hky9WWJ0`7 zs;v=-FeCu3y+~Mu2ls`oK}23Da-me49VOGBwv1%B2_xCT;o#A+?{0MWOO0M%ry zAQR2Ow=ob6h8>Pfg^4Fq(FAc}j7#bQnaKDxg8zz=)~E0(zAKj^p-Uy0GwA3Pl?KEe zm(c1(#bkgncPa|e>2kC&3}1r0L=})wchPtZ+T(=UEouH3r3#i%h=(N~slW1^pn}q% zBuQw^X~&n)9yJHuR2ONWSkov;?JCC}tRyjB@Ez}vtP?T;Mhe<-Bj(mjlEH+TI36Tof z7*ANDPeci%U z)g)~{tf~i_SKs_@!`lr@2fwu;Ti=te?^%{I_1lxjavR%Hu9hD*cg)*!-WotEZ`&tT z^*K*#*5glm{LB82Jv$(JZP@}C1owOl{7R>L)JNSSK?!DKZb=O0won5!Rbt28_AclMaK z{rEiJY~IX9&strlt0V@>i2nzF3PPKy@bOX{#Oi{$6$EQ>Hr_wTgQFPKK2W}wRN)u3 zVtTZhb*&h5mNk0C4UM=c=+rtTR5efvsjN`9j%g^#2dg81U5~~Jlp@_B8U_$82*A#A zj~Ok|6GcHAO|7nvx}rjOWjz?x(vR(dPH<6B>xd_RMi1N=Nr{TW7-@Zrf+~psBV__> zW{eOk1)&}jSegiV>1I|F|9!)7(`$mdcFqh*2hEpBWiTK6HNK*b@v42z`qgVKQ8K>^ z=PbJKF2Q&~9Qt&tM}V;?Xrqx5L^ZH5MpS4~n6oDQY7)*vr}|v@h2Dl!=L3RU+v_hv zDBD%YSD(g+94!iScHMrnC$_2CW6!8hgS;khUDu>Z;HtIOT}Xe)`mY8uvs^#4Ucg#jOGMAlR8mKTc}!mBnXTYo-d zVk5DtyXLW{=)e<3qFJZK=3OXoEc(5qwps;=f$BK&K^(jX{3|>*tW?SDw ziJktGJq#5!k5{dSI^B9cW{(TD4>cvmV^@lZu%hs<>cjCAeVi%k0Iymf`k8tP9E1}y z{Ag=qq+u@#f>S+5g6r}Y5HwFSV`b~UrhtJTGsAi~#l%<)(?EPxJ|sh1BoZ(z$b{cF z6rN$c;Fu8OP{t%8pmH_Qv}|T(($M*s$V?V({KmRAWE0t4B3Y}!tQBVLl-!+&jKeyR zDT`EF=$W!a_$q`p;b70D#CTM;sjvPn$Q^>C;izaq53>DII64uaOxXbgz8C~Ou~1kf zIjdZL0^*{xnhmyWr}x1~I4a2Q3-l96#Pi~7*&MnANjX#6%I1Di3{K1T0oa=;#Vw~s z$<$VM=vuR|CL}glvgc$lHhm^cR@{P8rJOYw5Gf5xE4k*h7#WA@%JJ~}a+b4{>emKY2A7hI)IBXS97iF)O!;0nFx$v4ql2! zLSdz>=@3?g34CCJ&eCC;t}oy^5RXU0!C1cO{G03=2!}A_sFLg$jK+iNbPP?7k5cFP zQ79$s1NeI7v5X#vv8wr;V`ondDUW6;F%3=j2)@Vfkj)op848<1b}6%_NIIFB3Nu)d ztJpk31jH(+i{?Fl z-?@DA=zRFr<%P>DuGZV)^+UOB&;EP&@44UdFCKdL)Z3?4D!aaa=KAq_){6Pf?`+LB z>_|84`2EY-oyXHVkEiNStXNO3*0wKAe)rn9uVretCta)VdQ~^klB=xE)wMmenn)pG zvOA#lb5zYAdgp~~c9Eg zjn`Hys8*YRxAj&u{-JSWmSPox@8uGoj3 z^c6p=!N+bRhy_b-x*h4p9V_-{wLX=P$$48!mM-3+g?YYfb^YqK*RTERYp=gH|60b{ zvAq8y>+VNdZPv94@n=oe*#x_>rDtznUU42snGXE)!65^-q(tESkE(0F(6ZjVn3!w| z4+KPy7;?Fo(Ut*5TPDE>BQ0pW5L*N@Vyj?5Y!j@A?Sc)lL$D)uhFvi4(#(TL%3$Qh zjlld1=E-iz=E`IT0a``$GBf5N@G+o>z9H|*yW223B-lN?1kHpZTsjk$AkLB^P;IbG z;K**$Tc8eH4Olhc0cM7zfGtfjM^@+5$vU~I37^XZ3|H~6-oEPw?0tU?7(rz&q0pw% zEWpA`Q;3(cRDp$;CJ0c88K~v?>u~%bmmgST(L%5Q-zekEZ8kI--f2}XC+S3Roxbzq z!5Hji^Fa6fZcT`JUNv=RkpDc*9YfBF0!(X`npVY*L4mAF$bcOS(4CiDB85SH3F1T8 zHeG?k6bT|Rm*-i_J)|@^ueCQMp2z6@R-Nq?eX$s%Xp|zFAh{e03f;Itn)Fk0*}7E4 zhKiQKx6bU_Ti76)<aMdc<@Dv6T9PMoEnCSn zO0f_QX-kQwXryct?1m)fagHKHm8(lhmJy&e)kA~oYS5P=WAJ=QA}or+V@hhpjMZ?$T% zu@am@f&|Abl#(ftyiA=HC?B36VS)t0G;8}%GrQD$+bp2#Ex}#bo!Sx63{$itN`}qn z728UQcnyWHzbj-E`u3rYnHtoMidqupILR6jPA^w5Xx5B>9+Cm#)HNU2)%D+ z7CDL*(-w|};sOAZ_#U#Dy^h}_yGaE}UzrDway2uV(Rh+|$rC}c8zyc+O=f;o7a~z8 zL)Im&15$FCq5@V+7{Q9jwrE`OA(UOzqdGWcKza*O2dTyr68R=6#;hjV3$PpnFeIB& za&;7c1#f=4Vj4t}Pep}$nV#6!{%3mnPZa$nMHdiB#DcMvph%&Iu;lVSiwW^S3v-D%tIpOw5NUAbksYI!PC zxif9snY7%kYs%L3r0aT?6SrT=)a^-@F}u39bVb|J;PS~#1zP-(v*NALpY6;vocXhz z-`~9W?7REk-k0j$`%&ZGKi!#bII~i7Hdou2t=*EYRhq8ddE?04+Q#IOyEP5jn$C1h z=kku*HJO^{lFlDFy^E%I-EX_0AFk_yQPU#7XqbO4IdIQi^XBZ0*;P;Vt+Iu(#Y@Yk zjHer<8jb-uoF);Xq0k_)AvEzuxz=@K7cpHTp`cfQ_= zG9`2kV$Hf%N|exAvBetDP954Q0o_Gc0lou1J5^YY86uxi7O)B$<`XwSCElXu6nw67 zT3#w(AMv*_s39h45Et+$S4QLU%aar2>NXjMsOMt%s%!;A(Zc4@grEK9HRFX6JtgX%l1R+T?4WU zgz;z`R-mjOqTt1UL#3S)iqwhBU__#U#5X9}l^-~3NBkkBe~Tib2F2f@=-*L9M^`qp zX%tW6*a^0>wwcp>A@f?Pjp~9QA+^cKL z)^(@rx|fA)-S*^>92De-at%!oIn=jh>pRo+ozRKHQ*$uqu1dLmYbIkwN3ONwyIa4# zHQTx?-MZ_JEz{aRf1Cs^8&clR|54Ruh*XxGAHJ0B-ka{;yHdSx zb>r6T#_j2i+vktnt7^P;a^WOlkNOQz{C`rrF;)8o51``3@J8S(VFV&hZac&OFz$F0so z+suF5%OhTgf(X?!6l6pEIAu7jePHBG)~FY8@xnSJq_Hm&%L7s{ma?;<{Z9dA-31VD zN@&2j6ad!1Tvq`Qmm;(kXRw4uV3z{3YX2YFRKRu-zPXPXORF+geXNc}`AWrhX-oss zg_2_(g=h6i?HiU;u!mp_PzhiyHRwiT(alV!+D_qD9gWD}>;yYSaHuF;l|-M~Z~=uE<`Cav9^0;#DEt=6!jkHmh8i^KL@DV8(8Y^D7w`mn zvWdT7DoJ3Jw1F-~WWdvgSCxqc6!t|zVnZ5|a?ZS^A(x*Ql2W-H;zS@&fs;GzJjhKFTYX5Jo#G_biy6*eAnji*Tb|#LGjPA z35G?oY7+k!MSq6K-=LsKLSN$lrpSg!c0mNEVL_dUXMjo^plFaHhTI5BiSJNEcuo8} zikuWJQS@6By@yD)Fmx`-b~3vS#A8w1k8&ge$&{iX5&xPBIT-3x&@Jf`6#S^T>oL?{ zuyU0hg-KM{CB`XHGbQZ4{wtDad_@Sb&_JHa`;UYMM~l%Q3^`NveQ9T3&Rd;43Pxi- zk!tQC7fu~`y^F1KJJ?Zv6EAG9lpSy&0bE^1X zu_gVh>RupSch#G(ef72XI+xG={_*UNFJUo72^s8Cu)ObS#-#8b}c``xwZqmaEye2Fo*s%MJmlHDulGX?Od5&a8ZR z@>t$|5%;n*_Wh%UYifOa=hCL{_I$f1+xmRE_4zwHzrQ2Xc;p|g#CJ=BvBm%1tAo;EykA>Y+T6Oi6KUy z#S&6D6*WMzW-cjx)0{^j+%^o!9-W+l!3H?}FglL7DUs2jKgN^Hgb&KO&hI+Er4;=K zjj$%TknQ>BxXAcbg~C%vyZ?qpAKBT3s`)p##s;xcNIZ^eqN|9Je2kixkg9oX>Z&vQeqV&HQJ|}+m@Eo*!12oxlMSAv ztI$Z}aTdN9fZ9w}773|p5S5(I-+(1xCR)hCYu55rx}>FLVi4aKQ+g zgp2~|BFN1KXc1bU2!w68BuAYMvNd1=yiwf81t&deXpl(^aq8N!9hCb3h?dh`1z=(d za`6`_^;L>~2@xu=!^zGn!-L(F^(%IO* zO}R$zx~oad^|ddjHXca152S1do^bq#+k6`JhDJH#cAApM$%KZA0x0Iq#52qqA*3*= zz_Jt|E#2k^m=Fp~X=1$D0ZJ5i;wW~^Ch?zoaO05WFXZE!JJ8dz>$aVz*Sw&uBX&2x9E{-FMQ^_iN3Y1hFUgRl+Q@En#YS@!74&^I%LMpm+q zLul$O@Zz7Kl=y!Tt=o5E8Yz!_(>mF81AP<8(iybRx?9uk)|9PP8IT@cYLNQ3Q5XZ_ zB`84wC2>&>xhOKbTF4B^MR5!zio>h{HnkOSRy5|_Paq4Sve2)TEWZa0kPWU5V?U84 zRX52TMx<$8$RUsqPGc@LU~rDzKc}fk*J(%rr1A>VCn`F1VD4N(x#;4;WQ^U6L*NN; zNq`0#-o?>ihyd;SK9sGbjfbgO@_r}a97uZ9<2#pkNX$1?q~O){{}`>#d8L!5Qw7I; ziuOVq5;V$reFj0~r&1>qW&jWt^Ixq4zEJD_cPym>Y1iLKp4=b9I{kfJ6$;0#gw+0smzj_L1u(J6c3`;KFim`*5sptUlOo#HP_wAgw zhq+wesOtBa))AZ*jEkMmH}LSd^Eqd{1fQhe;=v8)2~FnV3{p}hJc(okd~CsCu;|KI z$p1+z!>-$eUzKUrO2&dXbXIr)17qPnj23uBS#VFF$#0z*(v~pK?Gk?PP&H2-5Ub|> zdT5(6VgM@^%n+yl=)_@FaNq<2h;$3FLtGaEN3t$Il-*9{B8;O86l z#jbW=xpJkOWkP|)1`rn51&_ed%3W?@Np`@~FcJ(TaI@0TjIpz~bEZz;NIaAXC%WPE z6b_E#zB7h&3H_@6J_YDbS#ov$G8*QksJ1JKb{u}$g)i5779B_`!S{WPR%U8-J58^) z+fEye2m$6nuSz}dTi}U@`;cHy*06D@D%G*;PGzQkPqO@nO`XXTtM$I6rsdf?!pJhU07S4gHz!rwSBnXp?NFa?@+~{u7cP+Mb0_mo9JA8k)jET zNK7jdt11#zuV6vKU<~BTF2J!wB&5)PBAp?TKCiUb&L2?@MK96BoWuk3+A*1J|KKPy zcinH<1b>_pe5bkQ{>ywH;tRaf+;_jB(tMD=zr~7#O5WVIX5lQApBcR7ng>QatuN?ok@M08RjDN3B((Tkg+bP8GJ0IahDF=2=_-UlQ%C^7|twa3rb z6sTZzK?YUis;QDpA7FhbuuGscLh37u(U8WM0;h5TlFhIH{Hnj+iT9glenSHj|NrQt z04;zubdw0wqnOp|XO?jbWL(hWJC&dKLVd+*Xq}4}ksKtKd~h1kagJwjmcdG1cVh&f z(8!chH)^R2;5YeOJmi=@x>NOcj8}N&m>CtxlqQdYsez$qn`oqyK+WdS(C79&Brdx; zA?};mqTha+@lnqn()UNDeLY&qR|sYhl=`1!k(9y}zBRY|-`c$xe6RMq&EIa$dV9ZD z^HX@Ja@Izt3-w>qNQHp3k$VRXoaO+bV#>I-d z6~e8WDrQjW<@c!G1&aQXq63Ju3rDUi==epX%~Y41fz$N4FCiZv`xNF^_uQ3fni5=X zyyAW_Wt&PJn93k_zli(iaA~J2*VI8*cGlF|o>{Ooq)#jgNF|!PC?M5Sl!RCK z3eZ770Q58ItY5^xKpKofviMOXsyTY1DH1=S=vOGJ#e|5}6yfrBqQ3emwSYV?(INwpXc9;Mu4i1dD_Zu(q`j?-`}k;^ce5g5%@Zf^at&uLaJrD26a$kzhR9@|u3 z#)JM&zn^(?A7Aq3KD*j-!RoWrhA7<7r@|`|70%Qhm9$F?N%rH*-_5aKJdbuk36(nZ zaKpe&Sxm4fmZ6wjHE?LK|J;e;fO`4eiT<-^8OCSIZ-we;qmrl!sK71<5t}f7F`B=v z$hpqlvzDi<4XZZKn`Jl3QZ=uvyeh5O606SYx1!maUFn)#|Dhq{97vf4l=W+8x&XS@ z9G3)sf!gGqR zN%i{d9`f=ICX@+sQYog^uPrJCFAsLpzcNv{PAPx8za)Z}rTI|JjU|zerfg;-Qxy5M zuf$Ch^-x5ZN<4!IN)-65D3^%-0wt11H1l~-=A7+Ln%$z=|J=3*-V?Y3cb~Wgx%lIx zUq=KrFwg&xbAQTh_>`;rTdwI-ZtMTxj-|O{f6X08a|b@FWx$m;@b!(N5W>bo*f7syR8Ya+4>@|cpD+#c{6YR< k%mCb1HQ)RYmo)QL567%N-Z8)TA%~v_gS?49#Ixo7zqD0@ZU6uP literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/generators.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/generators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83449b894a8e63ae1494b63ee237133cbd029b98 GIT binary patch literal 9910 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/openapi.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/openapi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1839e46c3b065c12d18deb00d8f4d6b4342d9ece GIT binary patch literal 29038 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%0AJdF_)5WhpT=u=AYC57|wP9|C`RYi+s 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/views.cpython-312.pyc b/env/lib/python3.12/site-packages/rest_framework/schemas/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcee0ec32d9999a5ebb1a7b6cbff94a1489dc13a GIT binary patch literal 2795 zcma)8O>7fK6rQ!$_QrPn6AXd!w-gds6x&UkOGS$cBoHVHC`8|ejoOS-mJK5l4(A9F4adsJU|iISCdSOw zC7p^@S-Bz?h^Sv9l)WPp{++#9^4Vc>T_IJosB4DZM~S8qN~j@mwlGbMDo6?NAw{P| zt`>of!h{WCnnkU^%tG!~l=ey5)aNeNj{@@%1dgCQ2f_2HT;8wx@;p2Nc!H`wA6i70 zIF-L4T{}7~~akr4!(JuMx z=wlwCI#)z>-qOVe<9f6Mo~%1R@2kf))wS_BbBo87wt8H5zJ};f9YX!0xcs-@0yp1} zkmBo}X%4Z!yWEu2ZwHK8l~7yoiqTGZ^@W|9B?b+`F6?m8z(kX0%0#6sHTITcP;O9H zXR1VlY1*wyJHh0qa%ZMGlK4iGO-#K}m^w=JS%bZx#~Wq&wzrN?96xgY^f^2|F*QCh zJu!`soj#JwP2?or<_%K5Wb-mD7G3Qu`glp!3i?^9mxy9!iFPepF3x1D zbLM4Tdo45iYSt*4B<*&uk)^~i@g*u($gEDUWZiDhdZ}B1?@yT8Mr_+LS<8@cDO)H z+?LwGYHg-mR4Ch|oj6NqrDzyX7vn@LLe(<}lLB;*X+xA;twEkC>r}dpiGpsTnHf}^ zDAMgr?1vZ3$9l32>wTaw-UPCMTFK4Lq#oZjVxLu3T9!%s~!1 z(CYmLAQ`;~W>xOKuag~L-S;l|ez7I?uI7K!GiY&!*#TnbI@rUmgKqvL|I|6S#sY9l zDn#mYP=PYIq^#uZ?SNpQs$fOeOz3H>k%Dd(ou;NQGmE6GunUx^*h4paQ%6)GYEj1K z9C!hsgw$V_HMLA|=hBt04qBJ6C%2AZ*q70cW)AJp&Ge;8}TGRv{aMSttIt!*LCe2V*;oaYa{aa1LxoF}_-p%dTb{E*3NZ zX{IM-499j0-JpA6drnO0F2;$Bu*^_avd$6heivL7QZ8dGaqU>JR(q=*2zK>SMp!V7 zF(6NGpq99=!S8JKCl`*l2Ddl(luP>u7LGsWV}VoLpCTU+pG1R!^cn)<9LRCQZmAH) zs;g;cV|N zYHyWw`!nH4>> example = {} + >>> insert_into(example, ['a', 'b', 'c'], 123) + >>> example + LinkNode({'a': LinkNode({'b': LinkNode({'c': LinkNode(links=[123])}}}))) + """ + for key in keys[:-1]: + if key not in target: + target[key] = LinkNode() + target = target[key] + + try: + target.links.append((keys[-1], value)) + except TypeError: + msg = INSERT_INTO_COLLISION_FMT.format( + value_url=value.url, + target_url=target.url, + keys=keys + ) + raise ValueError(msg) + + +class SchemaGenerator(BaseSchemaGenerator): + """ + Original CoreAPI version. + """ + # Map HTTP methods onto actions. + default_mapping = { + 'get': 'retrieve', + 'post': 'create', + 'put': 'update', + 'patch': 'partial_update', + 'delete': 'destroy', + } + + # Map the method names we use for viewset actions onto external schema names. + # These give us names that are more suitable for the external representation. + # Set by 'SCHEMA_COERCE_METHOD_NAMES'. + coerce_method_names = None + + def __init__(self, title=None, url=None, description=None, patterns=None, urlconf=None, version=None): + assert coreapi, '`coreapi` must be installed for schema support.' + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + assert coreschema, '`coreschema` must be installed for schema support.' + + super().__init__(title, url, description, patterns, urlconf) + self.coerce_method_names = api_settings.SCHEMA_COERCE_METHOD_NAMES + + def get_links(self, request=None): + """ + Return a dictionary containing all the links that should be + included in the API schema. + """ + links = LinkNode() + + paths, view_endpoints = self._get_paths_and_endpoints(request) + + # Only generate the path prefix for paths that will be included + if not paths: + return None + prefix = self.determine_path_prefix(paths) + + for path, method, view in view_endpoints: + if not self.has_view_permissions(path, method, view): + continue + link = view.schema.get_link(path, method, base_url=self.url) + subpath = path[len(prefix):] + keys = self.get_keys(subpath, method, view) + insert_into(links, keys, link) + + return links + + def get_schema(self, request=None, public=False): + """ + Generate a `coreapi.Document` representing the API schema. + """ + self._initialise_endpoints() + + links = self.get_links(None if public else request) + if not links: + return None + + url = self.url + if not url and request is not None: + url = request.build_absolute_uri() + + distribute_links(links) + return coreapi.Document( + title=self.title, description=self.description, + url=url, content=links + ) + + # Method for generating the link layout.... + def get_keys(self, subpath, method, view): + """ + Return a list of keys that should be used to layout a link within + the schema document. + + /users/ ("users", "list"), ("users", "create") + /users/{pk}/ ("users", "read"), ("users", "update"), ("users", "delete") + /users/enabled/ ("users", "enabled") # custom viewset list action + /users/{pk}/star/ ("users", "star") # custom viewset detail action + /users/{pk}/groups/ ("users", "groups", "list"), ("users", "groups", "create") + /users/{pk}/groups/{pk}/ ("users", "groups", "read"), ("users", "groups", "update"), ("users", "groups", "delete") + """ + if hasattr(view, 'action'): + # Viewsets have explicitly named actions. + action = view.action + else: + # Views have no associated action, so we determine one from the method. + if is_list_view(subpath, method, view): + action = 'list' + else: + action = self.default_mapping[method.lower()] + + named_path_components = [ + component for component + in subpath.strip('/').split('/') + if '{' not in component + ] + + if is_custom_action(action): + # Custom action, eg "/users/{pk}/activate/", "/users/active/" + mapped_methods = { + # Don't count head mapping, e.g. not part of the schema + method for method in view.action_map if method != 'head' + } + if len(mapped_methods) > 1: + action = self.default_mapping[method.lower()] + if action in self.coerce_method_names: + action = self.coerce_method_names[action] + return named_path_components + [action] + else: + return named_path_components[:-1] + [action] + + if action in self.coerce_method_names: + action = self.coerce_method_names[action] + + # Default action, eg "/users/", "/users/{pk}/" + return named_path_components + [action] + + def determine_path_prefix(self, paths): + """ + Given a list of all paths, return the common prefix which should be + discounted when generating a schema structure. + + This will be the longest common string that does not include that last + component of the URL, or the last component before a path parameter. + + For example: + + /api/v1/users/ + /api/v1/users/{pk}/ + + The path prefix is '/api/v1' + """ + prefixes = [] + for path in paths: + components = path.strip('/').split('/') + initial_components = [] + for component in components: + if '{' in component: + break + initial_components.append(component) + prefix = '/'.join(initial_components[:-1]) + if not prefix: + # We can just break early in the case that there's at least + # one URL that doesn't have a path prefix. + return '/' + prefixes.append('/' + prefix + '/') + return common_path(prefixes) + +# View Inspectors # + + +def field_to_schema(field): + title = force_str(field.label) if field.label else '' + description = force_str(field.help_text) if field.help_text else '' + + if isinstance(field, (serializers.ListSerializer, serializers.ListField)): + child_schema = field_to_schema(field.child) + return coreschema.Array( + items=child_schema, + title=title, + description=description + ) + elif isinstance(field, serializers.DictField): + return coreschema.Object( + title=title, + description=description + ) + elif isinstance(field, serializers.Serializer): + return coreschema.Object( + properties={ + key: field_to_schema(value) + for key, value + in field.fields.items() + }, + title=title, + description=description + ) + elif isinstance(field, serializers.ManyRelatedField): + related_field_schema = field_to_schema(field.child_relation) + + return coreschema.Array( + items=related_field_schema, + title=title, + description=description + ) + elif isinstance(field, serializers.PrimaryKeyRelatedField): + schema_cls = coreschema.String + model = getattr(field.queryset, 'model', None) + if model is not None: + model_field = model._meta.pk + if isinstance(model_field, models.AutoField): + schema_cls = coreschema.Integer + return schema_cls(title=title, description=description) + elif isinstance(field, serializers.RelatedField): + return coreschema.String(title=title, description=description) + elif isinstance(field, serializers.MultipleChoiceField): + return coreschema.Array( + items=coreschema.Enum(enum=list(field.choices)), + title=title, + description=description + ) + elif isinstance(field, serializers.ChoiceField): + return coreschema.Enum( + enum=list(field.choices), + title=title, + description=description + ) + elif isinstance(field, serializers.BooleanField): + return coreschema.Boolean(title=title, description=description) + elif isinstance(field, (serializers.DecimalField, serializers.FloatField)): + return coreschema.Number(title=title, description=description) + elif isinstance(field, serializers.IntegerField): + return coreschema.Integer(title=title, description=description) + elif isinstance(field, serializers.DateField): + return coreschema.String( + title=title, + description=description, + format='date' + ) + elif isinstance(field, serializers.DateTimeField): + return coreschema.String( + title=title, + description=description, + format='date-time' + ) + elif isinstance(field, serializers.JSONField): + return coreschema.Object(title=title, description=description) + + if field.style.get('base_template') == 'textarea.html': + return coreschema.String( + title=title, + description=description, + format='textarea' + ) + + return coreschema.String(title=title, description=description) + + +class AutoSchema(ViewInspector): + """ + Default inspector for APIView + + Responsible for per-view introspection and schema generation. + """ + def __init__(self, manual_fields=None): + """ + Parameters: + + * `manual_fields`: list of `coreapi.Field` instances that + will be added to auto-generated fields, overwriting on `Field.name` + """ + super().__init__() + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + + if manual_fields is None: + manual_fields = [] + self._manual_fields = manual_fields + + def get_link(self, path, method, base_url): + """ + Generate `coreapi.Link` for self.view, path and method. + + This is the main _public_ access point. + + Parameters: + + * path: Route path for view from URLConf. + * method: The HTTP request method. + * base_url: The project "mount point" as given to SchemaGenerator + """ + fields = self.get_path_fields(path, method) + fields += self.get_serializer_fields(path, method) + fields += self.get_pagination_fields(path, method) + fields += self.get_filter_fields(path, method) + + manual_fields = self.get_manual_fields(path, method) + fields = self.update_fields(fields, manual_fields) + + if fields and any([field.location in ('form', 'body') for field in fields]): + encoding = self.get_encoding(path, method) + else: + encoding = None + + description = self.get_description(path, method) + + if base_url and path.startswith('/'): + path = path[1:] + + return coreapi.Link( + url=parse.urljoin(base_url, path), + action=method.lower(), + encoding=encoding, + fields=fields, + description=description + ) + + def get_path_fields(self, path, method): + """ + Return a list of `coreapi.Field` instances corresponding to any + templated path variables. + """ + view = self.view + model = getattr(getattr(view, 'queryset', None), 'model', None) + fields = [] + + for variable in uritemplate.variables(path): + title = '' + description = '' + schema_cls = coreschema.String + kwargs = {} + if model is not None: + # Attempt to infer a field description if possible. + try: + model_field = model._meta.get_field(variable) + except Exception: + model_field = None + + if model_field is not None and model_field.verbose_name: + title = force_str(model_field.verbose_name) + + if model_field is not None and model_field.help_text: + description = force_str(model_field.help_text) + elif model_field is not None and model_field.primary_key: + description = get_pk_description(model, model_field) + + if hasattr(view, 'lookup_value_regex') and view.lookup_field == variable: + kwargs['pattern'] = view.lookup_value_regex + elif isinstance(model_field, models.AutoField): + schema_cls = coreschema.Integer + + field = coreapi.Field( + name=variable, + location='path', + required=True, + schema=schema_cls(title=title, description=description, **kwargs) + ) + fields.append(field) + + return fields + + def get_serializer_fields(self, path, method): + """ + Return a list of `coreapi.Field` instances corresponding to any + request body input, as determined by the serializer class. + """ + view = self.view + + if method not in ('PUT', 'PATCH', 'POST'): + return [] + + if not hasattr(view, 'get_serializer'): + return [] + + try: + serializer = view.get_serializer() + except exceptions.APIException: + serializer = None + warnings.warn('{}.get_serializer() raised an exception during ' + 'schema generation. Serializer fields will not be ' + 'generated for {} {}.' + .format(view.__class__.__name__, method, path)) + + if isinstance(serializer, serializers.ListSerializer): + return [ + coreapi.Field( + name='data', + location='body', + required=True, + schema=coreschema.Array() + ) + ] + + if not isinstance(serializer, serializers.Serializer): + return [] + + fields = [] + for field in serializer.fields.values(): + if field.read_only or isinstance(field, serializers.HiddenField): + continue + + required = field.required and method != 'PATCH' + field = coreapi.Field( + name=field.field_name, + location='form', + required=required, + schema=field_to_schema(field) + ) + fields.append(field) + + return fields + + def get_pagination_fields(self, path, method): + view = self.view + + if not is_list_view(path, method, view): + return [] + + pagination = getattr(view, 'pagination_class', None) + if not pagination: + return [] + + paginator = view.pagination_class() + return paginator.get_schema_fields(view) + + def _allows_filters(self, path, method): + """ + Determine whether to include filter Fields in schema. + + Default implementation looks for ModelViewSet or GenericAPIView + actions/methods that cause filtering on the default implementation. + + Override to adjust behaviour for your view. + + Note: Introduced in v3.7: Initially "private" (i.e. with leading underscore) + to allow changes based on user experience. + """ + if getattr(self.view, 'filter_backends', None) is None: + return False + + if hasattr(self.view, 'action'): + return self.view.action in ["list", "retrieve", "update", "partial_update", "destroy"] + + return method.lower() in ["get", "put", "patch", "delete"] + + def get_filter_fields(self, path, method): + if not self._allows_filters(path, method): + return [] + + fields = [] + for filter_backend in self.view.filter_backends: + fields += filter_backend().get_schema_fields(self.view) + return fields + + def get_manual_fields(self, path, method): + return self._manual_fields + + @staticmethod + def update_fields(fields, update_with): + """ + Update list of coreapi.Field instances, overwriting on `Field.name`. + + Utility function to handle replacing coreapi.Field fields + from a list by name. Used to handle `manual_fields`. + + Parameters: + + * `fields`: list of `coreapi.Field` instances to update + * `update_with: list of `coreapi.Field` instances to add or replace. + """ + if not update_with: + return fields + + by_name = {f.name: f for f in fields} + for f in update_with: + by_name[f.name] = f + fields = list(by_name.values()) + return fields + + def get_encoding(self, path, method): + """ + Return the 'encoding' parameter to use for a given endpoint. + """ + view = self.view + + # Core API supports the following request encodings over HTTP... + supported_media_types = { + 'application/json', + 'application/x-www-form-urlencoded', + 'multipart/form-data', + } + parser_classes = getattr(view, 'parser_classes', []) + for parser_class in parser_classes: + media_type = getattr(parser_class, 'media_type', None) + if media_type in supported_media_types: + return media_type + # Raw binary uploads are supported with "application/octet-stream" + if media_type == '*/*': + return 'application/octet-stream' + + return None + + +class ManualSchema(ViewInspector): + """ + Allows providing a list of coreapi.Fields, + plus an optional description. + """ + def __init__(self, fields, description='', encoding=None): + """ + Parameters: + + * `fields`: list of `coreapi.Field` instances. + * `description`: String description for view. Optional. + """ + super().__init__() + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + + assert all(isinstance(f, coreapi.Field) for f in fields), "`fields` must be a list of coreapi.Field instances" + self._fields = fields + self._description = description + self._encoding = encoding + + def get_link(self, path, method, base_url): + + if base_url and path.startswith('/'): + path = path[1:] + + return coreapi.Link( + url=parse.urljoin(base_url, path), + action=method.lower(), + encoding=self._encoding, + fields=self._fields, + description=self._description + ) + + +def is_enabled(): + """Is CoreAPI Mode enabled?""" + if coreapi is not None: + warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.17', RemovedInDRF317Warning) + return issubclass(api_settings.DEFAULT_SCHEMA_CLASS, AutoSchema) diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/generators.py b/env/lib/python3.12/site-packages/rest_framework/schemas/generators.py new file mode 100644 index 00000000..f59e25c2 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/schemas/generators.py @@ -0,0 +1,239 @@ +""" +generators.py # Top-down schema generation + +See schemas.__init__.py for package overview. +""" +import re +from importlib import import_module + +from django.conf import settings +from django.contrib.admindocs.views import simplify_regex +from django.core.exceptions import PermissionDenied +from django.http import Http404 +from django.urls import URLPattern, URLResolver + +from rest_framework import exceptions +from rest_framework.request import clone_request +from rest_framework.settings import api_settings +from rest_framework.utils.model_meta import _get_pk + + +def get_pk_name(model): + meta = model._meta.concrete_model._meta + return _get_pk(meta).name + + +def is_api_view(callback): + """ + Return `True` if the given view callback is a REST framework view/viewset. + """ + # Avoid import cycle on APIView + from rest_framework.views import APIView + cls = getattr(callback, 'cls', None) + return (cls is not None) and issubclass(cls, APIView) + + +def endpoint_ordering(endpoint): + path, method, callback = endpoint + method_priority = { + 'GET': 0, + 'POST': 1, + 'PUT': 2, + 'PATCH': 3, + 'DELETE': 4 + }.get(method, 5) + return (method_priority,) + + +_PATH_PARAMETER_COMPONENT_RE = re.compile( + r'<(?:(?P[^>:]+):)?(?P\w+)>' +) + + +class EndpointEnumerator: + """ + A class to determine the available API endpoints that a project exposes. + """ + def __init__(self, patterns=None, urlconf=None): + if patterns is None: + if urlconf is None: + # Use the default Django URL conf + urlconf = settings.ROOT_URLCONF + + # Load the given URLconf module + if isinstance(urlconf, str): + urls = import_module(urlconf) + else: + urls = urlconf + patterns = urls.urlpatterns + + self.patterns = patterns + + def get_api_endpoints(self, patterns=None, prefix=''): + """ + Return a list of all available API endpoints by inspecting the URL conf. + """ + if patterns is None: + patterns = self.patterns + + api_endpoints = [] + + for pattern in patterns: + path_regex = prefix + str(pattern.pattern) + if isinstance(pattern, URLPattern): + path = self.get_path_from_regex(path_regex) + callback = pattern.callback + if self.should_include_endpoint(path, callback): + for method in self.get_allowed_methods(callback): + endpoint = (path, method, callback) + api_endpoints.append(endpoint) + + elif isinstance(pattern, URLResolver): + nested_endpoints = self.get_api_endpoints( + patterns=pattern.url_patterns, + prefix=path_regex + ) + api_endpoints.extend(nested_endpoints) + + return sorted(api_endpoints, key=endpoint_ordering) + + def get_path_from_regex(self, path_regex): + """ + Given a URL conf regex, return a URI template string. + """ + # ???: Would it be feasible to adjust this such that we generate the + # path, plus the kwargs, plus the type from the converter, such that we + # could feed that straight into the parameter schema object? + + path = simplify_regex(path_regex) + + # Strip Django 2.0 converters as they are incompatible with uritemplate format + return re.sub(_PATH_PARAMETER_COMPONENT_RE, r'{\g}', path) + + def should_include_endpoint(self, path, callback): + """ + Return `True` if the given endpoint should be included. + """ + if not is_api_view(callback): + return False # Ignore anything except REST framework views. + + if callback.cls.schema is None: + return False + + if 'schema' in callback.initkwargs: + if callback.initkwargs['schema'] is None: + return False + + if path.endswith('.{format}') or path.endswith('.{format}/'): + return False # Ignore .json style URLs. + + return True + + def get_allowed_methods(self, callback): + """ + Return a list of the valid HTTP methods for this endpoint. + """ + if hasattr(callback, 'actions'): + actions = set(callback.actions) + http_method_names = set(callback.cls.http_method_names) + methods = [method.upper() for method in actions & http_method_names] + else: + methods = callback.cls().allowed_methods + + return [method for method in methods if method not in ('OPTIONS', 'HEAD')] + + +class BaseSchemaGenerator: + endpoint_inspector_cls = EndpointEnumerator + + # 'pk' isn't great as an externally exposed name for an identifier, + # so by default we prefer to use the actual model field name for schemas. + # Set by 'SCHEMA_COERCE_PATH_PK'. + coerce_path_pk = None + + def __init__(self, title=None, url=None, description=None, patterns=None, urlconf=None, version=None): + if url and not url.endswith('/'): + url += '/' + + self.coerce_path_pk = api_settings.SCHEMA_COERCE_PATH_PK + + self.patterns = patterns + self.urlconf = urlconf + self.title = title + self.description = description + self.version = version + self.url = url + self.endpoints = None + + def _initialise_endpoints(self): + if self.endpoints is None: + inspector = self.endpoint_inspector_cls(self.patterns, self.urlconf) + self.endpoints = inspector.get_api_endpoints() + + def _get_paths_and_endpoints(self, request): + """ + Generate (path, method, view) given (path, method, callback) for paths. + """ + paths = [] + view_endpoints = [] + for path, method, callback in self.endpoints: + view = self.create_view(callback, method, request) + path = self.coerce_path(path, method, view) + paths.append(path) + view_endpoints.append((path, method, view)) + + return paths, view_endpoints + + def create_view(self, callback, method, request=None): + """ + Given a callback, return an actual view instance. + """ + view = callback.cls(**getattr(callback, 'initkwargs', {})) + view.args = () + view.kwargs = {} + view.format_kwarg = None + view.request = None + view.action_map = getattr(callback, 'actions', None) + + actions = getattr(callback, 'actions', None) + if actions is not None: + if method == 'OPTIONS': + view.action = 'metadata' + else: + view.action = actions.get(method.lower()) + + if request is not None: + view.request = clone_request(request, method) + + return view + + def coerce_path(self, path, method, view): + """ + Coerce {pk} path arguments into the name of the model field, + where possible. This is cleaner for an external representation. + (Ie. "this is an identifier", not "this is a database primary key") + """ + if not self.coerce_path_pk or '{pk}' not in path: + return path + model = getattr(getattr(view, 'queryset', None), 'model', None) + if model: + field_name = get_pk_name(model) + else: + field_name = 'id' + return path.replace('{pk}', '{%s}' % field_name) + + def get_schema(self, request=None, public=False): + raise NotImplementedError(".get_schema() must be implemented in subclasses.") + + def has_view_permissions(self, path, method, view): + """ + Return `True` if the incoming request has the correct view permissions. + """ + if view.request is None: + return True + + try: + view.check_permissions(view.request) + except (exceptions.APIException, Http404, PermissionDenied): + return False + return True diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/inspectors.py b/env/lib/python3.12/site-packages/rest_framework/schemas/inspectors.py new file mode 100644 index 00000000..cb880e79 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/schemas/inspectors.py @@ -0,0 +1,125 @@ +""" +inspectors.py # Per-endpoint view introspection + +See schemas.__init__.py for package overview. +""" +import re +from weakref import WeakKeyDictionary + +from django.utils.encoding import smart_str + +from rest_framework.settings import api_settings +from rest_framework.utils import formatting + + +class ViewInspector: + """ + Descriptor class on APIView. + + Provide subclass for per-view schema generation + """ + + # Used in _get_description_section() + header_regex = re.compile('^[a-zA-Z][0-9A-Za-z_]*:') + + def __init__(self): + self.instance_schemas = WeakKeyDictionary() + + def __get__(self, instance, owner): + """ + Enables `ViewInspector` as a Python _Descriptor_. + + This is how `view.schema` knows about `view`. + + `__get__` is called when the descriptor is accessed on the owner. + (That will be when view.schema is called in our case.) + + `owner` is always the owner class. (An APIView, or subclass for us.) + `instance` is the view instance or `None` if accessed from the class, + rather than an instance. + + See: https://docs.python.org/3/howto/descriptor.html for info on + descriptor usage. + """ + if instance in self.instance_schemas: + return self.instance_schemas[instance] + + self.view = instance + return self + + def __set__(self, instance, other): + self.instance_schemas[instance] = other + if other is not None: + other.view = instance + + @property + def view(self): + """View property.""" + assert self._view is not None, ( + "Schema generation REQUIRES a view instance. (Hint: you accessed " + "`schema` from the view class rather than an instance.)" + ) + return self._view + + @view.setter + def view(self, value): + self._view = value + + @view.deleter + def view(self): + self._view = None + + def get_description(self, path, method): + """ + Determine a path description. + + This will be based on the method docstring if one exists, + or else the class docstring. + """ + view = self.view + + method_name = getattr(view, 'action', method.lower()) + method_docstring = getattr(view, method_name, None).__doc__ + if method_docstring: + # An explicit docstring on the method or action. + return self._get_description_section(view, method.lower(), formatting.dedent(smart_str(method_docstring))) + else: + return self._get_description_section(view, getattr(view, 'action', method.lower()), + view.get_view_description()) + + def _get_description_section(self, view, header, description): + lines = description.splitlines() + current_section = '' + sections = {'': ''} + + for line in lines: + if self.header_regex.match(line): + current_section, separator, lead = line.partition(':') + sections[current_section] = lead.strip() + else: + sections[current_section] += '\n' + line + + # TODO: SCHEMA_COERCE_METHOD_NAMES appears here and in `SchemaGenerator.get_keys` + coerce_method_names = api_settings.SCHEMA_COERCE_METHOD_NAMES + if header in sections: + return sections[header].strip() + if header in coerce_method_names: + if coerce_method_names[header] in sections: + return sections[coerce_method_names[header]].strip() + return sections[''].strip() + + +class DefaultSchema(ViewInspector): + """Allows overriding AutoSchema using DEFAULT_SCHEMA_CLASS setting""" + def __get__(self, instance, owner): + result = super().__get__(instance, owner) + if not isinstance(result, DefaultSchema): + return result + + inspector_class = api_settings.DEFAULT_SCHEMA_CLASS + assert issubclass(inspector_class, ViewInspector), ( + "DEFAULT_SCHEMA_CLASS must be set to a ViewInspector (usually an AutoSchema) subclass" + ) + inspector = inspector_class() + inspector.view = instance + return inspector diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/openapi.py b/env/lib/python3.12/site-packages/rest_framework/schemas/openapi.py new file mode 100644 index 00000000..f35106fe --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/schemas/openapi.py @@ -0,0 +1,731 @@ +import re +import warnings +from decimal import Decimal +from operator import attrgetter +from urllib.parse import urljoin + +from django.core.validators import ( + DecimalValidator, EmailValidator, MaxLengthValidator, MaxValueValidator, + MinLengthValidator, MinValueValidator, RegexValidator, URLValidator +) +from django.db import models +from django.utils.encoding import force_str + +from rest_framework import ( + RemovedInDRF316Warning, exceptions, renderers, serializers +) +from rest_framework.compat import inflection, uritemplate +from rest_framework.fields import _UnvalidatedField, empty +from rest_framework.settings import api_settings + +from .generators import BaseSchemaGenerator +from .inspectors import ViewInspector +from .utils import get_pk_description, is_list_view + + +class SchemaGenerator(BaseSchemaGenerator): + + def get_info(self): + # Title and version are required by openapi specification 3.x + info = { + 'title': self.title or '', + 'version': self.version or '' + } + + if self.description is not None: + info['description'] = self.description + + return info + + def check_duplicate_operation_id(self, paths): + ids = {} + for route in paths: + for method in paths[route]: + if 'operationId' not in paths[route][method]: + continue + operation_id = paths[route][method]['operationId'] + if operation_id in ids: + warnings.warn( + 'You have a duplicated operationId in your OpenAPI schema: {operation_id}\n' + '\tRoute: {route1}, Method: {method1}\n' + '\tRoute: {route2}, Method: {method2}\n' + '\tAn operationId has to be unique across your schema. Your schema may not work in other tools.' + .format( + route1=ids[operation_id]['route'], + method1=ids[operation_id]['method'], + route2=route, + method2=method, + operation_id=operation_id + ) + ) + ids[operation_id] = { + 'route': route, + 'method': method + } + + def get_schema(self, request=None, public=False): + """ + Generate a OpenAPI schema. + """ + self._initialise_endpoints() + components_schemas = {} + + # Iterate endpoints generating per method path operations. + paths = {} + _, view_endpoints = self._get_paths_and_endpoints(None if public else request) + for path, method, view in view_endpoints: + if not self.has_view_permissions(path, method, view): + continue + + operation = view.schema.get_operation(path, method) + components = view.schema.get_components(path, method) + for k in components.keys(): + if k not in components_schemas: + continue + if components_schemas[k] == components[k]: + continue + warnings.warn('Schema component "{}" has been overridden with a different value.'.format(k)) + + components_schemas.update(components) + + # Normalise path for any provided mount url. + if path.startswith('/'): + path = path[1:] + path = urljoin(self.url or '/', path) + + paths.setdefault(path, {}) + paths[path][method.lower()] = operation + + self.check_duplicate_operation_id(paths) + + # Compile final schema. + schema = { + 'openapi': '3.0.2', + 'info': self.get_info(), + 'paths': paths, + } + + if len(components_schemas) > 0: + schema['components'] = { + 'schemas': components_schemas + } + + return schema + +# View Inspectors + + +class AutoSchema(ViewInspector): + + def __init__(self, tags=None, operation_id_base=None, component_name=None): + """ + :param operation_id_base: user-defined name in operationId. If empty, it will be deducted from the Model/Serializer/View name. + :param component_name: user-defined component's name. If empty, it will be deducted from the Serializer's class name. + """ + if tags and not all(isinstance(tag, str) for tag in tags): + raise ValueError('tags must be a list or tuple of string.') + self._tags = tags + self.operation_id_base = operation_id_base + self.component_name = component_name + super().__init__() + + request_media_types = [] + response_media_types = [] + + method_mapping = { + 'get': 'retrieve', + 'post': 'create', + 'put': 'update', + 'patch': 'partialUpdate', + 'delete': 'destroy', + } + + def get_operation(self, path, method): + operation = {} + + operation['operationId'] = self.get_operation_id(path, method) + operation['description'] = self.get_description(path, method) + + parameters = [] + parameters += self.get_path_parameters(path, method) + parameters += self.get_pagination_parameters(path, method) + parameters += self.get_filter_parameters(path, method) + operation['parameters'] = parameters + + request_body = self.get_request_body(path, method) + if request_body: + operation['requestBody'] = request_body + operation['responses'] = self.get_responses(path, method) + operation['tags'] = self.get_tags(path, method) + + return operation + + def get_component_name(self, serializer): + """ + Compute the component's name from the serializer. + Raise an exception if the serializer's class name is "Serializer" (case-insensitive). + """ + if self.component_name is not None: + return self.component_name + + # use the serializer's class name as the component name. + component_name = serializer.__class__.__name__ + # We remove the "serializer" string from the class name. + pattern = re.compile("serializer", re.IGNORECASE) + component_name = pattern.sub("", component_name) + + if component_name == "": + raise Exception( + '"{}" is an invalid class name for schema generation. ' + 'Serializer\'s class name should be unique and explicit. e.g. "ItemSerializer"' + .format(serializer.__class__.__name__) + ) + + return component_name + + def get_components(self, path, method): + """ + Return components with their properties from the serializer. + """ + + if method.lower() == 'delete': + return {} + + request_serializer = self.get_request_serializer(path, method) + response_serializer = self.get_response_serializer(path, method) + + components = {} + + if isinstance(request_serializer, serializers.Serializer): + component_name = self.get_component_name(request_serializer) + content = self.map_serializer(request_serializer) + components.setdefault(component_name, content) + + if isinstance(response_serializer, serializers.Serializer): + component_name = self.get_component_name(response_serializer) + content = self.map_serializer(response_serializer) + components.setdefault(component_name, content) + + return components + + def _to_camel_case(self, snake_str): + components = snake_str.split('_') + # We capitalize the first letter of each component except the first one + # with the 'title' method and join them together. + return components[0] + ''.join(x.title() for x in components[1:]) + + def get_operation_id_base(self, path, method, action): + """ + Compute the base part for operation ID from the model, serializer or view name. + """ + model = getattr(getattr(self.view, 'queryset', None), 'model', None) + + if self.operation_id_base is not None: + name = self.operation_id_base + + # Try to deduce the ID from the view's model + elif model is not None: + name = model.__name__ + + # Try with the serializer class name + elif self.get_serializer(path, method) is not None: + name = self.get_serializer(path, method).__class__.__name__ + if name.endswith('Serializer'): + name = name[:-10] + + # Fallback to the view name + else: + name = self.view.__class__.__name__ + if name.endswith('APIView'): + name = name[:-7] + elif name.endswith('View'): + name = name[:-4] + + # Due to camel-casing of classes and `action` being lowercase, apply title in order to find if action truly + # comes at the end of the name + if name.endswith(action.title()): # ListView, UpdateAPIView, ThingDelete ... + name = name[:-len(action)] + + if action == 'list': + assert inflection, '`inflection` must be installed for OpenAPI schema support.' + name = inflection.pluralize(name) + + return name + + def get_operation_id(self, path, method): + """ + Compute an operation ID from the view type and get_operation_id_base method. + """ + method_name = getattr(self.view, 'action', method.lower()) + if is_list_view(path, method, self.view): + action = 'list' + elif method_name not in self.method_mapping: + action = self._to_camel_case(method_name) + else: + action = self.method_mapping[method.lower()] + + name = self.get_operation_id_base(path, method, action) + + return action + name + + def get_path_parameters(self, path, method): + """ + Return a list of parameters from templated path variables. + """ + assert uritemplate, '`uritemplate` must be installed for OpenAPI schema support.' + + model = getattr(getattr(self.view, 'queryset', None), 'model', None) + parameters = [] + + for variable in uritemplate.variables(path): + description = '' + if model is not None: # TODO: test this. + # Attempt to infer a field description if possible. + try: + model_field = model._meta.get_field(variable) + except Exception: + model_field = None + + if model_field is not None and model_field.help_text: + description = force_str(model_field.help_text) + elif model_field is not None and model_field.primary_key: + description = get_pk_description(model, model_field) + + parameter = { + "name": variable, + "in": "path", + "required": True, + "description": description, + 'schema': { + 'type': 'string', # TODO: integer, pattern, ... + }, + } + parameters.append(parameter) + + return parameters + + def get_filter_parameters(self, path, method): + if not self.allows_filters(path, method): + return [] + parameters = [] + for filter_backend in self.view.filter_backends: + parameters += filter_backend().get_schema_operation_parameters(self.view) + return parameters + + def allows_filters(self, path, method): + """ + Determine whether to include filter Fields in schema. + + Default implementation looks for ModelViewSet or GenericAPIView + actions/methods that cause filtering on the default implementation. + """ + if getattr(self.view, 'filter_backends', None) is None: + return False + if hasattr(self.view, 'action'): + return self.view.action in ["list", "retrieve", "update", "partial_update", "destroy"] + return method.lower() in ["get", "put", "patch", "delete"] + + def get_pagination_parameters(self, path, method): + view = self.view + + if not is_list_view(path, method, view): + return [] + + paginator = self.get_paginator() + if not paginator: + return [] + + return paginator.get_schema_operation_parameters(view) + + def map_choicefield(self, field): + choices = list(dict.fromkeys(field.choices)) # preserve order and remove duplicates + if all(isinstance(choice, bool) for choice in choices): + type = 'boolean' + elif all(isinstance(choice, int) for choice in choices): + type = 'integer' + elif all(isinstance(choice, (int, float, Decimal)) for choice in choices): # `number` includes `integer` + # Ref: https://tools.ietf.org/html/draft-wright-json-schema-validation-00#section-5.21 + type = 'number' + elif all(isinstance(choice, str) for choice in choices): + type = 'string' + else: + type = None + + mapping = { + # The value of `enum` keyword MUST be an array and SHOULD be unique. + # Ref: https://tools.ietf.org/html/draft-wright-json-schema-validation-00#section-5.20 + 'enum': choices + } + + # If We figured out `type` then and only then we should set it. It must be a string. + # Ref: https://swagger.io/docs/specification/data-models/data-types/#mixed-type + # It is optional but it can not be null. + # Ref: https://tools.ietf.org/html/draft-wright-json-schema-validation-00#section-5.21 + if type: + mapping['type'] = type + return mapping + + def map_field(self, field): + + # Nested Serializers, `many` or not. + if isinstance(field, serializers.ListSerializer): + return { + 'type': 'array', + 'items': self.map_serializer(field.child) + } + if isinstance(field, serializers.Serializer): + data = self.map_serializer(field) + data['type'] = 'object' + return data + + # Related fields. + if isinstance(field, serializers.ManyRelatedField): + return { + 'type': 'array', + 'items': self.map_field(field.child_relation) + } + if isinstance(field, serializers.PrimaryKeyRelatedField): + if getattr(field, "pk_field", False): + return self.map_field(field=field.pk_field) + model = getattr(field.queryset, 'model', None) + if model is not None: + model_field = model._meta.pk + if isinstance(model_field, models.AutoField): + return {'type': 'integer'} + + # ChoiceFields (single and multiple). + # Q: + # - Is 'type' required? + # - can we determine the TYPE of a choicefield? + if isinstance(field, serializers.MultipleChoiceField): + return { + 'type': 'array', + 'items': self.map_choicefield(field) + } + + if isinstance(field, serializers.ChoiceField): + return self.map_choicefield(field) + + # ListField. + if isinstance(field, serializers.ListField): + mapping = { + 'type': 'array', + 'items': {}, + } + if not isinstance(field.child, _UnvalidatedField): + mapping['items'] = self.map_field(field.child) + return mapping + + # DateField and DateTimeField type is string + if isinstance(field, serializers.DateField): + return { + 'type': 'string', + 'format': 'date', + } + + if isinstance(field, serializers.DateTimeField): + return { + 'type': 'string', + 'format': 'date-time', + } + + # "Formats such as "email", "uuid", and so on, MAY be used even though undefined by this specification." + # see: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#data-types + # see also: https://swagger.io/docs/specification/data-models/data-types/#string + if isinstance(field, serializers.EmailField): + return { + 'type': 'string', + 'format': 'email' + } + + if isinstance(field, serializers.URLField): + return { + 'type': 'string', + 'format': 'uri' + } + + if isinstance(field, serializers.UUIDField): + return { + 'type': 'string', + 'format': 'uuid' + } + + if isinstance(field, serializers.IPAddressField): + content = { + 'type': 'string', + } + if field.protocol != 'both': + content['format'] = field.protocol + return content + + if isinstance(field, serializers.DecimalField): + if getattr(field, 'coerce_to_string', api_settings.COERCE_DECIMAL_TO_STRING): + content = { + 'type': 'string', + 'format': 'decimal', + } + else: + content = { + 'type': 'number' + } + + if field.decimal_places: + content['multipleOf'] = float('.' + (field.decimal_places - 1) * '0' + '1') + if field.max_whole_digits: + content['maximum'] = int(field.max_whole_digits * '9') + 1 + content['minimum'] = -content['maximum'] + self._map_min_max(field, content) + return content + + if isinstance(field, serializers.FloatField): + content = { + 'type': 'number', + } + self._map_min_max(field, content) + return content + + if isinstance(field, serializers.IntegerField): + content = { + 'type': 'integer' + } + self._map_min_max(field, content) + # 2147483647 is max for int32_size, so we use int64 for format + if int(content.get('maximum', 0)) > 2147483647 or int(content.get('minimum', 0)) > 2147483647: + content['format'] = 'int64' + return content + + if isinstance(field, serializers.FileField): + return { + 'type': 'string', + 'format': 'binary' + } + + # Simplest cases, default to 'string' type: + FIELD_CLASS_SCHEMA_TYPE = { + serializers.BooleanField: 'boolean', + serializers.JSONField: 'object', + serializers.DictField: 'object', + serializers.HStoreField: 'object', + } + return {'type': FIELD_CLASS_SCHEMA_TYPE.get(field.__class__, 'string')} + + def _map_min_max(self, field, content): + if field.max_value: + content['maximum'] = field.max_value + if field.min_value: + content['minimum'] = field.min_value + + def map_serializer(self, serializer): + # Assuming we have a valid serializer instance. + required = [] + properties = {} + + for field in serializer.fields.values(): + if isinstance(field, serializers.HiddenField): + continue + + if field.required and not serializer.partial: + required.append(self.get_field_name(field)) + + schema = self.map_field(field) + if field.read_only: + schema['readOnly'] = True + if field.write_only: + schema['writeOnly'] = True + if field.allow_null: + schema['nullable'] = True + if field.default is not None and field.default != empty and not callable(field.default): + schema['default'] = field.default + if field.help_text: + schema['description'] = str(field.help_text) + self.map_field_validators(field, schema) + + properties[self.get_field_name(field)] = schema + + result = { + 'type': 'object', + 'properties': properties + } + if required: + result['required'] = required + + return result + + def map_field_validators(self, field, schema): + """ + map field validators + """ + for v in field.validators: + # "Formats such as "email", "uuid", and so on, MAY be used even though undefined by this specification." + # https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#data-types + if isinstance(v, EmailValidator): + schema['format'] = 'email' + if isinstance(v, URLValidator): + schema['format'] = 'uri' + if isinstance(v, RegexValidator): + # In Python, the token \Z does what \z does in other engines. + # https://stackoverflow.com/questions/53283160 + schema['pattern'] = v.regex.pattern.replace('\\Z', '\\z') + elif isinstance(v, MaxLengthValidator): + attr_name = 'maxLength' + if isinstance(field, serializers.ListField): + attr_name = 'maxItems' + schema[attr_name] = v.limit_value + elif isinstance(v, MinLengthValidator): + attr_name = 'minLength' + if isinstance(field, serializers.ListField): + attr_name = 'minItems' + schema[attr_name] = v.limit_value + elif isinstance(v, MaxValueValidator): + schema['maximum'] = v.limit_value + elif isinstance(v, MinValueValidator): + schema['minimum'] = v.limit_value + elif isinstance(v, DecimalValidator) and \ + not getattr(field, 'coerce_to_string', api_settings.COERCE_DECIMAL_TO_STRING): + if v.decimal_places: + schema['multipleOf'] = float('.' + (v.decimal_places - 1) * '0' + '1') + if v.max_digits: + digits = v.max_digits + if v.decimal_places is not None and v.decimal_places > 0: + digits -= v.decimal_places + schema['maximum'] = int(digits * '9') + 1 + schema['minimum'] = -schema['maximum'] + + def get_field_name(self, field): + """ + Override this method if you want to change schema field name. + For example, convert snake_case field name to camelCase. + """ + return field.field_name + + def get_paginator(self): + pagination_class = getattr(self.view, 'pagination_class', None) + if pagination_class: + return pagination_class() + return None + + def map_parsers(self, path, method): + return list(map(attrgetter('media_type'), self.view.parser_classes)) + + def map_renderers(self, path, method): + media_types = [] + for renderer in self.view.renderer_classes: + # BrowsableAPIRenderer not relevant to OpenAPI spec + if issubclass(renderer, renderers.BrowsableAPIRenderer): + continue + media_types.append(renderer.media_type) + return media_types + + def get_serializer(self, path, method): + view = self.view + + if not hasattr(view, 'get_serializer'): + return None + + try: + return view.get_serializer() + except exceptions.APIException: + warnings.warn('{}.get_serializer() raised an exception during ' + 'schema generation. Serializer fields will not be ' + 'generated for {} {}.' + .format(view.__class__.__name__, method, path)) + return None + + def get_request_serializer(self, path, method): + """ + Override this method if your view uses a different serializer for + handling request body. + """ + return self.get_serializer(path, method) + + def get_response_serializer(self, path, method): + """ + Override this method if your view uses a different serializer for + populating response data. + """ + return self.get_serializer(path, method) + + def get_reference(self, serializer): + return {'$ref': '#/components/schemas/{}'.format(self.get_component_name(serializer))} + + def get_request_body(self, path, method): + if method not in ('PUT', 'PATCH', 'POST'): + return {} + + self.request_media_types = self.map_parsers(path, method) + + serializer = self.get_request_serializer(path, method) + + if not isinstance(serializer, serializers.Serializer): + item_schema = {} + else: + item_schema = self.get_reference(serializer) + + return { + 'content': { + ct: {'schema': item_schema} + for ct in self.request_media_types + } + } + + def get_responses(self, path, method): + if method == 'DELETE': + return { + '204': { + 'description': '' + } + } + + self.response_media_types = self.map_renderers(path, method) + + serializer = self.get_response_serializer(path, method) + + if not isinstance(serializer, serializers.Serializer): + item_schema = {} + else: + item_schema = self.get_reference(serializer) + + if is_list_view(path, method, self.view): + response_schema = { + 'type': 'array', + 'items': item_schema, + } + paginator = self.get_paginator() + if paginator: + response_schema = paginator.get_paginated_response_schema(response_schema) + else: + response_schema = item_schema + status_code = '201' if method == 'POST' else '200' + return { + status_code: { + 'content': { + ct: {'schema': response_schema} + for ct in self.response_media_types + }, + # description is a mandatory property, + # https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject + # TODO: put something meaningful into it + 'description': "" + } + } + + def get_tags(self, path, method): + # If user have specified tags, use them. + if self._tags: + return self._tags + + # First element of a specific path could be valid tag. This is a fallback solution. + # PUT, PATCH, GET(Retrieve), DELETE: /user_profile/{id}/ tags = [user-profile] + # POST, GET(List): /user_profile/ tags = [user-profile] + if path.startswith('/'): + path = path[1:] + + return [path.split('/')[0].replace('_', '-')] + + def _get_reference(self, serializer): + warnings.warn( + "Method `_get_reference()` has been renamed to `get_reference()`. " + "The old name will be removed in DRF v3.16.", + RemovedInDRF316Warning, stacklevel=2 + ) + return self.get_reference(serializer) diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/utils.py b/env/lib/python3.12/site-packages/rest_framework/schemas/utils.py new file mode 100644 index 00000000..60ed6982 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/schemas/utils.py @@ -0,0 +1,41 @@ +""" +utils.py # Shared helper functions + +See schemas.__init__.py for package overview. +""" +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from rest_framework.mixins import RetrieveModelMixin + + +def is_list_view(path, method, view): + """ + Return True if the given path/method appears to represent a list view. + """ + if hasattr(view, 'action'): + # Viewsets have an explicitly defined action, which we can inspect. + return view.action == 'list' + + if method.lower() != 'get': + return False + if isinstance(view, RetrieveModelMixin): + return False + path_components = path.strip('/').split('/') + if path_components and '{' in path_components[-1]: + return False + return True + + +def get_pk_description(model, model_field): + if isinstance(model_field, models.AutoField): + value_type = _('unique integer value') + elif isinstance(model_field, models.UUIDField): + value_type = _('UUID string') + else: + value_type = _('unique value') + + return _('A {value_type} identifying this {name}.').format( + value_type=value_type, + name=model._meta.verbose_name, + ) diff --git a/env/lib/python3.12/site-packages/rest_framework/schemas/views.py b/env/lib/python3.12/site-packages/rest_framework/schemas/views.py new file mode 100644 index 00000000..527a2323 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/schemas/views.py @@ -0,0 +1,48 @@ +""" +views.py # Houses `SchemaView`, `APIView` subclass. + +See schemas.__init__.py for package overview. +""" +from rest_framework import exceptions, renderers +from rest_framework.response import Response +from rest_framework.schemas import coreapi +from rest_framework.settings import api_settings +from rest_framework.views import APIView + + +class SchemaView(APIView): + _ignore_model_permissions = True + schema = None # exclude from schema + renderer_classes = None + schema_generator = None + public = False + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if self.renderer_classes is None: + if coreapi.is_enabled(): + self.renderer_classes = [ + renderers.CoreAPIOpenAPIRenderer, + renderers.CoreJSONRenderer + ] + else: + self.renderer_classes = [ + renderers.OpenAPIRenderer, + renderers.JSONOpenAPIRenderer, + ] + if renderers.BrowsableAPIRenderer in api_settings.DEFAULT_RENDERER_CLASSES: + self.renderer_classes += [renderers.BrowsableAPIRenderer] + + def get(self, request, *args, **kwargs): + schema = self.schema_generator.get_schema(request, self.public) + if schema is None: + raise exceptions.PermissionDenied() + return Response(schema) + + def handle_exception(self, exc): + # Schema renderers do not render exceptions, so re-perform content + # negotiation with default renderers. + self.renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + neg = self.perform_content_negotiation(self.request, force=True) + self.request.accepted_renderer, self.request.accepted_media_type = neg + return super().handle_exception(exc) diff --git a/env/lib/python3.12/site-packages/rest_framework/serializers.py b/env/lib/python3.12/site-packages/rest_framework/serializers.py new file mode 100644 index 00000000..b1b7b647 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/serializers.py @@ -0,0 +1,1701 @@ +""" +Serializers and ModelSerializers are similar to Forms and ModelForms. +Unlike forms, they are not constrained to dealing with HTML output, and +form encoded input. + +Serialization in REST framework is a two-phase process: + +1. Serializers marshal between complex types like model instances, and +python primitives. +2. The process of marshalling between python primitives and request and +response content is handled by parsers and renderers. +""" + +import contextlib +import copy +import inspect +import traceback +from collections import defaultdict +from collections.abc import Mapping + +from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.exceptions import ValidationError as DjangoValidationError +from django.db import models +from django.db.models.fields import Field as DjangoModelField +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +from rest_framework.compat import postgres_fields +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.fields import get_error_detail +from rest_framework.settings import api_settings +from rest_framework.utils import html, model_meta, representation +from rest_framework.utils.field_mapping import ( + ClassLookupDict, get_field_kwargs, get_nested_relation_kwargs, + get_relation_kwargs, get_url_kwargs +) +from rest_framework.utils.serializer_helpers import ( + BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict, + ReturnList +) +from rest_framework.validators import ( + UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator, + UniqueTogetherValidator +) + +# Note: We do the following so that users of the framework can use this style: +# +# example_field = serializers.CharField(...) +# +# This helps keep the separation between model fields, form fields, and +# serializer fields more explicit. +from rest_framework.fields import ( # NOQA # isort:skip + BooleanField, CharField, ChoiceField, DateField, DateTimeField, DecimalField, + DictField, DurationField, EmailField, Field, FileField, FilePathField, FloatField, + HiddenField, HStoreField, IPAddressField, ImageField, IntegerField, JSONField, + ListField, ModelField, MultipleChoiceField, ReadOnlyField, + RegexField, SerializerMethodField, SlugField, TimeField, URLField, UUIDField, +) +from rest_framework.relations import ( # NOQA # isort:skip + HyperlinkedIdentityField, HyperlinkedRelatedField, ManyRelatedField, + PrimaryKeyRelatedField, RelatedField, SlugRelatedField, StringRelatedField, +) + +# Non-field imports, but public API +from rest_framework.fields import ( # NOQA # isort:skip + CreateOnlyDefault, CurrentUserDefault, SkipField, empty +) +from rest_framework.relations import Hyperlink, PKOnlyObject # NOQA # isort:skip + +# We assume that 'validators' are intended for the child serializer, +# rather than the parent serializer. +LIST_SERIALIZER_KWARGS = ( + 'read_only', 'write_only', 'required', 'default', 'initial', 'source', + 'label', 'help_text', 'style', 'error_messages', 'allow_empty', + 'instance', 'data', 'partial', 'context', 'allow_null', + 'max_length', 'min_length' +) +LIST_SERIALIZER_KWARGS_REMOVE = ('allow_empty', 'min_length', 'max_length') + +ALL_FIELDS = '__all__' + + +# BaseSerializer +# -------------- + +class BaseSerializer(Field): + """ + The BaseSerializer class provides a minimal class which may be used + for writing custom serializer implementations. + + Note that we strongly restrict the ordering of operations/properties + that may be used on the serializer in order to enforce correct usage. + + In particular, if a `data=` argument is passed then: + + .is_valid() - Available. + .initial_data - Available. + .validated_data - Only available after calling `is_valid()` + .errors - Only available after calling `is_valid()` + .data - Only available after calling `is_valid()` + + If a `data=` argument is not passed then: + + .is_valid() - Not available. + .initial_data - Not available. + .validated_data - Not available. + .errors - Not available. + .data - Available. + """ + + def __init__(self, instance=None, data=empty, **kwargs): + self.instance = instance + if data is not empty: + self.initial_data = data + self.partial = kwargs.pop('partial', False) + self._context = kwargs.pop('context', {}) + kwargs.pop('many', None) + super().__init__(**kwargs) + + def __new__(cls, *args, **kwargs): + # We override this method in order to automatically create + # `ListSerializer` classes instead when `many=True` is set. + if kwargs.pop('many', False): + return cls.many_init(*args, **kwargs) + return super().__new__(cls, *args, **kwargs) + + # Allow type checkers to make serializers generic. + def __class_getitem__(cls, *args, **kwargs): + return cls + + @classmethod + def many_init(cls, *args, **kwargs): + """ + This method implements the creation of a `ListSerializer` parent + class when `many=True` is used. You can customize it if you need to + control which keyword arguments are passed to the parent, and + which are passed to the child. + + Note that we're over-cautious in passing most arguments to both parent + and child classes in order to try to cover the general case. If you're + overriding this method you'll probably want something much simpler, eg: + + @classmethod + def many_init(cls, *args, **kwargs): + kwargs['child'] = cls() + return CustomListSerializer(*args, **kwargs) + """ + list_kwargs = {} + for key in LIST_SERIALIZER_KWARGS_REMOVE: + value = kwargs.pop(key, None) + if value is not None: + list_kwargs[key] = value + list_kwargs['child'] = cls(*args, **kwargs) + list_kwargs.update({ + key: value for key, value in kwargs.items() + if key in LIST_SERIALIZER_KWARGS + }) + meta = getattr(cls, 'Meta', None) + list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer) + return list_serializer_class(*args, **list_kwargs) + + def to_internal_value(self, data): + raise NotImplementedError('`to_internal_value()` must be implemented.') + + def to_representation(self, instance): + raise NotImplementedError('`to_representation()` must be implemented.') + + def update(self, instance, validated_data): + raise NotImplementedError('`update()` must be implemented.') + + def create(self, validated_data): + raise NotImplementedError('`create()` must be implemented.') + + def save(self, **kwargs): + assert hasattr(self, '_errors'), ( + 'You must call `.is_valid()` before calling `.save()`.' + ) + + assert not self.errors, ( + 'You cannot call `.save()` on a serializer with invalid data.' + ) + + # Guard against incorrect use of `serializer.save(commit=False)` + assert 'commit' not in kwargs, ( + "'commit' is not a valid keyword argument to the 'save()' method. " + "If you need to access data before committing to the database then " + "inspect 'serializer.validated_data' instead. " + "You can also pass additional keyword arguments to 'save()' if you " + "need to set extra attributes on the saved model instance. " + "For example: 'serializer.save(owner=request.user)'.'" + ) + + assert not hasattr(self, '_data'), ( + "You cannot call `.save()` after accessing `serializer.data`." + "If you need to access data before committing to the database then " + "inspect 'serializer.validated_data' instead. " + ) + + validated_data = {**self.validated_data, **kwargs} + + if self.instance is not None: + self.instance = self.update(self.instance, validated_data) + assert self.instance is not None, ( + '`update()` did not return an object instance.' + ) + else: + self.instance = self.create(validated_data) + assert self.instance is not None, ( + '`create()` did not return an object instance.' + ) + + return self.instance + + def is_valid(self, *, raise_exception=False): + assert hasattr(self, 'initial_data'), ( + 'Cannot call `.is_valid()` as no `data=` keyword argument was ' + 'passed when instantiating the serializer instance.' + ) + + if not hasattr(self, '_validated_data'): + try: + self._validated_data = self.run_validation(self.initial_data) + except ValidationError as exc: + self._validated_data = {} + self._errors = exc.detail + else: + self._errors = {} + + if self._errors and raise_exception: + raise ValidationError(self.errors) + + return not bool(self._errors) + + @property + def data(self): + if hasattr(self, 'initial_data') and not hasattr(self, '_validated_data'): + msg = ( + 'When a serializer is passed a `data` keyword argument you ' + 'must call `.is_valid()` before attempting to access the ' + 'serialized `.data` representation.\n' + 'You should either call `.is_valid()` first, ' + 'or access `.initial_data` instead.' + ) + raise AssertionError(msg) + + if not hasattr(self, '_data'): + if self.instance is not None and not getattr(self, '_errors', None): + self._data = self.to_representation(self.instance) + elif hasattr(self, '_validated_data') and not getattr(self, '_errors', None): + self._data = self.to_representation(self.validated_data) + else: + self._data = self.get_initial() + return self._data + + @property + def errors(self): + if not hasattr(self, '_errors'): + msg = 'You must call `.is_valid()` before accessing `.errors`.' + raise AssertionError(msg) + return self._errors + + @property + def validated_data(self): + if not hasattr(self, '_validated_data'): + msg = 'You must call `.is_valid()` before accessing `.validated_data`.' + raise AssertionError(msg) + return self._validated_data + + +# Serializer & ListSerializer classes +# ----------------------------------- + +class SerializerMetaclass(type): + """ + This metaclass sets a dictionary named `_declared_fields` on the class. + + Any instances of `Field` included as attributes on either the class + or on any of its superclasses will be include in the + `_declared_fields` dictionary. + """ + + @classmethod + def _get_declared_fields(cls, bases, attrs): + fields = [(field_name, attrs.pop(field_name)) + for field_name, obj in list(attrs.items()) + if isinstance(obj, Field)] + fields.sort(key=lambda x: x[1]._creation_counter) + + # Ensures a base class field doesn't override cls attrs, and maintains + # field precedence when inheriting multiple parents. e.g. if there is a + # class C(A, B), and A and B both define 'field', use 'field' from A. + known = set(attrs) + + def visit(name): + known.add(name) + return name + + base_fields = [ + (visit(name), f) + for base in bases if hasattr(base, '_declared_fields') + for name, f in base._declared_fields.items() if name not in known + ] + + return dict(base_fields + fields) + + def __new__(cls, name, bases, attrs): + attrs['_declared_fields'] = cls._get_declared_fields(bases, attrs) + return super().__new__(cls, name, bases, attrs) + + +def as_serializer_error(exc): + assert isinstance(exc, (ValidationError, DjangoValidationError)) + + if isinstance(exc, DjangoValidationError): + detail = get_error_detail(exc) + else: + detail = exc.detail + + if isinstance(detail, Mapping): + # If errors may be a dict we use the standard {key: list of values}. + # Here we ensure that all the values are *lists* of errors. + return { + key: value if isinstance(value, (list, Mapping)) else [value] + for key, value in detail.items() + } + elif isinstance(detail, list): + # Errors raised as a list are non-field errors. + return { + api_settings.NON_FIELD_ERRORS_KEY: detail + } + # Errors raised as a string are non-field errors. + return { + api_settings.NON_FIELD_ERRORS_KEY: [detail] + } + + +class Serializer(BaseSerializer, metaclass=SerializerMetaclass): + default_error_messages = { + 'invalid': _('Invalid data. Expected a dictionary, but got {datatype}.') + } + + def set_value(self, dictionary, keys, value): + """ + Similar to Python's built in `dictionary[key] = value`, + but takes a list of nested keys instead of a single key. + + set_value({'a': 1}, [], {'b': 2}) -> {'a': 1, 'b': 2} + set_value({'a': 1}, ['x'], 2) -> {'a': 1, 'x': 2} + set_value({'a': 1}, ['x', 'y'], 2) -> {'a': 1, 'x': {'y': 2}} + """ + if not keys: + dictionary.update(value) + return + + for key in keys[:-1]: + if key not in dictionary: + dictionary[key] = {} + dictionary = dictionary[key] + + dictionary[keys[-1]] = value + + @cached_property + def fields(self): + """ + A dictionary of {field_name: field_instance}. + """ + # `fields` is evaluated lazily. We do this to ensure that we don't + # have issues importing modules that use ModelSerializers as fields, + # even if Django's app-loading stage has not yet run. + fields = BindingDict(self) + for key, value in self.get_fields().items(): + fields[key] = value + return fields + + @property + def _writable_fields(self): + for field in self.fields.values(): + if not field.read_only: + yield field + + @property + def _readable_fields(self): + for field in self.fields.values(): + if not field.write_only: + yield field + + def get_fields(self): + """ + Returns a dictionary of {field_name: field_instance}. + """ + # Every new serializer is created with a clone of the field instances. + # This allows users to dynamically modify the fields on a serializer + # instance without affecting every other serializer instance. + return copy.deepcopy(self._declared_fields) + + def get_validators(self): + """ + Returns a list of validator callables. + """ + # Used by the lazily-evaluated `validators` property. + meta = getattr(self, 'Meta', None) + validators = getattr(meta, 'validators', None) + return list(validators) if validators else [] + + def get_initial(self): + if hasattr(self, 'initial_data'): + # initial_data may not be a valid type + if not isinstance(self.initial_data, Mapping): + return {} + + return { + field_name: field.get_value(self.initial_data) + for field_name, field in self.fields.items() + if (field.get_value(self.initial_data) is not empty) and + not field.read_only + } + + return { + field.field_name: field.get_initial() + for field in self.fields.values() + if not field.read_only + } + + def get_value(self, dictionary): + # We override the default field access in order to support + # nested HTML forms. + if html.is_html_input(dictionary): + return html.parse_html_dict(dictionary, prefix=self.field_name) or empty + return dictionary.get(self.field_name, empty) + + def run_validation(self, data=empty): + """ + We override the default `run_validation`, because the validation + performed by validators and the `.validate()` method should + be coerced into an error dictionary with a 'non_fields_error' key. + """ + (is_empty_value, data) = self.validate_empty_values(data) + if is_empty_value: + return data + + value = self.to_internal_value(data) + try: + self.run_validators(value) + value = self.validate(value) + assert value is not None, '.validate() should return the validated data' + except (ValidationError, DjangoValidationError) as exc: + raise ValidationError(detail=as_serializer_error(exc)) + + return value + + def _read_only_defaults(self): + fields = [ + field for field in self.fields.values() + if (field.read_only) and (field.default != empty) and (field.source != '*') and ('.' not in field.source) + ] + + defaults = {} + for field in fields: + try: + default = field.get_default() + except SkipField: + continue + defaults[field.source] = default + + return defaults + + def run_validators(self, value): + """ + Add read_only fields with defaults to value before running validators. + """ + if isinstance(value, dict): + to_validate = self._read_only_defaults() + to_validate.update(value) + else: + to_validate = value + super().run_validators(to_validate) + + def to_internal_value(self, data): + """ + Dict of native values <- Dict of primitive datatypes. + """ + if not isinstance(data, Mapping): + message = self.error_messages['invalid'].format( + datatype=type(data).__name__ + ) + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='invalid') + + ret = {} + errors = {} + fields = self._writable_fields + + for field in fields: + validate_method = getattr(self, 'validate_' + field.field_name, None) + primitive_value = field.get_value(data) + try: + validated_value = field.run_validation(primitive_value) + if validate_method is not None: + validated_value = validate_method(validated_value) + except ValidationError as exc: + errors[field.field_name] = exc.detail + except DjangoValidationError as exc: + errors[field.field_name] = get_error_detail(exc) + except SkipField: + pass + else: + self.set_value(ret, field.source_attrs, validated_value) + + if errors: + raise ValidationError(errors) + + return ret + + def to_representation(self, instance): + """ + Object instance -> Dict of primitive datatypes. + """ + ret = {} + fields = self._readable_fields + + for field in fields: + try: + attribute = field.get_attribute(instance) + except SkipField: + continue + + # We skip `to_representation` for `None` values so that fields do + # not have to explicitly deal with that case. + # + # For related fields with `use_pk_only_optimization` we need to + # resolve the pk value. + check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute + if check_for_none is None: + ret[field.field_name] = None + else: + ret[field.field_name] = field.to_representation(attribute) + + return ret + + def validate(self, attrs): + return attrs + + def __repr__(self): + return representation.serializer_repr(self, indent=1) + + # The following are used for accessing `BoundField` instances on the + # serializer, for the purposes of presenting a form-like API onto the + # field values and field errors. + + def __iter__(self): + for field in self.fields.values(): + yield self[field.field_name] + + def __getitem__(self, key): + field = self.fields[key] + value = self.data.get(key) + error = self.errors.get(key) if hasattr(self, '_errors') else None + if isinstance(field, Serializer): + return NestedBoundField(field, value, error) + if isinstance(field, JSONField): + return JSONBoundField(field, value, error) + return BoundField(field, value, error) + + # Include a backlink to the serializer class on return objects. + # Allows renderers such as HTMLFormRenderer to get the full field info. + + @property + def data(self): + ret = super().data + return ReturnDict(ret, serializer=self) + + @property + def errors(self): + ret = super().errors + if isinstance(ret, list) and len(ret) == 1 and getattr(ret[0], 'code', None) == 'null': + # Edge case. Provide a more descriptive error than + # "this field may not be null", when no data is passed. + detail = ErrorDetail('No data provided', code='null') + ret = {api_settings.NON_FIELD_ERRORS_KEY: [detail]} + return ReturnDict(ret, serializer=self) + + +# There's some replication of `ListField` here, +# but that's probably better than obfuscating the call hierarchy. + +class ListSerializer(BaseSerializer): + child = None + many = True + + default_error_messages = { + 'not_a_list': _('Expected a list of items but got type "{input_type}".'), + 'empty': _('This list may not be empty.'), + 'max_length': _('Ensure this field has no more than {max_length} elements.'), + 'min_length': _('Ensure this field has at least {min_length} elements.') + } + + def __init__(self, *args, **kwargs): + self.child = kwargs.pop('child', copy.deepcopy(self.child)) + self.allow_empty = kwargs.pop('allow_empty', True) + self.max_length = kwargs.pop('max_length', None) + self.min_length = kwargs.pop('min_length', None) + assert self.child is not None, '`child` is a required argument.' + assert not inspect.isclass(self.child), '`child` has not been instantiated.' + super().__init__(*args, **kwargs) + self.child.bind(field_name='', parent=self) + + def get_initial(self): + if hasattr(self, 'initial_data'): + return self.to_representation(self.initial_data) + return [] + + def get_value(self, dictionary): + """ + Given the input dictionary, return the field value. + """ + # We override the default field access in order to support + # lists in HTML forms. + if html.is_html_input(dictionary): + return html.parse_html_list(dictionary, prefix=self.field_name, default=empty) + return dictionary.get(self.field_name, empty) + + def run_validation(self, data=empty): + """ + We override the default `run_validation`, because the validation + performed by validators and the `.validate()` method should + be coerced into an error dictionary with a 'non_fields_error' key. + """ + (is_empty_value, data) = self.validate_empty_values(data) + if is_empty_value: + return data + + value = self.to_internal_value(data) + try: + self.run_validators(value) + value = self.validate(value) + assert value is not None, '.validate() should return the validated data' + except (ValidationError, DjangoValidationError) as exc: + raise ValidationError(detail=as_serializer_error(exc)) + + return value + + def run_child_validation(self, data): + """ + Run validation on child serializer. + You may need to override this method to support multiple updates. For example: + + self.child.instance = self.instance.get(pk=data['id']) + self.child.initial_data = data + return super().run_child_validation(data) + """ + return self.child.run_validation(data) + + def to_internal_value(self, data): + """ + List of dicts of native values <- List of dicts of primitive datatypes. + """ + if html.is_html_input(data): + data = html.parse_html_list(data, default=[]) + + if not isinstance(data, list): + message = self.error_messages['not_a_list'].format( + input_type=type(data).__name__ + ) + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='not_a_list') + + if not self.allow_empty and len(data) == 0: + message = self.error_messages['empty'] + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='empty') + + if self.max_length is not None and len(data) > self.max_length: + message = self.error_messages['max_length'].format(max_length=self.max_length) + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='max_length') + + if self.min_length is not None and len(data) < self.min_length: + message = self.error_messages['min_length'].format(min_length=self.min_length) + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='min_length') + + ret = [] + errors = [] + + for item in data: + try: + validated = self.run_child_validation(item) + except ValidationError as exc: + errors.append(exc.detail) + else: + ret.append(validated) + errors.append({}) + + if any(errors): + raise ValidationError(errors) + + return ret + + def to_representation(self, data): + """ + List of object instances -> List of dicts of primitive datatypes. + """ + # Dealing with nested relationships, data can be a Manager, + # so, first get a queryset from the Manager if needed + iterable = data.all() if isinstance(data, models.manager.BaseManager) else data + + return [ + self.child.to_representation(item) for item in iterable + ] + + def validate(self, attrs): + return attrs + + def update(self, instance, validated_data): + raise NotImplementedError( + "Serializers with many=True do not support multiple update by " + "default, only multiple create. For updates it is unclear how to " + "deal with insertions and deletions. If you need to support " + "multiple update, use a `ListSerializer` class and override " + "`.update()` so you can specify the behavior exactly." + ) + + def create(self, validated_data): + return [ + self.child.create(attrs) for attrs in validated_data + ] + + def save(self, **kwargs): + """ + Save and return a list of object instances. + """ + # Guard against incorrect use of `serializer.save(commit=False)` + assert 'commit' not in kwargs, ( + "'commit' is not a valid keyword argument to the 'save()' method. " + "If you need to access data before committing to the database then " + "inspect 'serializer.validated_data' instead. " + "You can also pass additional keyword arguments to 'save()' if you " + "need to set extra attributes on the saved model instance. " + "For example: 'serializer.save(owner=request.user)'.'" + ) + + validated_data = [ + {**attrs, **kwargs} for attrs in self.validated_data + ] + + if self.instance is not None: + self.instance = self.update(self.instance, validated_data) + assert self.instance is not None, ( + '`update()` did not return an object instance.' + ) + else: + self.instance = self.create(validated_data) + assert self.instance is not None, ( + '`create()` did not return an object instance.' + ) + + return self.instance + + def is_valid(self, *, raise_exception=False): + # This implementation is the same as the default, + # except that we use lists, rather than dicts, as the empty case. + assert hasattr(self, 'initial_data'), ( + 'Cannot call `.is_valid()` as no `data=` keyword argument was ' + 'passed when instantiating the serializer instance.' + ) + + if not hasattr(self, '_validated_data'): + try: + self._validated_data = self.run_validation(self.initial_data) + except ValidationError as exc: + self._validated_data = [] + self._errors = exc.detail + else: + self._errors = [] + + if self._errors and raise_exception: + raise ValidationError(self.errors) + + return not bool(self._errors) + + def __repr__(self): + return representation.list_repr(self, indent=1) + + # Include a backlink to the serializer class on return objects. + # Allows renderers such as HTMLFormRenderer to get the full field info. + + @property + def data(self): + ret = super().data + return ReturnList(ret, serializer=self) + + @property + def errors(self): + ret = super().errors + if isinstance(ret, list) and len(ret) == 1 and getattr(ret[0], 'code', None) == 'null': + # Edge case. Provide a more descriptive error than + # "this field may not be null", when no data is passed. + detail = ErrorDetail('No data provided', code='null') + ret = {api_settings.NON_FIELD_ERRORS_KEY: [detail]} + if isinstance(ret, dict): + return ReturnDict(ret, serializer=self) + return ReturnList(ret, serializer=self) + + +# ModelSerializer & HyperlinkedModelSerializer +# -------------------------------------------- + +def raise_errors_on_nested_writes(method_name, serializer, validated_data): + """ + Give explicit errors when users attempt to pass writable nested data. + + If we don't do this explicitly they'd get a less helpful error when + calling `.save()` on the serializer. + + We don't *automatically* support these sorts of nested writes because + there are too many ambiguities to define a default behavior. + + Eg. Suppose we have a `UserSerializer` with a nested profile. How should + we handle the case of an update, where the `profile` relationship does + not exist? Any of the following might be valid: + + * Raise an application error. + * Silently ignore the nested part of the update. + * Automatically create a profile instance. + """ + ModelClass = serializer.Meta.model + model_field_info = model_meta.get_field_info(ModelClass) + + # Ensure we don't have a writable nested field. For example: + # + # class UserSerializer(ModelSerializer): + # ... + # profile = ProfileSerializer() + assert not any( + isinstance(field, BaseSerializer) and + (field.source in validated_data) and + (field.source in model_field_info.relations) and + isinstance(validated_data[field.source], (list, dict)) + for field in serializer._writable_fields + ), ( + 'The `.{method_name}()` method does not support writable nested ' + 'fields by default.\nWrite an explicit `.{method_name}()` method for ' + 'serializer `{module}.{class_name}`, or set `read_only=True` on ' + 'nested serializer fields.'.format( + method_name=method_name, + module=serializer.__class__.__module__, + class_name=serializer.__class__.__name__ + ) + ) + + # Ensure we don't have a writable dotted-source field. For example: + # + # class UserSerializer(ModelSerializer): + # ... + # address = serializer.CharField('profile.address') + # + # Though, non-relational fields (e.g., JSONField) are acceptable. For example: + # + # class NonRelationalPersonModel(models.Model): + # profile = JSONField() + # + # class UserSerializer(ModelSerializer): + # ... + # address = serializer.CharField('profile.address') + assert not any( + len(field.source_attrs) > 1 and + (field.source_attrs[0] in validated_data) and + (field.source_attrs[0] in model_field_info.relations) and + isinstance(validated_data[field.source_attrs[0]], (list, dict)) + for field in serializer._writable_fields + ), ( + 'The `.{method_name}()` method does not support writable dotted-source ' + 'fields by default.\nWrite an explicit `.{method_name}()` method for ' + 'serializer `{module}.{class_name}`, or set `read_only=True` on ' + 'dotted-source serializer fields.'.format( + method_name=method_name, + module=serializer.__class__.__module__, + class_name=serializer.__class__.__name__ + ) + ) + + +class ModelSerializer(Serializer): + """ + A `ModelSerializer` is just a regular `Serializer`, except that: + + * A set of default fields are automatically populated. + * A set of default validators are automatically populated. + * Default `.create()` and `.update()` implementations are provided. + + The process of automatically determining a set of serializer fields + based on the model fields is reasonably complex, but you almost certainly + don't need to dig into the implementation. + + If the `ModelSerializer` class *doesn't* generate the set of fields that + you need you should either declare the extra/differing fields explicitly on + the serializer class, or simply use a `Serializer` class. + """ + serializer_field_mapping = { + models.AutoField: IntegerField, + models.BigIntegerField: IntegerField, + models.BooleanField: BooleanField, + models.CharField: CharField, + models.CommaSeparatedIntegerField: CharField, + models.DateField: DateField, + models.DateTimeField: DateTimeField, + models.DecimalField: DecimalField, + models.DurationField: DurationField, + models.EmailField: EmailField, + models.Field: ModelField, + models.FileField: FileField, + models.FloatField: FloatField, + models.ImageField: ImageField, + models.IntegerField: IntegerField, + models.NullBooleanField: BooleanField, + models.PositiveIntegerField: IntegerField, + models.PositiveSmallIntegerField: IntegerField, + models.SlugField: SlugField, + models.SmallIntegerField: IntegerField, + models.TextField: CharField, + models.TimeField: TimeField, + models.URLField: URLField, + models.UUIDField: UUIDField, + models.GenericIPAddressField: IPAddressField, + models.FilePathField: FilePathField, + } + if hasattr(models, 'JSONField'): + serializer_field_mapping[models.JSONField] = JSONField + if postgres_fields: + serializer_field_mapping[postgres_fields.HStoreField] = HStoreField + serializer_field_mapping[postgres_fields.ArrayField] = ListField + serializer_field_mapping[postgres_fields.JSONField] = JSONField + serializer_related_field = PrimaryKeyRelatedField + serializer_related_to_field = SlugRelatedField + serializer_url_field = HyperlinkedIdentityField + serializer_choice_field = ChoiceField + + # The field name for hyperlinked identity fields. Defaults to 'url'. + # You can modify this using the API setting. + # + # Note that if you instead need modify this on a per-serializer basis, + # you'll also need to ensure you update the `create` method on any generic + # views, to correctly handle the 'Location' response header for + # "HTTP 201 Created" responses. + url_field_name = None + + # Default `create` and `update` behavior... + def create(self, validated_data): + """ + We have a bit of extra checking around this in order to provide + descriptive messages when something goes wrong, but this method is + essentially just: + + return ExampleModel.objects.create(**validated_data) + + If there are many to many fields present on the instance then they + cannot be set until the model is instantiated, in which case the + implementation is like so: + + example_relationship = validated_data.pop('example_relationship') + instance = ExampleModel.objects.create(**validated_data) + instance.example_relationship = example_relationship + return instance + + The default implementation also does not handle nested relationships. + If you want to support writable nested relationships you'll need + to write an explicit `.create()` method. + """ + raise_errors_on_nested_writes('create', self, validated_data) + + ModelClass = self.Meta.model + + # Remove many-to-many relationships from validated_data. + # They are not valid arguments to the default `.create()` method, + # as they require that the instance has already been saved. + info = model_meta.get_field_info(ModelClass) + many_to_many = {} + for field_name, relation_info in info.relations.items(): + if relation_info.to_many and (field_name in validated_data): + many_to_many[field_name] = validated_data.pop(field_name) + + try: + instance = ModelClass._default_manager.create(**validated_data) + except TypeError: + tb = traceback.format_exc() + msg = ( + 'Got a `TypeError` when calling `%s.%s.create()`. ' + 'This may be because you have a writable field on the ' + 'serializer class that is not a valid argument to ' + '`%s.%s.create()`. You may need to make the field ' + 'read-only, or override the %s.create() method to handle ' + 'this correctly.\nOriginal exception was:\n %s' % + ( + ModelClass.__name__, + ModelClass._default_manager.name, + ModelClass.__name__, + ModelClass._default_manager.name, + self.__class__.__name__, + tb + ) + ) + raise TypeError(msg) + + # Save many-to-many relationships after the instance is created. + if many_to_many: + for field_name, value in many_to_many.items(): + field = getattr(instance, field_name) + field.set(value) + + return instance + + def update(self, instance, validated_data): + raise_errors_on_nested_writes('update', self, validated_data) + info = model_meta.get_field_info(instance) + + # Simply set each attribute on the instance, and then save it. + # Note that unlike `.create()` we don't need to treat many-to-many + # relationships as being a special case. During updates we already + # have an instance pk for the relationships to be associated with. + m2m_fields = [] + for attr, value in validated_data.items(): + if attr in info.relations and info.relations[attr].to_many: + m2m_fields.append((attr, value)) + else: + setattr(instance, attr, value) + + instance.save() + + # Note that many-to-many fields are set after updating instance. + # Setting m2m fields triggers signals which could potentially change + # updated instance and we do not want it to collide with .update() + for attr, value in m2m_fields: + field = getattr(instance, attr) + field.set(value) + + return instance + + # Determine the fields to apply... + + def get_fields(self): + """ + Return the dict of field names -> field instances that should be + used for `self.fields` when instantiating the serializer. + """ + if self.url_field_name is None: + self.url_field_name = api_settings.URL_FIELD_NAME + + assert hasattr(self, 'Meta'), ( + 'Class {serializer_class} missing "Meta" attribute'.format( + serializer_class=self.__class__.__name__ + ) + ) + assert hasattr(self.Meta, 'model'), ( + 'Class {serializer_class} missing "Meta.model" attribute'.format( + serializer_class=self.__class__.__name__ + ) + ) + if model_meta.is_abstract_model(self.Meta.model): + raise ValueError( + 'Cannot use ModelSerializer with Abstract Models.' + ) + + declared_fields = copy.deepcopy(self._declared_fields) + model = getattr(self.Meta, 'model') + depth = getattr(self.Meta, 'depth', 0) + + if depth is not None: + assert depth >= 0, "'depth' may not be negative." + assert depth <= 10, "'depth' may not be greater than 10." + + # Retrieve metadata about fields & relationships on the model class. + info = model_meta.get_field_info(model) + field_names = self.get_field_names(declared_fields, info) + + # Determine any extra field arguments and hidden fields that + # should be included + extra_kwargs = self.get_extra_kwargs() + extra_kwargs, hidden_fields = self.get_uniqueness_extra_kwargs( + field_names, declared_fields, extra_kwargs + ) + + # Determine the fields that should be included on the serializer. + fields = {} + + for field_name in field_names: + # If the field is explicitly declared on the class then use that. + if field_name in declared_fields: + fields[field_name] = declared_fields[field_name] + continue + + extra_field_kwargs = extra_kwargs.get(field_name, {}) + source = extra_field_kwargs.get('source', '*') + if source == '*': + source = field_name + + # Determine the serializer field class and keyword arguments. + field_class, field_kwargs = self.build_field( + source, info, model, depth + ) + + # Include any kwargs defined in `Meta.extra_kwargs` + field_kwargs = self.include_extra_kwargs( + field_kwargs, extra_field_kwargs + ) + + # Create the serializer field. + fields[field_name] = field_class(**field_kwargs) + + # Add in any hidden fields. + fields.update(hidden_fields) + + return fields + + # Methods for determining the set of field names to include... + + def get_field_names(self, declared_fields, info): + """ + Returns the list of all field names that should be created when + instantiating this serializer class. This is based on the default + set of fields, but also takes into account the `Meta.fields` or + `Meta.exclude` options if they have been specified. + """ + fields = getattr(self.Meta, 'fields', None) + exclude = getattr(self.Meta, 'exclude', None) + + if fields and fields != ALL_FIELDS and not isinstance(fields, (list, tuple)): + raise TypeError( + 'The `fields` option must be a list or tuple or "__all__". ' + 'Got %s.' % type(fields).__name__ + ) + + if exclude and not isinstance(exclude, (list, tuple)): + raise TypeError( + 'The `exclude` option must be a list or tuple. Got %s.' % + type(exclude).__name__ + ) + + assert not (fields and exclude), ( + "Cannot set both 'fields' and 'exclude' options on " + "serializer {serializer_class}.".format( + serializer_class=self.__class__.__name__ + ) + ) + + assert not (fields is None and exclude is None), ( + "Creating a ModelSerializer without either the 'fields' attribute " + "or the 'exclude' attribute has been deprecated since 3.3.0, " + "and is now disallowed. Add an explicit fields = '__all__' to the " + "{serializer_class} serializer.".format( + serializer_class=self.__class__.__name__ + ), + ) + + if fields == ALL_FIELDS: + fields = None + + if fields is not None: + # Ensure that all declared fields have also been included in the + # `Meta.fields` option. + + # Do not require any fields that are declared in a parent class, + # in order to allow serializer subclasses to only include + # a subset of fields. + required_field_names = set(declared_fields) + for cls in self.__class__.__bases__: + required_field_names -= set(getattr(cls, '_declared_fields', [])) + + for field_name in required_field_names: + assert field_name in fields, ( + "The field '{field_name}' was declared on serializer " + "{serializer_class}, but has not been included in the " + "'fields' option.".format( + field_name=field_name, + serializer_class=self.__class__.__name__ + ) + ) + return fields + + # Use the default set of field names if `Meta.fields` is not specified. + fields = self.get_default_field_names(declared_fields, info) + + if exclude is not None: + # If `Meta.exclude` is included, then remove those fields. + for field_name in exclude: + assert field_name not in self._declared_fields, ( + "Cannot both declare the field '{field_name}' and include " + "it in the {serializer_class} 'exclude' option. Remove the " + "field or, if inherited from a parent serializer, disable " + "with `{field_name} = None`." + .format( + field_name=field_name, + serializer_class=self.__class__.__name__ + ) + ) + + assert field_name in fields, ( + "The field '{field_name}' was included on serializer " + "{serializer_class} in the 'exclude' option, but does " + "not match any model field.".format( + field_name=field_name, + serializer_class=self.__class__.__name__ + ) + ) + fields.remove(field_name) + + return fields + + def get_default_field_names(self, declared_fields, model_info): + """ + Return the default list of field names that will be used if the + `Meta.fields` option is not specified. + """ + return ( + [model_info.pk.name] + + list(declared_fields) + + list(model_info.fields) + + list(model_info.forward_relations) + ) + + # Methods for constructing serializer fields... + + def build_field(self, field_name, info, model_class, nested_depth): + """ + Return a two tuple of (cls, kwargs) to build a serializer field with. + """ + if field_name in info.fields_and_pk: + model_field = info.fields_and_pk[field_name] + return self.build_standard_field(field_name, model_field) + + elif field_name in info.relations: + relation_info = info.relations[field_name] + if not nested_depth: + return self.build_relational_field(field_name, relation_info) + else: + return self.build_nested_field(field_name, relation_info, nested_depth) + + elif hasattr(model_class, field_name): + return self.build_property_field(field_name, model_class) + + elif field_name == self.url_field_name: + return self.build_url_field(field_name, model_class) + + return self.build_unknown_field(field_name, model_class) + + def build_standard_field(self, field_name, model_field): + """ + Create regular model fields. + """ + field_mapping = ClassLookupDict(self.serializer_field_mapping) + + field_class = field_mapping[model_field] + field_kwargs = get_field_kwargs(field_name, model_field) + + # Special case to handle when a OneToOneField is also the primary key + if model_field.one_to_one and model_field.primary_key: + field_class = self.serializer_related_field + field_kwargs['queryset'] = model_field.related_model.objects + + if 'choices' in field_kwargs: + # Fields with choices get coerced into `ChoiceField` + # instead of using their regular typed field. + field_class = self.serializer_choice_field + # Some model fields may introduce kwargs that would not be valid + # for the choice field. We need to strip these out. + # Eg. models.DecimalField(max_digits=3, decimal_places=1, choices=DECIMAL_CHOICES) + valid_kwargs = { + 'read_only', 'write_only', + 'required', 'default', 'initial', 'source', + 'label', 'help_text', 'style', + 'error_messages', 'validators', 'allow_null', 'allow_blank', + 'choices' + } + for key in list(field_kwargs): + if key not in valid_kwargs: + field_kwargs.pop(key) + + if not issubclass(field_class, ModelField): + # `model_field` is only valid for the fallback case of + # `ModelField`, which is used when no other typed field + # matched to the model field. + field_kwargs.pop('model_field', None) + + if not issubclass(field_class, CharField) and not issubclass(field_class, ChoiceField): + # `allow_blank` is only valid for textual fields. + field_kwargs.pop('allow_blank', None) + + is_django_jsonfield = hasattr(models, 'JSONField') and isinstance(model_field, models.JSONField) + if (postgres_fields and isinstance(model_field, postgres_fields.JSONField)) or is_django_jsonfield: + # Populate the `encoder` argument of `JSONField` instances generated + # for the model `JSONField`. + field_kwargs['encoder'] = getattr(model_field, 'encoder', None) + if is_django_jsonfield: + field_kwargs['decoder'] = getattr(model_field, 'decoder', None) + + if postgres_fields and isinstance(model_field, postgres_fields.ArrayField): + # Populate the `child` argument on `ListField` instances generated + # for the PostgreSQL specific `ArrayField`. + child_model_field = model_field.base_field + child_field_class, child_field_kwargs = self.build_standard_field( + 'child', child_model_field + ) + field_kwargs['child'] = child_field_class(**child_field_kwargs) + + return field_class, field_kwargs + + def build_relational_field(self, field_name, relation_info): + """ + Create fields for forward and reverse relationships. + """ + field_class = self.serializer_related_field + field_kwargs = get_relation_kwargs(field_name, relation_info) + + to_field = field_kwargs.pop('to_field', None) + if to_field and not relation_info.reverse and not relation_info.related_model._meta.get_field(to_field).primary_key: + field_kwargs['slug_field'] = to_field + field_class = self.serializer_related_to_field + + # `view_name` is only valid for hyperlinked relationships. + if not issubclass(field_class, HyperlinkedRelatedField): + field_kwargs.pop('view_name', None) + + return field_class, field_kwargs + + def build_nested_field(self, field_name, relation_info, nested_depth): + """ + Create nested fields for forward and reverse relationships. + """ + class NestedSerializer(ModelSerializer): + class Meta: + model = relation_info.related_model + depth = nested_depth - 1 + fields = '__all__' + + field_class = NestedSerializer + field_kwargs = get_nested_relation_kwargs(relation_info) + + return field_class, field_kwargs + + def build_property_field(self, field_name, model_class): + """ + Create a read only field for model methods and properties. + """ + field_class = ReadOnlyField + field_kwargs = {} + + return field_class, field_kwargs + + def build_url_field(self, field_name, model_class): + """ + Create a field representing the object's own URL. + """ + field_class = self.serializer_url_field + field_kwargs = get_url_kwargs(model_class) + + return field_class, field_kwargs + + def build_unknown_field(self, field_name, model_class): + """ + Raise an error on any unknown fields. + """ + raise ImproperlyConfigured( + 'Field name `%s` is not valid for model `%s` in `%s.%s`.' % + (field_name, model_class.__name__, self.__class__.__module__, self.__class__.__name__) + ) + + def include_extra_kwargs(self, kwargs, extra_kwargs): + """ + Include any 'extra_kwargs' that have been included for this field, + possibly removing any incompatible existing keyword arguments. + """ + if extra_kwargs.get('read_only', False): + for attr in [ + 'required', 'default', 'allow_blank', 'min_length', + 'max_length', 'min_value', 'max_value', 'validators', 'queryset' + ]: + kwargs.pop(attr, None) + + if extra_kwargs.get('default') and kwargs.get('required') is False: + kwargs.pop('required') + + if extra_kwargs.get('read_only', kwargs.get('read_only', False)): + extra_kwargs.pop('required', None) # Read only fields should always omit the 'required' argument. + + kwargs.update(extra_kwargs) + + return kwargs + + # Methods for determining additional keyword arguments to apply... + + def get_extra_kwargs(self): + """ + Return a dictionary mapping field names to a dictionary of + additional keyword arguments. + """ + extra_kwargs = copy.deepcopy(getattr(self.Meta, 'extra_kwargs', {})) + + read_only_fields = getattr(self.Meta, 'read_only_fields', None) + if read_only_fields is not None: + if not isinstance(read_only_fields, (list, tuple)): + raise TypeError( + 'The `read_only_fields` option must be a list or tuple. ' + 'Got %s.' % type(read_only_fields).__name__ + ) + for field_name in read_only_fields: + kwargs = extra_kwargs.get(field_name, {}) + kwargs['read_only'] = True + extra_kwargs[field_name] = kwargs + + else: + # Guard against the possible misspelling `readonly_fields` (used + # by the Django admin and others). + assert not hasattr(self.Meta, 'readonly_fields'), ( + 'Serializer `%s.%s` has field `readonly_fields`; ' + 'the correct spelling for the option is `read_only_fields`.' % + (self.__class__.__module__, self.__class__.__name__) + ) + + return extra_kwargs + + def get_unique_together_constraints(self, model): + """ + Returns iterator of (fields, queryset), each entry describes an unique together + constraint on `fields` in `queryset`. + """ + for parent_class in [model] + list(model._meta.parents): + for unique_together in parent_class._meta.unique_together: + yield unique_together, model._default_manager + for constraint in parent_class._meta.constraints: + if isinstance(constraint, models.UniqueConstraint) and len(constraint.fields) > 1: + yield ( + constraint.fields, + model._default_manager + if constraint.condition is None + else model._default_manager.filter(constraint.condition) + ) + + def get_uniqueness_extra_kwargs(self, field_names, declared_fields, extra_kwargs): + """ + Return any additional field options that need to be included as a + result of uniqueness constraints on the model. This is returned as + a two-tuple of: + + ('dict of updated extra kwargs', 'mapping of hidden fields') + """ + if getattr(self.Meta, 'validators', None) is not None: + return (extra_kwargs, {}) + + model = getattr(self.Meta, 'model') + model_fields = self._get_model_fields( + field_names, declared_fields, extra_kwargs + ) + + # Determine if we need any additional `HiddenField` or extra keyword + # arguments to deal with `unique_for` dates that are required to + # be in the input data in order to validate it. + unique_constraint_names = set() + + for model_field in model_fields.values(): + # Include each of the `unique_for_*` field names. + unique_constraint_names |= {model_field.unique_for_date, model_field.unique_for_month, + model_field.unique_for_year} + + unique_constraint_names -= {None} + + # Include each of the `unique_together` and `UniqueConstraint` field names, + # so long as all the field names are included on the serializer. + for unique_together_list, queryset in self.get_unique_together_constraints(model): + if set(field_names).issuperset(unique_together_list): + unique_constraint_names |= set(unique_together_list) + + # Now we have all the field names that have uniqueness constraints + # applied, we can add the extra 'required=...' or 'default=...' + # arguments that are appropriate to these fields, or add a `HiddenField` for it. + hidden_fields = {} + uniqueness_extra_kwargs = {} + + for unique_constraint_name in unique_constraint_names: + # Get the model field that is referred too. + unique_constraint_field = model._meta.get_field(unique_constraint_name) + + if getattr(unique_constraint_field, 'auto_now_add', None): + default = CreateOnlyDefault(timezone.now) + elif getattr(unique_constraint_field, 'auto_now', None): + default = timezone.now + elif unique_constraint_field.has_default(): + default = unique_constraint_field.default + else: + default = empty + + if unique_constraint_name in model_fields: + # The corresponding field is present in the serializer + if default is empty: + uniqueness_extra_kwargs[unique_constraint_name] = {'required': True} + else: + uniqueness_extra_kwargs[unique_constraint_name] = {'default': default} + elif default is not empty: + # The corresponding field is not present in the + # serializer. We have a default to use for it, so + # add in a hidden field that populates it. + hidden_fields[unique_constraint_name] = HiddenField(default=default) + + # Update `extra_kwargs` with any new options. + for key, value in uniqueness_extra_kwargs.items(): + if key in extra_kwargs: + value.update(extra_kwargs[key]) + extra_kwargs[key] = value + + return extra_kwargs, hidden_fields + + def _get_model_fields(self, field_names, declared_fields, extra_kwargs): + """ + Returns all the model fields that are being mapped to by fields + on the serializer class. + Returned as a dict of 'model field name' -> 'model field'. + Used internally by `get_uniqueness_field_options`. + """ + model = getattr(self.Meta, 'model') + model_fields = {} + + for field_name in field_names: + if field_name in declared_fields: + # If the field is declared on the serializer + field = declared_fields[field_name] + source = field.source or field_name + else: + try: + source = extra_kwargs[field_name]['source'] + except KeyError: + source = field_name + + if '.' in source or source == '*': + # Model fields will always have a simple source mapping, + # they can't be nested attribute lookups. + continue + + with contextlib.suppress(FieldDoesNotExist): + field = model._meta.get_field(source) + if isinstance(field, DjangoModelField): + model_fields[source] = field + + return model_fields + + # Determine the validators to apply... + + def get_validators(self): + """ + Determine the set of validators to use when instantiating serializer. + """ + # If the validators have been declared explicitly then use that. + validators = getattr(getattr(self, 'Meta', None), 'validators', None) + if validators is not None: + return list(validators) + + # Otherwise use the default set of validators. + return ( + self.get_unique_together_validators() + + self.get_unique_for_date_validators() + ) + + def get_unique_together_validators(self): + """ + Determine a default set of validators for any unique_together constraints. + """ + # The field names we're passing though here only include fields + # which may map onto a model field. Any dotted field name lookups + # cannot map to a field, and must be a traversal, so we're not + # including those. + field_sources = { + field.field_name: field.source for field in self._writable_fields + if (field.source != '*') and ('.' not in field.source) + } + + # Special Case: Add read_only fields with defaults. + field_sources.update({ + field.field_name: field.source for field in self.fields.values() + if (field.read_only) and (field.default != empty) and (field.source != '*') and ('.' not in field.source) + }) + + # Invert so we can find the serializer field names that correspond to + # the model field names in the unique_together sets. This also allows + # us to check that multiple fields don't map to the same source. + source_map = defaultdict(list) + for name, source in field_sources.items(): + source_map[source].append(name) + + # Note that we make sure to check `unique_together` both on the + # base model class, but also on any parent classes. + validators = [] + for unique_together, queryset in self.get_unique_together_constraints(self.Meta.model): + # Skip if serializer does not map to all unique together sources + if not set(source_map).issuperset(unique_together): + continue + + for source in unique_together: + assert len(source_map[source]) == 1, ( + "Unable to create `UniqueTogetherValidator` for " + "`{model}.{field}` as `{serializer}` has multiple " + "fields ({fields}) that map to this model field. " + "Either remove the extra fields, or override " + "`Meta.validators` with a `UniqueTogetherValidator` " + "using the desired field names." + .format( + model=self.Meta.model.__name__, + serializer=self.__class__.__name__, + field=source, + fields=', '.join(source_map[source]), + ) + ) + + field_names = tuple(source_map[f][0] for f in unique_together) + validator = UniqueTogetherValidator( + queryset=queryset, + fields=field_names + ) + validators.append(validator) + return validators + + def get_unique_for_date_validators(self): + """ + Determine a default set of validators for the following constraints: + + * unique_for_date + * unique_for_month + * unique_for_year + """ + info = model_meta.get_field_info(self.Meta.model) + default_manager = self.Meta.model._default_manager + field_names = [field.source for field in self.fields.values()] + + validators = [] + + for field_name, field in info.fields_and_pk.items(): + if field.unique_for_date and field_name in field_names: + validator = UniqueForDateValidator( + queryset=default_manager, + field=field_name, + date_field=field.unique_for_date + ) + validators.append(validator) + + if field.unique_for_month and field_name in field_names: + validator = UniqueForMonthValidator( + queryset=default_manager, + field=field_name, + date_field=field.unique_for_month + ) + validators.append(validator) + + if field.unique_for_year and field_name in field_names: + validator = UniqueForYearValidator( + queryset=default_manager, + field=field_name, + date_field=field.unique_for_year + ) + validators.append(validator) + + return validators + + +class HyperlinkedModelSerializer(ModelSerializer): + """ + A type of `ModelSerializer` that uses hyperlinked relationships instead + of primary key relationships. Specifically: + + * A 'url' field is included instead of the 'id' field. + * Relationships to other instances are hyperlinks, instead of primary keys. + """ + serializer_related_field = HyperlinkedRelatedField + + def get_default_field_names(self, declared_fields, model_info): + """ + Return the default list of field names that will be used if the + `Meta.fields` option is not specified. + """ + return ( + [self.url_field_name] + + list(declared_fields) + + list(model_info.fields) + + list(model_info.forward_relations) + ) + + def build_nested_field(self, field_name, relation_info, nested_depth): + """ + Create nested fields for forward and reverse relationships. + """ + class NestedSerializer(HyperlinkedModelSerializer): + class Meta: + model = relation_info.related_model + depth = nested_depth - 1 + fields = '__all__' + + field_class = NestedSerializer + field_kwargs = get_nested_relation_kwargs(relation_info) + + return field_class, field_kwargs diff --git a/env/lib/python3.12/site-packages/rest_framework/settings.py b/env/lib/python3.12/site-packages/rest_framework/settings.py new file mode 100644 index 00000000..b0d7bace --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/settings.py @@ -0,0 +1,258 @@ +""" +Settings for REST framework are all namespaced in the REST_FRAMEWORK setting. +For example your project's `settings.py` file might look like this: + +REST_FRAMEWORK = { + 'DEFAULT_RENDERER_CLASSES': [ + 'rest_framework.renderers.JSONRenderer', + 'rest_framework.renderers.TemplateHTMLRenderer', + ], + 'DEFAULT_PARSER_CLASSES': [ + 'rest_framework.parsers.JSONParser', + 'rest_framework.parsers.FormParser', + 'rest_framework.parsers.MultiPartParser', + ], +} + +This module provides the `api_setting` object, that is used to access +REST framework settings, checking for user settings first, then falling +back to the defaults. +""" +from django.conf import settings +# Import from `django.core.signals` instead of the official location +# `django.test.signals` to avoid importing the test module unnecessarily. +from django.core.signals import setting_changed +from django.utils.module_loading import import_string + +from rest_framework import ISO_8601 + +DEFAULTS = { + # Base API policies + 'DEFAULT_RENDERER_CLASSES': [ + 'rest_framework.renderers.JSONRenderer', + 'rest_framework.renderers.BrowsableAPIRenderer', + ], + 'DEFAULT_PARSER_CLASSES': [ + 'rest_framework.parsers.JSONParser', + 'rest_framework.parsers.FormParser', + 'rest_framework.parsers.MultiPartParser' + ], + 'DEFAULT_AUTHENTICATION_CLASSES': [ + 'rest_framework.authentication.SessionAuthentication', + 'rest_framework.authentication.BasicAuthentication' + ], + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.AllowAny', + ], + 'DEFAULT_THROTTLE_CLASSES': [], + 'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation', + 'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata', + 'DEFAULT_VERSIONING_CLASS': None, + + # Generic view behavior + 'DEFAULT_PAGINATION_CLASS': None, + 'DEFAULT_FILTER_BACKENDS': [], + + # Schema + 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.openapi.AutoSchema', + + # Throttling + 'DEFAULT_THROTTLE_RATES': { + 'user': None, + 'anon': None, + }, + 'NUM_PROXIES': None, + + # Pagination + 'PAGE_SIZE': None, + + # Filtering + 'SEARCH_PARAM': 'search', + 'ORDERING_PARAM': 'ordering', + + # Versioning + 'DEFAULT_VERSION': None, + 'ALLOWED_VERSIONS': None, + 'VERSION_PARAM': 'version', + + # Authentication + 'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser', + 'UNAUTHENTICATED_TOKEN': None, + + # View configuration + 'VIEW_NAME_FUNCTION': 'rest_framework.views.get_view_name', + 'VIEW_DESCRIPTION_FUNCTION': 'rest_framework.views.get_view_description', + + # Exception handling + 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler', + 'NON_FIELD_ERRORS_KEY': 'non_field_errors', + + # Testing + 'TEST_REQUEST_RENDERER_CLASSES': [ + 'rest_framework.renderers.MultiPartRenderer', + 'rest_framework.renderers.JSONRenderer' + ], + 'TEST_REQUEST_DEFAULT_FORMAT': 'multipart', + + # Hyperlink settings + 'URL_FORMAT_OVERRIDE': 'format', + 'FORMAT_SUFFIX_KWARG': 'format', + 'URL_FIELD_NAME': 'url', + + # Input and output formats + 'DATE_FORMAT': ISO_8601, + 'DATE_INPUT_FORMATS': [ISO_8601], + + 'DATETIME_FORMAT': ISO_8601, + 'DATETIME_INPUT_FORMATS': [ISO_8601], + + 'TIME_FORMAT': ISO_8601, + 'TIME_INPUT_FORMATS': [ISO_8601], + + # Encoding + 'UNICODE_JSON': True, + 'COMPACT_JSON': True, + 'STRICT_JSON': True, + 'COERCE_DECIMAL_TO_STRING': True, + 'UPLOADED_FILES_USE_URL': True, + + # Browsable API + 'HTML_SELECT_CUTOFF': 1000, + 'HTML_SELECT_CUTOFF_TEXT': "More than {count} items...", + + # Schemas + 'SCHEMA_COERCE_PATH_PK': True, + 'SCHEMA_COERCE_METHOD_NAMES': { + 'retrieve': 'read', + 'destroy': 'delete' + }, +} + + +# List of settings that may be in string import notation. +IMPORT_STRINGS = [ + 'DEFAULT_RENDERER_CLASSES', + 'DEFAULT_PARSER_CLASSES', + 'DEFAULT_AUTHENTICATION_CLASSES', + 'DEFAULT_PERMISSION_CLASSES', + 'DEFAULT_THROTTLE_CLASSES', + 'DEFAULT_CONTENT_NEGOTIATION_CLASS', + 'DEFAULT_METADATA_CLASS', + 'DEFAULT_VERSIONING_CLASS', + 'DEFAULT_PAGINATION_CLASS', + 'DEFAULT_FILTER_BACKENDS', + 'DEFAULT_SCHEMA_CLASS', + 'EXCEPTION_HANDLER', + 'TEST_REQUEST_RENDERER_CLASSES', + 'UNAUTHENTICATED_USER', + 'UNAUTHENTICATED_TOKEN', + 'VIEW_NAME_FUNCTION', + 'VIEW_DESCRIPTION_FUNCTION' +] + + +# List of settings that have been removed +REMOVED_SETTINGS = [ + 'PAGINATE_BY', 'PAGINATE_BY_PARAM', 'MAX_PAGINATE_BY', +] + + +def perform_import(val, setting_name): + """ + If the given setting is a string import notation, + then perform the necessary import or imports. + """ + if val is None: + return None + elif isinstance(val, str): + return import_from_string(val, setting_name) + elif isinstance(val, (list, tuple)): + return [import_from_string(item, setting_name) for item in val] + return val + + +def import_from_string(val, setting_name): + """ + Attempt to import a class from a string representation. + """ + try: + return import_string(val) + except ImportError as e: + msg = "Could not import '%s' for API setting '%s'. %s: %s." % (val, setting_name, e.__class__.__name__, e) + raise ImportError(msg) + + +class APISettings: + """ + A settings object that allows REST Framework settings to be accessed as + properties. For example: + + from rest_framework.settings import api_settings + print(api_settings.DEFAULT_RENDERER_CLASSES) + + Any setting with string import paths will be automatically resolved + and return the class, rather than the string literal. + + Note: + This is an internal class that is only compatible with settings namespaced + under the REST_FRAMEWORK name. It is not intended to be used by 3rd-party + apps, and test helpers like `override_settings` may not work as expected. + """ + def __init__(self, user_settings=None, defaults=None, import_strings=None): + if user_settings: + self._user_settings = self.__check_user_settings(user_settings) + self.defaults = defaults or DEFAULTS + self.import_strings = import_strings or IMPORT_STRINGS + self._cached_attrs = set() + + @property + def user_settings(self): + if not hasattr(self, '_user_settings'): + self._user_settings = getattr(settings, 'REST_FRAMEWORK', {}) + return self._user_settings + + def __getattr__(self, attr): + if attr not in self.defaults: + raise AttributeError("Invalid API setting: '%s'" % attr) + + try: + # Check if present in user settings + val = self.user_settings[attr] + except KeyError: + # Fall back to defaults + val = self.defaults[attr] + + # Coerce import strings into classes + if attr in self.import_strings: + val = perform_import(val, attr) + + # Cache the result + self._cached_attrs.add(attr) + setattr(self, attr, val) + return val + + def __check_user_settings(self, user_settings): + SETTINGS_DOC = "https://www.django-rest-framework.org/api-guide/settings/" + for setting in REMOVED_SETTINGS: + if setting in user_settings: + raise RuntimeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC)) + return user_settings + + def reload(self): + for attr in self._cached_attrs: + delattr(self, attr) + self._cached_attrs.clear() + if hasattr(self, '_user_settings'): + delattr(self, '_user_settings') + + +api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS) + + +def reload_api_settings(*args, **kwargs): + setting = kwargs['setting'] + if setting == 'REST_FRAMEWORK': + api_settings.reload() + + +setting_changed.connect(reload_api_settings) diff --git a/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css new file mode 100644 index 00000000..2a69f48c --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map new file mode 100644 index 00000000..5d75106e --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-tweaks.css b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-tweaks.css new file mode 100644 index 00000000..5c033be3 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap-tweaks.css @@ -0,0 +1,237 @@ +/* + +This CSS file contains some tweaks specific to the included Bootstrap theme. +It's separate from `style.css` so that it can be easily overridden by replacing +a single block in the template. + +*/ + +.form-actions { + background: transparent; + border-top-color: transparent; + padding-top: 0; + text-align: right; +} + +#generic-content-form textarea { + font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace; + font-size: 80%; +} + +.navbar-inverse .brand a { + color: #999999; +} +.navbar-inverse .brand:hover a { + color: white; + text-decoration: none; +} + +/* custom navigation styles */ +.navbar { + width: 100%; + position: fixed; + left: 0; + top: 0; +} + +.navbar { + background: #2C2C2C; + color: white; + border: none; + border-top: 5px solid #A30000; + border-radius: 0px; +} + +.navbar .nav li, .navbar .nav li a, .navbar .brand:hover { + color: white; +} + +.nav-list > .active > a, .nav-list > .active > a:hover { + background: #2C2C2C; +} + +.navbar .dropdown-menu li a, .navbar .dropdown-menu li { + color: #A30000; +} + +.navbar .dropdown-menu li a:hover { + background: #EEEEEE; + color: #C20000; +} + +ul.breadcrumb { + margin: 70px 0 0 0; +} + +.breadcrumb li.active a { + color: #777; +} + +.pagination>.disabled>a, +.pagination>.disabled>a:hover, +.pagination>.disabled>a:focus { + cursor: not-allowed; + pointer-events: none; +} + +.pager>.disabled>a, +.pager>.disabled>a:hover, +.pager>.disabled>a:focus { + pointer-events: none; +} + +.pager .next { + margin-left: 10px; +} + +/*=== dabapps bootstrap styles ====*/ + +html { + width:100%; + background: none; +} + +/*body, .navbar .container-fluid { + max-width: 1150px; + margin: 0 auto; +}*/ + +body { + background: url("../img/grid.png") repeat-x; + background-attachment: fixed; +} + +#content { + margin: 0; + padding-bottom: 60px; +} + +/* sticky footer and footer */ +html, body { + height: 100%; +} + +.wrapper { + position: relative; + top: 0; + left: 0; + padding-top: 60px; + margin: -60px 0; + min-height: 100%; +} + +.form-switcher { + margin-bottom: 0; +} + +.well { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.well .form-actions { + padding-bottom: 0; + margin-bottom: 0; +} + +.well form { + margin-bottom: 0; +} + +.nav-tabs { + border: 0; +} + +.nav-tabs > li { + float: right; +} + +.nav-tabs li a { + margin-right: 0; +} + +.nav-tabs > .active > a { + background: #F5F5F5; +} + +.nav-tabs > .active > a:hover { + background: #F5F5F5; +} + +.tabbable.first-tab-active .tab-content { + border-top-right-radius: 0; +} + +footer { + position: absolute; + bottom: 0; + left: 0; + clear: both; + z-index: 10; + height: 60px; + width: 95%; + margin: 0 2.5%; +} + +footer p { + text-align: center; + color: gray; + border-top: 1px solid #DDDDDD; + padding-top: 10px; +} + +footer a { + color: gray !important; + font-weight: bold; +} + +footer a:hover { + color: gray; +} + +.page-header { + border-bottom: none; + padding-bottom: 0px; + margin: 0; +} + +/* custom general page styles */ +.hero-unit h1, .hero-unit h2 { + color: #A30000; +} + +body a { + color: #A30000; +} + +body a:hover { + color: #c20000; +} + +.request-info { + clear:both; +} + +.horizontal-checkbox label { + padding-top: 0; +} + +.horizontal-checkbox label { + padding-top: 0 !important; +} + +.horizontal-checkbox input { + float: left; + width: 20px; + margin-top: 3px; +} + +.modal-footer form { + margin-left: 5px; + margin-right: 5px; +} + +.pagination { + margin: 5px 0 10px 0; +} diff --git a/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css new file mode 100644 index 00000000..5b96335f --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css.map b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css.map new file mode 100644 index 00000000..0ae3de50 --- /dev/null +++ b/env/lib/python3.12/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","dist/css/bootstrap.css","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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A,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,EFCJ,yBCzEC,Ub2zDC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcnxDI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFUJ,yBClFC,Ubo+DC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,Uc57DI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFmBJ,0BC3FC,Ub6oEC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcrmEI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GCjEJ,MACE,iBAAA,YADF,uBAQI,SAAA,OACA,QAAA,aACA,MAAA,KAKA,sBf+xEJ,sBe9xEM,SAAA,OACA,QAAA,WACA,MAAA,KAKN,QACE,YAAA,IACA,eAAA,IACA,MAAA,KACA,WAAA,KAGF,GACE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","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n//\n\nabbr[title] {\n border-bottom: none; // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n -moz-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n -o-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important; // Black prints faster: h5bp.com/s\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n}\n","// stylelint-disable value-list-comma-newline-after, value-list-comma-space-after, indentation, declaration-colon-newline-after, font-family-no-missing-generic-family-keyword\n\n//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"@{icon-font-path}@{icon-font-name}.eot\");\n src: url(\"@{icon-font-path}@{icon-font-name}.eot?#iefix\") format(\"embedded-opentype\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff2\") format(\"woff2\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff\") format(\"woff\"),\n url(\"@{icon-font-path}@{icon-font-name}.ttf\") format(\"truetype\"),\n url(\"@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}\") format(\"svg\");\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// stylelint-disable media-feature-name-no-vendor-prefix, media-feature-parentheses-space-inside, media-feature-name-no-unknown, indentation, at-rule-name-space-after\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","// stylelint-disable selector-list-comma-newline-after, selector-no-qualifying-type\n\n//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: 400;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n padding: .2em;\n background-color: @state-warning-bg;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: \"\"; }\n &:after {\n content: \"\\00A0 \\2014\"; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n color: @pre-color;\n word-break: break-all;\n word-wrap: break-word;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n padding-right: ceil((@gutter / 2));\n padding-left: floor((@gutter / 2));\n margin-right: auto;\n margin-left: auto;\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-right: floor((@gutter / -2));\n margin-left: ceil((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-right: floor((@grid-gutter-width / 2));\n padding-left: ceil((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-no-qualifying-type\n\n//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type, property-no-vendor-prefix, media-feature-name-no-vendor-prefix\n\n//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: 700;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\ninput[type=\"search\"] {\n // Override content-box in Normalize (* isn't specific enough)\n .box-sizing(border-box);\n\n // Search inputs in iOS\n //\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n -webkit-appearance: none;\n appearance: none;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n\n // Apply same disabled cursor tweak as for inputs\n // Some special care is needed because

    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 rAq}Wz@@HlICXa%jPU;f@8gB8 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py index 4d20bc9b..b34b0fcb 100644 --- a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -8,7 +8,7 @@ """ __author__ = "Eric Larson" __email__ = "eric@ionrock.org" -__version__ = "0.13.1" +__version__ = "0.14.0" from pip._vendor.cachecontrol.adapter import CacheControlAdapter from pip._vendor.cachecontrol.controller import CacheController diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc index d163de4d5445f6e83496643bb62ade014626851a..a770d7983353667de9541e4b8c7c60c1353f90cd 100644 GIT binary patch delta 107 zcmbQizJZ&wi_@% diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc index b67888913e707649b566f3e3c0091622e2e526f9..3acf962e96f6b9ca76bae815d10516961f30af20 100644 GIT binary patch delta 99 zcmaDM(jdxnnwOW00SIgv8PhlNW3Dm78UEKBqf%oW+m#o$|3u zCMT9;=I7}LCnx5l7AZI;C#Iz4R_gosxab2J`7T+BdFlB9Mfq8&$t9atGwo#u00fmG ArT_o{ delta 75 zcmZn=eIdegnwOW00SJQce@olQlh0&Os2^IKT2!o`omiBZrz>% diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc index aeb24ea376a7130f747e47d61f75d20eb1ba6922..a37978ec23efed8c5acdf48d9b9c8fa55f9af6f4 100644 GIT binary patch delta 100 zcmca)^va0$G%qg~0}$9UGNxbN$h(-uqenlqIJKx)KP4%#JT)s(-z7h}G&eP`q*&iI zr8GIQBr`uxKR7utC$&hyF*z|MHMdgV$Hzq<$jEoeO3X{o4=BpdN=+`={D7rM1OSzb BBRl{A delta 76 zcmaE5bjgVKG%qg~0}uq?|CaV+Bky7sgA)DF;?$yI{p`e|#5}#EjKq@6M17ak;_Q^MflsJEvO99JE{6m=1D|+*WM|~&AP#0mUVX5F8@z&G>2yvxxb!5>L{