From 823d3717809aaec2ab6a1d06f4798ea564b55865 Mon Sep 17 00:00:00 2001 From: CalunVier Date: Sun, 8 May 2022 17:18:08 +0800 Subject: [PATCH] Deleted all of the unnecessary files. --- .gitignore | 1 - .idea/ITShowPlatform.iml | 25 - .idea/dataSources.local.xml | 10 - .idea/dataSources.xml | 12 - .idea/deployment.xml | 14 - .idea/inspectionProfiles/Project_Default.xml | 50 - .../inspectionProfiles/profiles_settings.xml | 6 - .idea/misc.xml | 7 - .idea/modules.xml | 8 - .../shelved.patch | 106 - ...at_2022_5_4_13_59__Default_Changelist_.xml | 4 - .../shelved.patch | 261 - ...at_2022_5_5_22_44__Default_Changelist_.xml | 4 - ...at_2022_5_5_22_17__Default_Changelist_.xml | 4 - .../shelved.patch | 201 - .idea/sshConfigs.xml | 8 - .idea/vcs.xml | 6 - .idea/webServers.xml | 14 - .idea/workspace.xml | 232 - .../Django-3.2.5.dist-info/INSTALLER | 1 - .../Django-3.2.5.dist-info/REQUESTED | 0 .../Django-3.2.5.dist-info/top_level.txt | 1 - .../Markdown-3.3.6.dist-info/INSTALLER | 1 - .../Markdown-3.3.6.dist-info/LICENSE.md | 29 - .../Markdown-3.3.6.dist-info/METADATA | 110 - .../Markdown-3.3.6.dist-info/RECORD | 77 - .../Markdown-3.3.6.dist-info/REQUESTED | 0 .../Markdown-3.3.6.dist-info/WHEEL | 5 - .../Markdown-3.3.6.dist-info/entry_points.txt | 23 - .../Markdown-3.3.6.dist-info/top_level.txt | 1 - venv/Lib/site-packages/MySQLdb/__init__.py | 170 - venv/Lib/site-packages/MySQLdb/_exceptions.py | 69 - .../MySQLdb/_mysql.cp39-win_amd64.pyd | Bin 311808 -> 0 bytes venv/Lib/site-packages/MySQLdb/connections.py | 333 - .../site-packages/MySQLdb/constants/CLIENT.py | 27 - .../Lib/site-packages/MySQLdb/constants/CR.py | 105 - .../Lib/site-packages/MySQLdb/constants/ER.py | 827 - .../MySQLdb/constants/FIELD_TYPE.py | 40 - .../site-packages/MySQLdb/constants/FLAG.py | 23 - .../MySQLdb/constants/__init__.py | 1 - venv/Lib/site-packages/MySQLdb/converters.py | 139 - venv/Lib/site-packages/MySQLdb/cursors.py | 489 - venv/Lib/site-packages/MySQLdb/release.py | 4 - venv/Lib/site-packages/MySQLdb/times.py | 150 - venv/Lib/site-packages/PIL/BdfFontFile.py | 110 - venv/Lib/site-packages/PIL/BlpImagePlugin.py | 497 - venv/Lib/site-packages/PIL/BmpImagePlugin.py | 438 - .../site-packages/PIL/BufrStubImagePlugin.py | 73 - venv/Lib/site-packages/PIL/ContainerIO.py | 120 - venv/Lib/site-packages/PIL/CurImagePlugin.py | 75 - venv/Lib/site-packages/PIL/DcxImagePlugin.py | 89 - venv/Lib/site-packages/PIL/DdsImagePlugin.py | 249 - venv/Lib/site-packages/PIL/EpsImagePlugin.py | 411 - venv/Lib/site-packages/PIL/ExifTags.py | 331 - venv/Lib/site-packages/PIL/FitsImagePlugin.py | 71 - .../site-packages/PIL/FitsStubImagePlugin.py | 77 - venv/Lib/site-packages/PIL/FliImagePlugin.py | 171 - venv/Lib/site-packages/PIL/FontFile.py | 111 - venv/Lib/site-packages/PIL/FpxImagePlugin.py | 242 - venv/Lib/site-packages/PIL/FtexImagePlugin.py | 135 - venv/Lib/site-packages/PIL/GbrImagePlugin.py | 98 - venv/Lib/site-packages/PIL/GdImageFile.py | 90 - venv/Lib/site-packages/PIL/GifImagePlugin.py | 1038 - .../Lib/site-packages/PIL/GimpGradientFile.py | 140 - venv/Lib/site-packages/PIL/GimpPaletteFile.py | 56 - .../site-packages/PIL/GribStubImagePlugin.py | 73 - .../site-packages/PIL/Hdf5StubImagePlugin.py | 73 - venv/Lib/site-packages/PIL/IcnsImagePlugin.py | 392 - venv/Lib/site-packages/PIL/IcoImagePlugin.py | 355 - venv/Lib/site-packages/PIL/ImImagePlugin.py | 376 - venv/Lib/site-packages/PIL/Image.py | 3697 -- venv/Lib/site-packages/PIL/ImageChops.py | 328 - venv/Lib/site-packages/PIL/ImageCms.py | 1029 - venv/Lib/site-packages/PIL/ImageColor.py | 302 - venv/Lib/site-packages/PIL/ImageDraw.py | 1004 - venv/Lib/site-packages/PIL/ImageDraw2.py | 179 - venv/Lib/site-packages/PIL/ImageEnhance.py | 103 - venv/Lib/site-packages/PIL/ImageFile.py | 748 - venv/Lib/site-packages/PIL/ImageFilter.py | 538 - venv/Lib/site-packages/PIL/ImageFont.py | 1083 - venv/Lib/site-packages/PIL/ImageGrab.py | 124 - venv/Lib/site-packages/PIL/ImageMath.py | 259 - venv/Lib/site-packages/PIL/ImageMode.py | 91 - venv/Lib/site-packages/PIL/ImageMorph.py | 245 - venv/Lib/site-packages/PIL/ImageOps.py | 610 - venv/Lib/site-packages/PIL/ImagePalette.py | 261 - venv/Lib/site-packages/PIL/ImagePath.py | 19 - venv/Lib/site-packages/PIL/ImageQt.py | 223 - venv/Lib/site-packages/PIL/ImageSequence.py | 75 - venv/Lib/site-packages/PIL/ImageShow.py | 417 - venv/Lib/site-packages/PIL/ImageStat.py | 147 - venv/Lib/site-packages/PIL/ImageTk.py | 301 - venv/Lib/site-packages/PIL/ImageTransform.py | 102 - venv/Lib/site-packages/PIL/ImageWin.py | 230 - venv/Lib/site-packages/PIL/ImtImagePlugin.py | 93 - venv/Lib/site-packages/PIL/IptcImagePlugin.py | 230 - .../site-packages/PIL/Jpeg2KImagePlugin.py | 362 - venv/Lib/site-packages/PIL/JpegImagePlugin.py | 830 - venv/Lib/site-packages/PIL/JpegPresets.py | 240 - .../site-packages/PIL/McIdasImagePlugin.py | 75 - venv/Lib/site-packages/PIL/MicImagePlugin.py | 107 - venv/Lib/site-packages/PIL/MpegImagePlugin.py | 83 - venv/Lib/site-packages/PIL/MpoImagePlugin.py | 137 - venv/Lib/site-packages/PIL/MspImagePlugin.py | 194 - venv/Lib/site-packages/PIL/PSDraw.py | 235 - venv/Lib/site-packages/PIL/PaletteFile.py | 53 - venv/Lib/site-packages/PIL/PalmImagePlugin.py | 227 - venv/Lib/site-packages/PIL/PcdImagePlugin.py | 63 - venv/Lib/site-packages/PIL/PcfFontFile.py | 248 - venv/Lib/site-packages/PIL/PcxImagePlugin.py | 218 - venv/Lib/site-packages/PIL/PdfImagePlugin.py | 239 - venv/Lib/site-packages/PIL/PdfParser.py | 998 - .../Lib/site-packages/PIL/PixarImagePlugin.py | 70 - venv/Lib/site-packages/PIL/PngImagePlugin.py | 1432 - venv/Lib/site-packages/PIL/PpmImagePlugin.py | 199 - venv/Lib/site-packages/PIL/PsdImagePlugin.py | 311 - venv/Lib/site-packages/PIL/PyAccess.py | 353 - venv/Lib/site-packages/PIL/SgiImagePlugin.py | 230 - .../site-packages/PIL/SpiderImagePlugin.py | 322 - venv/Lib/site-packages/PIL/SunImagePlugin.py | 136 - venv/Lib/site-packages/PIL/TarIO.py | 65 - venv/Lib/site-packages/PIL/TgaImagePlugin.py | 253 - venv/Lib/site-packages/PIL/TiffImagePlugin.py | 2112 - venv/Lib/site-packages/PIL/TiffTags.py | 522 - venv/Lib/site-packages/PIL/WalImageFile.py | 124 - venv/Lib/site-packages/PIL/WebPImagePlugin.py | 353 - venv/Lib/site-packages/PIL/WmfImagePlugin.py | 177 - .../site-packages/PIL/XVThumbImagePlugin.py | 78 - venv/Lib/site-packages/PIL/XbmImagePlugin.py | 95 - venv/Lib/site-packages/PIL/XpmImagePlugin.py | 130 - venv/Lib/site-packages/PIL/__init__.py | 80 - venv/Lib/site-packages/PIL/__main__.py | 3 - venv/Lib/site-packages/PIL/_binary.py | 102 - .../PIL/_imaging.cp39-win_amd64.pyd | Bin 3202048 -> 0 bytes .../PIL/_imagingcms.cp39-win_amd64.pyd | Bin 254976 -> 0 bytes .../PIL/_imagingft.cp39-win_amd64.pyd | Bin 1505280 -> 0 bytes .../PIL/_imagingmath.cp39-win_amd64.pyd | Bin 25088 -> 0 bytes .../PIL/_imagingmorph.cp39-win_amd64.pyd | Bin 13824 -> 0 bytes .../PIL/_imagingtk.cp39-win_amd64.pyd | Bin 15360 -> 0 bytes venv/Lib/site-packages/PIL/_tkinter_finder.py | 25 - venv/Lib/site-packages/PIL/_util.py | 19 - venv/Lib/site-packages/PIL/_version.py | 2 - .../PIL/_webp.cp39-win_amd64.pyd | Bin 522752 -> 0 bytes venv/Lib/site-packages/PIL/concrt140.dll | Bin 317864 -> 0 bytes venv/Lib/site-packages/PIL/features.py | 320 - venv/Lib/site-packages/PIL/msvcp140.dll | Bin 566704 -> 0 bytes venv/Lib/site-packages/PIL/msvcp140_1.dll | Bin 23944 -> 0 bytes venv/Lib/site-packages/PIL/msvcp140_2.dll | Bin 186800 -> 0 bytes .../PIL/msvcp140_atomic_wait.dll | Bin 57264 -> 0 bytes .../PIL/msvcp140_codecvt_ids.dll | Bin 21424 -> 0 bytes venv/Lib/site-packages/PIL/vccorlib140.dll | Bin 335792 -> 0 bytes venv/Lib/site-packages/PIL/vcruntime140.dll | Bin 98224 -> 0 bytes venv/Lib/site-packages/PIL/vcruntime140_1.dll | Bin 37256 -> 0 bytes .../Pillow-9.1.0.dist-info/INSTALLER | 1 - .../Pillow-9.1.0.dist-info/LICENSE | 30 - .../Pillow-9.1.0.dist-info/METADATA | 167 - .../Pillow-9.1.0.dist-info/RECORD | 210 - .../Pillow-9.1.0.dist-info/REQUESTED | 0 .../Pillow-9.1.0.dist-info/WHEEL | 5 - .../Pillow-9.1.0.dist-info/top_level.txt | 1 - .../Pillow-9.1.0.dist-info/zip-safe | 1 - .../site-packages/_distutils_hack/__init__.py | 166 - .../site-packages/_distutils_hack/override.py | 1 - .../backports/configparser/__init__.py | 1440 - .../backports/configparser/compat.py | 19 - .../configparser-5.2.0.dist-info/INSTALLER | 1 - .../configparser-5.2.0.dist-info/LICENSE | 19 - .../configparser-5.2.0.dist-info/METADATA | 267 - .../configparser-5.2.0.dist-info/RECORD | 13 - .../configparser-5.2.0.dist-info/REQUESTED | 0 .../configparser-5.2.0.dist-info/WHEEL | 5 - .../top_level.txt | 2 - venv/Lib/site-packages/configparser.py | 61 - .../site-packages/distutils-precedence.pth | 1 - .../site-packages/django/bin/django-admin.py | 21 - .../django/contrib/postgres/forms/jsonb.py | 16 - .../django/db/migrations/operations/utils.py | 102 - .../django_filter-21.1.dist-info/INSTALLER | 1 - .../django_filter-21.1.dist-info/LICENSE | 24 - .../django_filter-21.1.dist-info/METADATA | 156 - .../django_filter-21.1.dist-info/RECORD | 74 - .../django_filter-21.1.dist-info/REQUESTED | 0 .../django_filter-21.1.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../site-packages/django_filters/__init__.py | 30 - .../site-packages/django_filters/compat.py | 25 - venv/Lib/site-packages/django_filters/conf.py | 109 - .../site-packages/django_filters/constants.py | 5 - .../django_filters/exceptions.py | 9 - .../site-packages/django_filters/fields.py | 312 - .../site-packages/django_filters/filters.py | 804 - .../site-packages/django_filters/filterset.py | 470 - .../locale/ar/LC_MESSAGES/django.mo | Bin 2568 -> 0 bytes .../locale/ar/LC_MESSAGES/django.po | 189 - .../locale/be/LC_MESSAGES/django.mo | Bin 2819 -> 0 bytes .../locale/be/LC_MESSAGES/django.po | 185 - .../locale/bg/LC_MESSAGES/django.mo | Bin 2711 -> 0 bytes .../locale/bg/LC_MESSAGES/django.po | 187 - .../locale/cs/LC_MESSAGES/django.mo | Bin 2368 -> 0 bytes .../locale/cs/LC_MESSAGES/django.po | 182 - .../locale/da/LC_MESSAGES/django.mo | Bin 2166 -> 0 bytes .../locale/da/LC_MESSAGES/django.po | 181 - .../locale/de/LC_MESSAGES/django.mo | Bin 2277 -> 0 bytes .../locale/de/LC_MESSAGES/django.po | 187 - .../locale/el/LC_MESSAGES/django.mo | Bin 2836 -> 0 bytes .../locale/el/LC_MESSAGES/django.po | 187 - .../locale/es/LC_MESSAGES/django.mo | Bin 2279 -> 0 bytes .../locale/es/LC_MESSAGES/django.po | 190 - .../locale/es_AR/LC_MESSAGES/django.mo | Bin 703 -> 0 bytes .../locale/es_AR/LC_MESSAGES/django.po | 47 - .../locale/fr/LC_MESSAGES/django.mo | Bin 727 -> 0 bytes .../locale/fr/LC_MESSAGES/django.po | 47 - .../locale/it/LC_MESSAGES/django.mo | Bin 2268 -> 0 bytes .../locale/it/LC_MESSAGES/django.po | 186 - .../locale/pl/LC_MESSAGES/django.mo | Bin 1859 -> 0 bytes .../locale/pl/LC_MESSAGES/django.po | 202 - .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 2263 -> 0 bytes .../locale/pt_BR/LC_MESSAGES/django.po | 186 - .../locale/ru/LC_MESSAGES/django.mo | Bin 2796 -> 0 bytes .../locale/ru/LC_MESSAGES/django.po | 189 - .../locale/sk/LC_MESSAGES/django.mo | Bin 2394 -> 0 bytes .../locale/sk/LC_MESSAGES/django.po | 188 - .../locale/uk/LC_MESSAGES/django.mo | Bin 2912 -> 0 bytes .../locale/uk/LC_MESSAGES/django.po | 184 - .../locale/zh_CN/LC_MESSAGES/django.mo | Bin 852 -> 0 bytes .../locale/zh_CN/LC_MESSAGES/django.po | 64 - .../django_filters/rest_framework/__init__.py | 4 - .../django_filters/rest_framework/backends.py | 170 - .../django_filters/rest_framework/filters.py | 13 - .../rest_framework/filterset.py | 40 - .../rest_framework/crispy_form.html | 5 - .../django_filters/rest_framework/form.html | 6 - .../django_filters/widgets/multiwidget.html | 1 - .../Lib/site-packages/django_filters/utils.py | 328 - .../Lib/site-packages/django_filters/views.py | 116 - .../site-packages/django_filters/widgets.py | 270 - .../INSTALLER | 1 - .../LICENSE.md | 29 - .../METADATA | 264 - .../RECORD | 311 - .../REQUESTED | 0 .../WHEEL | 5 - .../top_level.txt | 1 - .../INSTALLER | 1 - .../LICENSE | 13 - .../METADATA | 118 - .../RECORD | 23 - .../importlib_metadata-4.11.3.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../importlib_metadata/__init__.py | 1075 - .../importlib_metadata/_adapters.py | 68 - .../importlib_metadata/_collections.py | 30 - .../importlib_metadata/_compat.py | 71 - .../importlib_metadata/_functools.py | 104 - .../importlib_metadata/_itertools.py | 73 - .../site-packages/importlib_metadata/_meta.py | 48 - .../site-packages/importlib_metadata/_text.py | 99 - .../site-packages/importlib_metadata/py.typed | 0 venv/Lib/site-packages/markdown/__init__.py | 61 - venv/Lib/site-packages/markdown/__main__.py | 151 - venv/Lib/site-packages/markdown/__meta__.py | 49 - .../Lib/site-packages/markdown/blockparser.py | 125 - .../site-packages/markdown/blockprocessors.py | 623 - venv/Lib/site-packages/markdown/core.py | 407 - .../markdown/extensions/__init__.py | 107 - .../site-packages/markdown/extensions/abbr.py | 99 - .../markdown/extensions/admonition.py | 170 - .../markdown/extensions/attr_list.py | 166 - .../markdown/extensions/codehilite.py | 307 - .../markdown/extensions/def_list.py | 111 - .../markdown/extensions/extra.py | 58 - .../markdown/extensions/fenced_code.py | 179 - .../markdown/extensions/footnotes.py | 402 - .../markdown/extensions/legacy_attrs.py | 67 - .../markdown/extensions/legacy_em.py | 49 - .../markdown/extensions/md_in_html.py | 364 - .../site-packages/markdown/extensions/meta.py | 79 - .../markdown/extensions/nl2br.py | 33 - .../markdown/extensions/sane_lists.py | 54 - .../markdown/extensions/smarty.py | 263 - .../markdown/extensions/tables.py | 223 - .../site-packages/markdown/extensions/toc.py | 380 - .../markdown/extensions/wikilinks.py | 87 - venv/Lib/site-packages/markdown/htmlparser.py | 323 - .../site-packages/markdown/inlinepatterns.py | 892 - venv/Lib/site-packages/markdown/pep562.py | 245 - .../site-packages/markdown/postprocessors.py | 134 - .../site-packages/markdown/preprocessors.py | 82 - .../Lib/site-packages/markdown/serializers.py | 189 - venv/Lib/site-packages/markdown/test_tools.py | 220 - .../site-packages/markdown/treeprocessors.py | 436 - venv/Lib/site-packages/markdown/util.py | 485 - .../mysqlclient-2.1.0.dist-info/INSTALLER | 1 - .../mysqlclient-2.1.0.dist-info/LICENSE | 339 - .../mysqlclient-2.1.0.dist-info/METADATA | 134 - .../mysqlclient-2.1.0.dist-info/RECORD | 34 - .../mysqlclient-2.1.0.dist-info/REQUESTED | 0 .../mysqlclient-2.1.0.dist-info/WHEEL | 5 - .../mysqlclient-2.1.0.dist-info/top_level.txt | 1 - venv/Lib/site-packages/pip/__init__.py | 13 - venv/Lib/site-packages/pip/__main__.py | 31 - .../site-packages/pip/_internal/__init__.py | 19 - .../site-packages/pip/_internal/build_env.py | 293 - venv/Lib/site-packages/pip/_internal/cache.py | 264 - .../pip/_internal/cli/__init__.py | 4 - .../pip/_internal/cli/autocompletion.py | 163 - .../pip/_internal/cli/base_command.py | 214 - .../pip/_internal/cli/cmdoptions.py | 1010 - .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 70 - .../pip/_internal/cli/main_parser.py | 87 - .../site-packages/pip/_internal/cli/parser.py | 292 - .../pip/_internal/cli/progress_bars.py | 250 - .../pip/_internal/cli/req_command.py | 469 - .../pip/_internal/cli/spinners.py | 157 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 127 - .../pip/_internal/commands/cache.py | 223 - .../pip/_internal/commands/check.py | 53 - .../pip/_internal/commands/completion.py | 96 - .../pip/_internal/commands/configuration.py | 266 - .../pip/_internal/commands/debug.py | 202 - .../pip/_internal/commands/download.py | 139 - .../pip/_internal/commands/freeze.py | 97 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 138 - .../pip/_internal/commands/install.py | 770 - .../pip/_internal/commands/list.py | 361 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 235 - .../pip/_internal/commands/uninstall.py | 105 - .../pip/_internal/commands/wheel.py | 177 - .../pip/_internal/configuration.py | 367 - .../pip/_internal/distributions/__init__.py | 21 - .../pip/_internal/distributions/base.py | 36 - .../pip/_internal/distributions/installed.py | 22 - .../pip/_internal/distributions/sdist.py | 129 - .../pip/_internal/distributions/wheel.py | 31 - .../site-packages/pip/_internal/exceptions.py | 402 - .../pip/_internal/index/__init__.py | 2 - .../pip/_internal/index/collector.py | 536 - .../pip/_internal/index/package_finder.py | 993 - .../pip/_internal/index/sources.py | 224 - .../pip/_internal/locations/__init__.py | 446 - .../pip/_internal/locations/_distutils.py | 169 - .../pip/_internal/locations/_sysconfig.py | 219 - .../pip/_internal/locations/base.py | 52 - venv/Lib/site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 51 - .../pip/_internal/metadata/base.py | 330 - .../pip/_internal/metadata/pkg_resources.py | 146 - .../pip/_internal/models/__init__.py | 2 - .../pip/_internal/models/candidate.py | 34 - .../pip/_internal/models/direct_url.py | 220 - .../pip/_internal/models/format_control.py | 80 - .../pip/_internal/models/index.py | 28 - .../pip/_internal/models/link.py | 288 - .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 129 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 110 - .../pip/_internal/models/wheel.py | 89 - .../pip/_internal/network/__init__.py | 2 - .../pip/_internal/network/auth.py | 323 - .../pip/_internal/network/cache.py | 69 - .../pip/_internal/network/download.py | 184 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 454 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 60 - .../pip/_internal/operations/__init__.py | 0 .../_internal/operations/build/__init__.py | 0 .../_internal/operations/build/metadata.py | 30 - .../operations/build/metadata_editable.py | 34 - .../operations/build/metadata_legacy.py | 67 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 105 - .../pip/_internal/operations/check.py | 149 - .../pip/_internal/operations/freeze.py | 254 - .../_internal/operations/install/__init__.py | 2 - .../operations/install/editable_legacy.py | 46 - .../_internal/operations/install/legacy.py | 125 - .../pip/_internal/operations/install/wheel.py | 738 - .../pip/_internal/operations/prepare.py | 632 - .../site-packages/pip/_internal/pyproject.py | 183 - .../pip/_internal/req/__init__.py | 94 - .../pip/_internal/req/constructors.py | 466 - .../pip/_internal/req/req_file.py | 536 - .../pip/_internal/req/req_install.py | 891 - .../pip/_internal/req/req_set.py | 189 - .../pip/_internal/req/req_tracker.py | 124 - .../pip/_internal/req/req_uninstall.py | 633 - .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 467 - .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 540 - .../resolution/resolvelib/factory.py | 701 - .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 215 - .../resolution/resolvelib/reporter.py | 68 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 251 - .../pip/_internal/self_outdated_check.py | 182 - .../pip/_internal/utils/__init__.py | 0 .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 120 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/distutils_args.py | 42 - .../pip/_internal/utils/egg_link.py | 75 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 27 - .../pip/_internal/utils/filesystem.py | 182 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 144 - .../_internal/utils/inject_securetransport.py | 35 - .../pip/_internal/utils/logging.py | 358 - .../site-packages/pip/_internal/utils/misc.py | 689 - .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 84 - .../pip/_internal/utils/setuptools_build.py | 167 - .../pip/_internal/utils/subprocess.py | 289 - .../pip/_internal/utils/temp_dir.py | 246 - .../pip/_internal/utils/unpacking.py | 258 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 182 - .../pip/_internal/vcs/__init__.py | 15 - .../site-packages/pip/_internal/vcs/bazaar.py | 93 - .../site-packages/pip/_internal/vcs/git.py | 513 - .../pip/_internal/vcs/mercurial.py | 153 - .../pip/_internal/vcs/subversion.py | 318 - .../pip/_internal/vcs/versioncontrol.py | 693 - .../pip/_internal/wheel_builder.py | 375 - .../Lib/site-packages/pip/_vendor/__init__.py | 111 - .../pip/_vendor/cachecontrol/__init__.py | 11 - .../pip/_vendor/cachecontrol/_cmd.py | 57 - .../pip/_vendor/cachecontrol/adapter.py | 133 - .../pip/_vendor/cachecontrol/cache.py | 39 - .../_vendor/cachecontrol/caches/__init__.py | 2 - .../_vendor/cachecontrol/caches/file_cache.py | 146 - .../cachecontrol/caches/redis_cache.py | 33 - .../pip/_vendor/cachecontrol/compat.py | 29 - .../pip/_vendor/cachecontrol/controller.py | 376 - .../pip/_vendor/cachecontrol/filewrapper.py | 80 - .../pip/_vendor/cachecontrol/heuristics.py | 135 - .../pip/_vendor/cachecontrol/serialize.py | 188 - .../pip/_vendor/cachecontrol/wrapper.py | 29 - .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__main__.py | 12 - .../pip/_vendor/certifi/cacert.pem | 4257 -- .../site-packages/pip/_vendor/certifi/core.py | 76 - .../pip/_vendor/chardet/__init__.py | 83 - .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 233 - .../pip/_vendor/chardet/charsetgroupprober.py | 107 - .../pip/_vendor/chardet/charsetprober.py | 145 - .../pip/_vendor/chardet/cli/__init__.py | 1 - .../pip/_vendor/chardet/cli/chardetect.py | 84 - .../pip/_vendor/chardet/codingstatemachine.py | 88 - .../pip/_vendor/chardet/compat.py | 36 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 76 - .../pip/_vendor/chardet/escprober.py | 101 - .../pip/_vendor/chardet/escsm.py | 246 - .../pip/_vendor/chardet/eucjpprober.py | 92 - .../pip/_vendor/chardet/euckrfreq.py | 195 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 387 - .../pip/_vendor/chardet/euctwprober.py | 46 - .../pip/_vendor/chardet/gb2312freq.py | 283 - .../pip/_vendor/chardet/gb2312prober.py | 46 - .../pip/_vendor/chardet/hebrewprober.py | 292 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/jpcntx.py | 233 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4650 -- .../pip/_vendor/chardet/langgreekmodel.py | 4398 -- .../pip/_vendor/chardet/langhebrewmodel.py | 4383 -- .../pip/_vendor/chardet/langhungarianmodel.py | 4650 -- .../pip/_vendor/chardet/langrussianmodel.py | 5718 --- .../pip/_vendor/chardet/langthaimodel.py | 4383 -- .../pip/_vendor/chardet/langturkishmodel.py | 4383 -- .../pip/_vendor/chardet/latin1prober.py | 145 - .../pip/_vendor/chardet/mbcharsetprober.py | 91 - .../pip/_vendor/chardet/mbcsgroupprober.py | 54 - .../pip/_vendor/chardet/mbcssm.py | 572 - .../pip/_vendor/chardet/metadata/__init__.py | 0 .../pip/_vendor/chardet/metadata/languages.py | 310 - .../pip/_vendor/chardet/sbcharsetprober.py | 145 - .../pip/_vendor/chardet/sbcsgroupprober.py | 83 - .../pip/_vendor/chardet/sjisprober.py | 92 - .../pip/_vendor/chardet/universaldetector.py | 286 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 6 - .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 258 - .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/distlib/__init__.py | 23 - .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../pip/_vendor/distlib/_backport/misc.py | 41 - .../pip/_vendor/distlib/_backport/shutil.py | 764 - .../_vendor/distlib/_backport/sysconfig.cfg | 84 - .../_vendor/distlib/_backport/sysconfig.py | 786 - .../pip/_vendor/distlib/_backport/tarfile.py | 2607 - .../pip/_vendor/distlib/compat.py | 1122 - .../pip/_vendor/distlib/database.py | 1339 - .../pip/_vendor/distlib/index.py | 509 - .../pip/_vendor/distlib/locators.py | 1300 - .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 147 - .../pip/_vendor/distlib/metadata.py | 1058 - .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 429 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 96768 -> 0 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 180736 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 105984 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1969 - .../pip/_vendor/distlib/version.py | 739 - .../site-packages/pip/_vendor/distlib/w32.exe | Bin 90112 -> 0 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 166400 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 99840 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 1053 - venv/Lib/site-packages/pip/_vendor/distro.py | 1386 - .../pip/_vendor/html5lib/__init__.py | 35 - .../pip/_vendor/html5lib/_ihatexml.py | 289 - .../pip/_vendor/html5lib/_inputstream.py | 918 - .../pip/_vendor/html5lib/_tokenizer.py | 1735 - .../pip/_vendor/html5lib/_trie/__init__.py | 5 - .../pip/_vendor/html5lib/_trie/_base.py | 40 - .../pip/_vendor/html5lib/_trie/py.py | 67 - .../pip/_vendor/html5lib/_utils.py | 159 - .../pip/_vendor/html5lib/constants.py | 2946 -- .../pip/_vendor/html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 - .../pip/_vendor/html5lib/filters/base.py | 12 - .../html5lib/filters/inject_meta_charset.py | 73 - .../pip/_vendor/html5lib/filters/lint.py | 93 - .../_vendor/html5lib/filters/optionaltags.py | 207 - .../pip/_vendor/html5lib/filters/sanitizer.py | 916 - .../_vendor/html5lib/filters/whitespace.py | 38 - .../pip/_vendor/html5lib/html5parser.py | 2795 -- .../pip/_vendor/html5lib/serializer.py | 409 - .../_vendor/html5lib/treeadapters/__init__.py | 30 - .../_vendor/html5lib/treeadapters/genshi.py | 54 - .../pip/_vendor/html5lib/treeadapters/sax.py | 50 - .../_vendor/html5lib/treebuilders/__init__.py | 88 - .../pip/_vendor/html5lib/treebuilders/base.py | 417 - .../pip/_vendor/html5lib/treebuilders/dom.py | 239 - .../_vendor/html5lib/treebuilders/etree.py | 343 - .../html5lib/treebuilders/etree_lxml.py | 392 - .../_vendor/html5lib/treewalkers/__init__.py | 154 - .../pip/_vendor/html5lib/treewalkers/base.py | 252 - .../pip/_vendor/html5lib/treewalkers/dom.py | 43 - .../pip/_vendor/html5lib/treewalkers/etree.py | 131 - .../html5lib/treewalkers/etree_lxml.py | 215 - .../_vendor/html5lib/treewalkers/genshi.py | 69 - .../pip/_vendor/idna/__init__.py | 44 - .../site-packages/pip/_vendor/idna/codec.py | 117 - .../site-packages/pip/_vendor/idna/compat.py | 16 - .../site-packages/pip/_vendor/idna/core.py | 409 - .../pip/_vendor/idna/idnadata.py | 2050 - .../pip/_vendor/idna/intranges.py | 58 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8438 ---- .../pip/_vendor/msgpack/__init__.py | 54 - .../pip/_vendor/msgpack/_version.py | 1 - .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1087 - .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 25 - .../pip/_vendor/packaging/_manylinux.py | 301 - .../pip/_vendor/packaging/_musllinux.py | 136 - .../pip/_vendor/packaging/_structures.py | 67 - .../pip/_vendor/packaging/markers.py | 304 - .../pip/_vendor/packaging/requirements.py | 146 - .../pip/_vendor/packaging/specifiers.py | 828 - .../pip/_vendor/packaging/tags.py | 484 - .../pip/_vendor/packaging/utils.py | 136 - .../pip/_vendor/packaging/version.py | 504 - .../pip/_vendor/pep517/__init__.py | 6 - .../site-packages/pip/_vendor/pep517/build.py | 127 - .../site-packages/pip/_vendor/pep517/check.py | 207 - .../pip/_vendor/pep517/colorlog.py | 115 - .../pip/_vendor/pep517/compat.py | 51 - .../pip/_vendor/pep517/dirtools.py | 44 - .../pip/_vendor/pep517/envbuild.py | 171 - .../pip/_vendor/pep517/in_process/__init__.py | 17 - .../_vendor/pep517/in_process/_in_process.py | 363 - .../site-packages/pip/_vendor/pep517/meta.py | 92 - .../pip/_vendor/pep517/wrappers.py | 375 - .../pip/_vendor/pkg_resources/__init__.py | 3296 -- .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/platformdirs/__init__.py | 329 - .../pip/_vendor/platformdirs/__main__.py | 44 - .../pip/_vendor/platformdirs/android.py | 117 - .../pip/_vendor/platformdirs/api.py | 155 - .../pip/_vendor/platformdirs/macos.py | 62 - .../pip/_vendor/platformdirs/unix.py | 180 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 180 - .../pip/_vendor/progress/__init__.py | 189 - .../site-packages/pip/_vendor/progress/bar.py | 93 - .../pip/_vendor/progress/colors.py | 79 - .../pip/_vendor/progress/counter.py | 47 - .../pip/_vendor/progress/spinner.py | 45 - .../pip/_vendor/requests/__init__.py | 154 - .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 42 - .../pip/_vendor/requests/adapters.py | 533 - .../site-packages/pip/_vendor/requests/api.py | 159 - .../pip/_vendor/requests/auth.py | 305 - .../pip/_vendor/requests/certs.py | 18 - .../pip/_vendor/requests/compat.py | 76 - .../pip/_vendor/requests/cookies.py | 549 - .../pip/_vendor/requests/exceptions.py | 127 - .../pip/_vendor/requests/help.py | 132 - .../pip/_vendor/requests/hooks.py | 34 - .../pip/_vendor/requests/models.py | 966 - .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 781 - .../pip/_vendor/requests/status_codes.py | 123 - .../pip/_vendor/requests/structures.py | 105 - .../pip/_vendor/requests/utils.py | 1013 - .../pip/_vendor/resolvelib/__init__.py | 26 - .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/reporters.py | 37 - .../pip/_vendor/resolvelib/resolvers.py | 483 - .../pip/_vendor/resolvelib/structs.py | 165 - venv/Lib/site-packages/pip/_vendor/six.py | 998 - .../pip/_vendor/tenacity/__init__.py | 517 - .../pip/_vendor/tenacity/_asyncio.py | 92 - .../pip/_vendor/tenacity/_utils.py | 68 - .../pip/_vendor/tenacity/after.py | 46 - .../pip/_vendor/tenacity/before.py | 41 - .../pip/_vendor/tenacity/before_sleep.py | 58 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 213 - .../pip/_vendor/tenacity/stop.py | 96 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 191 - .../pip/_vendor/tomli/__init__.py | 6 - .../pip/_vendor/tomli/_parser.py | 703 - .../site-packages/pip/_vendor/tomli/_re.py | 83 - .../pip/_vendor/urllib3/__init__.py | 85 - .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 569 - .../pip/_vendor/urllib3/connectionpool.py | 1078 - .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 397 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 511 - .../urllib3/contrib/securetransport.py | 922 - .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 5 - .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 - .../pip/_vendor/urllib3/packages/six.py | 1077 - .../pip/_vendor/urllib3/poolmanager.py | 536 - .../pip/_vendor/urllib3/request.py | 170 - .../pip/_vendor/urllib3/response.py | 821 - .../pip/_vendor/urllib3/util/__init__.py | 49 - .../pip/_vendor/urllib3/util/connection.py | 150 - .../pip/_vendor/urllib3/util/proxy.py | 57 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 143 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 602 - .../pip/_vendor/urllib3/util/ssl_.py | 495 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 268 - .../pip/_vendor/urllib3/util/url.py | 432 - .../pip/_vendor/urllib3/util/wait.py | 153 - venv/Lib/site-packages/pip/_vendor/vendor.txt | 22 - .../pip/_vendor/webencodings/__init__.py | 342 - .../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 - venv/Lib/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3303 -- .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 608 - .../_vendor/packaging/__about__.py | 26 - .../_vendor/packaging/__init__.py | 25 - .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 67 - .../_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 828 - .../pkg_resources/_vendor/packaging/tags.py | 484 - .../pkg_resources/_vendor/packaging/utils.py | 136 - .../_vendor/packaging/version.py | 504 - .../pkg_resources/_vendor/pyparsing.py | 5742 --- .../pkg_resources/extern/__init__.py | 73 - .../pytz-2022.1.dist-info/LICENSE.txt | 19 - .../pytz-2022.1.dist-info/METADATA | 635 - .../pytz-2022.1.dist-info/RECORD | 619 - .../site-packages/pytz-2022.1.dist-info/WHEEL | 6 - .../pytz-2022.1.dist-info/top_level.txt | 1 - .../pytz-2022.1.dist-info/zip-safe | 1 - venv/Lib/site-packages/pytz/__init__.py | 1559 - venv/Lib/site-packages/pytz/exceptions.py | 59 - venv/Lib/site-packages/pytz/lazy.py | 172 - venv/Lib/site-packages/pytz/reference.py | 140 - venv/Lib/site-packages/pytz/tzfile.py | 133 - venv/Lib/site-packages/pytz/tzinfo.py | 577 - .../pytz/zoneinfo/Africa/Abidjan | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 735 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 194 -> 0 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 1955 -> 0 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 2429 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 2036 -> 0 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 2295 -> 0 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 246 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 679 -> 0 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 679 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 246 -> 0 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 246 -> 0 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 208 -> 0 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 254 -> 0 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 625 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 689 -> 0 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 955 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 2356 -> 0 bytes .../pytz/zoneinfo/America/Anchorage | Bin 2371 -> 0 bytes .../pytz/zoneinfo/America/Anguilla | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Antigua | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Araguaina | Bin 884 -> 0 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 1076 -> 0 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 1048 -> 0 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 1090 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 1076 -> 0 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 1048 -> 0 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 1090 -> 0 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 1102 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 1104 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 1076 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Asuncion | Bin 2044 -> 0 bytes .../pytz/zoneinfo/America/Atikokan | Bin 182 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 2356 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 1024 -> 0 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 1546 -> 0 bytes .../pytz/zoneinfo/America/Barbados | Bin 436 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 576 -> 0 bytes .../pytz/zoneinfo/America/Belize | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 632 -> 0 bytes .../pytz/zoneinfo/America/Bogota | Bin 246 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 2394 -> 0 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 2084 -> 0 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 1444 -> 0 bytes .../pytz/zoneinfo/America/Cancun | Bin 782 -> 0 bytes .../pytz/zoneinfo/America/Caracas | Bin 264 -> 0 bytes .../pytz/zoneinfo/America/Catamarca | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Cayenne | Bin 198 -> 0 bytes .../pytz/zoneinfo/America/Cayman | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Chicago | Bin 3576 -> 0 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 1484 -> 0 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Cordoba | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 316 -> 0 bytes .../pytz/zoneinfo/America/Creston | Bin 328 -> 0 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 1416 -> 0 bytes .../pytz/zoneinfo/America/Curacao | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 698 -> 0 bytes .../pytz/zoneinfo/America/Dawson | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 1050 -> 0 bytes .../pytz/zoneinfo/America/Denver | Bin 2444 -> 0 bytes .../pytz/zoneinfo/America/Detroit | Bin 2230 -> 0 bytes .../pytz/zoneinfo/America/Dominica | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Edmonton | Bin 2332 -> 0 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 656 -> 0 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 224 -> 0 bytes .../pytz/zoneinfo/America/Ensenada | Bin 2342 -> 0 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 2240 -> 0 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 716 -> 0 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 2192 -> 0 bytes .../pytz/zoneinfo/America/Godthab | Bin 1878 -> 0 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 3210 -> 0 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 1834 -> 0 bytes .../pytz/zoneinfo/America/Grenada | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guatemala | Bin 280 -> 0 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guyana | Bin 262 -> 0 bytes .../pytz/zoneinfo/America/Halifax | Bin 3424 -> 0 bytes .../pytz/zoneinfo/America/Havana | Bin 2416 -> 0 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 416 -> 0 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 2428 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 1722 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 1904 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 1684 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 1414 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 1694 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 1778 -> 0 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Inuvik | Bin 1894 -> 0 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 2032 -> 0 bytes .../pytz/zoneinfo/America/Jamaica | Bin 482 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 1048 -> 0 bytes .../pytz/zoneinfo/America/Juneau | Bin 2353 -> 0 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 2772 -> 0 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 2352 -> 0 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 2428 -> 0 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/La_Paz | Bin 232 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 406 -> 0 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 2836 -> 0 bytes .../pytz/zoneinfo/America/Louisville | Bin 2772 -> 0 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Maceio | Bin 744 -> 0 bytes .../pytz/zoneinfo/America/Managua | Bin 430 -> 0 bytes .../pytz/zoneinfo/America/Manaus | Bin 604 -> 0 bytes .../pytz/zoneinfo/America/Marigot | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Martinique | Bin 232 -> 0 bytes .../pytz/zoneinfo/America/Matamoros | Bin 1390 -> 0 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 1526 -> 0 bytes .../pytz/zoneinfo/America/Mendoza | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Menominee | Bin 2274 -> 0 bytes .../pytz/zoneinfo/America/Merida | Bin 1422 -> 0 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 1423 -> 0 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 1584 -> 0 bytes .../pytz/zoneinfo/America/Miquelon | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Moncton | Bin 3154 -> 0 bytes .../pytz/zoneinfo/America/Monterrey | Bin 1390 -> 0 bytes .../pytz/zoneinfo/America/Montevideo | Bin 1510 -> 0 bytes .../pytz/zoneinfo/America/Montreal | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/Montserrat | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Nassau | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/New_York | Bin 3536 -> 0 bytes .../pytz/zoneinfo/America/Nipigon | Bin 2122 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 2367 -> 0 bytes .../pytz/zoneinfo/America/Noronha | Bin 716 -> 0 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 2380 -> 0 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 2380 -> 0 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 2380 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Nuuk | Bin 1878 -> 0 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 1484 -> 0 bytes .../pytz/zoneinfo/America/Panama | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 2094 -> 0 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 262 -> 0 bytes .../pytz/zoneinfo/America/Phoenix | Bin 328 -> 0 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 1434 -> 0 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 628 -> 0 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 576 -> 0 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 1902 -> 0 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 2122 -> 0 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 1892 -> 0 bytes .../pytz/zoneinfo/America/Recife | Bin 716 -> 0 bytes .../pytz/zoneinfo/America/Regina | Bin 980 -> 0 bytes .../pytz/zoneinfo/America/Resolute | Bin 1892 -> 0 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 628 -> 0 bytes .../pytz/zoneinfo/America/Rosario | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 2342 -> 0 bytes .../pytz/zoneinfo/America/Santarem | Bin 602 -> 0 bytes .../pytz/zoneinfo/America/Santiago | Bin 2529 -> 0 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 458 -> 0 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 1444 -> 0 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 1916 -> 0 bytes .../pytz/zoneinfo/America/Shiprock | Bin 2444 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 2329 -> 0 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Johns | Bin 3655 -> 0 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 560 -> 0 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 252 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 1502 -> 0 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 2202 -> 0 bytes .../pytz/zoneinfo/America/Tijuana | Bin 2342 -> 0 bytes .../pytz/zoneinfo/America/Toronto | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/Tortola | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Vancouver | Bin 2892 -> 0 bytes .../pytz/zoneinfo/America/Virgin | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 2868 -> 0 bytes .../pytz/zoneinfo/America/Yakutat | Bin 2305 -> 0 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 1966 -> 0 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 384 -> 0 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 297 -> 0 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 186 -> 0 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 2260 -> 0 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 199 -> 0 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 1418 -> 0 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 164 -> 0 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 165 -> 0 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 1162 -> 0 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 165 -> 0 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 2228 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Aden | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 997 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 1853 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 1188 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 983 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 1011 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 619 -> 0 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 619 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 991 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 983 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 199 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Baku | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 1221 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 2154 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 983 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 203 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 285 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 1221 -> 0 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 949 -> 0 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 561 -> 0 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 561 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 372 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 337 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 2294 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 337 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Dili | Bin 227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 591 -> 0 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 2028 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Gaza | Bin 2422 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 561 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 2450 -> 0 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 351 -> 0 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 1203 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Hovd | Bin 891 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 1243 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 1947 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 355 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 221 -> 0 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 2388 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 208 -> 0 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 1166 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 379 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 165 -> 0 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 212 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 212 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 1271 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 285 -> 0 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 1207 -> 0 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 383 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 483 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 1222 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 254 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 328 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 2002 -> 0 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 1165 -> 0 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 1221 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Omsk | Bin 1207 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Oral | Bin 1005 -> 0 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 199 -> 0 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 353 -> 0 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 237 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin 1011 -> 0 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 1025 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 268 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 351 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 1202 -> 0 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 577 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 617 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 561 -> 0 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 383 -> 0 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 1208 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 761 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 591 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 1035 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 2582 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 2388 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 203 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 203 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 309 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 1221 -> 0 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 254 -> 0 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 891 -> 0 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 891 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 1252 -> 0 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 199 -> 0 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 1208 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 1207 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 268 -> 0 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 1243 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 1151 -> 0 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 3512 -> 0 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 2396 -> 0 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 1897 -> 0 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 270 -> 0 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 1815 -> 0 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 1815 -> 0 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 2228 -> 0 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 3503 -> 0 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 1162 -> 0 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 164 -> 0 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 148 -> 0 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 1214 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 2208 -> 0 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 419 -> 0 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 2229 -> 0 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Currie | Bin 2358 -> 0 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 325 -> 0 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 470 -> 0 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 2358 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 1860 -> 0 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 475 -> 0 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 1860 -> 0 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 2190 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/North | Bin 325 -> 0 bytes .../pytz/zoneinfo/Australia/Perth | Bin 446 -> 0 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 419 -> 0 bytes .../pytz/zoneinfo/Australia/South | Bin 2208 -> 0 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 2358 -> 0 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/West | Bin 446 -> 0 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 2229 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 628 -> 0 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 716 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 1444 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 604 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/CET | Bin 2094 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/CST6CDT | Bin 2310 -> 0 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 3424 -> 0 bytes .../pytz/zoneinfo/Canada/Central | Bin 2868 -> 0 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 3494 -> 0 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 2332 -> 0 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 3655 -> 0 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 2892 -> 0 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 980 -> 0 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 1614 -> 0 bytes .../pytz/zoneinfo/Chile/Continental | Bin 2529 -> 0 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 2233 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Cuba | Bin 2416 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/EET | Bin 1908 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/EST | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/EST5EDT | Bin 2310 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Egypt | Bin 1955 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Eire | Bin 3492 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 118 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 117 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/UCT | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/UTC | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Etc/Zulu | Bin 114 -> 0 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 2910 -> 0 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 1742 -> 0 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 1165 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 2262 -> 0 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 3648 -> 0 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 2298 -> 0 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 2301 -> 0 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 2933 -> 0 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 2184 -> 0 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 2368 -> 0 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 1909 -> 0 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 2390 -> 0 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 2137 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 3492 -> 0 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 3052 -> 0 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 3648 -> 0 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 1900 -> 0 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 3648 -> 0 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 1947 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 3648 -> 0 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 1493 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 2120 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 1153 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 3497 -> 0 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 3648 -> 0 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 2946 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 2614 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 2620 -> 0 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 1900 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 1321 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 2944 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 1535 -> 0 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 2002 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 2228 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 2962 -> 0 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 2301 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 2198 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 2641 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 1215 -> 0 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 2641 -> 0 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 1920 -> 0 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 1183 -> 0 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 1469 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 2077 -> 0 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 1909 -> 0 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 2148 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 2084 -> 0 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 2390 -> 0 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 1267 -> 0 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 2066 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 1909 -> 0 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 2641 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 2200 -> 0 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 2162 -> 0 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 1165 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 2654 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 1920 -> 0 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 2138 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 1909 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Factory | Bin 116 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/GB | Bin 3648 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/GB-Eire | Bin 3648 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT+0 | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT-0 | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/GMT0 | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Greenwich | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/HST | Bin 115 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Hongkong | Bin 1203 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Iceland | Bin 1162 -> 0 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 199 -> 0 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 174 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 265 -> 0 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 165 -> 0 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 199 -> 0 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 241 -> 0 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 265 -> 0 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 165 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Iran | Bin 2582 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Israel | Bin 2388 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Jamaica | Bin 482 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Japan | Bin 309 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Kwajalein | Bin 316 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Libya | Bin 625 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/MET | Bin 2094 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/MST | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/MST7MDT | Bin 2310 -> 0 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 2342 -> 0 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 1526 -> 0 bytes .../pytz/zoneinfo/Mexico/General | Bin 1584 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/NZ | Bin 2437 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/NZ-CHAT | Bin 2068 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Navajo | Bin 2444 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/PRC | Bin 561 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/PST8PDT | Bin 2310 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 612 -> 0 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 268 -> 0 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 2068 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 269 -> 0 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 2233 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 538 -> 0 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 234 -> 0 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 200 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 1049 -> 0 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 238 -> 0 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 164 -> 0 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 166 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 494 -> 0 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 329 -> 0 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 329 -> 0 bytes .../pytz/zoneinfo/Pacific/Kanton | Bin 234 -> 0 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 238 -> 0 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 351 -> 0 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 316 -> 0 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 310 -> 0 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 173 -> 0 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 175 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 252 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 203 -> 0 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 880 -> 0 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 304 -> 0 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 175 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 180 -> 0 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 202 -> 0 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 303 -> 0 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 303 -> 0 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 186 -> 0 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 603 -> 0 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 494 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 175 -> 0 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 165 -> 0 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 372 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 269 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 166 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 269 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Poland | Bin 2654 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Portugal | Bin 3497 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/ROC | Bin 761 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/ROK | Bin 617 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Singapore | Bin 383 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Turkey | Bin 1947 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/UCT | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/US/Alaska | Bin 2371 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 2356 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 328 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 3576 -> 0 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 1666 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 3536 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/US/Hawaii | Bin 329 -> 0 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 2428 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 2230 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 2444 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 2836 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/US/Samoa | Bin 175 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/UTC | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Universal | Bin 114 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/W-SU | Bin 1535 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/WET | Bin 1905 -> 0 bytes venv/Lib/site-packages/pytz/zoneinfo/Zulu | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 274 - .../site-packages/pytz/zoneinfo/leapseconds | 82 - .../Lib/site-packages/pytz/zoneinfo/tzdata.zi | 4437 -- venv/Lib/site-packages/pytz/zoneinfo/zone.tab | 454 - .../site-packages/pytz/zoneinfo/zone1970.tab | 374 - .../site-packages/rest_framework/__init__.py | 37 - venv/Lib/site-packages/rest_framework/apps.py | 10 - .../rest_framework/authentication.py | 232 - .../rest_framework/authtoken/__init__.py | 4 - .../rest_framework/authtoken/admin.py | 51 - .../rest_framework/authtoken/apps.py | 7 - .../authtoken/management/__init__.py | 0 .../authtoken/management/commands/__init__.py | 0 .../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 - .../authtoken/migrations/__init__.py | 0 .../rest_framework/authtoken/models.py | 54 - .../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 | 159 - .../rest_framework/decorators.py | 233 - .../rest_framework/documentation.py | 88 - .../rest_framework/exceptions.py | 261 - .../site-packages/rest_framework/fields.py | 1926 - .../site-packages/rest_framework/filters.py | 333 - .../site-packages/rest_framework/generics.py | 291 - .../locale/ach/LC_MESSAGES/django.mo | Bin 472 -> 0 bytes .../locale/ar/LC_MESSAGES/django.mo | Bin 12150 -> 0 bytes .../locale/az/LC_MESSAGES/django.mo | Bin 10428 -> 0 bytes .../locale/be/LC_MESSAGES/django.mo | Bin 614 -> 0 bytes .../locale/bg/LC_MESSAGES/django.mo | Bin 13083 -> 0 bytes .../locale/ca/LC_MESSAGES/django.mo | Bin 9300 -> 0 bytes .../locale/ca_ES/LC_MESSAGES/django.mo | Bin 487 -> 0 bytes .../locale/cs/LC_MESSAGES/django.mo | Bin 10519 -> 0 bytes .../locale/da/LC_MESSAGES/django.mo | Bin 9955 -> 0 bytes .../locale/de/LC_MESSAGES/django.mo | Bin 10490 -> 0 bytes .../locale/el/LC_MESSAGES/django.mo | Bin 12933 -> 0 bytes .../locale/el_GR/LC_MESSAGES/django.mo | Bin 486 -> 0 bytes .../locale/en/LC_MESSAGES/django.mo | Bin 12285 -> 0 bytes .../locale/en_AU/LC_MESSAGES/django.mo | Bin 491 -> 0 bytes .../locale/en_CA/LC_MESSAGES/django.mo | Bin 488 -> 0 bytes .../locale/en_US/LC_MESSAGES/django.mo | Bin 337 -> 0 bytes .../locale/es/LC_MESSAGES/django.mo | Bin 10627 -> 0 bytes .../locale/et/LC_MESSAGES/django.mo | Bin 10096 -> 0 bytes .../locale/fa/LC_MESSAGES/django.mo | Bin 11976 -> 0 bytes .../locale/fa_IR/LC_MESSAGES/django.mo | Bin 11989 -> 0 bytes .../locale/fi/LC_MESSAGES/django.mo | Bin 10197 -> 0 bytes .../locale/fr/LC_MESSAGES/django.mo | Bin 10662 -> 0 bytes .../locale/fr_CA/LC_MESSAGES/django.mo | Bin 486 -> 0 bytes .../locale/gl/LC_MESSAGES/django.mo | Bin 474 -> 0 bytes .../locale/gl_ES/LC_MESSAGES/django.mo | Bin 628 -> 0 bytes .../locale/he_IL/LC_MESSAGES/django.mo | Bin 487 -> 0 bytes .../locale/hu/LC_MESSAGES/django.mo | Bin 10844 -> 0 bytes .../locale/hy/LC_MESSAGES/django.mo | Bin 12885 -> 0 bytes .../locale/id/LC_MESSAGES/django.mo | Bin 5188 -> 0 bytes .../locale/it/LC_MESSAGES/django.mo | Bin 10480 -> 0 bytes .../locale/ja/LC_MESSAGES/django.mo | Bin 11759 -> 0 bytes .../locale/ko_KR/LC_MESSAGES/django.mo | Bin 11698 -> 0 bytes .../locale/lt/LC_MESSAGES/django.mo | Bin 5056 -> 0 bytes .../locale/lv/LC_MESSAGES/django.mo | Bin 10423 -> 0 bytes .../locale/mk/LC_MESSAGES/django.mo | Bin 12121 -> 0 bytes .../locale/nb/LC_MESSAGES/django.mo | Bin 9928 -> 0 bytes .../locale/ne_NP/LC_MESSAGES/django.mo | Bin 15636 -> 0 bytes .../locale/nl/LC_MESSAGES/django.mo | Bin 10163 -> 0 bytes .../locale/nn/LC_MESSAGES/django.mo | Bin 483 -> 0 bytes .../locale/no/LC_MESSAGES/django.mo | Bin 475 -> 0 bytes .../locale/pl/LC_MESSAGES/django.mo | Bin 10673 -> 0 bytes .../locale/pt/LC_MESSAGES/django.mo | Bin 10382 -> 0 bytes .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 10397 -> 0 bytes .../locale/pt_PT/LC_MESSAGES/django.mo | Bin 493 -> 0 bytes .../locale/ro/LC_MESSAGES/django.mo | Bin 10701 -> 0 bytes .../locale/ru/LC_MESSAGES/django.mo | Bin 13160 -> 0 bytes .../locale/ru_RU/LC_MESSAGES/django.mo | Bin 5208 -> 0 bytes .../locale/sk/LC_MESSAGES/django.mo | Bin 9164 -> 0 bytes .../locale/sl/LC_MESSAGES/django.mo | Bin 9985 -> 0 bytes .../locale/sv/LC_MESSAGES/django.mo | Bin 10204 -> 0 bytes .../locale/th/LC_MESSAGES/django.mo | Bin 8880 -> 0 bytes .../locale/tr/LC_MESSAGES/django.mo | Bin 10073 -> 0 bytes .../locale/tr_TR/LC_MESSAGES/django.mo | Bin 10292 -> 0 bytes .../locale/uk/LC_MESSAGES/django.mo | Bin 13245 -> 0 bytes .../locale/vi/LC_MESSAGES/django.mo | Bin 2179 -> 0 bytes .../locale/zh_CN/LC_MESSAGES/django.mo | Bin 9915 -> 0 bytes .../locale/zh_Hans/LC_MESSAGES/django.mo | Bin 9938 -> 0 bytes .../locale/zh_Hant/LC_MESSAGES/django.mo | Bin 4809 -> 0 bytes .../locale/zh_TW/LC_MESSAGES/django.mo | Bin 481 -> 0 bytes .../rest_framework/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../management/commands/generateschema.py | 69 - .../site-packages/rest_framework/metadata.py | 151 - .../site-packages/rest_framework/mixins.py | 95 - .../rest_framework/negotiation.py | 95 - .../rest_framework/pagination.py | 980 - .../site-packages/rest_framework/parsers.py | 223 - .../rest_framework/permissions.py | 300 - .../site-packages/rest_framework/relations.py | 563 - .../site-packages/rest_framework/renderers.py | 1076 - .../site-packages/rest_framework/request.py | 455 - .../site-packages/rest_framework/response.py | 103 - .../site-packages/rest_framework/reverse.py | 66 - .../site-packages/rest_framework/routers.py | 348 - .../rest_framework/schemas/__init__.py | 58 - .../rest_framework/schemas/coreapi.py | 612 - .../rest_framework/schemas/generators.py | 239 - .../rest_framework/schemas/inspectors.py | 125 - .../rest_framework/schemas/openapi.py | 810 - .../rest_framework/schemas/utils.py | 41 - .../rest_framework/schemas/views.py | 48 - .../rest_framework/serializers.py | 1666 - .../site-packages/rest_framework/settings.py | 256 - .../css/bootstrap-theme.min.css | 6 - .../rest_framework/css/bootstrap-tweaks.css | 233 - .../rest_framework/css/bootstrap.min.css | 6 - .../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 5430 -> 0 bytes .../static/rest_framework/docs/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/docs/js/api.js | 321 - .../rest_framework/docs/js/highlight.pack.js | 2 - .../docs/js/jquery.json-view.min.js | 7 - .../fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes .../fonts/fontawesome-webfont.svg | 414 - .../fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../img/glyphicons-halflings.png | Bin 12762 -> 0 bytes .../static/rest_framework/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/js/ajax-form.js | 127 - .../static/rest_framework/js/bootstrap.min.js | 6 - .../static/rest_framework/js/coreapi-0.1.1.js | 2043 - .../static/rest_framework/js/csrf.js | 52 - .../static/rest_framework/js/default.js | 47 - .../rest_framework/js/jquery-3.5.1.min.js | 2 - .../static/rest_framework/js/prettify-min.js | 28 - .../site-packages/rest_framework/status.py | 89 - .../templates/rest_framework/admin.html | 267 - .../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 | 311 - .../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 .../templatetags/rest_framework.py | 322 - venv/Lib/site-packages/rest_framework/test.py | 412 - .../rest_framework/throttling.py | 250 - .../rest_framework/urlpatterns.py | 112 - venv/Lib/site-packages/rest_framework/urls.py | 21 - .../rest_framework/utils/__init__.py | 0 .../rest_framework/utils/breadcrumbs.py | 53 - .../rest_framework/utils/encoders.py | 67 - .../rest_framework/utils/field_mapping.py | 302 - .../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 | 83 - .../rest_framework/utils/model_meta.py | 161 - .../rest_framework/utils/representation.py | 101 - .../utils/serializer_helpers.py | 167 - .../rest_framework/utils/urls.py | 27 - .../rest_framework/validators.py | 280 - .../rest_framework/versioning.py | 184 - .../Lib/site-packages/rest_framework/views.py | 521 - .../site-packages/rest_framework/viewsets.py | 245 - venv/Lib/site-packages/setuptools/__init__.py | 244 - .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 24 - .../setuptools/_distutils/_msvccompiler.py | 561 - .../setuptools/_distutils/archive_util.py | 256 - .../setuptools/_distutils/bcppcompiler.py | 393 - .../setuptools/_distutils/ccompiler.py | 1123 - .../setuptools/_distutils/cmd.py | 403 - .../setuptools/_distutils/command/__init__.py | 31 - .../setuptools/_distutils/command/bdist.py | 143 - .../_distutils/command/bdist_dumb.py | 123 - .../_distutils/command/bdist_msi.py | 749 - .../_distutils/command/bdist_rpm.py | 579 - .../_distutils/command/bdist_wininst.py | 377 - .../setuptools/_distutils/command/build.py | 157 - .../_distutils/command/build_clib.py | 209 - .../_distutils/command/build_ext.py | 755 - .../setuptools/_distutils/command/build_py.py | 392 - .../_distutils/command/build_scripts.py | 152 - .../setuptools/_distutils/command/check.py | 148 - .../setuptools/_distutils/command/clean.py | 76 - .../setuptools/_distutils/command/config.py | 344 - .../setuptools/_distutils/command/install.py | 773 - .../_distutils/command/install_data.py | 79 - .../_distutils/command/install_egg_info.py | 84 - .../_distutils/command/install_headers.py | 47 - .../_distutils/command/install_lib.py | 217 - .../_distutils/command/install_scripts.py | 60 - .../_distutils/command/py37compat.py | 30 - .../setuptools/_distutils/command/register.py | 304 - .../setuptools/_distutils/command/sdist.py | 494 - .../setuptools/_distutils/command/upload.py | 214 - .../setuptools/_distutils/config.py | 130 - .../setuptools/_distutils/core.py | 249 - .../setuptools/_distutils/cygwinccompiler.py | 362 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 92 - .../setuptools/_distutils/dir_util.py | 210 - .../setuptools/_distutils/dist.py | 1257 - .../setuptools/_distutils/errors.py | 97 - .../setuptools/_distutils/extension.py | 240 - .../setuptools/_distutils/fancy_getopt.py | 457 - .../setuptools/_distutils/file_util.py | 238 - .../setuptools/_distutils/filelist.py | 355 - .../setuptools/_distutils/log.py | 81 - .../setuptools/_distutils/msvc9compiler.py | 788 - .../setuptools/_distutils/msvccompiler.py | 643 - .../setuptools/_distutils/py35compat.py | 19 - .../setuptools/_distutils/py38compat.py | 7 - .../setuptools/_distutils/spawn.py | 106 - .../setuptools/_distutils/sysconfig.py | 567 - .../setuptools/_distutils/text_file.py | 286 - .../setuptools/_distutils/unixccompiler.py | 325 - .../setuptools/_distutils/util.py | 548 - .../setuptools/_distutils/version.py | 363 - .../setuptools/_distutils/versionpredicate.py | 169 - venv/Lib/site-packages/setuptools/_imp.py | 82 - .../setuptools/_vendor/__init__.py | 0 .../_vendor/more_itertools/__init__.py | 4 - .../setuptools/_vendor/more_itertools/more.py | 3825 -- .../_vendor/more_itertools/recipes.py | 620 - .../setuptools/_vendor/ordered_set.py | 488 - .../setuptools/_vendor/packaging/__about__.py | 26 - .../setuptools/_vendor/packaging/__init__.py | 25 - .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 67 - .../setuptools/_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 828 - .../setuptools/_vendor/packaging/tags.py | 484 - .../setuptools/_vendor/packaging/utils.py | 136 - .../setuptools/_vendor/packaging/version.py | 504 - .../setuptools/_vendor/pyparsing.py | 5742 --- .../site-packages/setuptools/archive_util.py | 205 - .../site-packages/setuptools/build_meta.py | 290 - venv/Lib/site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes venv/Lib/site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 137216 -> 0 bytes venv/Lib/site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 8 - .../site-packages/setuptools/command/alias.py | 78 - .../setuptools/command/bdist_egg.py | 456 - .../setuptools/command/bdist_rpm.py | 40 - .../setuptools/command/build_clib.py | 101 - .../setuptools/command/build_ext.py | 328 - .../setuptools/command/build_py.py | 242 - .../setuptools/command/develop.py | 193 - .../setuptools/command/dist_info.py | 36 - .../setuptools/command/easy_install.py | 2304 - .../setuptools/command/egg_info.py | 755 - .../setuptools/command/install.py | 132 - .../setuptools/command/install_egg_info.py | 62 - .../setuptools/command/install_lib.py | 122 - .../setuptools/command/install_scripts.py | 69 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 134 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 64 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 196 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 252 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 202 - venv/Lib/site-packages/setuptools/dep_util.py | 25 - venv/Lib/site-packages/setuptools/depends.py | 176 - venv/Lib/site-packages/setuptools/dist.py | 1156 - venv/Lib/site-packages/setuptools/errors.py | 40 - .../Lib/site-packages/setuptools/extension.py | 55 - .../setuptools/extern/__init__.py | 73 - venv/Lib/site-packages/setuptools/glob.py | 167 - venv/Lib/site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes venv/Lib/site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 137728 -> 0 bytes venv/Lib/site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/installer.py | 104 - venv/Lib/site-packages/setuptools/launch.py | 36 - venv/Lib/site-packages/setuptools/logging.py | 30 - venv/Lib/site-packages/setuptools/monkey.py | 177 - venv/Lib/site-packages/setuptools/msvc.py | 1805 - .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1127 - .../site-packages/setuptools/py34compat.py | 13 - venv/Lib/site-packages/setuptools/sandbox.py | 530 - .../setuptools/script (dev).tmpl | 6 - venv/Lib/site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/unicode_utils.py | 42 - venv/Lib/site-packages/setuptools/version.py | 6 - venv/Lib/site-packages/setuptools/wheel.py | 213 - .../setuptools/windows_support.py | 29 - .../simpleui-4.0.2-py3.9.egg-info/PKG-INFO | 26 - .../simpleui-4.0.2-py3.9.egg-info/SOURCES.txt | 604 - .../dependency_links.txt | 1 - .../installed-files.txt | 606 - .../not-zip-safe | 1 - .../top_level.txt | 1 - venv/Lib/site-packages/simpleui/__init__.py | 5 - venv/Lib/site-packages/simpleui/apps.py | 21 - venv/Lib/site-packages/simpleui/forms.py | 202 - .../static/admin/css/autocomplete.css | 260 - .../simpleui/static/admin/css/base.css | 981 - .../simpleui/static/admin/css/changelists.css | 346 - .../simpleui/static/admin/css/dashboard.css | 27 - .../simpleui/static/admin/css/fonts.css | 20 - .../simpleui/static/admin/css/forms.css | 515 - .../simpleui/static/admin/css/login.css | 78 - .../simpleui/static/admin/css/responsive.css | 964 - .../static/admin/css/responsive_rtl.css | 80 - .../simpleui/static/admin/css/rtl.css | 264 - .../simpleui/static/admin/css/ui.css | 17 - .../css/vendor/select2/LICENSE-SELECT2.md | 21 - .../admin/css/vendor/select2/select2.css | 634 - .../admin/css/vendor/select2/select2.min.css | 1 - .../simpleui/static/admin/css/widgets.css | 565 - .../simpleui/static/admin/fonts/LICENSE.txt | 202 - .../simpleui/static/admin/fonts/README.txt | 2 - .../admin/fonts/Roboto-Bold-webfont.woff | Bin 82564 -> 0 bytes .../admin/fonts/Roboto-Light-webfont.woff | Bin 81348 -> 0 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 80304 -> 0 bytes .../simpleui/static/admin/img/LICENSE | 20 - .../simpleui/static/admin/img/README.txt | 7 - .../static/admin/img/calendar-icons.svg | 14 - .../static/admin/img/gis/move_vertex_off.svg | 13 - .../static/admin/img/gis/move_vertex_on.svg | 13 - .../static/admin/img/icon-addlink.svg | 4 - .../simpleui/static/admin/img/icon-alert.svg | 4 - .../static/admin/img/icon-calendar.svg | 9 - .../static/admin/img/icon-changelink.svg | 4 - .../simpleui/static/admin/img/icon-clock.svg | 9 - .../static/admin/img/icon-deletelink.svg | 4 - .../simpleui/static/admin/img/icon-no.svg | 4 - .../static/admin/img/icon-unknown-alt.svg | 4 - .../static/admin/img/icon-unknown.svg | 4 - .../simpleui/static/admin/img/icon-yes.svg | 4 - .../static/admin/img/inline-delete.svg | 4 - .../simpleui/static/admin/img/search.svg | 4 - .../static/admin/img/selector-icons.svg | 36 - .../static/admin/img/sorting-icons.svg | 19 - .../simpleui/static/admin/img/tooltag-add.svg | 4 - .../static/admin/img/tooltag-arrowright.svg | 4 - .../simpleui/static/admin/js/SelectBox.js | 143 - .../simpleui/static/admin/js/SelectFilter2.js | 255 - .../simpleui/static/admin/js/actions.js | 155 - .../simpleui/static/admin/js/actions.min.js | 6 - .../admin/js/admin/DateTimeShortcuts.js | 431 - .../admin/js/admin/RelatedObjectLookups.js | 181 - .../simpleui/static/admin/js/autocomplete.js | 37 - .../simpleui/static/admin/js/calendar.js | 205 - .../simpleui/static/admin/js/cancel.js | 9 - .../simpleui/static/admin/js/change_form.js | 20 - .../simpleui/static/admin/js/collapse.js | 26 - .../simpleui/static/admin/js/collapse.min.js | 5 - .../simpleui/static/admin/js/core.js | 209 - .../simpleui/static/admin/js/inlines.js | 295 - .../simpleui/static/admin/js/inlines.min.js | 13 - .../simpleui/static/admin/js/jquery.init.js | 8 - .../static/admin/js/popup_response.js | 16 - .../simpleui/static/admin/js/prepopulate.js | 42 - .../static/admin/js/prepopulate.min.js | 1 - .../static/admin/js/prepopulate_init.js | 10 - .../simpleui/static/admin/js/timeparse.js | 106 - .../simpleui/static/admin/js/urlify.js | 190 - .../admin/js/vendor/jquery/LICENSE-JQUERY.txt | 26 - .../static/admin/js/vendor/jquery/jquery.js | 9822 ---- .../admin/js/vendor/jquery/jquery.min.js | 4 - .../js/vendor/select2/LICENSE-SELECT2.md | 21 - .../static/admin/js/vendor/select2/i18n/ar.js | 3 - .../static/admin/js/vendor/select2/i18n/az.js | 3 - .../static/admin/js/vendor/select2/i18n/bg.js | 3 - .../static/admin/js/vendor/select2/i18n/ca.js | 3 - .../static/admin/js/vendor/select2/i18n/cs.js | 3 - .../static/admin/js/vendor/select2/i18n/da.js | 3 - .../static/admin/js/vendor/select2/i18n/de.js | 3 - .../static/admin/js/vendor/select2/i18n/el.js | 3 - .../static/admin/js/vendor/select2/i18n/en.js | 3 - .../static/admin/js/vendor/select2/i18n/es.js | 3 - .../static/admin/js/vendor/select2/i18n/et.js | 3 - .../static/admin/js/vendor/select2/i18n/eu.js | 3 - .../static/admin/js/vendor/select2/i18n/fa.js | 3 - .../static/admin/js/vendor/select2/i18n/fi.js | 3 - .../static/admin/js/vendor/select2/i18n/fr.js | 3 - .../static/admin/js/vendor/select2/i18n/gl.js | 3 - .../static/admin/js/vendor/select2/i18n/he.js | 3 - .../static/admin/js/vendor/select2/i18n/hi.js | 3 - .../static/admin/js/vendor/select2/i18n/hr.js | 3 - .../static/admin/js/vendor/select2/i18n/hu.js | 3 - .../static/admin/js/vendor/select2/i18n/id.js | 3 - .../static/admin/js/vendor/select2/i18n/is.js | 3 - .../static/admin/js/vendor/select2/i18n/it.js | 3 - .../static/admin/js/vendor/select2/i18n/ja.js | 3 - .../static/admin/js/vendor/select2/i18n/km.js | 3 - .../static/admin/js/vendor/select2/i18n/ko.js | 3 - .../static/admin/js/vendor/select2/i18n/lt.js | 3 - .../static/admin/js/vendor/select2/i18n/lv.js | 3 - .../static/admin/js/vendor/select2/i18n/mk.js | 3 - .../static/admin/js/vendor/select2/i18n/ms.js | 3 - .../static/admin/js/vendor/select2/i18n/nb.js | 3 - .../static/admin/js/vendor/select2/i18n/nl.js | 3 - .../static/admin/js/vendor/select2/i18n/pl.js | 3 - .../admin/js/vendor/select2/i18n/pt-BR.js | 3 - .../static/admin/js/vendor/select2/i18n/pt.js | 3 - .../static/admin/js/vendor/select2/i18n/ro.js | 3 - .../static/admin/js/vendor/select2/i18n/ru.js | 3 - .../static/admin/js/vendor/select2/i18n/sk.js | 3 - .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 - .../static/admin/js/vendor/select2/i18n/sr.js | 3 - .../static/admin/js/vendor/select2/i18n/sv.js | 3 - .../static/admin/js/vendor/select2/i18n/th.js | 3 - .../static/admin/js/vendor/select2/i18n/tr.js | 3 - .../static/admin/js/vendor/select2/i18n/uk.js | 3 - .../static/admin/js/vendor/select2/i18n/vi.js | 3 - .../admin/js/vendor/select2/i18n/zh-CN.js | 3 - .../admin/js/vendor/select2/i18n/zh-TW.js | 3 - .../admin/js/vendor/select2/select2.full.js | 6438 --- .../js/vendor/select2/select2.full.min.js | 3 - .../js/vendor/xregexp/LICENSE-XREGEXP.txt | 21 - .../static/admin/js/vendor/xregexp/xregexp.js | 2307 - .../admin/js/vendor/xregexp/xregexp.min.js | 18 - .../admin/simpleui-x/automatic/dicts.js | 141 - .../admin/simpleui-x/automatic/segment.js | 65 - .../static/admin/simpleui-x/css/base.css | 212 - .../static/admin/simpleui-x/css/base.css.map | 9 - .../static/admin/simpleui-x/css/base.less | 212 - .../static/admin/simpleui-x/css/index.css | 442 - .../static/admin/simpleui-x/css/index.css.map | 9 - .../static/admin/simpleui-x/css/index.less | 440 - .../static/admin/simpleui-x/css/login.css | 38 - .../admin/simpleui-x/elementui/alert.js | 481 - .../admin/simpleui-x/elementui/aside.js | 338 - .../simpleui-x/elementui/autocomplete.js | 1008 - .../admin/simpleui-x/elementui/avatar.js | 426 - .../admin/simpleui-x/elementui/backtop.js | 450 - .../admin/simpleui-x/elementui/badge.js | 395 - .../simpleui-x/elementui/breadcrumb-item.js | 383 - .../admin/simpleui-x/elementui/breadcrumb.js | 354 - .../simpleui-x/elementui/button-group.js | 323 - .../admin/simpleui-x/elementui/button.js | 418 - .../admin/simpleui-x/elementui/calendar.js | 967 - .../static/admin/simpleui-x/elementui/card.js | 358 - .../simpleui-x/elementui/carousel-item.js | 495 - .../admin/simpleui-x/elementui/carousel.js | 757 - .../simpleui-x/elementui/cascader-panel.js | 1651 - .../admin/simpleui-x/elementui/cascader.js | 1481 - .../simpleui-x/elementui/checkbox-button.js | 644 - .../simpleui-x/elementui/checkbox-group.js | 374 - .../admin/simpleui-x/elementui/checkbox.js | 690 - .../static/admin/simpleui-x/elementui/col.js | 236 - .../simpleui-x/elementui/collapse-item.js | 558 - .../admin/simpleui-x/elementui/collapse.js | 390 - .../simpleui-x/elementui/color-picker.js | 2025 - .../admin/simpleui-x/elementui/container.js | 349 - .../admin/simpleui-x/elementui/date-picker.js | 6300 --- .../admin/simpleui-x/elementui/dialog.js | 659 - .../elementui/directives/mousewheel.js | 28 - .../elementui/directives/repeat-click.js | 30 - .../admin/simpleui-x/elementui/divider.js | 205 - .../admin/simpleui-x/elementui/drawer.js | 618 - .../simpleui-x/elementui/dropdown-item.js | 377 - .../simpleui-x/elementui/dropdown-menu.js | 412 - .../admin/simpleui-x/elementui/dropdown.js | 688 - .../simpleui-x/elementui/element-ui.common.js | 41278 ---------------- .../admin/simpleui-x/elementui/footer.js | 338 - .../admin/simpleui-x/elementui/form-item.js | 887 - .../static/admin/simpleui-x/elementui/form.js | 528 - .../admin/simpleui-x/elementui/header.js | 338 - .../static/admin/simpleui-x/elementui/icon.js | 326 - .../admin/simpleui-x/elementui/image.js | 1122 - .../admin/simpleui-x/elementui/index.js | 1 - .../simpleui-x/elementui/infinite-scroll.js | 354 - .../simpleui-x/elementui/input-number.js | 806 - .../admin/simpleui-x/elementui/input.js | 1024 - .../static/admin/simpleui-x/elementui/link.js | 391 - .../admin/simpleui-x/elementui/loading.js | 690 - .../simpleui-x/elementui/locale/format.js | 60 - .../simpleui-x/elementui/locale/index.js | 65 - .../simpleui-x/elementui/locale/lang/af-ZA.js | 119 - .../simpleui-x/elementui/locale/lang/ar.js | 118 - .../simpleui-x/elementui/locale/lang/bg.js | 119 - .../simpleui-x/elementui/locale/lang/ca.js | 118 - .../simpleui-x/elementui/locale/lang/cs-CZ.js | 121 - .../simpleui-x/elementui/locale/lang/da.js | 118 - .../simpleui-x/elementui/locale/lang/de.js | 120 - .../simpleui-x/elementui/locale/lang/ee.js | 119 - .../simpleui-x/elementui/locale/lang/el.js | 119 - .../simpleui-x/elementui/locale/lang/en.js | 119 - .../simpleui-x/elementui/locale/lang/es.js | 118 - .../simpleui-x/elementui/locale/lang/eu.js | 119 - .../simpleui-x/elementui/locale/lang/fa.js | 119 - .../simpleui-x/elementui/locale/lang/fi.js | 119 - .../simpleui-x/elementui/locale/lang/fr.js | 118 - .../simpleui-x/elementui/locale/lang/he.js | 119 - .../simpleui-x/elementui/locale/lang/hr.js | 119 - .../simpleui-x/elementui/locale/lang/hu.js | 118 - .../simpleui-x/elementui/locale/lang/hy-AM.js | 119 - .../simpleui-x/elementui/locale/lang/id.js | 119 - .../simpleui-x/elementui/locale/lang/it.js | 118 - .../simpleui-x/elementui/locale/lang/ja.js | 119 - .../simpleui-x/elementui/locale/lang/kg.js | 119 - .../simpleui-x/elementui/locale/lang/km.js | 119 - .../simpleui-x/elementui/locale/lang/ko.js | 119 - .../simpleui-x/elementui/locale/lang/ku.js | 119 - .../simpleui-x/elementui/locale/lang/kz.js | 119 - .../simpleui-x/elementui/locale/lang/lt.js | 119 - .../simpleui-x/elementui/locale/lang/lv.js | 119 - .../simpleui-x/elementui/locale/lang/mn.js | 119 - .../simpleui-x/elementui/locale/lang/nb-NO.js | 118 - .../simpleui-x/elementui/locale/lang/nl.js | 119 - .../simpleui-x/elementui/locale/lang/pl.js | 119 - .../simpleui-x/elementui/locale/lang/pt-br.js | 119 - .../simpleui-x/elementui/locale/lang/pt.js | 119 - .../simpleui-x/elementui/locale/lang/ro.js | 119 - .../simpleui-x/elementui/locale/lang/ru-RU.js | 119 - .../simpleui-x/elementui/locale/lang/sk.js | 121 - .../simpleui-x/elementui/locale/lang/sl.js | 119 - .../simpleui-x/elementui/locale/lang/sr.js | 119 - .../simpleui-x/elementui/locale/lang/sv-SE.js | 119 - .../simpleui-x/elementui/locale/lang/ta.js | 118 - .../simpleui-x/elementui/locale/lang/th.js | 119 - .../simpleui-x/elementui/locale/lang/tk.js | 119 - .../simpleui-x/elementui/locale/lang/tr-TR.js | 119 - .../simpleui-x/elementui/locale/lang/ua.js | 119 - .../simpleui-x/elementui/locale/lang/ug-CN.js | 119 - .../simpleui-x/elementui/locale/lang/uz-UZ.js | 119 - .../simpleui-x/elementui/locale/lang/vi.js | 119 - .../simpleui-x/elementui/locale/lang/zh-CN.js | 119 - .../simpleui-x/elementui/locale/lang/zh-TW.js | 119 - .../static/admin/simpleui-x/elementui/main.js | 325 - .../simpleui-x/elementui/menu-item-group.js | 369 - .../admin/simpleui-x/elementui/menu-item.js | 553 - .../static/admin/simpleui-x/elementui/menu.js | 926 - .../admin/simpleui-x/elementui/message-box.js | 1253 - .../admin/simpleui-x/elementui/message.js | 595 - .../simpleui-x/elementui/mixins/emitter.js | 38 - .../simpleui-x/elementui/mixins/focus.js | 13 - .../simpleui-x/elementui/mixins/locale.js | 17 - .../simpleui-x/elementui/mixins/migrating.js | 69 - .../simpleui-x/elementui/notification.js | 666 - .../simpleui-x/elementui/option-group.js | 405 - .../admin/simpleui-x/elementui/option.js | 534 - .../admin/simpleui-x/elementui/page-header.js | 381 - .../admin/simpleui-x/elementui/pagination.js | 1019 - .../admin/simpleui-x/elementui/popover.js | 662 - .../admin/simpleui-x/elementui/progress.js | 633 - .../simpleui-x/elementui/radio-button.js | 522 - .../admin/simpleui-x/elementui/radio-group.js | 445 - .../admin/simpleui-x/elementui/radio.js | 556 - .../static/admin/simpleui-x/elementui/rate.js | 737 - .../static/admin/simpleui-x/elementui/row.js | 207 - .../admin/simpleui-x/elementui/scrollbar.js | 484 - .../admin/simpleui-x/elementui/select.js | 2244 - .../admin/simpleui-x/elementui/slider.js | 1263 - .../admin/simpleui-x/elementui/spinner.js | 362 - .../static/admin/simpleui-x/elementui/step.js | 583 - .../admin/simpleui-x/elementui/steps.js | 403 - .../admin/simpleui-x/elementui/submenu.js | 767 - .../admin/simpleui-x/elementui/switch.js | 613 - .../admin/simpleui-x/elementui/tab-pane.js | 393 - .../simpleui-x/elementui/table-column.js | 1048 - .../admin/simpleui-x/elementui/table.js | 5042 -- .../static/admin/simpleui-x/elementui/tabs.js | 990 - .../static/admin/simpleui-x/elementui/tag.js | 367 - .../elementui/theme-chalk/alert.css | 1 - .../elementui/theme-chalk/aside.css | 7 - .../elementui/theme-chalk/autocomplete.css | 1 - .../elementui/theme-chalk/avatar.css | 1 - .../elementui/theme-chalk/backtop.css | 1 - .../elementui/theme-chalk/badge.css | 1 - .../simpleui-x/elementui/theme-chalk/base.css | 1 - .../elementui/theme-chalk/breadcrumb-item.css | 0 .../elementui/theme-chalk/breadcrumb.css | 1 - .../elementui/theme-chalk/button-group.css | 0 .../elementui/theme-chalk/button.css | 1 - .../elementui/theme-chalk/calendar.css | 1 - .../simpleui-x/elementui/theme-chalk/card.css | 1 - .../elementui/theme-chalk/carousel-item.css | 1 - .../elementui/theme-chalk/carousel.css | 1 - .../elementui/theme-chalk/cascader-panel.css | 1 - .../elementui/theme-chalk/cascader.css | 1 - .../elementui/theme-chalk/checkbox-button.css | 0 .../elementui/theme-chalk/checkbox-group.css | 0 .../elementui/theme-chalk/checkbox.css | 1 - .../simpleui-x/elementui/theme-chalk/col.css | 1 - .../elementui/theme-chalk/collapse-item.css | 0 .../elementui/theme-chalk/collapse.css | 1 - .../elementui/theme-chalk/color-picker.css | 1 - .../elementui/theme-chalk/container.css | 1 - .../elementui/theme-chalk/date-picker.css | 1 - .../elementui/theme-chalk/dialog.css | 1 - .../elementui/theme-chalk/display.css | 1 - .../elementui/theme-chalk/divider.css | 1 - .../elementui/theme-chalk/drawer.css | 1 - .../elementui/theme-chalk/dropdown-item.css | 0 .../elementui/theme-chalk/dropdown-menu.css | 0 .../elementui/theme-chalk/dropdown.css | 1 - .../theme-chalk/fonts/element-icons.ttf | Bin 55956 -> 0 bytes .../theme-chalk/fonts/element-icons.woff | Bin 28200 -> 0 bytes .../elementui/theme-chalk/footer.css | 7 - .../elementui/theme-chalk/form-item.css | 0 .../simpleui-x/elementui/theme-chalk/form.css | 1 - .../elementui/theme-chalk/header.css | 7 - .../simpleui-x/elementui/theme-chalk/icon.css | 1 - .../elementui/theme-chalk/image.css | 1 - .../elementui/theme-chalk/index.css | 1 - .../elementui/theme-chalk/infinite-scroll.css | 0 .../elementui/theme-chalk/infiniteScroll.css | 0 .../elementui/theme-chalk/input-number.css | 1 - .../elementui/theme-chalk/input.css | 1 - .../simpleui-x/elementui/theme-chalk/link.css | 1 - .../elementui/theme-chalk/loading.css | 1 - .../simpleui-x/elementui/theme-chalk/main.css | 1 - .../elementui/theme-chalk/menu-item-group.css | 0 .../elementui/theme-chalk/menu-item.css | 0 .../simpleui-x/elementui/theme-chalk/menu.css | 1 - .../elementui/theme-chalk/message-box.css | 1 - .../elementui/theme-chalk/message.css | 1 - .../elementui/theme-chalk/notification.css | 1 - .../elementui/theme-chalk/option-group.css | 1 - .../elementui/theme-chalk/option.css | 1 - .../elementui/theme-chalk/page-header.css | 1 - .../elementui/theme-chalk/pagination.css | 1 - .../elementui/theme-chalk/popover.css | 1 - .../elementui/theme-chalk/popper.css | 1 - .../elementui/theme-chalk/progress.css | 1 - .../elementui/theme-chalk/radio-button.css | 1 - .../elementui/theme-chalk/radio-group.css | 6 - .../elementui/theme-chalk/radio.css | 1 - .../simpleui-x/elementui/theme-chalk/rate.css | 1 - .../elementui/theme-chalk/reset.css | 1 - .../simpleui-x/elementui/theme-chalk/row.css | 1 - .../elementui/theme-chalk/scrollbar.css | 1 - .../elementui/theme-chalk/select-dropdown.css | 1 - .../elementui/theme-chalk/select.css | 1 - .../elementui/theme-chalk/slider.css | 1 - .../elementui/theme-chalk/spinner.css | 1 - .../simpleui-x/elementui/theme-chalk/step.css | 1 - .../elementui/theme-chalk/steps.css | 1 - .../elementui/theme-chalk/submenu.css | 0 .../elementui/theme-chalk/switch.css | 1 - .../elementui/theme-chalk/tab-pane.css | 0 .../elementui/theme-chalk/table-column.css | 1 - .../elementui/theme-chalk/table.css | 1 - .../simpleui-x/elementui/theme-chalk/tabs.css | 1 - .../simpleui-x/elementui/theme-chalk/tag.css | 1 - .../elementui/theme-chalk/time-picker.css | 1 - .../elementui/theme-chalk/time-select.css | 1 - .../elementui/theme-chalk/timeline-item.css | 1 - .../elementui/theme-chalk/timeline.css | 9 - .../elementui/theme-chalk/tooltip.css | 1 - .../elementui/theme-chalk/transfer.css | 1 - .../simpleui-x/elementui/theme-chalk/tree.css | 1 - .../elementui/theme-chalk/upload.css | 1 - .../admin/simpleui-x/elementui/time-picker.js | 2994 -- .../admin/simpleui-x/elementui/time-select.js | 1798 - .../simpleui-x/elementui/timeline-item.js | 432 - .../admin/simpleui-x/elementui/timeline.js | 337 - .../admin/simpleui-x/elementui/tooltip.js | 483 - .../admin/simpleui-x/elementui/transfer.js | 1165 - .../transitions/collapse-transition.js | 95 - .../static/admin/simpleui-x/elementui/tree.js | 2357 - .../simpleui-x/elementui/umd/locale/af-ZA.js | 135 - .../simpleui-x/elementui/umd/locale/ar.js | 134 - .../simpleui-x/elementui/umd/locale/bg.js | 135 - .../simpleui-x/elementui/umd/locale/ca.js | 134 - .../simpleui-x/elementui/umd/locale/cs-CZ.js | 137 - .../simpleui-x/elementui/umd/locale/da.js | 134 - .../simpleui-x/elementui/umd/locale/de.js | 136 - .../simpleui-x/elementui/umd/locale/ee.js | 135 - .../simpleui-x/elementui/umd/locale/el.js | 135 - .../simpleui-x/elementui/umd/locale/en.js | 135 - .../simpleui-x/elementui/umd/locale/es.js | 134 - .../simpleui-x/elementui/umd/locale/eu.js | 135 - .../simpleui-x/elementui/umd/locale/fa.js | 135 - .../simpleui-x/elementui/umd/locale/fi.js | 135 - .../simpleui-x/elementui/umd/locale/fr.js | 134 - .../simpleui-x/elementui/umd/locale/he.js | 135 - .../simpleui-x/elementui/umd/locale/hr.js | 135 - .../simpleui-x/elementui/umd/locale/hu.js | 134 - .../simpleui-x/elementui/umd/locale/hy-AM.js | 135 - .../simpleui-x/elementui/umd/locale/id.js | 135 - .../simpleui-x/elementui/umd/locale/it.js | 134 - .../simpleui-x/elementui/umd/locale/ja.js | 135 - .../simpleui-x/elementui/umd/locale/kg.js | 135 - .../simpleui-x/elementui/umd/locale/km.js | 135 - .../simpleui-x/elementui/umd/locale/ko.js | 135 - .../simpleui-x/elementui/umd/locale/ku.js | 135 - .../simpleui-x/elementui/umd/locale/kz.js | 135 - .../simpleui-x/elementui/umd/locale/lt.js | 135 - .../simpleui-x/elementui/umd/locale/lv.js | 135 - .../simpleui-x/elementui/umd/locale/mn.js | 135 - .../simpleui-x/elementui/umd/locale/nb-NO.js | 134 - .../simpleui-x/elementui/umd/locale/nl.js | 135 - .../simpleui-x/elementui/umd/locale/pl.js | 135 - .../simpleui-x/elementui/umd/locale/pt-br.js | 135 - .../simpleui-x/elementui/umd/locale/pt.js | 135 - .../simpleui-x/elementui/umd/locale/ro.js | 135 - .../simpleui-x/elementui/umd/locale/ru-RU.js | 135 - .../simpleui-x/elementui/umd/locale/sk.js | 137 - .../simpleui-x/elementui/umd/locale/sl.js | 135 - .../simpleui-x/elementui/umd/locale/sr.js | 135 - .../simpleui-x/elementui/umd/locale/sv-SE.js | 135 - .../simpleui-x/elementui/umd/locale/ta.js | 134 - .../simpleui-x/elementui/umd/locale/th.js | 135 - .../simpleui-x/elementui/umd/locale/tk.js | 135 - .../simpleui-x/elementui/umd/locale/tr-TR.js | 135 - .../simpleui-x/elementui/umd/locale/ua.js | 135 - .../simpleui-x/elementui/umd/locale/ug-CN.js | 135 - .../simpleui-x/elementui/umd/locale/uz-UZ.js | 135 - .../simpleui-x/elementui/umd/locale/vi.js | 135 - .../simpleui-x/elementui/umd/locale/zh-CN.js | 135 - .../simpleui-x/elementui/umd/locale/zh-TW.js | 135 - .../admin/simpleui-x/elementui/upload.js | 1466 - .../simpleui-x/elementui/utils/after-leave.js | 35 - .../simpleui-x/elementui/utils/aria-dialog.js | 110 - .../simpleui-x/elementui/utils/aria-utils.js | 127 - .../elementui/utils/clickoutside.js | 81 - .../simpleui-x/elementui/utils/date-util.js | 322 - .../admin/simpleui-x/elementui/utils/date.js | 370 - .../admin/simpleui-x/elementui/utils/dom.js | 240 - .../elementui/utils/menu/aria-menubar.js | 26 - .../elementui/utils/menu/aria-menuitem.js | 64 - .../elementui/utils/menu/aria-submenu.js | 71 - .../admin/simpleui-x/elementui/utils/merge.js | 20 - .../simpleui-x/elementui/utils/popper.js | 1268 - .../simpleui-x/elementui/utils/popup/index.js | 235 - .../elementui/utils/popup/popup-manager.js | 207 - .../elementui/utils/resize-event.js | 59 - .../elementui/utils/scroll-into-view.js | 40 - .../elementui/utils/scrollbar-width.js | 40 - .../simpleui-x/elementui/utils/shared.js | 14 - .../admin/simpleui-x/elementui/utils/types.js | 31 - .../admin/simpleui-x/elementui/utils/util.js | 273 - .../admin/simpleui-x/elementui/utils/vdom.js | 17 - .../simpleui-x/elementui/utils/vue-popper.js | 205 - .../css/all.min.css | 5 - .../webfonts/fa-brands-400.eot | Bin 129916 -> 0 bytes .../webfonts/fa-brands-400.svg | 3460 -- .../webfonts/fa-brands-400.ttf | Bin 129612 -> 0 bytes .../webfonts/fa-brands-400.woff | Bin 87688 -> 0 bytes .../webfonts/fa-brands-400.woff2 | Bin 74768 -> 0 bytes .../webfonts/fa-regular-400.eot | Bin 34388 -> 0 bytes .../webfonts/fa-regular-400.svg | 804 - .../webfonts/fa-regular-400.ttf | Bin 34092 -> 0 bytes .../webfonts/fa-regular-400.woff | Bin 16804 -> 0 bytes .../webfonts/fa-regular-400.woff2 | Bin 13552 -> 0 bytes .../webfonts/fa-solid-900.eot | Bin 186728 -> 0 bytes .../webfonts/fa-solid-900.svg | 4528 -- .../webfonts/fa-solid-900.ttf | Bin 186444 -> 0 bytes .../webfonts/fa-solid-900.woff | Bin 96256 -> 0 bytes .../webfonts/fa-solid-900.woff2 | Bin 74256 -> 0 bytes .../static/admin/simpleui-x/img/bg.svg | 93 - .../static/admin/simpleui-x/img/favicon.png | Bin 115997 -> 0 bytes .../static/admin/simpleui-x/img/logo.png | Bin 115997 -> 0 bytes .../static/admin/simpleui-x/js/cookie.js | 17 - .../static/admin/simpleui-x/js/index.js | 587 - .../static/admin/simpleui-x/js/language.js | 10 - .../static/admin/simpleui-x/js/login.js | 25 - .../static/admin/simpleui-x/js/vue.min.js | 6 - .../static/admin/simpleui-x/locale/en-us.js | 42 - .../static/admin/simpleui-x/locale/zh-hans.js | 44 - .../static/admin/simpleui-x/particles/app.js | 132 - .../admin/simpleui-x/particles/particles.js | 1524 - .../admin/simpleui-x/theme/admin.lte.css | 226 - .../admin/simpleui-x/theme/admin.lte.css.map | 10 - .../admin/simpleui-x/theme/admin.lte.less | 36 - .../admin/simpleui-x/theme/aircraft.css | 239 - .../admin/simpleui-x/theme/aircraft.css.map | 10 - .../admin/simpleui-x/theme/aircraft.less | 47 - .../admin/simpleui-x/theme/ant.design.css | 228 - .../admin/simpleui-x/theme/ant.design.css.map | 10 - .../admin/simpleui-x/theme/ant.design.less | 43 - .../static/admin/simpleui-x/theme/base.less | 181 - .../static/admin/simpleui-x/theme/black.css | 221 - .../admin/simpleui-x/theme/black.css.map | 10 - .../static/admin/simpleui-x/theme/black.less | 31 - .../admin/simpleui-x/theme/dark.green.css | 221 - .../admin/simpleui-x/theme/dark.green.css.map | 10 - .../admin/simpleui-x/theme/dark.green.less | 31 - .../admin/simpleui-x/theme/e-black-pro.css | 227 - .../simpleui-x/theme/e-black-pro.css.map | 10 - .../admin/simpleui-x/theme/e-black-pro.less | 3 - .../static/admin/simpleui-x/theme/e-black.css | 234 - .../admin/simpleui-x/theme/e-black.css.map | 10 - .../admin/simpleui-x/theme/e-black.less | 3 - .../admin/simpleui-x/theme/e-blue-pro.css | 210 - .../admin/simpleui-x/theme/e-blue-pro.css.map | 10 - .../admin/simpleui-x/theme/e-blue-pro.less | 37 - .../static/admin/simpleui-x/theme/e-blue.css | 217 - .../admin/simpleui-x/theme/e-blue.css.map | 10 - .../static/admin/simpleui-x/theme/e-blue.less | 43 - .../admin/simpleui-x/theme/e-green-pro.css | 227 - .../simpleui-x/theme/e-green-pro.css.map | 10 - .../admin/simpleui-x/theme/e-green-pro.less | 3 - .../static/admin/simpleui-x/theme/e-green.css | 234 - .../admin/simpleui-x/theme/e-green.css.map | 10 - .../admin/simpleui-x/theme/e-green.less | 3 - .../admin/simpleui-x/theme/e-purple-pro.css | 227 - .../simpleui-x/theme/e-purple-pro.css.map | 10 - .../admin/simpleui-x/theme/e-purple-pro.less | 3 - .../admin/simpleui-x/theme/e-purple.css | 234 - .../admin/simpleui-x/theme/e-purple.css.map | 10 - .../admin/simpleui-x/theme/e-purple.less | 3 - .../admin/simpleui-x/theme/e-red-pro.css | 227 - .../admin/simpleui-x/theme/e-red-pro.css.map | 10 - .../admin/simpleui-x/theme/e-red-pro.less | 3 - .../static/admin/simpleui-x/theme/e-red.css | 234 - .../admin/simpleui-x/theme/e-red.css.map | 10 - .../static/admin/simpleui-x/theme/e-red.less | 3 - .../static/admin/simpleui-x/theme/element.css | 217 - .../admin/simpleui-x/theme/element.css.map | 10 - .../admin/simpleui-x/theme/element.less | 27 - .../static/admin/simpleui-x/theme/gray.css | 221 - .../admin/simpleui-x/theme/gray.css.map | 10 - .../static/admin/simpleui-x/theme/gray.less | 28 - .../static/admin/simpleui-x/theme/green.css | 221 - .../admin/simpleui-x/theme/green.css.map | 10 - .../static/admin/simpleui-x/theme/green.less | 30 - .../admin/simpleui-x/theme/highdmin.css | 226 - .../admin/simpleui-x/theme/highdmin.css.map | 10 - .../admin/simpleui-x/theme/highdmin.less | 32 - .../static/admin/simpleui-x/theme/layui.css | 222 - .../admin/simpleui-x/theme/layui.css.map | 10 - .../static/admin/simpleui-x/theme/layui.less | 32 - .../static/admin/simpleui-x/theme/light.css | 212 - .../admin/simpleui-x/theme/light.css.map | 9 - .../static/admin/simpleui-x/theme/light.less | 20 - .../static/admin/simpleui-x/theme/orange.css | 236 - .../admin/simpleui-x/theme/orange.css.map | 10 - .../static/admin/simpleui-x/theme/orange.less | 47 - .../static/admin/simpleui-x/theme/purple.css | 235 - .../admin/simpleui-x/theme/purple.css.map | 10 - .../static/admin/simpleui-x/theme/purple.less | 47 - .../admin/simpleui-x/theme/simpleui.css | 220 - .../admin/simpleui-x/theme/simpleui.css.map | 10 - .../admin/simpleui-x/theme/simpleui.less | 30 - .../static/admin/simpleui-x/theme/theme.js | 178 - .../static/admin/simpleui-x/theme/x-blue.css | 232 - .../admin/simpleui-x/theme/x-blue.css.map | 11 - .../static/admin/simpleui-x/theme/x-blue.less | 8 - .../static/admin/simpleui-x/theme/x-green.css | 227 - .../admin/simpleui-x/theme/x-green.css.map | 10 - .../admin/simpleui-x/theme/x-green.less | 3 - .../static/admin/simpleui-x/theme/x-red.css | 232 - .../admin/simpleui-x/theme/x-red.css.map | 11 - .../static/admin/simpleui-x/theme/x-red.less | 8 - .../admin/simpleui-x/waves/waves.min.css | 7 - .../admin/simpleui-x/waves/waves.min.js | 2 - .../admin/simpleui-x/waves/waves.min.js.map | 168 - .../static/import_export/action_formats.js | 0 .../simpleui/templates/admin/404.html | 12 - .../simpleui/templates/admin/500.html | 18 - .../simpleui/templates/admin/actions.html | 322 - .../simpleui/templates/admin/app_index.html | 18 - .../simpleui/templates/admin/base.html | 193 - .../simpleui/templates/admin/base_site.html | 9 - .../simpleui/templates/admin/change_form.html | 136 - .../admin/change_form_object_tools.html | 8 - .../simpleui/templates/admin/change_list.html | 116 - .../admin/change_list_object_tools.html | 12 - .../templates/admin/change_list_results.html | 50 - .../templates/admin/date_hierarchy.html | 10 - .../simpleui/templates/admin/filter.html | 8 - .../simpleui/templates/admin/home.html | 119 - .../templates/admin/includes/css-part.html | 8 - .../templates/admin/includes/fieldset.html | 219 - .../templates/admin/includes/js-part.html | 8 - .../simpleui/templates/admin/index.html | 377 - .../templates/admin/invalid_setup.html | 13 - .../simpleui/templates/admin/login.html | 133 - .../templates/admin/object_history.html | 50 - .../simpleui/templates/admin/pagination.html | 34 - .../templates/admin/popup_response.html | 12 - .../admin/prepopulated_fields_js.html | 6 - .../admin/related_widget_wrapper.html | 29 - .../simpleui/templates/admin/search_form.html | 245 - .../simpleui/templates/admin/submit_line.html | 53 - .../templates/registration/logged_out.html | 21 - .../registration/password_change_done.html | 23 - .../registration/password_change_form.html | 98 - .../registration/password_reset_complete.html | 20 - .../registration/password_reset_confirm.html | 42 - .../registration/password_reset_done.html | 19 - .../registration/password_reset_email.html | 14 - .../registration/password_reset_form.html | 29 - .../simpleui/templatetags/__init__.py | 0 .../simpleui/templatetags/simpletags.py | 480 - venv/Lib/site-packages/simpleui/widgets.py | 286 - .../zipp-3.8.0.dist-info/INSTALLER | 1 - .../zipp-3.8.0.dist-info/LICENSE | 19 - .../zipp-3.8.0.dist-info/METADATA | 84 - .../site-packages/zipp-3.8.0.dist-info/RECORD | 8 - .../site-packages/zipp-3.8.0.dist-info/WHEEL | 5 - .../zipp-3.8.0.dist-info/top_level.txt | 1 - venv/Lib/site-packages/zipp.py | 312 - venv/Scripts/Activate.ps1 | 60 - venv/Scripts/activate | 83 - venv/Scripts/activate.bat | 39 - venv/Scripts/deactivate.bat | 19 - venv/Scripts/django-admin.py | 21 - venv/Scripts/markdown_py.exe | Bin 106375 -> 0 bytes venv/Scripts/pip.exe | Bin 106898 -> 0 bytes venv/Scripts/pip3.9.exe | Bin 106898 -> 0 bytes venv/Scripts/pip3.exe | Bin 106898 -> 0 bytes venv/Scripts/python.exe | Bin 543464 -> 0 bytes venv/Scripts/pythonw.exe | Bin 542440 -> 0 bytes venv/pyvenv.cfg | 8 - 2309 files changed, 464940 deletions(-) delete mode 100644 .idea/ITShowPlatform.iml delete mode 100644 .idea/dataSources.local.xml delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/deployment.xml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59_[Default_Changelist]/shelved.patch delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59__Default_Changelist_.xml delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44_[Default_Changelist]/shelved.patch delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44__Default_Changelist_.xml delete mode 100644 .idea/shelf/Update_at_2022_5_5_22_17__Default_Changelist_.xml delete mode 100644 .idea/shelf/在Update之前未提交更改_at_2022_5_5_22_17_[Default_Changelist]/shelved.patch delete mode 100644 .idea/sshConfigs.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/webServers.xml delete mode 100644 .idea/workspace.xml delete mode 100644 venv/Lib/site-packages/Django-3.2.5.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/Django-3.2.5.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/Django-3.2.5.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/LICENSE.md delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/entry_points.txt delete mode 100644 venv/Lib/site-packages/Markdown-3.3.6.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/MySQLdb/__init__.py delete mode 100644 venv/Lib/site-packages/MySQLdb/_exceptions.py delete mode 100644 venv/Lib/site-packages/MySQLdb/_mysql.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/MySQLdb/connections.py delete mode 100644 venv/Lib/site-packages/MySQLdb/constants/CLIENT.py delete mode 100644 venv/Lib/site-packages/MySQLdb/constants/CR.py delete mode 100644 venv/Lib/site-packages/MySQLdb/constants/ER.py delete mode 100644 venv/Lib/site-packages/MySQLdb/constants/FIELD_TYPE.py delete mode 100644 venv/Lib/site-packages/MySQLdb/constants/FLAG.py delete mode 100644 venv/Lib/site-packages/MySQLdb/constants/__init__.py delete mode 100644 venv/Lib/site-packages/MySQLdb/converters.py delete mode 100644 venv/Lib/site-packages/MySQLdb/cursors.py delete mode 100644 venv/Lib/site-packages/MySQLdb/release.py delete mode 100644 venv/Lib/site-packages/MySQLdb/times.py delete mode 100644 venv/Lib/site-packages/PIL/BdfFontFile.py delete mode 100644 venv/Lib/site-packages/PIL/BlpImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/BmpImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/BufrStubImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/ContainerIO.py delete mode 100644 venv/Lib/site-packages/PIL/CurImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/DcxImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/DdsImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/EpsImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/ExifTags.py delete mode 100644 venv/Lib/site-packages/PIL/FitsImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/FitsStubImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/FliImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/FontFile.py delete mode 100644 venv/Lib/site-packages/PIL/FpxImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/FtexImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/GbrImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/GdImageFile.py delete mode 100644 venv/Lib/site-packages/PIL/GifImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/GimpGradientFile.py delete mode 100644 venv/Lib/site-packages/PIL/GimpPaletteFile.py delete mode 100644 venv/Lib/site-packages/PIL/GribStubImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/IcnsImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/IcoImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/ImImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/Image.py delete mode 100644 venv/Lib/site-packages/PIL/ImageChops.py delete mode 100644 venv/Lib/site-packages/PIL/ImageCms.py delete mode 100644 venv/Lib/site-packages/PIL/ImageColor.py delete mode 100644 venv/Lib/site-packages/PIL/ImageDraw.py delete mode 100644 venv/Lib/site-packages/PIL/ImageDraw2.py delete mode 100644 venv/Lib/site-packages/PIL/ImageEnhance.py delete mode 100644 venv/Lib/site-packages/PIL/ImageFile.py delete mode 100644 venv/Lib/site-packages/PIL/ImageFilter.py delete mode 100644 venv/Lib/site-packages/PIL/ImageFont.py delete mode 100644 venv/Lib/site-packages/PIL/ImageGrab.py delete mode 100644 venv/Lib/site-packages/PIL/ImageMath.py delete mode 100644 venv/Lib/site-packages/PIL/ImageMode.py delete mode 100644 venv/Lib/site-packages/PIL/ImageMorph.py delete mode 100644 venv/Lib/site-packages/PIL/ImageOps.py delete mode 100644 venv/Lib/site-packages/PIL/ImagePalette.py delete mode 100644 venv/Lib/site-packages/PIL/ImagePath.py delete mode 100644 venv/Lib/site-packages/PIL/ImageQt.py delete mode 100644 venv/Lib/site-packages/PIL/ImageSequence.py delete mode 100644 venv/Lib/site-packages/PIL/ImageShow.py delete mode 100644 venv/Lib/site-packages/PIL/ImageStat.py delete mode 100644 venv/Lib/site-packages/PIL/ImageTk.py delete mode 100644 venv/Lib/site-packages/PIL/ImageTransform.py delete mode 100644 venv/Lib/site-packages/PIL/ImageWin.py delete mode 100644 venv/Lib/site-packages/PIL/ImtImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/IptcImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/JpegImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/JpegPresets.py delete mode 100644 venv/Lib/site-packages/PIL/McIdasImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/MicImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/MpegImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/MpoImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/MspImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PSDraw.py delete mode 100644 venv/Lib/site-packages/PIL/PaletteFile.py delete mode 100644 venv/Lib/site-packages/PIL/PalmImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PcdImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PcfFontFile.py delete mode 100644 venv/Lib/site-packages/PIL/PcxImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PdfImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PdfParser.py delete mode 100644 venv/Lib/site-packages/PIL/PixarImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PngImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PpmImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PsdImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/PyAccess.py delete mode 100644 venv/Lib/site-packages/PIL/SgiImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/SpiderImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/SunImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/TarIO.py delete mode 100644 venv/Lib/site-packages/PIL/TgaImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/TiffImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/TiffTags.py delete mode 100644 venv/Lib/site-packages/PIL/WalImageFile.py delete mode 100644 venv/Lib/site-packages/PIL/WebPImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/WmfImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/XVThumbImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/XbmImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/XpmImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/__init__.py delete mode 100644 venv/Lib/site-packages/PIL/__main__.py delete mode 100644 venv/Lib/site-packages/PIL/_binary.py delete mode 100644 venv/Lib/site-packages/PIL/_imaging.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/_imagingcms.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/_imagingft.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/_imagingmath.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/_imagingmorph.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/_imagingtk.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/_tkinter_finder.py delete mode 100644 venv/Lib/site-packages/PIL/_util.py delete mode 100644 venv/Lib/site-packages/PIL/_version.py delete mode 100644 venv/Lib/site-packages/PIL/_webp.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/concrt140.dll delete mode 100644 venv/Lib/site-packages/PIL/features.py delete mode 100644 venv/Lib/site-packages/PIL/msvcp140.dll delete mode 100644 venv/Lib/site-packages/PIL/msvcp140_1.dll delete mode 100644 venv/Lib/site-packages/PIL/msvcp140_2.dll delete mode 100644 venv/Lib/site-packages/PIL/msvcp140_atomic_wait.dll delete mode 100644 venv/Lib/site-packages/PIL/msvcp140_codecvt_ids.dll delete mode 100644 venv/Lib/site-packages/PIL/vccorlib140.dll delete mode 100644 venv/Lib/site-packages/PIL/vcruntime140.dll delete mode 100644 venv/Lib/site-packages/PIL/vcruntime140_1.dll delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/LICENSE delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/Pillow-9.1.0.dist-info/zip-safe delete mode 100644 venv/Lib/site-packages/_distutils_hack/__init__.py delete mode 100644 venv/Lib/site-packages/_distutils_hack/override.py delete mode 100644 venv/Lib/site-packages/backports/configparser/__init__.py delete mode 100644 venv/Lib/site-packages/backports/configparser/compat.py delete mode 100644 venv/Lib/site-packages/configparser-5.2.0.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/configparser-5.2.0.dist-info/LICENSE delete mode 100644 venv/Lib/site-packages/configparser-5.2.0.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/configparser-5.2.0.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/configparser-5.2.0.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/configparser-5.2.0.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/configparser-5.2.0.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/configparser.py delete mode 100644 venv/Lib/site-packages/distutils-precedence.pth delete mode 100644 venv/Lib/site-packages/django/bin/django-admin.py delete mode 100644 venv/Lib/site-packages/django/contrib/postgres/forms/jsonb.py delete mode 100644 venv/Lib/site-packages/django/db/migrations/operations/utils.py delete mode 100644 venv/Lib/site-packages/django_filter-21.1.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/django_filter-21.1.dist-info/LICENSE delete mode 100644 venv/Lib/site-packages/django_filter-21.1.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/django_filter-21.1.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/django_filter-21.1.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/django_filter-21.1.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/django_filter-21.1.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/django_filters/__init__.py delete mode 100644 venv/Lib/site-packages/django_filters/compat.py delete mode 100644 venv/Lib/site-packages/django_filters/conf.py delete mode 100644 venv/Lib/site-packages/django_filters/constants.py delete mode 100644 venv/Lib/site-packages/django_filters/exceptions.py delete mode 100644 venv/Lib/site-packages/django_filters/fields.py delete mode 100644 venv/Lib/site-packages/django_filters/filters.py delete mode 100644 venv/Lib/site-packages/django_filters/filterset.py delete mode 100644 venv/Lib/site-packages/django_filters/locale/ar/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/ar/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/be/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/be/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/bg/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/bg/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/cs/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/cs/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/da/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/da/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/de/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/de/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/el/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/el/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/es/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/es/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/es_AR/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/es_AR/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/fr/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/fr/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/it/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/it/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/pl/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/pl/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/pt_BR/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/ru/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/ru/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/sk/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/sk/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/uk/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/uk/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/locale/zh_CN/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/django_filters/locale/zh_CN/LC_MESSAGES/django.po delete mode 100644 venv/Lib/site-packages/django_filters/rest_framework/__init__.py delete mode 100644 venv/Lib/site-packages/django_filters/rest_framework/backends.py delete mode 100644 venv/Lib/site-packages/django_filters/rest_framework/filters.py delete mode 100644 venv/Lib/site-packages/django_filters/rest_framework/filterset.py delete mode 100644 venv/Lib/site-packages/django_filters/templates/django_filters/rest_framework/crispy_form.html delete mode 100644 venv/Lib/site-packages/django_filters/templates/django_filters/rest_framework/form.html delete mode 100644 venv/Lib/site-packages/django_filters/templates/django_filters/widgets/multiwidget.html delete mode 100644 venv/Lib/site-packages/django_filters/utils.py delete mode 100644 venv/Lib/site-packages/django_filters/views.py delete mode 100644 venv/Lib/site-packages/django_filters/widgets.py delete mode 100644 venv/Lib/site-packages/djangorestframework-3.13.1.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/djangorestframework-3.13.1.dist-info/LICENSE.md delete mode 100644 venv/Lib/site-packages/djangorestframework-3.13.1.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/djangorestframework-3.13.1.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/djangorestframework-3.13.1.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/djangorestframework-3.13.1.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/djangorestframework-3.13.1.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/importlib_metadata-4.11.3.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/importlib_metadata-4.11.3.dist-info/LICENSE delete mode 100644 venv/Lib/site-packages/importlib_metadata-4.11.3.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/importlib_metadata-4.11.3.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/importlib_metadata-4.11.3.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/importlib_metadata-4.11.3.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/importlib_metadata/__init__.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/_adapters.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/_collections.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/_compat.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/_functools.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/_itertools.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/_meta.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/_text.py delete mode 100644 venv/Lib/site-packages/importlib_metadata/py.typed delete mode 100644 venv/Lib/site-packages/markdown/__init__.py delete mode 100644 venv/Lib/site-packages/markdown/__main__.py delete mode 100644 venv/Lib/site-packages/markdown/__meta__.py delete mode 100644 venv/Lib/site-packages/markdown/blockparser.py delete mode 100644 venv/Lib/site-packages/markdown/blockprocessors.py delete mode 100644 venv/Lib/site-packages/markdown/core.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/__init__.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/abbr.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/admonition.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/attr_list.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/codehilite.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/def_list.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/extra.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/fenced_code.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/footnotes.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/legacy_attrs.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/legacy_em.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/md_in_html.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/meta.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/nl2br.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/sane_lists.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/smarty.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/tables.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/toc.py delete mode 100644 venv/Lib/site-packages/markdown/extensions/wikilinks.py delete mode 100644 venv/Lib/site-packages/markdown/htmlparser.py delete mode 100644 venv/Lib/site-packages/markdown/inlinepatterns.py delete mode 100644 venv/Lib/site-packages/markdown/pep562.py delete mode 100644 venv/Lib/site-packages/markdown/postprocessors.py delete mode 100644 venv/Lib/site-packages/markdown/preprocessors.py delete mode 100644 venv/Lib/site-packages/markdown/serializers.py delete mode 100644 venv/Lib/site-packages/markdown/test_tools.py delete mode 100644 venv/Lib/site-packages/markdown/treeprocessors.py delete mode 100644 venv/Lib/site-packages/markdown/util.py delete mode 100644 venv/Lib/site-packages/mysqlclient-2.1.0.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/mysqlclient-2.1.0.dist-info/LICENSE delete mode 100644 venv/Lib/site-packages/mysqlclient-2.1.0.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/mysqlclient-2.1.0.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/mysqlclient-2.1.0.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/mysqlclient-2.1.0.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/mysqlclient-2.1.0.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/pip/__init__.py delete mode 100644 venv/Lib/site-packages/pip/__main__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/build_env.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cache.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/command_context.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/main.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/req_command.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/spinners.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/cache.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/debug.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/index.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/configuration.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/installed.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/collector.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/package_finder.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/sources.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/main.py delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/direct_url.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/index.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/link.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/scheme.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/search_scope.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/target_python.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/auth.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/cache.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/download.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/session.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/utils.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/Lib/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 venv/Lib/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/_log.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/datetime.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/urls.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 venv/Lib/site-packages/pip/_internal/wheel_builder.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/core.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/util.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distro.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/constants.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/codec.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/core.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/_version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/build.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/check.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/meta.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/bar.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/colors.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/counter.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/spinner.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/api.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/auth.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/certs.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/help.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/models.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/packages.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/structures.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/six.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/vendor.txt delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv/Lib/site-packages/pip/py.typed delete mode 100644 venv/Lib/site-packages/pkg_resources/__init__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_manylinux.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_musllinux.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 venv/Lib/site-packages/pkg_resources/extern/__init__.py delete mode 100644 venv/Lib/site-packages/pytz-2022.1.dist-info/LICENSE.txt delete mode 100644 venv/Lib/site-packages/pytz-2022.1.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/pytz-2022.1.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/pytz-2022.1.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/pytz-2022.1.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/pytz-2022.1.dist-info/zip-safe delete mode 100644 venv/Lib/site-packages/pytz/__init__.py delete mode 100644 venv/Lib/site-packages/pytz/exceptions.py delete mode 100644 venv/Lib/site-packages/pytz/lazy.py delete mode 100644 venv/Lib/site-packages/pytz/reference.py delete mode 100644 venv/Lib/site-packages/pytz/tzfile.py delete mode 100644 venv/Lib/site-packages/pytz/tzinfo.py delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Abidjan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Accra delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Addis_Ababa delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Algiers delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Asmara delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Asmera delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bamako delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bangui delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Banjul delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bissau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Blantyre delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Brazzaville delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Bujumbura delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Cairo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Casablanca delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Ceuta delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Conakry delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Dakar delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Djibouti delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Douala delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/El_Aaiun delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Freetown delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Gaborone delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Harare delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Johannesburg delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Juba delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Kampala delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Khartoum delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Kigali delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Kinshasa delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lagos delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Libreville delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lome delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Luanda delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lubumbashi delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Lusaka delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Malabo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Maputo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Maseru delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Mbabane delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Mogadishu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Monrovia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Nairobi delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Ndjamena delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Niamey delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Nouakchott delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Ouagadougou delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Porto-Novo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Sao_Tome delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Timbuktu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Tripoli delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Tunis delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Africa/Windhoek delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Adak delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Anchorage delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Anguilla delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Antigua delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Araguaina delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Catamarca delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Cordoba delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Jujuy delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Mendoza delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Salta delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/San_Juan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/San_Luis delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Tucuman delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Aruba delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Asuncion delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Atikokan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Atka delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Bahia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Bahia_Banderas delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Barbados delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Belem delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Belize delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Blanc-Sablon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Boa_Vista delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Bogota delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Boise delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Buenos_Aires delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cambridge_Bay delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Campo_Grande delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cancun delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Caracas delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Catamarca delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cayenne delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cayman delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Chicago delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Chihuahua delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Coral_Harbour delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cordoba delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Costa_Rica delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Creston delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Cuiaba delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Curacao delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Danmarkshavn delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Dawson delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Dawson_Creek delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Denver delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Detroit delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Dominica delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Edmonton delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Eirunepe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/El_Salvador delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Ensenada delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Fort_Nelson delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Fort_Wayne delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Fortaleza delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Glace_Bay delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Godthab delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Goose_Bay delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Grand_Turk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Grenada delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guadeloupe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guatemala delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guayaquil delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Guyana delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Halifax delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Havana delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Hermosillo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Knox delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Marengo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Petersburg delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Tell_City delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Vevay delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Vincennes delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Winamac delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Indianapolis delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Inuvik delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Iqaluit delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Jamaica delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Jujuy delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Juneau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Kentucky/Louisville delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Kentucky/Monticello delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Knox_IN delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Kralendijk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/La_Paz delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Lima delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Los_Angeles delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Louisville delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Lower_Princes delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Maceio delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Managua delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Manaus delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Marigot delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Martinique delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Matamoros delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Mazatlan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Mendoza delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Menominee delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Merida delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Metlakatla delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Mexico_City delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Miquelon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Moncton delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Monterrey delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Montevideo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Montreal delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Montserrat delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Nassau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/New_York delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Nipigon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Nome delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Noronha delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/Center delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Nuuk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Ojinaga delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Panama delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Pangnirtung delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Paramaribo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Phoenix delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Port-au-Prince delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Port_of_Spain delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Porto_Acre delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Porto_Velho delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Puerto_Rico delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Punta_Arenas delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rainy_River delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rankin_Inlet delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Recife delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Regina delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Resolute delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rio_Branco delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Rosario delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santa_Isabel delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santarem delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santiago delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Santo_Domingo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Sao_Paulo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Scoresbysund delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Shiprock delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Sitka delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Barthelemy delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Johns delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Kitts delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Lucia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Thomas delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/St_Vincent delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Swift_Current delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Tegucigalpa delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Thule delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Thunder_Bay delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Tijuana delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Toronto delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Tortola delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Vancouver delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Virgin delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Whitehorse delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Winnipeg delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Yakutat delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/America/Yellowknife delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Casey delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Davis delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Macquarie delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Mawson delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/McMurdo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Palmer delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Rothera delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/South_Pole delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Syowa delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Troll delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Vostok delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Arctic/Longyearbyen delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Aden delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Almaty delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Amman delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Anadyr delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Aqtau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Aqtobe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ashgabat delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ashkhabad delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Atyrau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Baghdad delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Bahrain delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Baku delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Bangkok delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Barnaul delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Beirut delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Bishkek delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Brunei delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Calcutta delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Chita delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Choibalsan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Chongqing delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Chungking delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Colombo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dacca delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Damascus delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dhaka delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dili delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dubai delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Dushanbe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Famagusta delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Gaza delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Harbin delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Hebron delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Hong_Kong delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Hovd delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Irkutsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Istanbul delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Jakarta delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Jayapura delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Jerusalem delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kabul delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kamchatka delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Karachi delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kashgar delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kathmandu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Katmandu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Khandyga delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kolkata delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuching delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuwait delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Macao delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Macau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Magadan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Makassar delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Manila delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Muscat delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Nicosia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Novokuznetsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Novosibirsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Omsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Oral delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Phnom_Penh delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Pontianak delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Pyongyang delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Qatar delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Qostanay delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Qyzylorda delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Rangoon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Riyadh delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Saigon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Sakhalin delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Samarkand delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Seoul delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Shanghai delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Singapore delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Srednekolymsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Taipei delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tashkent delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tbilisi delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tehran delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tel_Aviv delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Thimbu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Thimphu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tokyo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Tomsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ulan_Bator delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Urumqi delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Ust-Nera delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Vientiane delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Vladivostok delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yakutsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yangon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yekaterinburg delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Asia/Yerevan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Azores delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Bermuda delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Canary delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Faeroe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Faroe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Madeira delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Reykjavik delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/South_Georgia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/St_Helena delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Stanley delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/ACT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Adelaide delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Brisbane delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Broken_Hill delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Canberra delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Currie delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Darwin delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Eucla delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Hobart delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/LHI delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Lindeman delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Lord_Howe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Melbourne delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/NSW delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/North delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Perth delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Queensland delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/South delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Sydney delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Tasmania delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Victoria delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/West delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Australia/Yancowinna delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/Acre delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/DeNoronha delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/East delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Brazil/West delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/CET delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/CST6CDT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Atlantic delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Central delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Eastern delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Mountain delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Newfoundland delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Pacific delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Saskatchewan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Canada/Yukon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Chile/Continental delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Chile/EasterIsland delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Cuba delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/EET delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/EST delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/EST5EDT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Egypt delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Eire delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+0 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+1 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+10 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+11 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+12 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+2 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+3 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+4 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+5 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+6 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+7 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+8 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+9 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-0 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-1 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-10 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-11 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-12 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-13 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-14 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-2 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-3 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-4 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-5 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-6 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-7 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-8 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-9 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT0 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/Greenwich delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/UCT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/UTC delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/Universal delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Etc/Zulu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Amsterdam delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Andorra delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Astrakhan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Athens delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Belfast delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Belgrade delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Berlin delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Bratislava delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Brussels delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Bucharest delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Budapest delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Busingen delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Chisinau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Copenhagen delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Dublin delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Gibraltar delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Guernsey delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Helsinki delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Isle_of_Man delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Istanbul delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Jersey delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Kaliningrad delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Kiev delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Kirov delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Lisbon delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Ljubljana delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/London delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Luxembourg delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Madrid delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Malta delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Mariehamn delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Minsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Monaco delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Moscow delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Nicosia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Oslo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Paris delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Podgorica delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Prague delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Riga delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Rome delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Samara delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/San_Marino delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Sarajevo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Saratov delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Simferopol delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Skopje delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Sofia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Stockholm delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Tallinn delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Tirane delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Tiraspol delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Ulyanovsk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Uzhgorod delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vaduz delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vatican delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vienna delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Vilnius delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Volgograd delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Warsaw delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Zagreb delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Zaporozhye delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Europe/Zurich delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Factory delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GB delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GB-Eire delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT+0 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT-0 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/GMT0 delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Greenwich delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/HST delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Hongkong delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Iceland delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Antananarivo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Chagos delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Christmas delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Cocos delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Comoro delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Kerguelen delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Mahe delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Maldives delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Mauritius delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Mayotte delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Indian/Reunion delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Iran delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Israel delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Jamaica delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Japan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Kwajalein delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Libya delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/MET delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/MST delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/MST7MDT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Mexico/BajaNorte delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Mexico/BajaSur delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Mexico/General delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/NZ delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/NZ-CHAT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Navajo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/PRC delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/PST8PDT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Apia delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Auckland delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Bougainville delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Chatham delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Chuuk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Easter delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Efate delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Enderbury delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Fakaofo delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Fiji delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Funafuti delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Galapagos delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Gambier delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Guadalcanal delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Guam delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Honolulu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Johnston delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kanton delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kiritimati delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kosrae delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kwajalein delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Majuro delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Marquesas delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Midway delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Nauru delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Niue delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Norfolk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Noumea delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pago_Pago delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Palau delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pitcairn delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pohnpei delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Ponape delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Port_Moresby delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Rarotonga delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Saipan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Samoa delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tahiti delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tarawa delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tongatapu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Truk delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Wake delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Wallis delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Pacific/Yap delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Poland delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Portugal delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/ROC delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/ROK delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Singapore delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Turkey delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/UCT delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Alaska delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Aleutian delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Arizona delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Central delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/East-Indiana delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Eastern delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Hawaii delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Indiana-Starke delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Michigan delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Mountain delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Pacific delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/US/Samoa delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/UTC delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Universal delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/W-SU delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/WET delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/Zulu delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/iso3166.tab delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/leapseconds delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/tzdata.zi delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/zone.tab delete mode 100644 venv/Lib/site-packages/pytz/zoneinfo/zone1970.tab delete mode 100644 venv/Lib/site-packages/rest_framework/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/apps.py delete mode 100644 venv/Lib/site-packages/rest_framework/authentication.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/admin.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/apps.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/management/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/management/commands/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/management/commands/drf_create_token.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/migrations/0001_initial.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/migrations/0002_auto_20160226_1747.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/migrations/0003_tokenproxy.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/migrations/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/models.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/serializers.py delete mode 100644 venv/Lib/site-packages/rest_framework/authtoken/views.py delete mode 100644 venv/Lib/site-packages/rest_framework/checks.py delete mode 100644 venv/Lib/site-packages/rest_framework/compat.py delete mode 100644 venv/Lib/site-packages/rest_framework/decorators.py delete mode 100644 venv/Lib/site-packages/rest_framework/documentation.py delete mode 100644 venv/Lib/site-packages/rest_framework/exceptions.py delete mode 100644 venv/Lib/site-packages/rest_framework/fields.py delete mode 100644 venv/Lib/site-packages/rest_framework/filters.py delete mode 100644 venv/Lib/site-packages/rest_framework/generics.py delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ach/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ar/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/az/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/be/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/bg/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ca/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/cs/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/da/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/de/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/el/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/el_GR/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/en/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/en_AU/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/en_CA/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/en_US/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/es/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/et/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/fa/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/fi/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/fr/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/gl/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/he_IL/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/hu/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/hy/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/id/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/it/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ja/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/lt/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/lv/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/mk/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/nb/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ne_NP/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/nl/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/nn/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/no/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/pl/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/pt/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ro/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ru/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/ru_RU/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/sk/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/sl/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/sv/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/th/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/tr/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/uk/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/vi/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo delete mode 100644 venv/Lib/site-packages/rest_framework/management/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/management/commands/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/management/commands/generateschema.py delete mode 100644 venv/Lib/site-packages/rest_framework/metadata.py delete mode 100644 venv/Lib/site-packages/rest_framework/mixins.py delete mode 100644 venv/Lib/site-packages/rest_framework/negotiation.py delete mode 100644 venv/Lib/site-packages/rest_framework/pagination.py delete mode 100644 venv/Lib/site-packages/rest_framework/parsers.py delete mode 100644 venv/Lib/site-packages/rest_framework/permissions.py delete mode 100644 venv/Lib/site-packages/rest_framework/relations.py delete mode 100644 venv/Lib/site-packages/rest_framework/renderers.py delete mode 100644 venv/Lib/site-packages/rest_framework/request.py delete mode 100644 venv/Lib/site-packages/rest_framework/response.py delete mode 100644 venv/Lib/site-packages/rest_framework/reverse.py delete mode 100644 venv/Lib/site-packages/rest_framework/routers.py delete mode 100644 venv/Lib/site-packages/rest_framework/schemas/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/schemas/coreapi.py delete mode 100644 venv/Lib/site-packages/rest_framework/schemas/generators.py delete mode 100644 venv/Lib/site-packages/rest_framework/schemas/inspectors.py delete mode 100644 venv/Lib/site-packages/rest_framework/schemas/openapi.py delete mode 100644 venv/Lib/site-packages/rest_framework/schemas/utils.py delete mode 100644 venv/Lib/site-packages/rest_framework/schemas/views.py delete mode 100644 venv/Lib/site-packages/rest_framework/serializers.py delete mode 100644 venv/Lib/site-packages/rest_framework/settings.py delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/css/bootstrap-theme.min.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/css/bootstrap-tweaks.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/css/bootstrap.min.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/css/default.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/css/font-awesome-4.0.3.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/css/prettify.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/css/base.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/css/highlight.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/css/jquery.json-view.min.css delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/img/favicon.ico delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/img/grid.png delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/js/api.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/js/highlight.pack.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/docs/js/jquery.json-view.min.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.eot delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.svg delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.ttf delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/fontawesome-webfont.woff delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.eot delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.svg delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.ttf delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/img/glyphicons-halflings-white.png delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/img/glyphicons-halflings.png delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/img/grid.png delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/js/ajax-form.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/js/bootstrap.min.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/js/coreapi-0.1.1.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/js/csrf.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/js/default.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/js/jquery-3.5.1.min.js delete mode 100644 venv/Lib/site-packages/rest_framework/static/rest_framework/js/prettify-min.js delete mode 100644 venv/Lib/site-packages/rest_framework/status.py delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/admin.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/admin/detail.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/admin/dict_value.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/admin/list.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/admin/list_value.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/admin/simple_list_value.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/api.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/base.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/auth/basic.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/auth/session.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/auth/token.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/document.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/error.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/index.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/interact.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/langs/javascript-intro.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/langs/javascript.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/langs/python-intro.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/langs/python.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/langs/shell-intro.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/langs/shell.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/link.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/docs/sidebar.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/filters/base.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/filters/ordering.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/filters/search.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/checkbox.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/checkbox_multiple.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/dict_field.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/fieldset.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/form.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/input.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/list_field.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/list_fieldset.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/radio.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/select.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/select_multiple.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/horizontal/textarea.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/checkbox.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/checkbox_multiple.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/dict_field.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/fieldset.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/form.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/input.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/list_field.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/list_fieldset.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/radio.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/select.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/select_multiple.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/inline/textarea.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/login.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/login_base.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/pagination/numbers.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/pagination/previous_and_next.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/raw_data_form.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/schema.js delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/checkbox.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/checkbox_multiple.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/dict_field.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/fieldset.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/form.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/input.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/list_field.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/list_fieldset.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/radio.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/select.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/select_multiple.html delete mode 100644 venv/Lib/site-packages/rest_framework/templates/rest_framework/vertical/textarea.html delete mode 100644 venv/Lib/site-packages/rest_framework/templatetags/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/templatetags/rest_framework.py delete mode 100644 venv/Lib/site-packages/rest_framework/test.py delete mode 100644 venv/Lib/site-packages/rest_framework/throttling.py delete mode 100644 venv/Lib/site-packages/rest_framework/urlpatterns.py delete mode 100644 venv/Lib/site-packages/rest_framework/urls.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/__init__.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/breadcrumbs.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/encoders.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/field_mapping.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/formatting.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/html.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/humanize_datetime.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/json.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/mediatypes.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/model_meta.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/representation.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/serializer_helpers.py delete mode 100644 venv/Lib/site-packages/rest_framework/utils/urls.py delete mode 100644 venv/Lib/site-packages/rest_framework/validators.py delete mode 100644 venv/Lib/site-packages/rest_framework/versioning.py delete mode 100644 venv/Lib/site-packages/rest_framework/views.py delete mode 100644 venv/Lib/site-packages/rest_framework/viewsets.py delete mode 100644 venv/Lib/site-packages/setuptools/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_deprecation_warning.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/cmd.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/check.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/config.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/register.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/config.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/core.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/debug.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/dist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/errors.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/extension.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/file_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/filelist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/log.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/py35compat.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/spawn.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/text_file.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/version.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 venv/Lib/site-packages/setuptools/_imp.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 venv/Lib/site-packages/setuptools/archive_util.py delete mode 100644 venv/Lib/site-packages/setuptools/build_meta.py delete mode 100644 venv/Lib/site-packages/setuptools/cli-32.exe delete mode 100644 venv/Lib/site-packages/setuptools/cli-64.exe delete mode 100644 venv/Lib/site-packages/setuptools/cli-arm64.exe delete mode 100644 venv/Lib/site-packages/setuptools/cli.exe delete mode 100644 venv/Lib/site-packages/setuptools/command/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/command/alias.py delete mode 100644 venv/Lib/site-packages/setuptools/command/bdist_egg.py delete mode 100644 venv/Lib/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 venv/Lib/site-packages/setuptools/command/build_clib.py delete mode 100644 venv/Lib/site-packages/setuptools/command/build_ext.py delete mode 100644 venv/Lib/site-packages/setuptools/command/build_py.py delete mode 100644 venv/Lib/site-packages/setuptools/command/develop.py delete mode 100644 venv/Lib/site-packages/setuptools/command/dist_info.py delete mode 100644 venv/Lib/site-packages/setuptools/command/easy_install.py delete mode 100644 venv/Lib/site-packages/setuptools/command/egg_info.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install_egg_info.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install_lib.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install_scripts.py delete mode 100644 venv/Lib/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 venv/Lib/site-packages/setuptools/command/py36compat.py delete mode 100644 venv/Lib/site-packages/setuptools/command/register.py delete mode 100644 venv/Lib/site-packages/setuptools/command/rotate.py delete mode 100644 venv/Lib/site-packages/setuptools/command/saveopts.py delete mode 100644 venv/Lib/site-packages/setuptools/command/sdist.py delete mode 100644 venv/Lib/site-packages/setuptools/command/setopt.py delete mode 100644 venv/Lib/site-packages/setuptools/command/test.py delete mode 100644 venv/Lib/site-packages/setuptools/command/upload.py delete mode 100644 venv/Lib/site-packages/setuptools/command/upload_docs.py delete mode 100644 venv/Lib/site-packages/setuptools/dep_util.py delete mode 100644 venv/Lib/site-packages/setuptools/depends.py delete mode 100644 venv/Lib/site-packages/setuptools/dist.py delete mode 100644 venv/Lib/site-packages/setuptools/errors.py delete mode 100644 venv/Lib/site-packages/setuptools/extension.py delete mode 100644 venv/Lib/site-packages/setuptools/extern/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/glob.py delete mode 100644 venv/Lib/site-packages/setuptools/gui-32.exe delete mode 100644 venv/Lib/site-packages/setuptools/gui-64.exe delete mode 100644 venv/Lib/site-packages/setuptools/gui-arm64.exe delete mode 100644 venv/Lib/site-packages/setuptools/gui.exe delete mode 100644 venv/Lib/site-packages/setuptools/installer.py delete mode 100644 venv/Lib/site-packages/setuptools/launch.py delete mode 100644 venv/Lib/site-packages/setuptools/logging.py delete mode 100644 venv/Lib/site-packages/setuptools/monkey.py delete mode 100644 venv/Lib/site-packages/setuptools/msvc.py delete mode 100644 venv/Lib/site-packages/setuptools/namespaces.py delete mode 100644 venv/Lib/site-packages/setuptools/package_index.py delete mode 100644 venv/Lib/site-packages/setuptools/py34compat.py delete mode 100644 venv/Lib/site-packages/setuptools/sandbox.py delete mode 100644 venv/Lib/site-packages/setuptools/script (dev).tmpl delete mode 100644 venv/Lib/site-packages/setuptools/script.tmpl delete mode 100644 venv/Lib/site-packages/setuptools/unicode_utils.py delete mode 100644 venv/Lib/site-packages/setuptools/version.py delete mode 100644 venv/Lib/site-packages/setuptools/wheel.py delete mode 100644 venv/Lib/site-packages/setuptools/windows_support.py delete mode 100644 venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/PKG-INFO delete mode 100644 venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/SOURCES.txt delete mode 100644 venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/dependency_links.txt delete mode 100644 venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/installed-files.txt delete mode 100644 venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/not-zip-safe delete mode 100644 venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/top_level.txt delete mode 100644 venv/Lib/site-packages/simpleui/__init__.py delete mode 100644 venv/Lib/site-packages/simpleui/apps.py delete mode 100644 venv/Lib/site-packages/simpleui/forms.py delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/autocomplete.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/base.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/changelists.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/dashboard.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/fonts.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/forms.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/login.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/responsive.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/responsive_rtl.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/rtl.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/ui.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.min.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/css/widgets.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/fonts/LICENSE.txt delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/fonts/README.txt delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Bold-webfont.woff delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Light-webfont.woff delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Regular-webfont.woff delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/LICENSE delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/README.txt delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/calendar-icons.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_off.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_on.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-addlink.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-alert.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-calendar.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-changelink.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-clock.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-deletelink.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-no.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown-alt.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/icon-yes.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/inline-delete.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/search.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/selector-icons.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/sorting-icons.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/tooltag-add.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/img/tooltag-arrowright.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/SelectBox.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/SelectFilter2.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/actions.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/actions.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/admin/DateTimeShortcuts.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/admin/RelatedObjectLookups.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/autocomplete.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/calendar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/cancel.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/change_form.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/collapse.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/collapse.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/core.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/inlines.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/inlines.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/jquery.init.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/popup_response.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/prepopulate_init.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/timeparse.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/urlify.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/jquery/jquery.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/jquery/jquery.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/LICENSE-SELECT2.md delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/ar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/az.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/bg.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/ca.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/cs.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/da.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/de.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/el.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/en.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/es.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/et.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/eu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/fa.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/fi.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/fr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/gl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/he.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/hi.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/hr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/hu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/id.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/is.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/it.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/ja.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/km.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/ko.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/lt.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/lv.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/mk.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/ms.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/nb.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/nl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/pl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/pt.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/ro.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/ru.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/sk.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/sr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/sv.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/th.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/tr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/uk.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/vi.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/select2.full.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/select2/select2.full.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/xregexp/xregexp.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/automatic/dicts.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/automatic/segment.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/css/base.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/css/base.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/css/base.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/css/index.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/css/index.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/css/index.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/css/login.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/alert.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/aside.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/autocomplete.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/avatar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/backtop.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/badge.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/breadcrumb-item.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/breadcrumb.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/button-group.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/button.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/calendar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/card.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/carousel-item.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/carousel.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/cascader-panel.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/cascader.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/checkbox-button.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/checkbox-group.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/checkbox.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/col.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/collapse-item.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/collapse.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/color-picker.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/container.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/date-picker.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/dialog.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/directives/mousewheel.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/directives/repeat-click.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/divider.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/drawer.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/dropdown-item.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/dropdown-menu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/dropdown.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/element-ui.common.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/footer.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/form-item.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/form.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/header.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/icon.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/image.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/index.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/infinite-scroll.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/input-number.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/input.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/link.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/loading.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/format.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/index.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/af-ZA.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/bg.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ca.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/cs-CZ.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/da.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/de.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ee.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/el.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/en.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/es.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/eu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/fa.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/fi.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/fr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/he.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/hr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/hu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/hy-AM.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/id.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/it.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ja.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/kg.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/km.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ko.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ku.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/kz.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/lt.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/lv.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/mn.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/nb-NO.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/nl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/pl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/pt-br.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/pt.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ro.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ru-RU.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/sk.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/sl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/sr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/sv-SE.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ta.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/th.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/tk.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/tr-TR.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ua.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/ug-CN.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/uz-UZ.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/vi.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/zh-CN.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/locale/lang/zh-TW.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/main.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/menu-item-group.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/menu-item.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/menu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/message-box.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/message.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/mixins/emitter.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/mixins/focus.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/mixins/locale.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/mixins/migrating.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/notification.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/option-group.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/option.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/page-header.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/pagination.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/popover.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/progress.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/radio-button.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/radio-group.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/radio.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/rate.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/row.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/scrollbar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/select.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/slider.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/spinner.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/step.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/steps.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/submenu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/switch.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/tab-pane.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/table-column.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/table.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/tabs.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/tag.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/alert.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/aside.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/autocomplete.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/avatar.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/backtop.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/badge.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/base.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/breadcrumb-item.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/breadcrumb.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/button-group.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/button.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/calendar.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/card.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/carousel-item.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/carousel.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/cascader-panel.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/cascader.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/checkbox-button.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/checkbox-group.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/checkbox.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/col.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/collapse-item.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/collapse.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/color-picker.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/container.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/date-picker.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/dialog.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/display.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/divider.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/drawer.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/dropdown-item.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/dropdown-menu.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/dropdown.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/fonts/element-icons.ttf delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/fonts/element-icons.woff delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/footer.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/form-item.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/form.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/header.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/icon.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/image.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/index.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/infinite-scroll.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/infiniteScroll.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/input-number.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/input.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/link.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/loading.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/main.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/menu-item-group.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/menu-item.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/menu.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/message-box.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/message.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/notification.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/option-group.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/option.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/page-header.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/pagination.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/popover.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/popper.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/progress.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/radio-button.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/radio-group.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/radio.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/rate.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/reset.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/row.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/scrollbar.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/select-dropdown.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/select.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/slider.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/spinner.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/step.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/steps.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/submenu.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/switch.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/tab-pane.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/table-column.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/table.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/tabs.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/tag.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/time-picker.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/time-select.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/timeline-item.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/timeline.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/tooltip.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/transfer.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/tree.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/theme-chalk/upload.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/time-picker.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/time-select.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/timeline-item.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/timeline.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/tooltip.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/transfer.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/transitions/collapse-transition.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/tree.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/af-ZA.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/bg.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ca.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/cs-CZ.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/da.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/de.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ee.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/el.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/en.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/es.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/eu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/fa.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/fi.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/fr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/he.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/hr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/hu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/hy-AM.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/id.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/it.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ja.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/kg.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/km.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ko.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ku.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/kz.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/lt.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/lv.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/mn.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/nb-NO.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/nl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/pl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/pt-br.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/pt.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ro.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ru-RU.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/sk.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/sl.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/sr.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/sv-SE.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ta.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/th.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/tk.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/tr-TR.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ua.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/ug-CN.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/uz-UZ.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/vi.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/zh-CN.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/umd/locale/zh-TW.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/upload.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/after-leave.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/aria-dialog.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/aria-utils.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/clickoutside.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/date-util.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/date.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/dom.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/menu/aria-menubar.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/menu/aria-menuitem.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/menu/aria-submenu.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/merge.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/popper.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/popup/index.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/popup/popup-manager.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/resize-event.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/scroll-into-view.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/scrollbar-width.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/shared.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/types.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/util.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/vdom.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/elementui/utils/vue-popper.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/css/all.min.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.eot delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.ttf delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.woff delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.woff2 delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.eot delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.ttf delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.woff delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.woff2 delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.eot delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.ttf delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.woff delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.woff2 delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/img/bg.svg delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/img/favicon.png delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/img/logo.png delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/js/cookie.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/js/index.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/js/language.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/js/login.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/js/vue.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/locale/en-us.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/locale/zh-hans.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/particles/app.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/particles/particles.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/admin.lte.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/admin.lte.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/admin.lte.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/aircraft.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/aircraft.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/aircraft.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/ant.design.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/ant.design.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/ant.design.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/base.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/black.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/black.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/black.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/dark.green.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/dark.green.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/dark.green.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-black-pro.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-black-pro.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-black-pro.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-black.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-black.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-black.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-blue-pro.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-blue-pro.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-blue-pro.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-blue.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-blue.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-blue.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-green-pro.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-green-pro.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-green-pro.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-green.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-green.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-green.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-purple-pro.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-purple-pro.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-purple-pro.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-purple.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-purple.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-purple.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-red-pro.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-red-pro.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-red-pro.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-red.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-red.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/e-red.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/element.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/element.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/element.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/gray.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/gray.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/gray.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/green.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/green.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/green.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/highdmin.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/highdmin.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/highdmin.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/layui.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/layui.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/layui.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/light.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/light.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/light.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/orange.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/orange.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/orange.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/purple.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/purple.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/purple.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/simpleui.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/simpleui.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/simpleui.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/theme.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-blue.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-blue.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-blue.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-green.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-green.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-green.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-red.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-red.css.map delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/theme/x-red.less delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/waves/waves.min.css delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/waves/waves.min.js delete mode 100644 venv/Lib/site-packages/simpleui/static/admin/simpleui-x/waves/waves.min.js.map delete mode 100644 venv/Lib/site-packages/simpleui/static/import_export/action_formats.js delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/404.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/500.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/actions.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/app_index.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/base.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/base_site.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/change_form.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/change_form_object_tools.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/change_list.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/change_list_object_tools.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/change_list_results.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/date_hierarchy.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/filter.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/home.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/includes/css-part.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/includes/fieldset.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/includes/js-part.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/index.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/invalid_setup.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/login.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/object_history.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/pagination.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/popup_response.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/prepopulated_fields_js.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/related_widget_wrapper.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/search_form.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/admin/submit_line.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/logged_out.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/password_change_done.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/password_change_form.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/password_reset_complete.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/password_reset_confirm.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/password_reset_done.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/password_reset_email.html delete mode 100644 venv/Lib/site-packages/simpleui/templates/registration/password_reset_form.html delete mode 100644 venv/Lib/site-packages/simpleui/templatetags/__init__.py delete mode 100644 venv/Lib/site-packages/simpleui/templatetags/simpletags.py delete mode 100644 venv/Lib/site-packages/simpleui/widgets.py delete mode 100644 venv/Lib/site-packages/zipp-3.8.0.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/zipp-3.8.0.dist-info/LICENSE delete mode 100644 venv/Lib/site-packages/zipp-3.8.0.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/zipp-3.8.0.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/zipp-3.8.0.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/zipp-3.8.0.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/zipp.py delete mode 100644 venv/Scripts/Activate.ps1 delete mode 100644 venv/Scripts/activate delete mode 100644 venv/Scripts/activate.bat delete mode 100644 venv/Scripts/deactivate.bat delete mode 100644 venv/Scripts/django-admin.py delete mode 100644 venv/Scripts/markdown_py.exe delete mode 100644 venv/Scripts/pip.exe delete mode 100644 venv/Scripts/pip3.9.exe delete mode 100644 venv/Scripts/pip3.exe delete mode 100644 venv/Scripts/python.exe delete mode 100644 venv/Scripts/pythonw.exe delete mode 100644 venv/pyvenv.cfg diff --git a/.gitignore b/.gitignore index 18e9efa..2fa7ce7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ config.ini -.idea diff --git a/.idea/ITShowPlatform.iml b/.idea/ITShowPlatform.iml deleted file mode 100644 index 02690cb..0000000 --- a/.idea/ITShowPlatform.iml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml deleted file mode 100644 index c92cb4f..0000000 --- a/.idea/dataSources.local.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - forget - - - - \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index 77fc973..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - mysql.8 - true - com.mysql.cj.jdbc.Driver - jdbc:mysql://localhost:3306/ITStudio - $ProjectFileDir$ - - - \ No newline at end of file diff --git a/.idea/deployment.xml b/.idea/deployment.xml deleted file mode 100644 index fa01f2b..0000000 --- a/.idea/deployment.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index bced134..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index c1fb903..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index ac659a7..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59_[Default_Changelist]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59_[Default_Changelist]/shelved.patch deleted file mode 100644 index bd074d2..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59_[Default_Changelist]/shelved.patch +++ /dev/null @@ -1,106 +0,0 @@ -Index: .idea/workspace.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 1650187837343\r\n \r\n \r\n 1650187914913\r\n \r\n \r\n 1650785005055\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- .idea/workspace.xml (revision b6a66a1457215e0813938690788ef7e1783a9c22) -+++ .idea/workspace.xml (date 1651329189014) -@@ -31,11 +31,8 @@ - - - -- -+ - -- -- -- - - - - -+ -+ - - - - -+ - - - -@@ -114,7 +119,8 @@ - - - -- -+ -+ - - - 1650187914913 -@@ -130,7 +136,14 @@ - -- - -@@ -163,7 +176,8 @@ - - - -- - - -@@ -178,10 +192,10 @@ - - - -- -+ - - -- -+ - - - -@@ -218,10 +232,10 @@ - - - -- -+ - - -- -+ - - - diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59__Default_Changelist_.xml deleted file mode 100644 index 3d884c0..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_4_13_59__Default_Changelist_.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44_[Default_Changelist]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44_[Default_Changelist]/shelved.patch deleted file mode 100644 index e87091a..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44_[Default_Changelist]/shelved.patch +++ /dev/null @@ -1,261 +0,0 @@ -Index: ITShowPlatform/settings.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>\"\"\"\r\nDjango settings for ITShowPlatform project.\r\n\r\nGenerated by 'django-admin startproject' using Django 4.0.4.\r\n\r\nFor more information on this file, see\r\nhttps://docs.djangoproject.com/en/4.0/topics/settings/\r\n\r\nFor the full list of settings and their values, see\r\nhttps://docs.djangoproject.com/en/4.0/ref/settings/\r\n\"\"\"\r\n\r\nfrom pathlib import Path\r\nimport os\r\nimport configparser\r\n\r\n# Build paths inside the project like this: BASE_DIR / 'subdir'.\r\nBASE_DIR = Path(__file__).resolve().parent.parent\r\n\r\n# Quick-start development settings - unsuitable for production\r\n# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/\r\n\r\n# SECURITY WARNING: keep the secret key used in production secret!\r\nSECRET_KEY = 'django-insecure-0cn#v4ei2(^n+txyh4%3d5sllz6mknz#7t$!cq-d!ly*_rwvh2'\r\n\r\n# SECURITY WARNING: don't run with debug turned on in production!\r\nDEBUG = True\r\n\r\nALLOWED_HOSTS = [\"*\"]\r\n\r\n# Application definition\r\n\r\nconf = configparser.ConfigParser()\r\n\r\nconf.read(str(BASE_DIR)+r\"\\ITShowPlatform\\config.ini\",encoding=\"utf-8\")\r\n\r\n\r\n\r\nINSTALLED_APPS = [\r\n 'django.contrib.admin',\r\n 'django.contrib.auth',\r\n 'django.contrib.contenttypes',\r\n 'django.contrib.sessions',\r\n 'django.contrib.messages',\r\n 'django.contrib.staticfiles',\r\n 'rest_framework',\r\n 'Apps.enroll',\r\n 'Apps.history',\r\n 'Apps.comments',\r\n\r\n]\r\n\r\nMIDDLEWARE = [\r\n 'django.middleware.security.SecurityMiddleware',\r\n 'django.contrib.sessions.middleware.SessionMiddleware',\r\n 'django.middleware.common.CommonMiddleware',\r\n #'django.middleware.csrf.CsrfViewMiddleware',\r\n 'django.contrib.auth.middleware.AuthenticationMiddleware',\r\n 'django.contrib.messages.middleware.MessageMiddleware',\r\n 'django.middleware.clickjacking.XFrameOptionsMiddleware',\r\n]\r\n\r\nROOT_URLCONF = 'ITShowPlatform.urls'\r\n\r\nTEMPLATES = [\r\n {\r\n 'BACKEND': 'django.template.backends.django.DjangoTemplates',\r\n 'DIRS': [os.path.join(BASE_DIR, 'templates')]\r\n ,\r\n 'APP_DIRS': True,\r\n 'OPTIONS': {\r\n 'context_processors': [\r\n 'django.template.context_processors.debug',\r\n 'django.template.context_processors.request',\r\n 'django.contrib.auth.context_processors.auth',\r\n 'django.contrib.messages.context_processors.messages',\r\n ],\r\n },\r\n },\r\n]\r\n\r\nWSGI_APPLICATION = 'ITShowPlatform.wsgi.application'\r\n\r\n# Database\r\n# https://docs.djangoproject.com/en/4.0/ref/settings/#databases\r\n\r\nDATABASES = {\r\n 'default': {\r\n 'ENGINE': conf.get(\"database\",\"ENGINE\"),\r\n 'NAME': conf.get(\"database\",\"NAME\"),\r\n 'USER': conf.get(\"database\",\"USER\"),\r\n 'PASSWORD': conf.get(\"database\",\"PASSWORD\"),\r\n }\r\n}\r\n\r\n\r\n# Password validation\r\n# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators\r\n\r\nAUTH_PASSWORD_VALIDATORS = [\r\n {\r\n 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',\r\n },\r\n {\r\n 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',\r\n },\r\n {\r\n 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',\r\n },\r\n {\r\n 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',\r\n },\r\n]\r\n\r\n# Internationalization\r\n# https://docs.djangoproject.com/en/4.0/topics/i18n/\r\n\r\nLANGUAGE_CODE = 'zh-Hans'\r\n\r\nTIME_ZONE = 'Asia/Shanghai'\r\n\r\nUSE_I18N = True\r\n\r\nUSE_L10N = True\r\n\r\nUSE_TZ = False\r\n\r\n# Static files (CSS, JavaScript, Images)\r\n# https://docs.djangoproject.com/en/4.0/howto/static-files/\r\n\r\nSTATIC_URL = '/static/'\r\nSTATIC_ROOT = os.path.join(BASE_DIR, 'static')\r\nMEDIA_URL = '/media/'\r\nMEDIA_ROOT = os.path.join(BASE_DIR, 'media')\r\n\r\n# Default primary key field type\r\n# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field\r\n\r\nDEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'\r\n\r\nREST_FRAMEWORK = {\r\n 'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类\r\n 'rest_framework.renderers.JSONRenderer', # json渲染器\r\n 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器\r\n )\r\n}\r\n\r\nEMAIL_HOST = conf.get('email',\"EMAIL_HOST\") # 服务器\r\nEMAIL_PORT = conf.get(\"email\",\"EMAIL_PORT\")\r\nEMAIL_HOST_USER = conf.get(\"email\",\"EMAIL_HOST_USER\") # 账号\r\nEMAIL_HOST_PASSWORD = conf.get(\"email\",\"EMAIL_HOST_PASSWORD\") # 密码 (注意:这里的密码指的是授权码)\r\nEMAIL_USE_SSL = conf.get(\"email\",\"EMAIL_USE_SSL\") # 一般都为False\r\nEMAIL_FROM = conf.get(\"email\",\"EMAIL_FROM\") # 邮箱来自\r\n\r\n -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- ITShowPlatform/settings.py (revision 83c29b0ebfaa2dc6fd723c743e9ef08cd850940a) -+++ ITShowPlatform/settings.py (date 1651756900301) -@@ -17,11 +17,16 @@ - # Build paths inside the project like this: BASE_DIR / 'subdir'. - BASE_DIR = Path(__file__).resolve().parent.parent - -+conf = configparser.RawConfigParser() -+ -+conf.read(str(BASE_DIR)+r"\ITShowPlatform\config.ini",encoding="utf-8") -+ -+ - # Quick-start development settings - unsuitable for production - # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ - - # SECURITY WARNING: keep the secret key used in production secret! --SECRET_KEY = 'django-insecure-0cn#v4ei2(^n+txyh4%3d5sllz6mknz#7t$!cq-d!ly*_rwvh2' -+SECRET_KEY = conf.get("Django","SECRET_KEY") - - # SECURITY WARNING: don't run with debug turned on in production! - DEBUG = True -@@ -30,10 +35,6 @@ - - # Application definition - --conf = configparser.ConfigParser() -- --conf.read(str(BASE_DIR)+r"\ITShowPlatform\config.ini",encoding="utf-8") -- - - - INSTALLED_APPS = [ -Index: ITShowPlatform/config.ini -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>[email]\r\nEMAIL_HOST = smtp.qq.com # 服务器\r\n\r\nEMAIL_PORT = 465\r\n\r\nEMAIL_HOST_USER = 2302253692@qq.com # 账号\r\n\r\nEMAIL_HOST_PASSWORD = idujbpdlpgbmdhjg # 密码 (注意:这里的密码指的是授权码)\r\n\r\nEMAIL_USE_SSL = True # 一般都为False\r\n\r\nEMAIL_FROM = 2302253692@qq.com # 邮箱来自\r\n\r\n[database]\r\n\r\nENGINE = django.db.backends.mysql\r\n\r\nNAME = ITShowPlatform\r\n\r\nUSER = root\r\n\r\nPASSWORD = HNXhnx123\r\n -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- ITShowPlatform/config.ini (revision 83c29b0ebfaa2dc6fd723c743e9ef08cd850940a) -+++ ITShowPlatform/config.ini (date 1651756724343) -@@ -1,3 +1,7 @@ -+[Django] -+ -+SECRET_KEY = django-insecure-0cn#v4ei2(^n+txyh4%3d5sllz6mknz#7t$!cq-d!ly*_rwvh2 -+ - [email] - EMAIL_HOST = smtp.qq.com # 服务器 - -Index: .idea/misc.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>\r\n\r\n \r\n \r\n \r\n -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- .idea/misc.xml (revision 83c29b0ebfaa2dc6fd723c743e9ef08cd850940a) -+++ .idea/misc.xml (date 1651757009657) -@@ -3,5 +3,5 @@ - - -- -+ - -\ No newline at end of file -Index: .idea/ITShowPlatform.iml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- .idea/ITShowPlatform.iml (revision 83c29b0ebfaa2dc6fd723c743e9ef08cd850940a) -+++ .idea/ITShowPlatform.iml (date 1651757009497) -@@ -16,7 +16,7 @@ - - - -- -+ - - - -Index: .idea/workspace.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 1650187837343\r\n \r\n \r\n 1650187914913\r\n \r\n \r\n 1650785005055\r\n \r\n \r\n 1651746739401\r\n \r\n \r\n 1651748255265\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- .idea/workspace.xml (revision 83c29b0ebfaa2dc6fd723c743e9ef08cd850940a) -+++ .idea/workspace.xml (date 1651761845564) -@@ -26,13 +26,17 @@ - - - -- -+ - - - - -- -- -+ -+ -+ -+ -+ -+ - - - -@@ -228,7 +240,7 @@ - - - -- - - -@@ -247,13 +259,14 @@ - - - -- - -- -+ - - -- -+ - - - -@@ -266,6 +279,10 @@ - - - -+ -+ -+ -+ - - - -@@ -282,22 +299,22 @@ - - - -- -+ - - -- -- -+ -+ - - -- -- -+ -+ - - -- -- -+ -+ - - -- -+ - - - -@@ -326,10 +343,10 @@ - - - -- -+ - - -- -+ - - - -@@ -348,6 +365,6 @@ - - - -- -+ - - -\ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44__Default_Changelist_.xml deleted file mode 100644 index 0d326ea..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Update_at_2022_5_5_22_44__Default_Changelist_.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/shelf/Update_at_2022_5_5_22_17__Default_Changelist_.xml b/.idea/shelf/Update_at_2022_5_5_22_17__Default_Changelist_.xml deleted file mode 100644 index c530e64..0000000 --- a/.idea/shelf/Update_at_2022_5_5_22_17__Default_Changelist_.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/shelf/在Update之前未提交更改_at_2022_5_5_22_17_[Default_Changelist]/shelved.patch b/.idea/shelf/在Update之前未提交更改_at_2022_5_5_22_17_[Default_Changelist]/shelved.patch deleted file mode 100644 index bce2098..0000000 --- a/.idea/shelf/在Update之前未提交更改_at_2022_5_5_22_17_[Default_Changelist]/shelved.patch +++ /dev/null @@ -1,201 +0,0 @@ -Index: Apps/work/serializers.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>from rest_framework import serializers\r\nfrom .models import *\r\n\r\n\r\nclass HistoryInfoSerializer(serializers.ModelSerializer):\r\n class Meta:\r\n model = Works\r\n fields = '__all__'\r\n grade = serializers.CharField(label=\"年级\", required=True)\r\n name = serializers.CharField(label=\"事件名称\", max_length=30, required=True)\r\n description = serializers.CharField(label=\"事件描述\", max_length=200, required=True)\r\n img = serializers.ImageField(label=\"图片\", required=False)\r\n\r\n def validate_grade(self, value):\r\n if not (2010 < value <= 2021):\r\n raise serializers.ValidationError(\"不合法输入\")\r\n return value -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- Apps/work/serializers.py (revision c5874e8f6a4093a11d6cc1c13caa09639ef0ceeb) -+++ Apps/work/serializers.py (date 1651759994408) -@@ -2,7 +2,7 @@ - from .models import * - - --class HistoryInfoSerializer(serializers.ModelSerializer): -+class WorksInfoSerializer(serializers.ModelSerializer): - class Meta: - model = Works - fields = '__all__' -@@ -11,6 +11,7 @@ - description = serializers.CharField(label="事件描述", max_length=200, required=True) - img = serializers.ImageField(label="图片", required=False) - -+ - def validate_grade(self, value): - if not (2010 < value <= 2021): - raise serializers.ValidationError("不合法输入") -Index: Apps/work/urls.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>from django.contrib import admin\r\nfrom django.urls import path\r\nfrom . import views\r\nfrom django.conf.urls.static import static\r\nfrom ITShowPlatform import settings\r\n\r\n\r\nurlpatterns = [\r\n path('work/', views.work.as_view()),\r\n]\r\n\r\nurlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- Apps/work/urls.py (revision c5874e8f6a4093a11d6cc1c13caa09639ef0ceeb) -+++ Apps/work/urls.py (date 1651759619601) -@@ -9,4 +9,5 @@ - path('work/', views.work.as_view()), - ] - --urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -\ No newline at end of file -+urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -+ -Index: .idea/workspace.xml -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP -<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 1650187837343\r\n \r\n \r\n 1650187914913\r\n \r\n \r\n 1650785005055\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== ---- .idea/workspace.xml (revision c5874e8f6a4093a11d6cc1c13caa09639ef0ceeb) -+++ .idea/workspace.xml (date 1651760172607) -@@ -21,20 +21,15 @@ - - - -- -+ - - - - -- -- -- -+ - -- -- -- -- -- -+ -+ - - - - -+ - - -@@ -152,7 +152,7 @@ - - - -- -+ - - - 1650187914913 -@@ -168,7 +168,14 @@ - -- - -@@ -185,7 +192,7 @@ - - - -- - - -@@ -202,7 +209,8 @@ - - - -@@ -234,26 +242,26 @@ - - - -- -+ - - - -- -- -+ -+ - - - -- -- -+ -+ - - - -- -- -+ -+ - - - -- -+ - - - -@@ -283,11 +291,11 @@ - - - -- -+ - - - -- -+ - - - -@@ -304,9 +312,17 @@ - - - -+ -+ -+ -+ - - - - -+ -+ -+ -+ - - -\ No newline at end of file diff --git a/.idea/sshConfigs.xml b/.idea/sshConfigs.xml deleted file mode 100644 index 17609e9..0000000 --- a/.idea/sshConfigs.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/webServers.xml b/.idea/webServers.xml deleted file mode 100644 index b731694..0000000 --- a/.idea/webServers.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 407d9e0..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - "keyToString": { - "WebServerToolWindowFactoryState": "true", - "settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" - } -} - - - - - - - - - - - - - - - - - - - - - 1650187837343 - - - 1650187914913 - - - 1650785005055 - - - - - - - - - - - - - \ No newline at end of file diff --git a/venv/Lib/site-packages/Django-3.2.5.dist-info/INSTALLER b/venv/Lib/site-packages/Django-3.2.5.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/Lib/site-packages/Django-3.2.5.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/Lib/site-packages/Django-3.2.5.dist-info/REQUESTED b/venv/Lib/site-packages/Django-3.2.5.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/Django-3.2.5.dist-info/top_level.txt b/venv/Lib/site-packages/Django-3.2.5.dist-info/top_level.txt deleted file mode 100644 index d3e4ba5..0000000 --- a/venv/Lib/site-packages/Django-3.2.5.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -django diff --git a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/INSTALLER b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/LICENSE.md b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/LICENSE.md deleted file mode 100644 index 2652d97..0000000 --- a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/LICENSE.md +++ /dev/null @@ -1,29 +0,0 @@ -Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -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 Python Markdown Project 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 PYTHON MARKDOWN PROJECT ''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 ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT -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/venv/Lib/site-packages/Markdown-3.3.6.dist-info/METADATA b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/METADATA deleted file mode 100644 index 0dd5837..0000000 --- a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/METADATA +++ /dev/null @@ -1,110 +0,0 @@ -Metadata-Version: 2.1 -Name: Markdown -Version: 3.3.6 -Summary: Python implementation of Markdown. -Home-page: https://Python-Markdown.github.io/ -Author: Manfred Stienstra, Yuri takhteyev and Waylan limberg -Author-email: python.markdown@gmail.com -Maintainer: Waylan Limberg -Maintainer-email: python.markdown@gmail.com -License: BSD License -Project-URL: Documentation, https://Python-Markdown.github.io/ -Project-URL: GitHub Project, https://github.com/Python-Markdown/markdown -Project-URL: Issue Tracker, https://github.com/Python-Markdown/markdown/issues -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -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.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Communications :: Email :: Filters -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries -Classifier: Topic :: Internet :: WWW/HTTP :: Site Management -Classifier: Topic :: Software Development :: Documentation -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Filters -Classifier: Topic :: Text Processing :: Markup :: HTML -Classifier: Topic :: Text Processing :: Markup :: Markdown -Requires-Python: >=3.6 -Description-Content-Type: text/markdown -License-File: LICENSE.md -Requires-Dist: importlib-metadata (>=4.4) ; python_version < "3.10" -Provides-Extra: testing -Requires-Dist: coverage ; extra == 'testing' -Requires-Dist: pyyaml ; extra == 'testing' - -[Python-Markdown][] -=================== - -[![Build Status][build-button]][build] -[![Coverage Status][codecov-button]][codecov] -[![Latest Version][mdversion-button]][md-pypi] -[![Python Versions][pyversion-button]][md-pypi] -[![BSD License][bsdlicense-button]][bsdlicense] -[![Code of Conduct][codeofconduct-button]][Code of Conduct] - -[build-button]: https://github.com/Python-Markdown/markdown/workflows/CI/badge.svg?event=push -[build]: https://github.com/Python-Markdown/markdown/actions?query=workflow%3ACI+event%3Apush -[codecov-button]: https://codecov.io/gh/Python-Markdown/markdown/branch/master/graph/badge.svg -[codecov]: https://codecov.io/gh/Python-Markdown/markdown -[mdversion-button]: https://img.shields.io/pypi/v/Markdown.svg -[md-pypi]: https://pypi.org/project/Markdown/ -[pyversion-button]: https://img.shields.io/pypi/pyversions/Markdown.svg -[bsdlicense-button]: https://img.shields.io/badge/license-BSD-yellow.svg -[bsdlicense]: https://opensource.org/licenses/BSD-3-Clause -[codeofconduct-button]: https://img.shields.io/badge/code%20of%20conduct-contributor%20covenant-green.svg?style=flat-square -[Code of Conduct]: https://github.com/Python-Markdown/markdown/blob/master/CODE_OF_CONDUCT.md - -This is a Python implementation of John Gruber's [Markdown][]. -It is almost completely compliant with the reference implementation, -though there are a few known issues. See [Features][] for information -on what exactly is supported and what is not. Additional features are -supported by the [Available Extensions][]. - -[Python-Markdown]: https://Python-Markdown.github.io/ -[Markdown]: https://daringfireball.net/projects/markdown/ -[Features]: https://Python-Markdown.github.io#Features -[Available Extensions]: https://Python-Markdown.github.io/extensions - -Documentation -------------- - -```bash -pip install markdown -``` -```python -import markdown -html = markdown.markdown(your_text_string) -``` - -For more advanced [installation] and [usage] documentation, see the `docs/` directory -of the distribution or the project website at . - -[installation]: https://python-markdown.github.io/install/ -[usage]: https://python-markdown.github.io/reference/ - -See the change log at . - -Support -------- - -You may report bugs, ask for help, and discuss various other issues on the [bug tracker][]. - -[bug tracker]: https://github.com/Python-Markdown/markdown/issues - -Code of Conduct ---------------- - -Everyone interacting in the Python-Markdown project's codebases, issue trackers, -and mailing lists is expected to follow the [Code of Conduct]. - - - diff --git a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/RECORD b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/RECORD deleted file mode 100644 index dd376e7..0000000 --- a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/RECORD +++ /dev/null @@ -1,77 +0,0 @@ -../../Scripts/markdown_py.exe,sha256=vCw3UluhGhDZ5OHeFwbu_i2uuAow6Ag76pfC21_f61A,106375 -Markdown-3.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Markdown-3.3.6.dist-info/LICENSE.md,sha256=bxGTy2NHGOZcOlN9biXr1hSCDsDvaTz8EiSBEmONZNo,1645 -Markdown-3.3.6.dist-info/METADATA,sha256=5gK5efFze8GvYs5GX7G5M597OXkRKG5DtqP8CvscZVQ,4630 -Markdown-3.3.6.dist-info/RECORD,, -Markdown-3.3.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Markdown-3.3.6.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 -Markdown-3.3.6.dist-info/entry_points.txt,sha256=j4jiKg-iwZGImvi8OzotZePWoFbJJ4GrfzDqH03u3SQ,1103 -Markdown-3.3.6.dist-info/top_level.txt,sha256=IAxs8x618RXoH1uCqeLLxXsDefJvE_mIibr_M4sOlyk,9 -markdown/__init__.py,sha256=002-LuHviYzROW2rg_gBGai81nMouUNO9UFj5nSsTSk,2065 -markdown/__main__.py,sha256=JX1057VoovH3NA5uH5nQdQE8b0kXoeT79ZxCzFoL_kg,5803 -markdown/__meta__.py,sha256=IDpR5cdETCEXvY2YxKlRPnIQvdyf5vHJolJNDD4Um9w,1630 -markdown/__pycache__/__init__.cpython-39.pyc,, -markdown/__pycache__/__main__.cpython-39.pyc,, -markdown/__pycache__/__meta__.cpython-39.pyc,, -markdown/__pycache__/blockparser.cpython-39.pyc,, -markdown/__pycache__/blockprocessors.cpython-39.pyc,, -markdown/__pycache__/core.cpython-39.pyc,, -markdown/__pycache__/htmlparser.cpython-39.pyc,, -markdown/__pycache__/inlinepatterns.cpython-39.pyc,, -markdown/__pycache__/pep562.cpython-39.pyc,, -markdown/__pycache__/postprocessors.cpython-39.pyc,, -markdown/__pycache__/preprocessors.cpython-39.pyc,, -markdown/__pycache__/serializers.cpython-39.pyc,, -markdown/__pycache__/test_tools.cpython-39.pyc,, -markdown/__pycache__/treeprocessors.cpython-39.pyc,, -markdown/__pycache__/util.cpython-39.pyc,, -markdown/blockparser.py,sha256=JpBhOokOoBUGCXolftOc5m1hPcR2y9s9hVd9WSuhHzo,4285 -markdown/blockprocessors.py,sha256=LK4mfcgjH8rk3zsyxBzxisxdQjpFj0xkg1LxBtlpLUs,24890 -markdown/core.py,sha256=ZHtqvLdVHOKWIuX_UzdL3rIcxMwji5TC5ZCkV19iM4U,15401 -markdown/extensions/__init__.py,sha256=nw2VtafIf5zHjAcUuykQbaNY6taOmNn7ARn11-Pe080,3661 -markdown/extensions/__pycache__/__init__.cpython-39.pyc,, -markdown/extensions/__pycache__/abbr.cpython-39.pyc,, -markdown/extensions/__pycache__/admonition.cpython-39.pyc,, -markdown/extensions/__pycache__/attr_list.cpython-39.pyc,, -markdown/extensions/__pycache__/codehilite.cpython-39.pyc,, -markdown/extensions/__pycache__/def_list.cpython-39.pyc,, -markdown/extensions/__pycache__/extra.cpython-39.pyc,, -markdown/extensions/__pycache__/fenced_code.cpython-39.pyc,, -markdown/extensions/__pycache__/footnotes.cpython-39.pyc,, -markdown/extensions/__pycache__/legacy_attrs.cpython-39.pyc,, -markdown/extensions/__pycache__/legacy_em.cpython-39.pyc,, -markdown/extensions/__pycache__/md_in_html.cpython-39.pyc,, -markdown/extensions/__pycache__/meta.cpython-39.pyc,, -markdown/extensions/__pycache__/nl2br.cpython-39.pyc,, -markdown/extensions/__pycache__/sane_lists.cpython-39.pyc,, -markdown/extensions/__pycache__/smarty.cpython-39.pyc,, -markdown/extensions/__pycache__/tables.cpython-39.pyc,, -markdown/extensions/__pycache__/toc.cpython-39.pyc,, -markdown/extensions/__pycache__/wikilinks.cpython-39.pyc,, -markdown/extensions/abbr.py,sha256=5TNU5ml6-H1n-fztEkgUphSTvp5yKCXaiPZMrVuRFvo,3186 -markdown/extensions/admonition.py,sha256=INIecvdzQ7RLmgP8M-N6AZJ5uMd6dBfh9Uj6YibgNLk,5847 -markdown/extensions/attr_list.py,sha256=nhKFY_u6BVyKW2oMUeC4wEjqFNGpDSnNXqaohuF6M7I,5988 -markdown/extensions/codehilite.py,sha256=aEorLnWkEA_zwC2gAoqlR5nb8ZwjiUUFe0bA8bVP0Co,11654 -markdown/extensions/def_list.py,sha256=p-JT64hKqMkfxlmhETMVRPxjrdnBIPDW8k3S05S-qNM,3634 -markdown/extensions/extra.py,sha256=udRN8OvSWcq3UwkPygvsFl1RlCVtCJ-ARVg2IwVH6VY,1831 -markdown/extensions/fenced_code.py,sha256=pRZjVaEh8JZdhyLb2Vy7alfqIQNuPtN2Mzt_Imj2Vm0,7346 -markdown/extensions/footnotes.py,sha256=xvT6etWuTWTHLNHXYQWQGV-35RHTCvH9kBp2xJA6Jdg,15481 -markdown/extensions/legacy_attrs.py,sha256=2EaVQkxQoNnP8_lMPvGRBdNda8L4weUQroiyEuVdS-w,2547 -markdown/extensions/legacy_em.py,sha256=18j4L6zdScy9k18y-U2zaIhYsKVTxCaPurjqLFZmWkI,1582 -markdown/extensions/md_in_html.py,sha256=17w2s-YvjzKPWmng9La6J9-1-h1TWNEFBhVd0pF-j9U,15830 -markdown/extensions/meta.py,sha256=EUfkzM7l7UpH__Or9K3pl8ldVddwndlCZWA3d712RAE,2331 -markdown/extensions/nl2br.py,sha256=wAqTNOuf2L1NzlEvEqoID70n9y-aiYaGLkuyQk3CD0w,783 -markdown/extensions/sane_lists.py,sha256=ZQmCf-247KBexVG0fc62nDvokGkV6W1uavYbieNKSG4,1505 -markdown/extensions/smarty.py,sha256=0padzkVCNACainKw-Xj1S5UfT0125VCTfNejmrCZItA,10238 -markdown/extensions/tables.py,sha256=bicFx_wqhnEx6Y_8MJqA56rh71pt5fOe94oiWbvcobY,7685 -markdown/extensions/toc.py,sha256=Q8YP0DIuyl_B0GfUASYbE4q_B7zFsHS93t5fjiZyJWE,14136 -markdown/extensions/wikilinks.py,sha256=GkgT9BY7b1-qW--dIwFAhC9V20RoeF13b7CFdw_V21Q,2812 -markdown/htmlparser.py,sha256=K3OMq-OU2CTWCMNGPbMGqMmiwZAIrG2lQxuDOJxDjYo,13032 -markdown/inlinepatterns.py,sha256=csrxrPIET_nltn-phz80ObXu5i5oibK68h9ZCWT5eAo,29775 -markdown/pep562.py,sha256=5UkqT7sb-cQufgbOl_jF-RYUVVHS7VThzlMzR9vrd3I,8917 -markdown/postprocessors.py,sha256=NeJyWBqPeDuBBJLTGs5Bfm5oTkUBXk9HWBeQy2_OldI,4262 -markdown/preprocessors.py,sha256=-s8QGHGlX7JAIJTfCivuc-CVwTLWs0IyEU94YUT2IvQ,2742 -markdown/serializers.py,sha256=_wQl-iJrPSUEQ4Q1owWYqN9qceVh6TOlAOH_i44BKAQ,6540 -markdown/test_tools.py,sha256=svokrqFAHJ1H_BiYhEY9kilmk4dZIO3jYJTJcOsphCg,8361 -markdown/treeprocessors.py,sha256=S91w6byWeyBF96q9w8SJ_8UQV8p0UuFJ7Brj6Rw0-y4,15433 -markdown/util.py,sha256=1BKofVbYfqmgAK982UJATA22pj-ee9BcwxaHxB_bOZg,16063 diff --git a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/REQUESTED b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/WHEEL b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/WHEEL deleted file mode 100644 index 5bad85f..0000000 --- a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/entry_points.txt b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/entry_points.txt deleted file mode 100644 index f49693d..0000000 --- a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/entry_points.txt +++ /dev/null @@ -1,23 +0,0 @@ -[console_scripts] -markdown_py = markdown.__main__:run - -[markdown.extensions] -abbr = markdown.extensions.abbr:AbbrExtension -admonition = markdown.extensions.admonition:AdmonitionExtension -attr_list = markdown.extensions.attr_list:AttrListExtension -codehilite = markdown.extensions.codehilite:CodeHiliteExtension -def_list = markdown.extensions.def_list:DefListExtension -extra = markdown.extensions.extra:ExtraExtension -fenced_code = markdown.extensions.fenced_code:FencedCodeExtension -footnotes = markdown.extensions.footnotes:FootnoteExtension -legacy_attrs = markdown.extensions.legacy_attrs:LegacyAttrExtension -legacy_em = markdown.extensions.legacy_em:LegacyEmExtension -md_in_html = markdown.extensions.md_in_html:MarkdownInHtmlExtension -meta = markdown.extensions.meta:MetaExtension -nl2br = markdown.extensions.nl2br:Nl2BrExtension -sane_lists = markdown.extensions.sane_lists:SaneListExtension -smarty = markdown.extensions.smarty:SmartyExtension -tables = markdown.extensions.tables:TableExtension -toc = markdown.extensions.toc:TocExtension -wikilinks = markdown.extensions.wikilinks:WikiLinkExtension - diff --git a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/top_level.txt b/venv/Lib/site-packages/Markdown-3.3.6.dist-info/top_level.txt deleted file mode 100644 index 0918c97..0000000 --- a/venv/Lib/site-packages/Markdown-3.3.6.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markdown diff --git a/venv/Lib/site-packages/MySQLdb/__init__.py b/venv/Lib/site-packages/MySQLdb/__init__.py deleted file mode 100644 index b567363..0000000 --- a/venv/Lib/site-packages/MySQLdb/__init__.py +++ /dev/null @@ -1,170 +0,0 @@ -""" -MySQLdb - A DB API v2.0 compatible interface to MySQL. - -This package is a wrapper around _mysql, which mostly implements the -MySQL C API. - -connect() -- connects to server - -See the C API specification and the MySQL documentation for more info -on other items. - -For information on how MySQLdb handles type conversion, see the -MySQLdb.converters module. -""" - -try: - from MySQLdb.release import version_info - from . import _mysql - - assert version_info == _mysql.version_info -except Exception: - raise ImportError( - "this is MySQLdb version {}, but _mysql is version {!r}\n_mysql: {!r}".format( - version_info, _mysql.version_info, _mysql.__file__ - ) - ) - - -from ._mysql import ( - NotSupportedError, - OperationalError, - get_client_info, - ProgrammingError, - Error, - InterfaceError, - debug, - IntegrityError, - string_literal, - MySQLError, - DataError, - DatabaseError, - InternalError, - Warning, -) -from MySQLdb.constants import FIELD_TYPE -from MySQLdb.times import ( - Date, - Time, - Timestamp, - DateFromTicks, - TimeFromTicks, - TimestampFromTicks, -) - -threadsafety = 1 -apilevel = "2.0" -paramstyle = "format" - - -class DBAPISet(frozenset): - """A special type of set for which A == x is true if A is a - DBAPISet and x is a member of that set.""" - - def __eq__(self, other): - if isinstance(other, DBAPISet): - return not self.difference(other) - return other in self - - -STRING = DBAPISet([FIELD_TYPE.ENUM, FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING]) -BINARY = DBAPISet( - [ - FIELD_TYPE.BLOB, - FIELD_TYPE.LONG_BLOB, - FIELD_TYPE.MEDIUM_BLOB, - FIELD_TYPE.TINY_BLOB, - ] -) -NUMBER = DBAPISet( - [ - FIELD_TYPE.DECIMAL, - FIELD_TYPE.DOUBLE, - FIELD_TYPE.FLOAT, - FIELD_TYPE.INT24, - FIELD_TYPE.LONG, - FIELD_TYPE.LONGLONG, - FIELD_TYPE.TINY, - FIELD_TYPE.YEAR, - FIELD_TYPE.NEWDECIMAL, - ] -) -DATE = DBAPISet([FIELD_TYPE.DATE]) -TIME = DBAPISet([FIELD_TYPE.TIME]) -TIMESTAMP = DBAPISet([FIELD_TYPE.TIMESTAMP, FIELD_TYPE.DATETIME]) -DATETIME = TIMESTAMP -ROWID = DBAPISet() - - -def test_DBAPISet_set_equality(): - assert STRING == STRING - - -def test_DBAPISet_set_inequality(): - assert STRING != NUMBER - - -def test_DBAPISet_set_equality_membership(): - assert FIELD_TYPE.VAR_STRING == STRING - - -def test_DBAPISet_set_inequality_membership(): - assert FIELD_TYPE.DATE != STRING - - -def Binary(x): - return bytes(x) - - -def Connect(*args, **kwargs): - """Factory function for connections.Connection.""" - from MySQLdb.connections import Connection - - return Connection(*args, **kwargs) - - -connect = Connection = Connect - -__all__ = [ - "BINARY", - "Binary", - "Connect", - "Connection", - "DATE", - "Date", - "Time", - "Timestamp", - "DateFromTicks", - "TimeFromTicks", - "TimestampFromTicks", - "DataError", - "DatabaseError", - "Error", - "FIELD_TYPE", - "IntegrityError", - "InterfaceError", - "InternalError", - "MySQLError", - "NUMBER", - "NotSupportedError", - "DBAPISet", - "OperationalError", - "ProgrammingError", - "ROWID", - "STRING", - "TIME", - "TIMESTAMP", - "Warning", - "apilevel", - "connect", - "connections", - "constants", - "converters", - "cursors", - "debug", - "get_client_info", - "paramstyle", - "string_literal", - "threadsafety", - "version_info", -] diff --git a/venv/Lib/site-packages/MySQLdb/_exceptions.py b/venv/Lib/site-packages/MySQLdb/_exceptions.py deleted file mode 100644 index ba35dea..0000000 --- a/venv/Lib/site-packages/MySQLdb/_exceptions.py +++ /dev/null @@ -1,69 +0,0 @@ -"""Exception classes for _mysql and MySQLdb. - -These classes are dictated by the DB API v2.0: - - https://www.python.org/dev/peps/pep-0249/ -""" - - -class MySQLError(Exception): - """Exception related to operation with MySQL.""" - - -class Warning(Warning, MySQLError): - """Exception raised for important warnings like data truncations - while inserting, etc.""" - - -class Error(MySQLError): - """Exception that is the base class of all other error exceptions - (not Warning).""" - - -class InterfaceError(Error): - """Exception raised for errors that are related to the database - interface rather than the database itself.""" - - -class DatabaseError(Error): - """Exception raised for errors that are related to the - database.""" - - -class DataError(DatabaseError): - """Exception raised for errors that are due to problems with the - processed data like division by zero, numeric value out of range, - etc.""" - - -class OperationalError(DatabaseError): - """Exception raised for errors that are related to the database's - operation and not necessarily under the control of the programmer, - e.g. an unexpected disconnect occurs, the data source name is not - found, a transaction could not be processed, a memory allocation - error occurred during processing, etc.""" - - -class IntegrityError(DatabaseError): - """Exception raised when the relational integrity of the database - is affected, e.g. a foreign key check fails, duplicate key, - etc.""" - - -class InternalError(DatabaseError): - """Exception raised when the database encounters an internal - error, e.g. the cursor is not valid anymore, the transaction is - out of sync, etc.""" - - -class ProgrammingError(DatabaseError): - """Exception raised for programming errors, e.g. table not found - or already exists, syntax error in the SQL statement, wrong number - of parameters specified, etc.""" - - -class NotSupportedError(DatabaseError): - """Exception raised in case a method or database API was used - which is not supported by the database, e.g. requesting a - .rollback() on a connection that does not support transaction or - has transactions turned off.""" diff --git a/venv/Lib/site-packages/MySQLdb/_mysql.cp39-win_amd64.pyd b/venv/Lib/site-packages/MySQLdb/_mysql.cp39-win_amd64.pyd deleted file mode 100644 index c2edd4264812d56e891fdce4ab3bdcd6af4c53e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311808 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 diff --git a/venv/Lib/site-packages/MySQLdb/connections.py b/venv/Lib/site-packages/MySQLdb/connections.py deleted file mode 100644 index 3832466..0000000 --- a/venv/Lib/site-packages/MySQLdb/connections.py +++ /dev/null @@ -1,333 +0,0 @@ -""" -This module implements connections for MySQLdb. Presently there is -only one class: Connection. Others are unlikely. However, you might -want to make your own subclasses. In most cases, you will probably -override Connection.default_cursor with a non-standard Cursor class. -""" -import re - -from . import cursors, _mysql -from ._exceptions import ( - Warning, - Error, - InterfaceError, - DataError, - DatabaseError, - OperationalError, - IntegrityError, - InternalError, - NotSupportedError, - ProgrammingError, -) - -# Mapping from MySQL charset name to Python codec name -_charset_to_encoding = { - "utf8mb4": "utf8", - "utf8mb3": "utf8", - "latin1": "cp1252", - "koi8r": "koi8_r", - "koi8u": "koi8_u", -} - -re_numeric_part = re.compile(r"^(\d+)") - - -def numeric_part(s): - """Returns the leading numeric part of a string. - - >>> numeric_part("20-alpha") - 20 - >>> numeric_part("foo") - >>> numeric_part("16b") - 16 - """ - - m = re_numeric_part.match(s) - if m: - return int(m.group(1)) - return None - - -class Connection(_mysql.connection): - """MySQL Database Connection Object""" - - default_cursor = cursors.Cursor - - def __init__(self, *args, **kwargs): - """ - Create a connection to the database. It is strongly recommended - that you only use keyword parameters. Consult the MySQL C API - documentation for more information. - - :param str host: host to connect - :param str user: user to connect as - :param str password: password to use - :param str passwd: alias of password (deprecated) - :param str database: database to use - :param str db: alias of database (deprecated) - :param int port: TCP/IP port to connect to - :param str unix_socket: location of unix_socket to use - :param dict conv: conversion dictionary, see MySQLdb.converters - :param int connect_timeout: - number of seconds to wait before the connection attempt fails. - - :param bool compress: if set, compression is enabled - :param str named_pipe: if set, a named pipe is used to connect (Windows only) - :param str init_command: - command which is run once the connection is created - - :param str read_default_file: - file from which default client values are read - - :param str read_default_group: - configuration group to use from the default file - - :param type cursorclass: - class object, used to create cursors (keyword only) - - :param bool use_unicode: - If True, text-like columns are returned as unicode objects - using the connection's character set. Otherwise, text-like - columns are returned as bytes. Unicode objects will always - be encoded to the connection's character set regardless of - this setting. - Default to True. - - :param str charset: - If supplied, the connection character set will be changed - to this character set. - - :param str auth_plugin: - If supplied, the connection default authentication plugin will be - changed to this value. Example values: - `mysql_native_password` or `caching_sha2_password` - - :param str sql_mode: - If supplied, the session SQL mode will be changed to this - setting. - For more details and legal values, see the MySQL documentation. - - :param int client_flag: - flags to use or 0 (see MySQL docs or constants/CLIENTS.py) - - :param bool multi_statements: - If True, enable multi statements for clients >= 4.1. - Defaults to True. - - :param str ssl_mode: - specify the security settings for connection to the server; - see the MySQL documentation for more details - (mysql_option(), MYSQL_OPT_SSL_MODE). - Only one of 'DISABLED', 'PREFERRED', 'REQUIRED', - 'VERIFY_CA', 'VERIFY_IDENTITY' can be specified. - - :param dict ssl: - dictionary or mapping contains SSL connection parameters; - see the MySQL documentation for more details - (mysql_ssl_set()). If this is set, and the client does not - support SSL, NotSupportedError will be raised. - - :param bool local_infile: - enables LOAD LOCAL INFILE; zero disables - - :param bool autocommit: - If False (default), autocommit is disabled. - If True, autocommit is enabled. - If None, autocommit isn't set and server default is used. - - :param bool binary_prefix: - If set, the '_binary' prefix will be used for raw byte query - arguments (e.g. Binary). This is disabled by default. - - There are a number of undocumented, non-standard methods. See the - documentation for the MySQL C API for some hints on what they do. - """ - from MySQLdb.constants import CLIENT, FIELD_TYPE - from MySQLdb.converters import conversions, _bytes_or_str - from weakref import proxy - - kwargs2 = kwargs.copy() - - if "db" in kwargs2: - kwargs2["database"] = kwargs2.pop("db") - if "passwd" in kwargs2: - kwargs2["password"] = kwargs2.pop("passwd") - - if "conv" in kwargs: - conv = kwargs["conv"] - else: - conv = conversions - - conv2 = {} - for k, v in conv.items(): - if isinstance(k, int) and isinstance(v, list): - conv2[k] = v[:] - else: - conv2[k] = v - kwargs2["conv"] = conv2 - - cursorclass = kwargs2.pop("cursorclass", self.default_cursor) - charset = kwargs2.get("charset", "") - use_unicode = kwargs2.pop("use_unicode", True) - sql_mode = kwargs2.pop("sql_mode", "") - self._binary_prefix = kwargs2.pop("binary_prefix", False) - - client_flag = kwargs.get("client_flag", 0) - client_flag |= CLIENT.MULTI_RESULTS - multi_statements = kwargs2.pop("multi_statements", True) - if multi_statements: - client_flag |= CLIENT.MULTI_STATEMENTS - kwargs2["client_flag"] = client_flag - - # PEP-249 requires autocommit to be initially off - autocommit = kwargs2.pop("autocommit", False) - - super().__init__(*args, **kwargs2) - self.cursorclass = cursorclass - self.encoders = {k: v for k, v in conv.items() if type(k) is not int} - - self._server_version = tuple( - [numeric_part(n) for n in self.get_server_info().split(".")[:2]] - ) - - self.encoding = "ascii" # overridden in set_character_set() - - if not charset: - charset = self.character_set_name() - self.set_character_set(charset) - - if sql_mode: - self.set_sql_mode(sql_mode) - - if use_unicode: - for t in ( - FIELD_TYPE.STRING, - FIELD_TYPE.VAR_STRING, - FIELD_TYPE.VARCHAR, - FIELD_TYPE.TINY_BLOB, - FIELD_TYPE.MEDIUM_BLOB, - FIELD_TYPE.LONG_BLOB, - FIELD_TYPE.BLOB, - ): - self.converter[t] = _bytes_or_str - # Unlike other string/blob types, JSON is always text. - # MySQL may return JSON with charset==binary. - self.converter[FIELD_TYPE.JSON] = str - - db = proxy(self) - - def unicode_literal(u, dummy=None): - return db.string_literal(u.encode(db.encoding)) - - self.encoders[str] = unicode_literal - - self._transactional = self.server_capabilities & CLIENT.TRANSACTIONS - if self._transactional: - if autocommit is not None: - self.autocommit(autocommit) - self.messages = [] - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() - - def autocommit(self, on): - on = bool(on) - if self.get_autocommit() != on: - _mysql.connection.autocommit(self, on) - - def cursor(self, cursorclass=None): - """ - Create a cursor on which queries may be performed. The - optional cursorclass parameter is used to create the - Cursor. By default, self.cursorclass=cursors.Cursor is - used. - """ - return (cursorclass or self.cursorclass)(self) - - def query(self, query): - # Since _mysql releases GIL while querying, we need immutable buffer. - if isinstance(query, bytearray): - query = bytes(query) - _mysql.connection.query(self, query) - - def _bytes_literal(self, bs): - assert isinstance(bs, (bytes, bytearray)) - x = self.string_literal(bs) # x is escaped and quoted bytes - if self._binary_prefix: - return b"_binary" + x - return x - - def _tuple_literal(self, t): - return b"(%s)" % (b",".join(map(self.literal, t))) - - def literal(self, o): - """If o is a single object, returns an SQL literal as a string. - If o is a non-string sequence, the items of the sequence are - converted and returned as a sequence. - - Non-standard. For internal use; do not use this in your - applications. - """ - if isinstance(o, str): - s = self.string_literal(o.encode(self.encoding)) - elif isinstance(o, bytearray): - s = self._bytes_literal(o) - elif isinstance(o, bytes): - s = self._bytes_literal(o) - elif isinstance(o, (tuple, list)): - s = self._tuple_literal(o) - else: - s = self.escape(o, self.encoders) - if isinstance(s, str): - s = s.encode(self.encoding) - assert isinstance(s, bytes) - return s - - def begin(self): - """Explicitly begin a connection. - - This method is not used when autocommit=False (default). - """ - self.query(b"BEGIN") - - def set_character_set(self, charset): - """Set the connection character set to charset.""" - super().set_character_set(charset) - self.encoding = _charset_to_encoding.get(charset, charset) - - def set_sql_mode(self, sql_mode): - """Set the connection sql_mode. See MySQL documentation for - legal values.""" - if self._server_version < (4, 1): - raise NotSupportedError("server is too old to set sql_mode") - self.query("SET SESSION sql_mode='%s'" % sql_mode) - self.store_result() - - def show_warnings(self): - """Return detailed information about warnings as a - sequence of tuples of (Level, Code, Message). This - is only supported in MySQL-4.1 and up. If your server - is an earlier version, an empty sequence is returned.""" - if self._server_version < (4, 1): - return () - self.query("SHOW WARNINGS") - r = self.store_result() - warnings = r.fetch_row(0) - return warnings - - Warning = Warning - Error = Error - InterfaceError = InterfaceError - DatabaseError = DatabaseError - DataError = DataError - OperationalError = OperationalError - IntegrityError = IntegrityError - InternalError = InternalError - ProgrammingError = ProgrammingError - NotSupportedError = NotSupportedError - - -# vim: colorcolumn=100 diff --git a/venv/Lib/site-packages/MySQLdb/constants/CLIENT.py b/venv/Lib/site-packages/MySQLdb/constants/CLIENT.py deleted file mode 100644 index 35f578c..0000000 --- a/venv/Lib/site-packages/MySQLdb/constants/CLIENT.py +++ /dev/null @@ -1,27 +0,0 @@ -"""MySQL CLIENT constants - -These constants are used when creating the connection. Use bitwise-OR -(|) to combine options together, and pass them as the client_flags -parameter to MySQLdb.Connection. For more information on these flags, -see the MySQL C API documentation for mysql_real_connect(). - -""" - -LONG_PASSWORD = 1 -FOUND_ROWS = 2 -LONG_FLAG = 4 -CONNECT_WITH_DB = 8 -NO_SCHEMA = 16 -COMPRESS = 32 -ODBC = 64 -LOCAL_FILES = 128 -IGNORE_SPACE = 256 -CHANGE_USER = 512 -INTERACTIVE = 1024 -SSL = 2048 -IGNORE_SIGPIPE = 4096 -TRANSACTIONS = 8192 # mysql_com.h was WRONG prior to 3.23.35 -RESERVED = 16384 -SECURE_CONNECTION = 32768 -MULTI_STATEMENTS = 65536 -MULTI_RESULTS = 131072 diff --git a/venv/Lib/site-packages/MySQLdb/constants/CR.py b/venv/Lib/site-packages/MySQLdb/constants/CR.py deleted file mode 100644 index 9d33cf6..0000000 --- a/venv/Lib/site-packages/MySQLdb/constants/CR.py +++ /dev/null @@ -1,105 +0,0 @@ -"""MySQL Connection Errors - -Nearly all of these raise OperationalError. COMMANDS_OUT_OF_SYNC -raises ProgrammingError. - -""" - -if __name__ == "__main__": - """ - Usage: python CR.py [/path/to/mysql/errmsg.h ...] >> CR.py - """ - import fileinput - import re - - data = {} - error_last = None - for line in fileinput.input(): - line = re.sub(r"/\*.*?\*/", "", line) - m = re.match(r"^\s*#define\s+CR_([A-Z0-9_]+)\s+(\d+)(\s.*|$)", line) - if m: - name = m.group(1) - value = int(m.group(2)) - if name == "ERROR_LAST": - if error_last is None or error_last < value: - error_last = value - continue - if value not in data: - data[value] = set() - data[value].add(name) - for value, names in sorted(data.items()): - for name in sorted(names): - print("{} = {}".format(name, value)) - if error_last is not None: - print("ERROR_LAST = %s" % error_last) - - -ERROR_FIRST = 2000 -MIN_ERROR = 2000 -UNKNOWN_ERROR = 2000 -SOCKET_CREATE_ERROR = 2001 -CONNECTION_ERROR = 2002 -CONN_HOST_ERROR = 2003 -IPSOCK_ERROR = 2004 -UNKNOWN_HOST = 2005 -SERVER_GONE_ERROR = 2006 -VERSION_ERROR = 2007 -OUT_OF_MEMORY = 2008 -WRONG_HOST_INFO = 2009 -LOCALHOST_CONNECTION = 2010 -TCP_CONNECTION = 2011 -SERVER_HANDSHAKE_ERR = 2012 -SERVER_LOST = 2013 -COMMANDS_OUT_OF_SYNC = 2014 -NAMEDPIPE_CONNECTION = 2015 -NAMEDPIPEWAIT_ERROR = 2016 -NAMEDPIPEOPEN_ERROR = 2017 -NAMEDPIPESETSTATE_ERROR = 2018 -CANT_READ_CHARSET = 2019 -NET_PACKET_TOO_LARGE = 2020 -EMBEDDED_CONNECTION = 2021 -PROBE_SLAVE_STATUS = 2022 -PROBE_SLAVE_HOSTS = 2023 -PROBE_SLAVE_CONNECT = 2024 -PROBE_MASTER_CONNECT = 2025 -SSL_CONNECTION_ERROR = 2026 -MALFORMED_PACKET = 2027 -WRONG_LICENSE = 2028 -NULL_POINTER = 2029 -NO_PREPARE_STMT = 2030 -PARAMS_NOT_BOUND = 2031 -DATA_TRUNCATED = 2032 -NO_PARAMETERS_EXISTS = 2033 -INVALID_PARAMETER_NO = 2034 -INVALID_BUFFER_USE = 2035 -UNSUPPORTED_PARAM_TYPE = 2036 -SHARED_MEMORY_CONNECTION = 2037 -SHARED_MEMORY_CONNECT_REQUEST_ERROR = 2038 -SHARED_MEMORY_CONNECT_ANSWER_ERROR = 2039 -SHARED_MEMORY_CONNECT_FILE_MAP_ERROR = 2040 -SHARED_MEMORY_CONNECT_MAP_ERROR = 2041 -SHARED_MEMORY_FILE_MAP_ERROR = 2042 -SHARED_MEMORY_MAP_ERROR = 2043 -SHARED_MEMORY_EVENT_ERROR = 2044 -SHARED_MEMORY_CONNECT_ABANDONED_ERROR = 2045 -SHARED_MEMORY_CONNECT_SET_ERROR = 2046 -CONN_UNKNOW_PROTOCOL = 2047 -INVALID_CONN_HANDLE = 2048 -UNUSED_1 = 2049 -FETCH_CANCELED = 2050 -NO_DATA = 2051 -NO_STMT_METADATA = 2052 -NO_RESULT_SET = 2053 -NOT_IMPLEMENTED = 2054 -SERVER_LOST_EXTENDED = 2055 -STMT_CLOSED = 2056 -NEW_STMT_METADATA = 2057 -ALREADY_CONNECTED = 2058 -AUTH_PLUGIN_CANNOT_LOAD = 2059 -DUPLICATE_CONNECTION_ATTR = 2060 -AUTH_PLUGIN_ERR = 2061 -INSECURE_API_ERR = 2062 -FILE_NAME_TOO_LONG = 2063 -SSL_FIPS_MODE_ERR = 2064 -MAX_ERROR = 2999 -ERROR_LAST = 2064 diff --git a/venv/Lib/site-packages/MySQLdb/constants/ER.py b/venv/Lib/site-packages/MySQLdb/constants/ER.py deleted file mode 100644 index fcd5bf2..0000000 --- a/venv/Lib/site-packages/MySQLdb/constants/ER.py +++ /dev/null @@ -1,827 +0,0 @@ -"""MySQL ER Constants - -These constants are error codes for the bulk of the error conditions -that may occur. -""" - -if __name__ == "__main__": - """ - Usage: python ER.py [/path/to/mysql/mysqld_error.h ...] >> ER.py - """ - import fileinput - import re - - data = {} - error_last = None - for line in fileinput.input(): - line = re.sub(r"/\*.*?\*/", "", line) - m = re.match(r"^\s*#define\s+((ER|WARN)_[A-Z0-9_]+)\s+(\d+)\s*", line) - if m: - name = m.group(1) - if name.startswith("ER_"): - name = name[3:] - value = int(m.group(3)) - if name == "ERROR_LAST": - if error_last is None or error_last < value: - error_last = value - continue - if value not in data: - data[value] = set() - data[value].add(name) - for value, names in sorted(data.items()): - for name in sorted(names): - print("{} = {}".format(name, value)) - if error_last is not None: - print("ERROR_LAST = %s" % error_last) - - -ERROR_FIRST = 1000 -NO = 1002 -YES = 1003 -CANT_CREATE_FILE = 1004 -CANT_CREATE_TABLE = 1005 -CANT_CREATE_DB = 1006 -DB_CREATE_EXISTS = 1007 -DB_DROP_EXISTS = 1008 -DB_DROP_RMDIR = 1010 -CANT_FIND_SYSTEM_REC = 1012 -CANT_GET_STAT = 1013 -CANT_LOCK = 1015 -CANT_OPEN_FILE = 1016 -FILE_NOT_FOUND = 1017 -CANT_READ_DIR = 1018 -CHECKREAD = 1020 -DUP_KEY = 1022 -ERROR_ON_READ = 1024 -ERROR_ON_RENAME = 1025 -ERROR_ON_WRITE = 1026 -FILE_USED = 1027 -FILSORT_ABORT = 1028 -GET_ERRNO = 1030 -ILLEGAL_HA = 1031 -KEY_NOT_FOUND = 1032 -NOT_FORM_FILE = 1033 -NOT_KEYFILE = 1034 -OLD_KEYFILE = 1035 -OPEN_AS_READONLY = 1036 -OUTOFMEMORY = 1037 -OUT_OF_SORTMEMORY = 1038 -CON_COUNT_ERROR = 1040 -OUT_OF_RESOURCES = 1041 -BAD_HOST_ERROR = 1042 -HANDSHAKE_ERROR = 1043 -DBACCESS_DENIED_ERROR = 1044 -ACCESS_DENIED_ERROR = 1045 -NO_DB_ERROR = 1046 -UNKNOWN_COM_ERROR = 1047 -BAD_NULL_ERROR = 1048 -BAD_DB_ERROR = 1049 -TABLE_EXISTS_ERROR = 1050 -BAD_TABLE_ERROR = 1051 -NON_UNIQ_ERROR = 1052 -SERVER_SHUTDOWN = 1053 -BAD_FIELD_ERROR = 1054 -WRONG_FIELD_WITH_GROUP = 1055 -WRONG_GROUP_FIELD = 1056 -WRONG_SUM_SELECT = 1057 -WRONG_VALUE_COUNT = 1058 -TOO_LONG_IDENT = 1059 -DUP_FIELDNAME = 1060 -DUP_KEYNAME = 1061 -DUP_ENTRY = 1062 -WRONG_FIELD_SPEC = 1063 -PARSE_ERROR = 1064 -EMPTY_QUERY = 1065 -NONUNIQ_TABLE = 1066 -INVALID_DEFAULT = 1067 -MULTIPLE_PRI_KEY = 1068 -TOO_MANY_KEYS = 1069 -TOO_MANY_KEY_PARTS = 1070 -TOO_LONG_KEY = 1071 -KEY_COLUMN_DOES_NOT_EXITS = 1072 -BLOB_USED_AS_KEY = 1073 -TOO_BIG_FIELDLENGTH = 1074 -WRONG_AUTO_KEY = 1075 -READY = 1076 -SHUTDOWN_COMPLETE = 1079 -FORCING_CLOSE = 1080 -IPSOCK_ERROR = 1081 -NO_SUCH_INDEX = 1082 -WRONG_FIELD_TERMINATORS = 1083 -BLOBS_AND_NO_TERMINATED = 1084 -TEXTFILE_NOT_READABLE = 1085 -FILE_EXISTS_ERROR = 1086 -LOAD_INFO = 1087 -ALTER_INFO = 1088 -WRONG_SUB_KEY = 1089 -CANT_REMOVE_ALL_FIELDS = 1090 -CANT_DROP_FIELD_OR_KEY = 1091 -INSERT_INFO = 1092 -UPDATE_TABLE_USED = 1093 -NO_SUCH_THREAD = 1094 -KILL_DENIED_ERROR = 1095 -NO_TABLES_USED = 1096 -TOO_BIG_SET = 1097 -NO_UNIQUE_LOGFILE = 1098 -TABLE_NOT_LOCKED_FOR_WRITE = 1099 -TABLE_NOT_LOCKED = 1100 -BLOB_CANT_HAVE_DEFAULT = 1101 -WRONG_DB_NAME = 1102 -WRONG_TABLE_NAME = 1103 -TOO_BIG_SELECT = 1104 -UNKNOWN_ERROR = 1105 -UNKNOWN_PROCEDURE = 1106 -WRONG_PARAMCOUNT_TO_PROCEDURE = 1107 -WRONG_PARAMETERS_TO_PROCEDURE = 1108 -UNKNOWN_TABLE = 1109 -FIELD_SPECIFIED_TWICE = 1110 -INVALID_GROUP_FUNC_USE = 1111 -UNSUPPORTED_EXTENSION = 1112 -TABLE_MUST_HAVE_COLUMNS = 1113 -RECORD_FILE_FULL = 1114 -UNKNOWN_CHARACTER_SET = 1115 -TOO_MANY_TABLES = 1116 -TOO_MANY_FIELDS = 1117 -TOO_BIG_ROWSIZE = 1118 -STACK_OVERRUN = 1119 -WRONG_OUTER_JOIN_UNUSED = 1120 -NULL_COLUMN_IN_INDEX = 1121 -CANT_FIND_UDF = 1122 -CANT_INITIALIZE_UDF = 1123 -UDF_NO_PATHS = 1124 -UDF_EXISTS = 1125 -CANT_OPEN_LIBRARY = 1126 -CANT_FIND_DL_ENTRY = 1127 -FUNCTION_NOT_DEFINED = 1128 -HOST_IS_BLOCKED = 1129 -HOST_NOT_PRIVILEGED = 1130 -PASSWORD_ANONYMOUS_USER = 1131 -PASSWORD_NOT_ALLOWED = 1132 -PASSWORD_NO_MATCH = 1133 -UPDATE_INFO = 1134 -CANT_CREATE_THREAD = 1135 -WRONG_VALUE_COUNT_ON_ROW = 1136 -CANT_REOPEN_TABLE = 1137 -INVALID_USE_OF_NULL = 1138 -REGEXP_ERROR = 1139 -MIX_OF_GROUP_FUNC_AND_FIELDS = 1140 -NONEXISTING_GRANT = 1141 -TABLEACCESS_DENIED_ERROR = 1142 -COLUMNACCESS_DENIED_ERROR = 1143 -ILLEGAL_GRANT_FOR_TABLE = 1144 -GRANT_WRONG_HOST_OR_USER = 1145 -NO_SUCH_TABLE = 1146 -NONEXISTING_TABLE_GRANT = 1147 -NOT_ALLOWED_COMMAND = 1148 -SYNTAX_ERROR = 1149 -ABORTING_CONNECTION = 1152 -NET_PACKET_TOO_LARGE = 1153 -NET_READ_ERROR_FROM_PIPE = 1154 -NET_FCNTL_ERROR = 1155 -NET_PACKETS_OUT_OF_ORDER = 1156 -NET_UNCOMPRESS_ERROR = 1157 -NET_READ_ERROR = 1158 -NET_READ_INTERRUPTED = 1159 -NET_ERROR_ON_WRITE = 1160 -NET_WRITE_INTERRUPTED = 1161 -TOO_LONG_STRING = 1162 -TABLE_CANT_HANDLE_BLOB = 1163 -TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164 -WRONG_COLUMN_NAME = 1166 -WRONG_KEY_COLUMN = 1167 -WRONG_MRG_TABLE = 1168 -DUP_UNIQUE = 1169 -BLOB_KEY_WITHOUT_LENGTH = 1170 -PRIMARY_CANT_HAVE_NULL = 1171 -TOO_MANY_ROWS = 1172 -REQUIRES_PRIMARY_KEY = 1173 -UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175 -KEY_DOES_NOT_EXITS = 1176 -CHECK_NO_SUCH_TABLE = 1177 -CHECK_NOT_IMPLEMENTED = 1178 -CANT_DO_THIS_DURING_AN_TRANSACTION = 1179 -ERROR_DURING_COMMIT = 1180 -ERROR_DURING_ROLLBACK = 1181 -ERROR_DURING_FLUSH_LOGS = 1182 -NEW_ABORTING_CONNECTION = 1184 -MASTER = 1188 -MASTER_NET_READ = 1189 -MASTER_NET_WRITE = 1190 -FT_MATCHING_KEY_NOT_FOUND = 1191 -LOCK_OR_ACTIVE_TRANSACTION = 1192 -UNKNOWN_SYSTEM_VARIABLE = 1193 -CRASHED_ON_USAGE = 1194 -CRASHED_ON_REPAIR = 1195 -WARNING_NOT_COMPLETE_ROLLBACK = 1196 -TRANS_CACHE_FULL = 1197 -SLAVE_NOT_RUNNING = 1199 -BAD_SLAVE = 1200 -MASTER_INFO = 1201 -SLAVE_THREAD = 1202 -TOO_MANY_USER_CONNECTIONS = 1203 -SET_CONSTANTS_ONLY = 1204 -LOCK_WAIT_TIMEOUT = 1205 -LOCK_TABLE_FULL = 1206 -READ_ONLY_TRANSACTION = 1207 -WRONG_ARGUMENTS = 1210 -NO_PERMISSION_TO_CREATE_USER = 1211 -LOCK_DEADLOCK = 1213 -TABLE_CANT_HANDLE_FT = 1214 -CANNOT_ADD_FOREIGN = 1215 -NO_REFERENCED_ROW = 1216 -ROW_IS_REFERENCED = 1217 -CONNECT_TO_MASTER = 1218 -ERROR_WHEN_EXECUTING_COMMAND = 1220 -WRONG_USAGE = 1221 -WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222 -CANT_UPDATE_WITH_READLOCK = 1223 -MIXING_NOT_ALLOWED = 1224 -DUP_ARGUMENT = 1225 -USER_LIMIT_REACHED = 1226 -SPECIFIC_ACCESS_DENIED_ERROR = 1227 -LOCAL_VARIABLE = 1228 -GLOBAL_VARIABLE = 1229 -NO_DEFAULT = 1230 -WRONG_VALUE_FOR_VAR = 1231 -WRONG_TYPE_FOR_VAR = 1232 -VAR_CANT_BE_READ = 1233 -CANT_USE_OPTION_HERE = 1234 -NOT_SUPPORTED_YET = 1235 -MASTER_FATAL_ERROR_READING_BINLOG = 1236 -SLAVE_IGNORED_TABLE = 1237 -INCORRECT_GLOBAL_LOCAL_VAR = 1238 -WRONG_FK_DEF = 1239 -KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240 -OPERAND_COLUMNS = 1241 -SUBQUERY_NO_1_ROW = 1242 -UNKNOWN_STMT_HANDLER = 1243 -CORRUPT_HELP_DB = 1244 -AUTO_CONVERT = 1246 -ILLEGAL_REFERENCE = 1247 -DERIVED_MUST_HAVE_ALIAS = 1248 -SELECT_REDUCED = 1249 -TABLENAME_NOT_ALLOWED_HERE = 1250 -NOT_SUPPORTED_AUTH_MODE = 1251 -SPATIAL_CANT_HAVE_NULL = 1252 -COLLATION_CHARSET_MISMATCH = 1253 -TOO_BIG_FOR_UNCOMPRESS = 1256 -ZLIB_Z_MEM_ERROR = 1257 -ZLIB_Z_BUF_ERROR = 1258 -ZLIB_Z_DATA_ERROR = 1259 -CUT_VALUE_GROUP_CONCAT = 1260 -WARN_TOO_FEW_RECORDS = 1261 -WARN_TOO_MANY_RECORDS = 1262 -WARN_NULL_TO_NOTNULL = 1263 -WARN_DATA_OUT_OF_RANGE = 1264 -WARN_DATA_TRUNCATED = 1265 -WARN_USING_OTHER_HANDLER = 1266 -CANT_AGGREGATE_2COLLATIONS = 1267 -REVOKE_GRANTS = 1269 -CANT_AGGREGATE_3COLLATIONS = 1270 -CANT_AGGREGATE_NCOLLATIONS = 1271 -VARIABLE_IS_NOT_STRUCT = 1272 -UNKNOWN_COLLATION = 1273 -SLAVE_IGNORED_SSL_PARAMS = 1274 -SERVER_IS_IN_SECURE_AUTH_MODE = 1275 -WARN_FIELD_RESOLVED = 1276 -BAD_SLAVE_UNTIL_COND = 1277 -MISSING_SKIP_SLAVE = 1278 -UNTIL_COND_IGNORED = 1279 -WRONG_NAME_FOR_INDEX = 1280 -WRONG_NAME_FOR_CATALOG = 1281 -BAD_FT_COLUMN = 1283 -UNKNOWN_KEY_CACHE = 1284 -WARN_HOSTNAME_WONT_WORK = 1285 -UNKNOWN_STORAGE_ENGINE = 1286 -WARN_DEPRECATED_SYNTAX = 1287 -NON_UPDATABLE_TABLE = 1288 -FEATURE_DISABLED = 1289 -OPTION_PREVENTS_STATEMENT = 1290 -DUPLICATED_VALUE_IN_TYPE = 1291 -TRUNCATED_WRONG_VALUE = 1292 -INVALID_ON_UPDATE = 1294 -UNSUPPORTED_PS = 1295 -GET_ERRMSG = 1296 -GET_TEMPORARY_ERRMSG = 1297 -UNKNOWN_TIME_ZONE = 1298 -WARN_INVALID_TIMESTAMP = 1299 -INVALID_CHARACTER_STRING = 1300 -WARN_ALLOWED_PACKET_OVERFLOWED = 1301 -CONFLICTING_DECLARATIONS = 1302 -SP_NO_RECURSIVE_CREATE = 1303 -SP_ALREADY_EXISTS = 1304 -SP_DOES_NOT_EXIST = 1305 -SP_DROP_FAILED = 1306 -SP_STORE_FAILED = 1307 -SP_LILABEL_MISMATCH = 1308 -SP_LABEL_REDEFINE = 1309 -SP_LABEL_MISMATCH = 1310 -SP_UNINIT_VAR = 1311 -SP_BADSELECT = 1312 -SP_BADRETURN = 1313 -SP_BADSTATEMENT = 1314 -UPDATE_LOG_DEPRECATED_IGNORED = 1315 -UPDATE_LOG_DEPRECATED_TRANSLATED = 1316 -QUERY_INTERRUPTED = 1317 -SP_WRONG_NO_OF_ARGS = 1318 -SP_COND_MISMATCH = 1319 -SP_NORETURN = 1320 -SP_NORETURNEND = 1321 -SP_BAD_CURSOR_QUERY = 1322 -SP_BAD_CURSOR_SELECT = 1323 -SP_CURSOR_MISMATCH = 1324 -SP_CURSOR_ALREADY_OPEN = 1325 -SP_CURSOR_NOT_OPEN = 1326 -SP_UNDECLARED_VAR = 1327 -SP_WRONG_NO_OF_FETCH_ARGS = 1328 -SP_FETCH_NO_DATA = 1329 -SP_DUP_PARAM = 1330 -SP_DUP_VAR = 1331 -SP_DUP_COND = 1332 -SP_DUP_CURS = 1333 -SP_CANT_ALTER = 1334 -SP_SUBSELECT_NYI = 1335 -STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336 -SP_VARCOND_AFTER_CURSHNDLR = 1337 -SP_CURSOR_AFTER_HANDLER = 1338 -SP_CASE_NOT_FOUND = 1339 -FPARSER_TOO_BIG_FILE = 1340 -FPARSER_BAD_HEADER = 1341 -FPARSER_EOF_IN_COMMENT = 1342 -FPARSER_ERROR_IN_PARAMETER = 1343 -FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344 -VIEW_NO_EXPLAIN = 1345 -WRONG_OBJECT = 1347 -NONUPDATEABLE_COLUMN = 1348 -VIEW_SELECT_CLAUSE = 1350 -VIEW_SELECT_VARIABLE = 1351 -VIEW_SELECT_TMPTABLE = 1352 -VIEW_WRONG_LIST = 1353 -WARN_VIEW_MERGE = 1354 -WARN_VIEW_WITHOUT_KEY = 1355 -VIEW_INVALID = 1356 -SP_NO_DROP_SP = 1357 -TRG_ALREADY_EXISTS = 1359 -TRG_DOES_NOT_EXIST = 1360 -TRG_ON_VIEW_OR_TEMP_TABLE = 1361 -TRG_CANT_CHANGE_ROW = 1362 -TRG_NO_SUCH_ROW_IN_TRG = 1363 -NO_DEFAULT_FOR_FIELD = 1364 -DIVISION_BY_ZERO = 1365 -TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366 -ILLEGAL_VALUE_FOR_TYPE = 1367 -VIEW_NONUPD_CHECK = 1368 -VIEW_CHECK_FAILED = 1369 -PROCACCESS_DENIED_ERROR = 1370 -RELAY_LOG_FAIL = 1371 -UNKNOWN_TARGET_BINLOG = 1373 -IO_ERR_LOG_INDEX_READ = 1374 -BINLOG_PURGE_PROHIBITED = 1375 -FSEEK_FAIL = 1376 -BINLOG_PURGE_FATAL_ERR = 1377 -LOG_IN_USE = 1378 -LOG_PURGE_UNKNOWN_ERR = 1379 -RELAY_LOG_INIT = 1380 -NO_BINARY_LOGGING = 1381 -RESERVED_SYNTAX = 1382 -PS_MANY_PARAM = 1390 -KEY_PART_0 = 1391 -VIEW_CHECKSUM = 1392 -VIEW_MULTIUPDATE = 1393 -VIEW_NO_INSERT_FIELD_LIST = 1394 -VIEW_DELETE_MERGE_VIEW = 1395 -CANNOT_USER = 1396 -XAER_NOTA = 1397 -XAER_INVAL = 1398 -XAER_RMFAIL = 1399 -XAER_OUTSIDE = 1400 -XAER_RMERR = 1401 -XA_RBROLLBACK = 1402 -NONEXISTING_PROC_GRANT = 1403 -PROC_AUTO_GRANT_FAIL = 1404 -PROC_AUTO_REVOKE_FAIL = 1405 -DATA_TOO_LONG = 1406 -SP_BAD_SQLSTATE = 1407 -STARTUP = 1408 -LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409 -CANT_CREATE_USER_WITH_GRANT = 1410 -WRONG_VALUE_FOR_TYPE = 1411 -TABLE_DEF_CHANGED = 1412 -SP_DUP_HANDLER = 1413 -SP_NOT_VAR_ARG = 1414 -SP_NO_RETSET = 1415 -CANT_CREATE_GEOMETRY_OBJECT = 1416 -BINLOG_UNSAFE_ROUTINE = 1418 -BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419 -STMT_HAS_NO_OPEN_CURSOR = 1421 -COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422 -NO_DEFAULT_FOR_VIEW_FIELD = 1423 -SP_NO_RECURSION = 1424 -TOO_BIG_SCALE = 1425 -TOO_BIG_PRECISION = 1426 -M_BIGGER_THAN_D = 1427 -WRONG_LOCK_OF_SYSTEM_TABLE = 1428 -CONNECT_TO_FOREIGN_DATA_SOURCE = 1429 -QUERY_ON_FOREIGN_DATA_SOURCE = 1430 -FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431 -FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432 -FOREIGN_DATA_STRING_INVALID = 1433 -TRG_IN_WRONG_SCHEMA = 1435 -STACK_OVERRUN_NEED_MORE = 1436 -TOO_LONG_BODY = 1437 -WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438 -TOO_BIG_DISPLAYWIDTH = 1439 -XAER_DUPID = 1440 -DATETIME_FUNCTION_OVERFLOW = 1441 -CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442 -VIEW_PREVENT_UPDATE = 1443 -PS_NO_RECURSION = 1444 -SP_CANT_SET_AUTOCOMMIT = 1445 -VIEW_FRM_NO_USER = 1447 -VIEW_OTHER_USER = 1448 -NO_SUCH_USER = 1449 -FORBID_SCHEMA_CHANGE = 1450 -ROW_IS_REFERENCED_2 = 1451 -NO_REFERENCED_ROW_2 = 1452 -SP_BAD_VAR_SHADOW = 1453 -TRG_NO_DEFINER = 1454 -OLD_FILE_FORMAT = 1455 -SP_RECURSION_LIMIT = 1456 -SP_WRONG_NAME = 1458 -TABLE_NEEDS_UPGRADE = 1459 -SP_NO_AGGREGATE = 1460 -MAX_PREPARED_STMT_COUNT_REACHED = 1461 -VIEW_RECURSIVE = 1462 -NON_GROUPING_FIELD_USED = 1463 -TABLE_CANT_HANDLE_SPKEYS = 1464 -NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465 -REMOVED_SPACES = 1466 -AUTOINC_READ_FAILED = 1467 -USERNAME = 1468 -HOSTNAME = 1469 -WRONG_STRING_LENGTH = 1470 -NON_INSERTABLE_TABLE = 1471 -ADMIN_WRONG_MRG_TABLE = 1472 -TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473 -NAME_BECOMES_EMPTY = 1474 -AMBIGUOUS_FIELD_TERM = 1475 -FOREIGN_SERVER_EXISTS = 1476 -FOREIGN_SERVER_DOESNT_EXIST = 1477 -ILLEGAL_HA_CREATE_OPTION = 1478 -PARTITION_REQUIRES_VALUES_ERROR = 1479 -PARTITION_WRONG_VALUES_ERROR = 1480 -PARTITION_MAXVALUE_ERROR = 1481 -PARTITION_WRONG_NO_PART_ERROR = 1484 -PARTITION_WRONG_NO_SUBPART_ERROR = 1485 -WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486 -FIELD_NOT_FOUND_PART_ERROR = 1488 -INCONSISTENT_PARTITION_INFO_ERROR = 1490 -PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491 -PARTITIONS_MUST_BE_DEFINED_ERROR = 1492 -RANGE_NOT_INCREASING_ERROR = 1493 -INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494 -MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495 -PARTITION_ENTRY_ERROR = 1496 -MIX_HANDLER_ERROR = 1497 -PARTITION_NOT_DEFINED_ERROR = 1498 -TOO_MANY_PARTITIONS_ERROR = 1499 -SUBPARTITION_ERROR = 1500 -CANT_CREATE_HANDLER_FILE = 1501 -BLOB_FIELD_IN_PART_FUNC_ERROR = 1502 -UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503 -NO_PARTS_ERROR = 1504 -PARTITION_MGMT_ON_NONPARTITIONED = 1505 -FOREIGN_KEY_ON_PARTITIONED = 1506 -DROP_PARTITION_NON_EXISTENT = 1507 -DROP_LAST_PARTITION = 1508 -COALESCE_ONLY_ON_HASH_PARTITION = 1509 -REORG_HASH_ONLY_ON_SAME_NO = 1510 -REORG_NO_PARAM_ERROR = 1511 -ONLY_ON_RANGE_LIST_PARTITION = 1512 -ADD_PARTITION_SUBPART_ERROR = 1513 -ADD_PARTITION_NO_NEW_PARTITION = 1514 -COALESCE_PARTITION_NO_PARTITION = 1515 -REORG_PARTITION_NOT_EXIST = 1516 -SAME_NAME_PARTITION = 1517 -NO_BINLOG_ERROR = 1518 -CONSECUTIVE_REORG_PARTITIONS = 1519 -REORG_OUTSIDE_RANGE = 1520 -PARTITION_FUNCTION_FAILURE = 1521 -LIMITED_PART_RANGE = 1523 -PLUGIN_IS_NOT_LOADED = 1524 -WRONG_VALUE = 1525 -NO_PARTITION_FOR_GIVEN_VALUE = 1526 -FILEGROUP_OPTION_ONLY_ONCE = 1527 -CREATE_FILEGROUP_FAILED = 1528 -DROP_FILEGROUP_FAILED = 1529 -TABLESPACE_AUTO_EXTEND_ERROR = 1530 -WRONG_SIZE_NUMBER = 1531 -SIZE_OVERFLOW_ERROR = 1532 -ALTER_FILEGROUP_FAILED = 1533 -BINLOG_ROW_LOGGING_FAILED = 1534 -EVENT_ALREADY_EXISTS = 1537 -EVENT_DOES_NOT_EXIST = 1539 -EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542 -EVENT_ENDS_BEFORE_STARTS = 1543 -EVENT_EXEC_TIME_IN_THE_PAST = 1544 -EVENT_SAME_NAME = 1551 -DROP_INDEX_FK = 1553 -WARN_DEPRECATED_SYNTAX_WITH_VER = 1554 -CANT_LOCK_LOG_TABLE = 1556 -FOREIGN_DUPLICATE_KEY_OLD_UNUSED = 1557 -COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558 -TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559 -STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560 -PARTITION_NO_TEMPORARY = 1562 -PARTITION_CONST_DOMAIN_ERROR = 1563 -PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564 -NULL_IN_VALUES_LESS_THAN = 1566 -WRONG_PARTITION_NAME = 1567 -CANT_CHANGE_TX_CHARACTERISTICS = 1568 -DUP_ENTRY_AUTOINCREMENT_CASE = 1569 -EVENT_SET_VAR_ERROR = 1571 -PARTITION_MERGE_ERROR = 1572 -BASE64_DECODE_ERROR = 1575 -EVENT_RECURSION_FORBIDDEN = 1576 -ONLY_INTEGERS_ALLOWED = 1578 -UNSUPORTED_LOG_ENGINE = 1579 -BAD_LOG_STATEMENT = 1580 -CANT_RENAME_LOG_TABLE = 1581 -WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582 -WRONG_PARAMETERS_TO_NATIVE_FCT = 1583 -WRONG_PARAMETERS_TO_STORED_FCT = 1584 -NATIVE_FCT_NAME_COLLISION = 1585 -DUP_ENTRY_WITH_KEY_NAME = 1586 -BINLOG_PURGE_EMFILE = 1587 -EVENT_CANNOT_CREATE_IN_THE_PAST = 1588 -EVENT_CANNOT_ALTER_IN_THE_PAST = 1589 -NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591 -BINLOG_UNSAFE_STATEMENT = 1592 -BINLOG_FATAL_ERROR = 1593 -BINLOG_LOGGING_IMPOSSIBLE = 1598 -VIEW_NO_CREATION_CTX = 1599 -VIEW_INVALID_CREATION_CTX = 1600 -TRG_CORRUPTED_FILE = 1602 -TRG_NO_CREATION_CTX = 1603 -TRG_INVALID_CREATION_CTX = 1604 -EVENT_INVALID_CREATION_CTX = 1605 -TRG_CANT_OPEN_TABLE = 1606 -NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609 -SLAVE_CORRUPT_EVENT = 1610 -LOG_PURGE_NO_FILE = 1612 -XA_RBTIMEOUT = 1613 -XA_RBDEADLOCK = 1614 -NEED_REPREPARE = 1615 -WARN_NO_MASTER_INFO = 1617 -WARN_OPTION_IGNORED = 1618 -PLUGIN_DELETE_BUILTIN = 1619 -WARN_PLUGIN_BUSY = 1620 -VARIABLE_IS_READONLY = 1621 -WARN_ENGINE_TRANSACTION_ROLLBACK = 1622 -SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624 -NDB_REPLICATION_SCHEMA_ERROR = 1625 -CONFLICT_FN_PARSE_ERROR = 1626 -EXCEPTIONS_WRITE_ERROR = 1627 -TOO_LONG_TABLE_COMMENT = 1628 -TOO_LONG_FIELD_COMMENT = 1629 -FUNC_INEXISTENT_NAME_COLLISION = 1630 -DATABASE_NAME = 1631 -TABLE_NAME = 1632 -PARTITION_NAME = 1633 -SUBPARTITION_NAME = 1634 -TEMPORARY_NAME = 1635 -RENAMED_NAME = 1636 -TOO_MANY_CONCURRENT_TRXS = 1637 -WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638 -DEBUG_SYNC_TIMEOUT = 1639 -DEBUG_SYNC_HIT_LIMIT = 1640 -DUP_SIGNAL_SET = 1641 -SIGNAL_WARN = 1642 -SIGNAL_NOT_FOUND = 1643 -SIGNAL_EXCEPTION = 1644 -RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645 -SIGNAL_BAD_CONDITION_TYPE = 1646 -WARN_COND_ITEM_TRUNCATED = 1647 -COND_ITEM_TOO_LONG = 1648 -UNKNOWN_LOCALE = 1649 -SLAVE_IGNORE_SERVER_IDS = 1650 -SAME_NAME_PARTITION_FIELD = 1652 -PARTITION_COLUMN_LIST_ERROR = 1653 -WRONG_TYPE_COLUMN_VALUE_ERROR = 1654 -TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655 -MAXVALUE_IN_VALUES_IN = 1656 -TOO_MANY_VALUES_ERROR = 1657 -ROW_SINGLE_PARTITION_FIELD_ERROR = 1658 -FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659 -PARTITION_FIELDS_TOO_LONG = 1660 -BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661 -BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662 -BINLOG_UNSAFE_AND_STMT_ENGINE = 1663 -BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664 -BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665 -BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666 -BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667 -BINLOG_UNSAFE_LIMIT = 1668 -BINLOG_UNSAFE_SYSTEM_TABLE = 1670 -BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671 -BINLOG_UNSAFE_UDF = 1672 -BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673 -BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674 -BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675 -MESSAGE_AND_STATEMENT = 1676 -SLAVE_CANT_CREATE_CONVERSION = 1678 -INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679 -PATH_LENGTH = 1680 -WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681 -WRONG_NATIVE_TABLE_STRUCTURE = 1682 -WRONG_PERFSCHEMA_USAGE = 1683 -WARN_I_S_SKIPPED_TABLE = 1684 -INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685 -STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686 -SPATIAL_MUST_HAVE_GEOM_COL = 1687 -TOO_LONG_INDEX_COMMENT = 1688 -LOCK_ABORTED = 1689 -DATA_OUT_OF_RANGE = 1690 -WRONG_SPVAR_TYPE_IN_LIMIT = 1691 -BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692 -BINLOG_UNSAFE_MIXED_STATEMENT = 1693 -INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694 -STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695 -FAILED_READ_FROM_PAR_FILE = 1696 -VALUES_IS_NOT_INT_TYPE_ERROR = 1697 -ACCESS_DENIED_NO_PASSWORD_ERROR = 1698 -SET_PASSWORD_AUTH_PLUGIN = 1699 -TRUNCATE_ILLEGAL_FK = 1701 -PLUGIN_IS_PERMANENT = 1702 -SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703 -SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704 -STMT_CACHE_FULL = 1705 -MULTI_UPDATE_KEY_CONFLICT = 1706 -TABLE_NEEDS_REBUILD = 1707 -WARN_OPTION_BELOW_LIMIT = 1708 -INDEX_COLUMN_TOO_LONG = 1709 -ERROR_IN_TRIGGER_BODY = 1710 -ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711 -INDEX_CORRUPT = 1712 -UNDO_RECORD_TOO_BIG = 1713 -BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714 -BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715 -BINLOG_UNSAFE_REPLACE_SELECT = 1716 -BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717 -BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718 -BINLOG_UNSAFE_UPDATE_IGNORE = 1719 -PLUGIN_NO_UNINSTALL = 1720 -PLUGIN_NO_INSTALL = 1721 -BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722 -BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723 -BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724 -TABLE_IN_FK_CHECK = 1725 -UNSUPPORTED_ENGINE = 1726 -BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727 -CANNOT_LOAD_FROM_TABLE_V2 = 1728 -MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729 -ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730 -PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731 -PARTITION_EXCHANGE_PART_TABLE = 1732 -PARTITION_EXCHANGE_TEMP_TABLE = 1733 -PARTITION_INSTEAD_OF_SUBPARTITION = 1734 -UNKNOWN_PARTITION = 1735 -TABLES_DIFFERENT_METADATA = 1736 -ROW_DOES_NOT_MATCH_PARTITION = 1737 -BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738 -WARN_INDEX_NOT_APPLICABLE = 1739 -PARTITION_EXCHANGE_FOREIGN_KEY = 1740 -RPL_INFO_DATA_TOO_LONG = 1742 -BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745 -CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746 -PARTITION_CLAUSE_ON_NONPARTITIONED = 1747 -ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748 -CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750 -WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751 -WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752 -MTS_FEATURE_IS_NOT_SUPPORTED = 1753 -MTS_UPDATED_DBS_GREATER_MAX = 1754 -MTS_CANT_PARALLEL = 1755 -MTS_INCONSISTENT_DATA = 1756 -FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757 -DA_INVALID_CONDITION_NUMBER = 1758 -INSECURE_PLAIN_TEXT = 1759 -INSECURE_CHANGE_MASTER = 1760 -FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761 -FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762 -SQLTHREAD_WITH_SECURE_SLAVE = 1763 -TABLE_HAS_NO_FT = 1764 -VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765 -VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766 -SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769 -GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770 -MALFORMED_GTID_SET_SPECIFICATION = 1772 -MALFORMED_GTID_SET_ENCODING = 1773 -MALFORMED_GTID_SPECIFICATION = 1774 -GNO_EXHAUSTED = 1775 -BAD_SLAVE_AUTO_POSITION = 1776 -AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF = 1777 -CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778 -GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779 -CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781 -CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782 -CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783 -GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785 -GTID_UNSAFE_CREATE_SELECT = 1786 -GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787 -GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788 -MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789 -CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790 -UNKNOWN_EXPLAIN_FORMAT = 1791 -CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792 -TOO_LONG_TABLE_PARTITION_COMMENT = 1793 -SLAVE_CONFIGURATION = 1794 -INNODB_FT_LIMIT = 1795 -INNODB_NO_FT_TEMP_TABLE = 1796 -INNODB_FT_WRONG_DOCID_COLUMN = 1797 -INNODB_FT_WRONG_DOCID_INDEX = 1798 -INNODB_ONLINE_LOG_TOO_BIG = 1799 -UNKNOWN_ALTER_ALGORITHM = 1800 -UNKNOWN_ALTER_LOCK = 1801 -MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802 -MTS_RECOVERY_FAILURE = 1803 -MTS_RESET_WORKERS = 1804 -COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805 -SLAVE_SILENT_RETRY_TRANSACTION = 1806 -DISCARD_FK_CHECKS_RUNNING = 1807 -TABLE_SCHEMA_MISMATCH = 1808 -TABLE_IN_SYSTEM_TABLESPACE = 1809 -IO_READ_ERROR = 1810 -IO_WRITE_ERROR = 1811 -TABLESPACE_MISSING = 1812 -TABLESPACE_EXISTS = 1813 -TABLESPACE_DISCARDED = 1814 -INTERNAL_ERROR = 1815 -INNODB_IMPORT_ERROR = 1816 -INNODB_INDEX_CORRUPT = 1817 -INVALID_YEAR_COLUMN_LENGTH = 1818 -NOT_VALID_PASSWORD = 1819 -MUST_CHANGE_PASSWORD = 1820 -FK_NO_INDEX_CHILD = 1821 -FK_NO_INDEX_PARENT = 1822 -FK_FAIL_ADD_SYSTEM = 1823 -FK_CANNOT_OPEN_PARENT = 1824 -FK_INCORRECT_OPTION = 1825 -FK_DUP_NAME = 1826 -PASSWORD_FORMAT = 1827 -FK_COLUMN_CANNOT_DROP = 1828 -FK_COLUMN_CANNOT_DROP_CHILD = 1829 -FK_COLUMN_NOT_NULL = 1830 -DUP_INDEX = 1831 -FK_COLUMN_CANNOT_CHANGE = 1832 -FK_COLUMN_CANNOT_CHANGE_CHILD = 1833 -MALFORMED_PACKET = 1835 -READ_ONLY_MODE = 1836 -GTID_NEXT_TYPE_UNDEFINED_GTID = 1837 -VARIABLE_NOT_SETTABLE_IN_SP = 1838 -CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840 -CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841 -GTID_PURGED_WAS_CHANGED = 1842 -GTID_EXECUTED_WAS_CHANGED = 1843 -BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844 -ALTER_OPERATION_NOT_SUPPORTED = 1845 -ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846 -ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847 -ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848 -ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849 -ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850 -ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851 -ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853 -ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854 -ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855 -ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856 -ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857 -SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858 -DUP_UNKNOWN_IN_INDEX = 1859 -IDENT_CAUSES_TOO_LONG_PATH = 1860 -ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861 -MUST_CHANGE_PASSWORD_LOGIN = 1862 -ROW_IN_WRONG_PARTITION = 1863 -MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864 -BINLOG_LOGICAL_CORRUPTION = 1866 -WARN_PURGE_LOG_IN_USE = 1867 -WARN_PURGE_LOG_IS_ACTIVE = 1868 -AUTO_INCREMENT_CONFLICT = 1869 -WARN_ON_BLOCKHOLE_IN_RBR = 1870 -SLAVE_MI_INIT_REPOSITORY = 1871 -SLAVE_RLI_INIT_REPOSITORY = 1872 -ACCESS_DENIED_CHANGE_USER_ERROR = 1873 -INNODB_READ_ONLY = 1874 -STOP_SLAVE_SQL_THREAD_TIMEOUT = 1875 -STOP_SLAVE_IO_THREAD_TIMEOUT = 1876 -TABLE_CORRUPT = 1877 -TEMP_FILE_WRITE_FAILURE = 1878 -INNODB_FT_AUX_NOT_HEX_ID = 1879 -OLD_TEMPORALS_UPGRADED = 1880 -INNODB_FORCED_RECOVERY = 1881 -AES_INVALID_IV = 1882 -PLUGIN_CANNOT_BE_UNINSTALLED = 1883 -GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_ASSIGNED_GTID = 1884 -SLAVE_HAS_MORE_GTIDS_THAN_MASTER = 1885 -MISSING_KEY = 1886 -ERROR_LAST = 1973 diff --git a/venv/Lib/site-packages/MySQLdb/constants/FIELD_TYPE.py b/venv/Lib/site-packages/MySQLdb/constants/FIELD_TYPE.py deleted file mode 100644 index 3c4eca9..0000000 --- a/venv/Lib/site-packages/MySQLdb/constants/FIELD_TYPE.py +++ /dev/null @@ -1,40 +0,0 @@ -"""MySQL FIELD_TYPE Constants - -These constants represent the various column (field) types that are -supported by MySQL. -""" - -DECIMAL = 0 -TINY = 1 -SHORT = 2 -LONG = 3 -FLOAT = 4 -DOUBLE = 5 -NULL = 6 -TIMESTAMP = 7 -LONGLONG = 8 -INT24 = 9 -DATE = 10 -TIME = 11 -DATETIME = 12 -YEAR = 13 -# NEWDATE = 14 # Internal to MySQL. -VARCHAR = 15 -BIT = 16 -# TIMESTAMP2 = 17 -# DATETIME2 = 18 -# TIME2 = 19 -JSON = 245 -NEWDECIMAL = 246 -ENUM = 247 -SET = 248 -TINY_BLOB = 249 -MEDIUM_BLOB = 250 -LONG_BLOB = 251 -BLOB = 252 -VAR_STRING = 253 -STRING = 254 -GEOMETRY = 255 - -CHAR = TINY -INTERVAL = ENUM diff --git a/venv/Lib/site-packages/MySQLdb/constants/FLAG.py b/venv/Lib/site-packages/MySQLdb/constants/FLAG.py deleted file mode 100644 index 00e6c7c..0000000 --- a/venv/Lib/site-packages/MySQLdb/constants/FLAG.py +++ /dev/null @@ -1,23 +0,0 @@ -"""MySQL FLAG Constants - -These flags are used along with the FIELD_TYPE to indicate various -properties of columns in a result set. - -""" - -NOT_NULL = 1 -PRI_KEY = 2 -UNIQUE_KEY = 4 -MULTIPLE_KEY = 8 -BLOB = 16 -UNSIGNED = 32 -ZEROFILL = 64 -BINARY = 128 -ENUM = 256 -AUTO_INCREMENT = 512 -TIMESTAMP = 1024 -SET = 2048 -NUM = 32768 -PART_KEY = 16384 -GROUP = 32768 -UNIQUE = 65536 diff --git a/venv/Lib/site-packages/MySQLdb/constants/__init__.py b/venv/Lib/site-packages/MySQLdb/constants/__init__.py deleted file mode 100644 index 0372265..0000000 --- a/venv/Lib/site-packages/MySQLdb/constants/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ["CR", "FIELD_TYPE", "CLIENT", "ER", "FLAG"] diff --git a/venv/Lib/site-packages/MySQLdb/converters.py b/venv/Lib/site-packages/MySQLdb/converters.py deleted file mode 100644 index 33f22f7..0000000 --- a/venv/Lib/site-packages/MySQLdb/converters.py +++ /dev/null @@ -1,139 +0,0 @@ -"""MySQLdb type conversion module - -This module handles all the type conversions for MySQL. If the default -type conversions aren't what you need, you can make your own. The -dictionary conversions maps some kind of type to a conversion function -which returns the corresponding value: - -Key: FIELD_TYPE.* (from MySQLdb.constants) - -Conversion function: - - Arguments: string - - Returns: Python object - -Key: Python type object (from types) or class - -Conversion function: - - Arguments: Python object of indicated type or class AND - conversion dictionary - - Returns: SQL literal value - - Notes: Most conversion functions can ignore the dictionary, but - it is a required parameter. It is necessary for converting - things like sequences and instances. - -Don't modify conversions if you can avoid it. Instead, make copies -(with the copy() method), modify the copies, and then pass them to -MySQL.connect(). -""" -from decimal import Decimal - -from MySQLdb._mysql import string_literal -from MySQLdb.constants import FIELD_TYPE, FLAG -from MySQLdb.times import ( - Date, - DateTimeType, - DateTime2literal, - DateTimeDeltaType, - DateTimeDelta2literal, - DateTime_or_None, - TimeDelta_or_None, - Date_or_None, -) -from MySQLdb._exceptions import ProgrammingError - -import array - -NoneType = type(None) - -try: - ArrayType = array.ArrayType -except AttributeError: - ArrayType = array.array - - -def Bool2Str(s, d): - return b"1" if s else b"0" - - -def Set2Str(s, d): - # Only support ascii string. Not tested. - return string_literal(",".join(s)) - - -def Thing2Str(s, d): - """Convert something into a string via str().""" - return str(s) - - -def Float2Str(o, d): - s = repr(o) - if s in ("inf", "nan"): - raise ProgrammingError("%s can not be used with MySQL" % s) - if "e" not in s: - s += "e0" - return s - - -def None2NULL(o, d): - """Convert None to NULL.""" - return b"NULL" - - -def Thing2Literal(o, d): - """Convert something into a SQL string literal. If using - MySQL-3.23 or newer, string_literal() is a method of the - _mysql.MYSQL object, and this function will be overridden with - that method when the connection is created.""" - return string_literal(o) - - -def Decimal2Literal(o, d): - return format(o, "f") - - -def array2Str(o, d): - return Thing2Literal(o.tostring(), d) - - -# bytes or str regarding to BINARY_FLAG. -_bytes_or_str = ((FLAG.BINARY, bytes), (None, str)) - -conversions = { - int: Thing2Str, - float: Float2Str, - NoneType: None2NULL, - ArrayType: array2Str, - bool: Bool2Str, - Date: Thing2Literal, - DateTimeType: DateTime2literal, - DateTimeDeltaType: DateTimeDelta2literal, - set: Set2Str, - Decimal: Decimal2Literal, - FIELD_TYPE.TINY: int, - FIELD_TYPE.SHORT: int, - FIELD_TYPE.LONG: int, - FIELD_TYPE.FLOAT: float, - FIELD_TYPE.DOUBLE: float, - FIELD_TYPE.DECIMAL: Decimal, - FIELD_TYPE.NEWDECIMAL: Decimal, - FIELD_TYPE.LONGLONG: int, - FIELD_TYPE.INT24: int, - FIELD_TYPE.YEAR: int, - FIELD_TYPE.TIMESTAMP: DateTime_or_None, - FIELD_TYPE.DATETIME: DateTime_or_None, - FIELD_TYPE.TIME: TimeDelta_or_None, - FIELD_TYPE.DATE: Date_or_None, - FIELD_TYPE.TINY_BLOB: bytes, - FIELD_TYPE.MEDIUM_BLOB: bytes, - FIELD_TYPE.LONG_BLOB: bytes, - FIELD_TYPE.BLOB: bytes, - FIELD_TYPE.STRING: bytes, - FIELD_TYPE.VAR_STRING: bytes, - FIELD_TYPE.VARCHAR: bytes, - FIELD_TYPE.JSON: bytes, -} diff --git a/venv/Lib/site-packages/MySQLdb/cursors.py b/venv/Lib/site-packages/MySQLdb/cursors.py deleted file mode 100644 index f8a4864..0000000 --- a/venv/Lib/site-packages/MySQLdb/cursors.py +++ /dev/null @@ -1,489 +0,0 @@ -"""MySQLdb Cursors - -This module implements Cursors of various types for MySQLdb. By -default, MySQLdb uses the Cursor class. -""" -import re - -from ._exceptions import ProgrammingError - - -#: Regular expression for :meth:`Cursor.executemany`. -#: executemany only supports simple bulk insert. -#: You can use it to load large dataset. -RE_INSERT_VALUES = re.compile( - "".join( - [ - r"\s*((?:INSERT|REPLACE)\b.+\bVALUES?\s*)", - r"(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))", - r"(\s*(?:ON DUPLICATE.*)?);?\s*\Z", - ] - ), - re.IGNORECASE | re.DOTALL, -) - - -class BaseCursor: - """A base for Cursor classes. Useful attributes: - - description - A tuple of DB API 7-tuples describing the columns in - the last executed query; see PEP-249 for details. - - description_flags - Tuple of column flags for last query, one entry per column - in the result set. Values correspond to those in - MySQLdb.constants.FLAG. See MySQL documentation (C API) - for more information. Non-standard extension. - - arraysize - default number of rows fetchmany() will fetch - """ - - #: Max statement size which :meth:`executemany` generates. - #: - #: Max size of allowed statement is max_allowed_packet - packet_header_size. - #: Default value of max_allowed_packet is 1048576. - max_stmt_length = 64 * 1024 - - from ._exceptions import ( - MySQLError, - Warning, - Error, - InterfaceError, - DatabaseError, - DataError, - OperationalError, - IntegrityError, - InternalError, - ProgrammingError, - NotSupportedError, - ) - - connection = None - - def __init__(self, connection): - self.connection = connection - self.description = None - self.description_flags = None - self.rowcount = -1 - self.arraysize = 1 - self._executed = None - - self.lastrowid = None - self._result = None - self.rownumber = None - self._rows = None - - def close(self): - """Close the cursor. No further queries will be possible.""" - try: - if self.connection is None: - return - while self.nextset(): - pass - finally: - self.connection = None - self._result = None - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - del exc_info - self.close() - - def _escape_args(self, args, conn): - encoding = conn.encoding - literal = conn.literal - - def ensure_bytes(x): - if isinstance(x, str): - return x.encode(encoding) - elif isinstance(x, tuple): - return tuple(map(ensure_bytes, x)) - elif isinstance(x, list): - return list(map(ensure_bytes, x)) - return x - - if isinstance(args, (tuple, list)): - ret = tuple(literal(ensure_bytes(arg)) for arg in args) - elif isinstance(args, dict): - ret = { - ensure_bytes(key): literal(ensure_bytes(val)) - for (key, val) in args.items() - } - else: - # If it's not a dictionary let's try escaping it anyways. - # Worst case it will throw a Value error - ret = literal(ensure_bytes(args)) - - ensure_bytes = None # break circular reference - return ret - - def _check_executed(self): - if not self._executed: - raise ProgrammingError("execute() first") - - def nextset(self): - """Advance to the next result set. - - Returns None if there are no more result sets. - """ - if self._executed: - self.fetchall() - - db = self._get_db() - nr = db.next_result() - if nr == -1: - return None - self._do_get_result(db) - self._post_get_result() - return 1 - - def _do_get_result(self, db): - self._result = result = self._get_result() - if result is None: - self.description = self.description_flags = None - else: - self.description = result.describe() - self.description_flags = result.field_flags() - - self.rowcount = db.affected_rows() - self.rownumber = 0 - self.lastrowid = db.insert_id() - - def _post_get_result(self): - pass - - def setinputsizes(self, *args): - """Does nothing, required by DB API.""" - - def setoutputsizes(self, *args): - """Does nothing, required by DB API.""" - - def _get_db(self): - con = self.connection - if con is None: - raise ProgrammingError("cursor closed") - return con - - def execute(self, query, args=None): - """Execute a query. - - query -- string, query to execute on server - args -- optional sequence or mapping, parameters to use with query. - - Note: If args is a sequence, then %s must be used as the - parameter placeholder in the query. If a mapping is used, - %(key)s must be used as the placeholder. - - Returns integer represents rows affected, if any - """ - while self.nextset(): - pass - db = self._get_db() - - if isinstance(query, str): - query = query.encode(db.encoding) - - if args is not None: - if isinstance(args, dict): - nargs = {} - for key, item in args.items(): - if isinstance(key, str): - key = key.encode(db.encoding) - nargs[key] = db.literal(item) - args = nargs - else: - args = tuple(map(db.literal, args)) - try: - query = query % args - except TypeError as m: - raise ProgrammingError(str(m)) - - assert isinstance(query, (bytes, bytearray)) - res = self._query(query) - return res - - def executemany(self, query, args): - # type: (str, list) -> int - """Execute a multi-row query. - - :param query: query to execute on server - :param args: Sequence of sequences or mappings. It is used as parameter. - :return: Number of rows affected, if any. - - This method improves performance on multiple-row INSERT and - REPLACE. Otherwise it is equivalent to looping over args with - execute(). - """ - if not args: - return - - m = RE_INSERT_VALUES.match(query) - if m: - q_prefix = m.group(1) % () - q_values = m.group(2).rstrip() - q_postfix = m.group(3) or "" - assert q_values[0] == "(" and q_values[-1] == ")" - return self._do_execute_many( - q_prefix, - q_values, - q_postfix, - args, - self.max_stmt_length, - self._get_db().encoding, - ) - - self.rowcount = sum(self.execute(query, arg) for arg in args) - return self.rowcount - - def _do_execute_many( - self, prefix, values, postfix, args, max_stmt_length, encoding - ): - conn = self._get_db() - escape = self._escape_args - if isinstance(prefix, str): - prefix = prefix.encode(encoding) - if isinstance(values, str): - values = values.encode(encoding) - if isinstance(postfix, str): - postfix = postfix.encode(encoding) - sql = bytearray(prefix) - args = iter(args) - v = values % escape(next(args), conn) - sql += v - rows = 0 - for arg in args: - v = values % escape(arg, conn) - if len(sql) + len(v) + len(postfix) + 1 > max_stmt_length: - rows += self.execute(sql + postfix) - sql = bytearray(prefix) - else: - sql += b"," - sql += v - rows += self.execute(sql + postfix) - self.rowcount = rows - return rows - - def callproc(self, procname, args=()): - """Execute stored procedure procname with args - - procname -- string, name of procedure to execute on server - - args -- Sequence of parameters to use with procedure - - Returns the original args. - - Compatibility warning: PEP-249 specifies that any modified - parameters must be returned. This is currently impossible - as they are only available by storing them in a server - variable and then retrieved by a query. Since stored - procedures return zero or more result sets, there is no - reliable way to get at OUT or INOUT parameters via callproc. - The server variables are named @_procname_n, where procname - is the parameter above and n is the position of the parameter - (from zero). Once all result sets generated by the procedure - have been fetched, you can issue a SELECT @_procname_0, ... - query using .execute() to get any OUT or INOUT values. - - Compatibility warning: The act of calling a stored procedure - itself creates an empty result set. This appears after any - result sets generated by the procedure. This is non-standard - behavior with respect to the DB-API. Be sure to use nextset() - to advance through all result sets; otherwise you may get - disconnected. - """ - db = self._get_db() - if isinstance(procname, str): - procname = procname.encode(db.encoding) - if args: - fmt = b"@_" + procname + b"_%d=%s" - q = b"SET %s" % b",".join( - fmt % (index, db.literal(arg)) for index, arg in enumerate(args) - ) - self._query(q) - self.nextset() - - q = b"CALL %s(%s)" % ( - procname, - b",".join([b"@_%s_%d" % (procname, i) for i in range(len(args))]), - ) - self._query(q) - return args - - def _query(self, q): - db = self._get_db() - self._result = None - db.query(q) - self._do_get_result(db) - self._post_get_result() - self._executed = q - return self.rowcount - - def _fetch_row(self, size=1): - if not self._result: - return () - return self._result.fetch_row(size, self._fetch_type) - - def __iter__(self): - return iter(self.fetchone, None) - - Warning = Warning - Error = Error - InterfaceError = InterfaceError - DatabaseError = DatabaseError - DataError = DataError - OperationalError = OperationalError - IntegrityError = IntegrityError - InternalError = InternalError - ProgrammingError = ProgrammingError - NotSupportedError = NotSupportedError - - -class CursorStoreResultMixIn: - """This is a MixIn class which causes the entire result set to be - stored on the client side, i.e. it uses mysql_store_result(). If the - result set can be very large, consider adding a LIMIT clause to your - query, or using CursorUseResultMixIn instead.""" - - def _get_result(self): - return self._get_db().store_result() - - def _post_get_result(self): - self._rows = self._fetch_row(0) - self._result = None - - def fetchone(self): - """Fetches a single row from the cursor. None indicates that - no more rows are available.""" - self._check_executed() - if self.rownumber >= len(self._rows): - return None - result = self._rows[self.rownumber] - self.rownumber = self.rownumber + 1 - return result - - def fetchmany(self, size=None): - """Fetch up to size rows from the cursor. Result set may be smaller - than size. If size is not defined, cursor.arraysize is used.""" - self._check_executed() - end = self.rownumber + (size or self.arraysize) - result = self._rows[self.rownumber : end] - self.rownumber = min(end, len(self._rows)) - return result - - def fetchall(self): - """Fetches all available rows from the cursor.""" - self._check_executed() - if self.rownumber: - result = self._rows[self.rownumber :] - else: - result = self._rows - self.rownumber = len(self._rows) - return result - - def scroll(self, value, mode="relative"): - """Scroll the cursor in the result set to a new position according - to mode. - - If mode is 'relative' (default), value is taken as offset to - the current position in the result set, if set to 'absolute', - value states an absolute target position.""" - self._check_executed() - if mode == "relative": - r = self.rownumber + value - elif mode == "absolute": - r = value - else: - raise ProgrammingError("unknown scroll mode %s" % repr(mode)) - if r < 0 or r >= len(self._rows): - raise IndexError("out of range") - self.rownumber = r - - def __iter__(self): - self._check_executed() - result = self.rownumber and self._rows[self.rownumber :] or self._rows - return iter(result) - - -class CursorUseResultMixIn: - - """This is a MixIn class which causes the result set to be stored - in the server and sent row-by-row to client side, i.e. it uses - mysql_use_result(). You MUST retrieve the entire result set and - close() the cursor before additional queries can be performed on - the connection.""" - - def _get_result(self): - return self._get_db().use_result() - - def fetchone(self): - """Fetches a single row from the cursor.""" - self._check_executed() - r = self._fetch_row(1) - if not r: - return None - self.rownumber = self.rownumber + 1 - return r[0] - - def fetchmany(self, size=None): - """Fetch up to size rows from the cursor. Result set may be smaller - than size. If size is not defined, cursor.arraysize is used.""" - self._check_executed() - r = self._fetch_row(size or self.arraysize) - self.rownumber = self.rownumber + len(r) - return r - - def fetchall(self): - """Fetches all available rows from the cursor.""" - self._check_executed() - r = self._fetch_row(0) - self.rownumber = self.rownumber + len(r) - return r - - def __iter__(self): - return self - - def next(self): - row = self.fetchone() - if row is None: - raise StopIteration - return row - - __next__ = next - - -class CursorTupleRowsMixIn: - """This is a MixIn class that causes all rows to be returned as tuples, - which is the standard form required by DB API.""" - - _fetch_type = 0 - - -class CursorDictRowsMixIn: - """This is a MixIn class that causes all rows to be returned as - dictionaries. This is a non-standard feature.""" - - _fetch_type = 1 - - -class Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn, BaseCursor): - """This is the standard Cursor class that returns rows as tuples - and stores the result set in the client.""" - - -class DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn, BaseCursor): - """This is a Cursor class that returns rows as dictionaries and - stores the result set in the client.""" - - -class SSCursor(CursorUseResultMixIn, CursorTupleRowsMixIn, BaseCursor): - """This is a Cursor class that returns rows as tuples and stores - the result set in the server.""" - - -class SSDictCursor(CursorUseResultMixIn, CursorDictRowsMixIn, BaseCursor): - """This is a Cursor class that returns rows as dictionaries and - stores the result set in the server.""" diff --git a/venv/Lib/site-packages/MySQLdb/release.py b/venv/Lib/site-packages/MySQLdb/release.py deleted file mode 100644 index 38b522c..0000000 --- a/venv/Lib/site-packages/MySQLdb/release.py +++ /dev/null @@ -1,4 +0,0 @@ - -__author__ = "Inada Naoki " -version_info = (2,1,0,'final',0) -__version__ = "2.1.0" diff --git a/venv/Lib/site-packages/MySQLdb/times.py b/venv/Lib/site-packages/MySQLdb/times.py deleted file mode 100644 index 915d827..0000000 --- a/venv/Lib/site-packages/MySQLdb/times.py +++ /dev/null @@ -1,150 +0,0 @@ -"""times module - -This module provides some Date and Time classes for dealing with MySQL data. - -Use Python datetime module to handle date and time columns. -""" -from time import localtime -from datetime import date, datetime, time, timedelta -from MySQLdb._mysql import string_literal - -Date = date -Time = time -TimeDelta = timedelta -Timestamp = datetime - -DateTimeDeltaType = timedelta -DateTimeType = datetime - - -def DateFromTicks(ticks): - """Convert UNIX ticks into a date instance.""" - return date(*localtime(ticks)[:3]) - - -def TimeFromTicks(ticks): - """Convert UNIX ticks into a time instance.""" - return time(*localtime(ticks)[3:6]) - - -def TimestampFromTicks(ticks): - """Convert UNIX ticks into a datetime instance.""" - return datetime(*localtime(ticks)[:6]) - - -format_TIME = format_DATE = str - - -def format_TIMEDELTA(v): - seconds = int(v.seconds) % 60 - minutes = int(v.seconds // 60) % 60 - hours = int(v.seconds // 3600) % 24 - return "%d %d:%d:%d" % (v.days, hours, minutes, seconds) - - -def format_TIMESTAMP(d): - """ - :type d: datetime.datetime - """ - if d.microsecond: - fmt = " ".join( - [ - "{0.year:04}-{0.month:02}-{0.day:02}", - "{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}", - ] - ) - else: - fmt = " ".join( - [ - "{0.year:04}-{0.month:02}-{0.day:02}", - "{0.hour:02}:{0.minute:02}:{0.second:02}", - ] - ) - return fmt.format(d) - - -def DateTime_or_None(s): - try: - if len(s) < 11: - return Date_or_None(s) - - micros = s[20:] - - if len(micros) == 0: - # 12:00:00 - micros = 0 - elif len(micros) < 7: - # 12:00:00.123456 - micros = int(micros) * 10 ** (6 - len(micros)) - else: - return None - - return datetime( - int(s[:4]), # year - int(s[5:7]), # month - int(s[8:10]), # day - int(s[11:13] or 0), # hour - int(s[14:16] or 0), # minute - int(s[17:19] or 0), # second - micros, # microsecond - ) - except ValueError: - return None - - -def TimeDelta_or_None(s): - try: - h, m, s = s.split(":") - if "." in s: - s, ms = s.split(".") - ms = ms.ljust(6, "0") - else: - ms = 0 - if h[0] == "-": - negative = True - else: - negative = False - h, m, s, ms = abs(int(h)), int(m), int(s), int(ms) - td = timedelta(hours=h, minutes=m, seconds=s, microseconds=ms) - if negative: - return -td - else: - return td - except ValueError: - # unpacking or int/float conversion failed - return None - - -def Time_or_None(s): - try: - h, m, s = s.split(":") - if "." in s: - s, ms = s.split(".") - ms = ms.ljust(6, "0") - else: - ms = 0 - h, m, s, ms = int(h), int(m), int(s), int(ms) - return time(hour=h, minute=m, second=s, microsecond=ms) - except ValueError: - return None - - -def Date_or_None(s): - try: - return date( - int(s[:4]), - int(s[5:7]), - int(s[8:10]), - ) # year # month # day - except ValueError: - return None - - -def DateTime2literal(d, c): - """Format a DateTime object as an ISO timestamp.""" - return string_literal(format_TIMESTAMP(d)) - - -def DateTimeDelta2literal(d, c): - """Format a DateTimeDelta object as a time.""" - return string_literal(format_TIMEDELTA(d)) diff --git a/venv/Lib/site-packages/PIL/BdfFontFile.py b/venv/Lib/site-packages/PIL/BdfFontFile.py deleted file mode 100644 index 102b72e..0000000 --- a/venv/Lib/site-packages/PIL/BdfFontFile.py +++ /dev/null @@ -1,110 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# bitmap distribution font (bdf) file parser -# -# history: -# 1996-05-16 fl created (as bdf2pil) -# 1997-08-25 fl converted to FontFile driver -# 2001-05-25 fl removed bogus __init__ call -# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) -# 2003-04-22 fl more robustification (from Graham Dumpleton) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -Parse X Bitmap Distribution Format (BDF) -""" - - -from . import FontFile, Image - -bdf_slant = { - "R": "Roman", - "I": "Italic", - "O": "Oblique", - "RI": "Reverse Italic", - "RO": "Reverse Oblique", - "OT": "Other", -} - -bdf_spacing = {"P": "Proportional", "M": "Monospaced", "C": "Cell"} - - -def bdf_char(f): - # skip to STARTCHAR - while True: - s = f.readline() - if not s: - return None - if s[:9] == b"STARTCHAR": - break - id = s[9:].strip().decode("ascii") - - # load symbol properties - props = {} - while True: - s = f.readline() - if not s or s[:6] == b"BITMAP": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - - # load bitmap - bitmap = [] - while True: - s = f.readline() - if not s or s[:7] == b"ENDCHAR": - break - bitmap.append(s[:-1]) - bitmap = b"".join(bitmap) - - [x, y, l, d] = [int(p) for p in props["BBX"].split()] - [dx, dy] = [int(p) for p in props["DWIDTH"].split()] - - bbox = (dx, dy), (l, -d - y, x + l, -d), (0, 0, x, y) - - try: - im = Image.frombytes("1", (x, y), bitmap, "hex", "1") - except ValueError: - # deal with zero-width characters - im = Image.new("1", (x, y)) - - return id, int(props["ENCODING"]), bbox, im - - -class BdfFontFile(FontFile.FontFile): - """Font file plugin for the X11 BDF format.""" - - def __init__(self, fp): - super().__init__() - - s = fp.readline() - if s[:13] != b"STARTFONT 2.1": - raise SyntaxError("not a valid BDF file") - - props = {} - comments = [] - - while True: - s = fp.readline() - if not s or s[:13] == b"ENDPROPERTIES": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - if s[:i] in [b"COMMENT", b"COPYRIGHT"]: - if s.find(b"LogicalFontDescription") < 0: - comments.append(s[i + 1 : -1].decode("ascii")) - - while True: - c = bdf_char(fp) - if not c: - break - id, ch, (xy, dst, src), im = c - if 0 <= ch < len(self.glyph): - self.glyph[ch] = xy, dst, src, im diff --git a/venv/Lib/site-packages/PIL/BlpImagePlugin.py b/venv/Lib/site-packages/PIL/BlpImagePlugin.py deleted file mode 100644 index ecd3da5..0000000 --- a/venv/Lib/site-packages/PIL/BlpImagePlugin.py +++ /dev/null @@ -1,497 +0,0 @@ -""" -Blizzard Mipmap Format (.blp) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -BLP1 files, used mostly in Warcraft III, are not fully supported. -All types of BLP2 files used in World of Warcraft are supported. - -The BLP file structure consists of a header, up to 16 mipmaps of the -texture - -Texture sizes must be powers of two, though the two dimensions do -not have to be equal; 512x256 is valid, but 512x200 is not. -The first mipmap (mipmap #0) is the full size image; each subsequent -mipmap halves both dimensions. The final mipmap should be 1x1. - -BLP files come in many different flavours: -* JPEG-compressed (type == 0) - only supported for BLP1. -* RAW images (type == 1, encoding == 1). Each mipmap is stored as an - array of 8-bit values, one per pixel, left to right, top to bottom. - Each value is an index to the palette. -* DXT-compressed (type == 1, encoding == 2): -- DXT1 compression is used if alpha_encoding == 0. - - An additional alpha bit is used if alpha_depth == 1. - - DXT3 compression is used if alpha_encoding == 1. - - DXT5 compression is used if alpha_encoding == 7. -""" - -import os -import struct -import warnings -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile - - -class Format(IntEnum): - JPEG = 0 - - -class Encoding(IntEnum): - UNCOMPRESSED = 1 - DXT = 2 - UNCOMPRESSED_RAW_BGRA = 3 - - -class AlphaEncoding(IntEnum): - DXT1 = 0 - DXT3 = 1 - DXT5 = 7 - - -def __getattr__(name): - deprecated = "deprecated and will be removed in Pillow 10 (2023-07-01). " - for enum, prefix in { - Format: "BLP_FORMAT_", - Encoding: "BLP_ENCODING_", - AlphaEncoding: "BLP_ALPHA_ENCODING_", - }.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - warnings.warn( - prefix - + name - + " is " - + deprecated - + "Use " - + enum.__name__ - + "." - + name - + " instead.", - DeprecationWarning, - stacklevel=2, - ) - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -def unpack_565(i): - return (((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3) - - -def decode_dxt1(data, alpha=False): - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 8 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - # Decode next 8-byte block. - idx = block * 8 - color0, color1, bits = struct.unpack_from("> 2 - - a = 0xFF - if control == 0: - r, g, b = r0, g0, b0 - elif control == 1: - r, g, b = r1, g1, b1 - elif control == 2: - if color0 > color1: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - else: - r = (r0 + r1) // 2 - g = (g0 + g1) // 2 - b = (b0 + b1) // 2 - elif control == 3: - if color0 > color1: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - else: - r, g, b, a = 0, 0, 0, 0 - - if alpha: - ret[j].extend([r, g, b, a]) - else: - ret[j].extend([r, g, b]) - - return ret - - -def decode_dxt3(data): - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - idx = block * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - bits = struct.unpack_from("<8B", block) - color0, color1 = struct.unpack_from(">= 4 - else: - high = True - a &= 0xF - a *= 17 # We get a value between 0 and 15 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -def decode_dxt5(data): - """ - input: one "row" of data (i.e. will produce 4 * width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block in range(blocks): - idx = block * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 - elif alphacode_index == 15: - alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) - else: # alphacode_index >= 18 and alphacode_index <= 45 - alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 - - if alphacode == 0: - a = a0 - elif alphacode == 1: - a = a1 - elif a0 > a1: - a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 - elif alphacode == 6: - a = 0 - elif alphacode == 7: - a = 255 - else: - a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -class BLPFormatError(NotImplementedError): - pass - - -def _accept(prefix): - return prefix[:4] in (b"BLP1", b"BLP2") - - -class BlpImageFile(ImageFile.ImageFile): - """ - Blizzard Mipmap Format - """ - - format = "BLP" - format_description = "Blizzard Mipmap Format" - - def _open(self): - self.magic = self.fp.read(4) - - self.fp.seek(5, os.SEEK_CUR) - (self._blp_alpha_depth,) = struct.unpack(" mode, rawmode - 1: ("P", "P;1"), - 4: ("P", "P;4"), - 8: ("P", "P"), - 16: ("RGB", "BGR;15"), - 24: ("RGB", "BGR"), - 32: ("RGB", "BGRX"), -} - - -def _accept(prefix): - return prefix[:2] == b"BM" - - -def _dib_accept(prefix): - return i32(prefix) in [12, 40, 64, 108, 124] - - -# ============================================================================= -# Image plugin for the Windows BMP format. -# ============================================================================= -class BmpImageFile(ImageFile.ImageFile): - """Image plugin for the Windows Bitmap format (BMP)""" - - # ------------------------------------------------------------- Description - format_description = "Windows Bitmap" - format = "BMP" - - # -------------------------------------------------- BMP Compression values - COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} - for k, v in COMPRESSIONS.items(): - vars()[k] = v - - def _bitmap(self, header=0, offset=0): - """Read relevant info about the BMP""" - read, seek = self.fp.read, self.fp.seek - if header: - seek(header) - file_info = {} - # read bmp header size @offset 14 (this is part of the header size) - file_info["header_size"] = i32(read(4)) - file_info["direction"] = -1 - - # -------------------- If requested, read header at a specific position - # read the rest of the bmp header, without its size - header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) - - # -------------------------------------------------- IBM OS/2 Bitmap v1 - # ----- This format has different offsets because of width/height types - if file_info["header_size"] == 12: - file_info["width"] = i16(header_data, 0) - file_info["height"] = i16(header_data, 2) - file_info["planes"] = i16(header_data, 4) - file_info["bits"] = i16(header_data, 6) - file_info["compression"] = self.RAW - file_info["palette_padding"] = 3 - - # --------------------------------------------- Windows Bitmap v2 to v5 - # v3, OS/2 v2, v4, v5 - elif file_info["header_size"] in (40, 64, 108, 124): - file_info["y_flip"] = header_data[7] == 0xFF - file_info["direction"] = 1 if file_info["y_flip"] else -1 - file_info["width"] = i32(header_data, 0) - file_info["height"] = ( - i32(header_data, 4) - if not file_info["y_flip"] - else 2**32 - i32(header_data, 4) - ) - file_info["planes"] = i16(header_data, 8) - file_info["bits"] = i16(header_data, 10) - file_info["compression"] = i32(header_data, 12) - # byte size of pixel data - file_info["data_size"] = i32(header_data, 16) - file_info["pixels_per_meter"] = ( - i32(header_data, 20), - i32(header_data, 24), - ) - file_info["colors"] = i32(header_data, 28) - file_info["palette_padding"] = 4 - self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) - if file_info["compression"] == self.BITFIELDS: - if len(header_data) >= 52: - for idx, mask in enumerate( - ["r_mask", "g_mask", "b_mask", "a_mask"] - ): - file_info[mask] = i32(header_data, 36 + idx * 4) - else: - # 40 byte headers only have the three components in the - # bitfields masks, ref: - # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx - # See also - # https://github.com/python-pillow/Pillow/issues/1293 - # There is a 4th component in the RGBQuad, in the alpha - # location, but it is listed as a reserved component, - # and it is not generally an alpha channel - file_info["a_mask"] = 0x0 - for mask in ["r_mask", "g_mask", "b_mask"]: - file_info[mask] = i32(read(4)) - file_info["rgb_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - ) - file_info["rgba_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - file_info["a_mask"], - ) - else: - raise OSError(f"Unsupported BMP header type ({file_info['header_size']})") - - # ------------------ Special case : header is reported 40, which - # ---------------------- is shorter than real size for bpp >= 16 - self._size = file_info["width"], file_info["height"] - - # ------- If color count was not found in the header, compute from bits - file_info["colors"] = ( - file_info["colors"] - if file_info.get("colors", 0) - else (1 << file_info["bits"]) - ) - if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: - offset += 4 * file_info["colors"] - - # ---------------------- Check bit depth for unusual unsupported values - self.mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None)) - if self.mode is None: - raise OSError(f"Unsupported BMP pixel depth ({file_info['bits']})") - - # ---------------- Process BMP with Bitfields compression (not palette) - decoder_name = "raw" - if file_info["compression"] == self.BITFIELDS: - SUPPORTED = { - 32: [ - (0xFF0000, 0xFF00, 0xFF, 0x0), - (0xFF0000, 0xFF00, 0xFF, 0xFF000000), - (0xFF, 0xFF00, 0xFF0000, 0xFF000000), - (0x0, 0x0, 0x0, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0x0), - ], - 24: [(0xFF0000, 0xFF00, 0xFF)], - 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], - } - MASK_MODES = { - (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", - (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", - (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", - (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", - (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", - (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", - (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", - } - if file_info["bits"] in SUPPORTED: - if ( - file_info["bits"] == 32 - and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] - ): - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] - self.mode = "RGBA" if "A" in raw_mode else self.mode - elif ( - file_info["bits"] in (24, 16) - and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] - ): - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] - else: - raise OSError("Unsupported BMP bitfields layout") - else: - raise OSError("Unsupported BMP bitfields layout") - elif file_info["compression"] == self.RAW: - if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset - raw_mode, self.mode = "BGRA", "RGBA" - elif file_info["compression"] == self.RLE8: - decoder_name = "bmp_rle" - else: - raise OSError(f"Unsupported BMP compression ({file_info['compression']})") - - # --------------- Once the header is processed, process the palette/LUT - if self.mode == "P": # Paletted for 1, 4 and 8 bit images - - # ---------------------------------------------------- 1-bit images - if not (0 < file_info["colors"] <= 65536): - raise OSError(f"Unsupported BMP Palette size ({file_info['colors']})") - else: - padding = file_info["palette_padding"] - palette = read(padding * file_info["colors"]) - greyscale = True - indices = ( - (0, 255) - if file_info["colors"] == 2 - else list(range(file_info["colors"])) - ) - - # ----------------- Check if greyscale and ignore palette if so - for ind, val in enumerate(indices): - rgb = palette[ind * padding : ind * padding + 3] - if rgb != o8(val) * 3: - greyscale = False - - # ------- If all colors are grey, white or black, ditch palette - if greyscale: - self.mode = "1" if file_info["colors"] == 2 else "L" - raw_mode = self.mode - else: - self.mode = "P" - self.palette = ImagePalette.raw( - "BGRX" if padding == 4 else "BGR", palette - ) - - # ---------------------------- Finally set the tile data for the plugin - self.info["compression"] = file_info["compression"] - self.tile = [ - ( - decoder_name, - (0, 0, file_info["width"], file_info["height"]), - offset or self.fp.tell(), - ( - raw_mode, - ((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3), - file_info["direction"], - ), - ) - ] - - def _open(self): - """Open file, check magic number and read header""" - # read 14 bytes: magic number, filesize, reserved, header final offset - head_data = self.fp.read(14) - # choke if the file does not have the required magic bytes - if not _accept(head_data): - raise SyntaxError("Not a BMP file") - # read the start position of the BMP image data (u32) - offset = i32(head_data, 10) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) - - -class BmpRleDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - data = bytearray() - x = 0 - while len(data) < self.state.xsize * self.state.ysize: - pixels = self.fd.read(1) - byte = self.fd.read(1) - if not pixels or not byte: - break - num_pixels = pixels[0] - if num_pixels: - # encoded mode - if x + num_pixels > self.state.xsize: - # Too much data for row - num_pixels = max(0, self.state.xsize - x) - data += byte * num_pixels - x += num_pixels - else: - if byte[0] == 0: - # end of line - while len(data) % self.state.xsize != 0: - data += b"\x00" - x = 0 - elif byte[0] == 1: - # end of bitmap - break - elif byte[0] == 2: - # delta - bytes_read = self.fd.read(2) - if len(bytes_read) < 2: - break - right, up = self.fd.read(2) - data += b"\x00" * (right + up * self.state.xsize) - x = len(data) % self.state.xsize - else: - # absolute mode - bytes_read = self.fd.read(byte[0]) - data += bytes_read - if len(bytes_read) < byte[0]: - break - x += byte[0] - - # align to 16-bit word boundary - if self.fd.tell() % 2 != 0: - self.fd.seek(1, os.SEEK_CUR) - self.set_as_raw(bytes(data), ("P", 0, self.args[-1])) - return -1, 0 - - -# ============================================================================= -# Image plugin for the DIB format (BMP alias) -# ============================================================================= -class DibImageFile(BmpImageFile): - - format = "DIB" - format_description = "Windows Bitmap" - - def _open(self): - self._bitmap() - - -# -# -------------------------------------------------------------------- -# Write BMP file - - -SAVE = { - "1": ("1", 1, 2), - "L": ("L", 8, 256), - "P": ("P", 8, 256), - "RGB": ("BGR", 24, 0), - "RGBA": ("BGRA", 32, 0), -} - - -def _dib_save(im, fp, filename): - _save(im, fp, filename, False) - - -def _save(im, fp, filename, bitmap_header=True): - try: - rawmode, bits, colors = SAVE[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as BMP") from e - - info = im.encoderinfo - - dpi = info.get("dpi", (96, 96)) - - # 1 meter == 39.3701 inches - ppm = tuple(map(lambda x: int(x * 39.3701 + 0.5), dpi)) - - stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) - header = 40 # or 64 for OS/2 version 2 - image = stride * im.size[1] - - # bitmap header - if bitmap_header: - offset = 14 + header + colors * 4 - file_size = offset + image - if file_size > 2**32 - 1: - raise ValueError("File size is too large for the BMP format") - fp.write( - b"BM" # file type (magic) - + o32(file_size) # file size - + o32(0) # reserved - + o32(offset) # image data offset - ) - - # bitmap info header - fp.write( - o32(header) # info header size - + o32(im.size[0]) # width - + o32(im.size[1]) # height - + o16(1) # planes - + o16(bits) # depth - + o32(0) # compression (0=uncompressed) - + o32(image) # size of bitmap - + o32(ppm[0]) # resolution - + o32(ppm[1]) # resolution - + o32(colors) # colors used - + o32(colors) # colors important - ) - - fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) - - if im.mode == "1": - for i in (0, 255): - fp.write(o8(i) * 4) - elif im.mode == "L": - for i in range(256): - fp.write(o8(i) * 4) - elif im.mode == "P": - fp.write(im.im.getpalette("RGB", "BGRX")) - - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))]) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(BmpImageFile.format, BmpImageFile, _accept) -Image.register_save(BmpImageFile.format, _save) - -Image.register_extension(BmpImageFile.format, ".bmp") - -Image.register_mime(BmpImageFile.format, "image/bmp") - -Image.register_decoder("bmp_rle", BmpRleDecoder) - -Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) -Image.register_save(DibImageFile.format, _dib_save) - -Image.register_extension(DibImageFile.format, ".dib") - -Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/venv/Lib/site-packages/PIL/BufrStubImagePlugin.py b/venv/Lib/site-packages/PIL/BufrStubImagePlugin.py deleted file mode 100644 index 9510f73..0000000 --- a/venv/Lib/site-packages/PIL/BufrStubImagePlugin.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# BUFR stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific BUFR image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" - - -class BufrStubImageFile(ImageFile.StubImageFile): - - format = "BUFR" - format_description = "BUFR" - - def _open(self): - - offset = self.fp.tell() - - if not _accept(self.fp.read(4)): - raise SyntaxError("Not a BUFR file") - - self.fp.seek(offset) - - # make something up - self.mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("BUFR save handler not installed") - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) -Image.register_save(BufrStubImageFile.format, _save) - -Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/venv/Lib/site-packages/PIL/ContainerIO.py b/venv/Lib/site-packages/PIL/ContainerIO.py deleted file mode 100644 index 45e80b3..0000000 --- a/venv/Lib/site-packages/PIL/ContainerIO.py +++ /dev/null @@ -1,120 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a class to read from a container file -# -# History: -# 1995-06-18 fl Created -# 1995-09-07 fl Added readline(), readlines() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -import io - - -class ContainerIO: - """ - A file object that provides read access to a part of an existing - file (for example a TAR file). - """ - - def __init__(self, file, offset, length): - """ - Create file object. - - :param file: Existing file. - :param offset: Start of region, in bytes. - :param length: Size of region, in bytes. - """ - self.fh = file - self.pos = 0 - self.offset = offset - self.length = length - self.fh.seek(offset) - - ## - # Always false. - - def isatty(self): - return False - - def seek(self, offset, mode=io.SEEK_SET): - """ - Move file pointer. - - :param offset: Offset in bytes. - :param mode: Starting position. Use 0 for beginning of region, 1 - for current offset, and 2 for end of region. You cannot move - the pointer outside the defined region. - """ - if mode == 1: - self.pos = self.pos + offset - elif mode == 2: - self.pos = self.length + offset - else: - self.pos = offset - # clamp - self.pos = max(0, min(self.pos, self.length)) - self.fh.seek(self.offset + self.pos) - - def tell(self): - """ - Get current file pointer. - - :returns: Offset from start of region, in bytes. - """ - return self.pos - - def read(self, n=0): - """ - Read data. - - :param n: Number of bytes to read. If omitted or zero, - read until end of region. - :returns: An 8-bit string. - """ - if n: - n = min(n, self.length - self.pos) - else: - n = self.length - self.pos - if not n: # EOF - return b"" if "b" in self.fh.mode else "" - self.pos = self.pos + n - return self.fh.read(n) - - def readline(self): - """ - Read a line of text. - - :returns: An 8-bit string. - """ - s = b"" if "b" in self.fh.mode else "" - newline_character = b"\n" if "b" in self.fh.mode else "\n" - while True: - c = self.read(1) - if not c: - break - s = s + c - if c == newline_character: - break - return s - - def readlines(self): - """ - Read multiple lines of text. - - :returns: A list of 8-bit strings. - """ - lines = [] - while True: - s = self.readline() - if not s: - break - lines.append(s) - return lines diff --git a/venv/Lib/site-packages/PIL/CurImagePlugin.py b/venv/Lib/site-packages/PIL/CurImagePlugin.py deleted file mode 100644 index 42af5ca..0000000 --- a/venv/Lib/site-packages/PIL/CurImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Cursor support for PIL -# -# notes: -# uses BmpImagePlugin.py to read the bitmap data. -# -# history: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from . import BmpImagePlugin, Image -from ._binary import i16le as i16 -from ._binary import i32le as i32 - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:4] == b"\0\0\2\0" - - -## -# Image plugin for Windows Cursor files. - - -class CurImageFile(BmpImagePlugin.BmpImageFile): - - format = "CUR" - format_description = "Windows Cursor" - - def _open(self): - - offset = self.fp.tell() - - # check magic - s = self.fp.read(6) - if not _accept(s): - raise SyntaxError("not a CUR file") - - # pick the largest cursor in the file - m = b"" - for i in range(i16(s, 4)): - s = self.fp.read(16) - if not m: - m = s - elif s[0] > m[0] and s[1] > m[1]: - m = s - if not m: - raise TypeError("No cursors were found") - - # load as bitmap - self._bitmap(i32(m, 12) + offset) - - # patch up the bitmap height - self._size = self.size[0], self.size[1] // 2 - d, e, o, a = self.tile[0] - self.tile[0] = d, (0, 0) + self.size, o, a - - return - - -# -# -------------------------------------------------------------------- - -Image.register_open(CurImageFile.format, CurImageFile, _accept) - -Image.register_extension(CurImageFile.format, ".cur") diff --git a/venv/Lib/site-packages/PIL/DcxImagePlugin.py b/venv/Lib/site-packages/PIL/DcxImagePlugin.py deleted file mode 100644 index de21db8..0000000 --- a/venv/Lib/site-packages/PIL/DcxImagePlugin.py +++ /dev/null @@ -1,89 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# DCX file handling -# -# DCX is a container file format defined by Intel, commonly used -# for fax applications. Each DCX file consists of a directory -# (a list of file offsets) followed by a set of (usually 1-bit) -# PCX files. -# -# History: -# 1995-09-09 fl Created -# 1996-03-20 fl Properly derived from PcxImageFile. -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2002-07-30 fl Fixed file handling -# -# Copyright (c) 1997-98 by Secret Labs AB. -# Copyright (c) 1995-96 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -from . import Image -from ._binary import i32le as i32 -from .PcxImagePlugin import PcxImageFile - -MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? - - -def _accept(prefix): - return len(prefix) >= 4 and i32(prefix) == MAGIC - - -## -# Image plugin for the Intel DCX format. - - -class DcxImageFile(PcxImageFile): - - format = "DCX" - format_description = "Intel DCX" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # Header - s = self.fp.read(4) - if not _accept(s): - raise SyntaxError("not a DCX file") - - # Component directory - self._offset = [] - for i in range(1024): - offset = i32(self.fp.read(4)) - if not offset: - break - self._offset.append(offset) - - self.__fp = self.fp - self.frame = None - self.n_frames = len(self._offset) - self.is_animated = self.n_frames > 1 - self.seek(0) - - def seek(self, frame): - if not self._seek_check(frame): - return - self.frame = frame - self.fp = self.__fp - self.fp.seek(self._offset[frame]) - PcxImageFile._open(self) - - def tell(self): - return self.frame - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -Image.register_open(DcxImageFile.format, DcxImageFile, _accept) - -Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/venv/Lib/site-packages/PIL/DdsImagePlugin.py b/venv/Lib/site-packages/PIL/DdsImagePlugin.py deleted file mode 100644 index 3a04bdb..0000000 --- a/venv/Lib/site-packages/PIL/DdsImagePlugin.py +++ /dev/null @@ -1,249 +0,0 @@ -""" -A Pillow loader for .dds files (S3TC-compressed aka DXTC) -Jerome Leclanche - -Documentation: - https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ -""" - -import struct -from io import BytesIO - -from . import Image, ImageFile -from ._binary import o32le as o32 - -# Magic ("DDS ") -DDS_MAGIC = 0x20534444 - -# DDS flags -DDSD_CAPS = 0x1 -DDSD_HEIGHT = 0x2 -DDSD_WIDTH = 0x4 -DDSD_PITCH = 0x8 -DDSD_PIXELFORMAT = 0x1000 -DDSD_MIPMAPCOUNT = 0x20000 -DDSD_LINEARSIZE = 0x80000 -DDSD_DEPTH = 0x800000 - -# DDS caps -DDSCAPS_COMPLEX = 0x8 -DDSCAPS_TEXTURE = 0x1000 -DDSCAPS_MIPMAP = 0x400000 - -DDSCAPS2_CUBEMAP = 0x200 -DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 -DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 -DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 -DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 -DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 -DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 -DDSCAPS2_VOLUME = 0x200000 - -# Pixel Format -DDPF_ALPHAPIXELS = 0x1 -DDPF_ALPHA = 0x2 -DDPF_FOURCC = 0x4 -DDPF_PALETTEINDEXED8 = 0x20 -DDPF_RGB = 0x40 -DDPF_LUMINANCE = 0x20000 - - -# dds.h - -DDS_FOURCC = DDPF_FOURCC -DDS_RGB = DDPF_RGB -DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS -DDS_LUMINANCE = DDPF_LUMINANCE -DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS -DDS_ALPHA = DDPF_ALPHA -DDS_PAL8 = DDPF_PALETTEINDEXED8 - -DDS_HEADER_FLAGS_TEXTURE = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT -DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT -DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH -DDS_HEADER_FLAGS_PITCH = DDSD_PITCH -DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE - -DDS_HEIGHT = DDSD_HEIGHT -DDS_WIDTH = DDSD_WIDTH - -DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE -DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP -DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX - -DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX -DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX -DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY -DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY -DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ -DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ - - -# DXT1 -DXT1_FOURCC = 0x31545844 - -# DXT3 -DXT3_FOURCC = 0x33545844 - -# DXT5 -DXT5_FOURCC = 0x35545844 - - -# dxgiformat.h - -DXGI_FORMAT_R8G8B8A8_TYPELESS = 27 -DXGI_FORMAT_R8G8B8A8_UNORM = 28 -DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29 -DXGI_FORMAT_BC5_TYPELESS = 82 -DXGI_FORMAT_BC5_UNORM = 83 -DXGI_FORMAT_BC5_SNORM = 84 -DXGI_FORMAT_BC7_TYPELESS = 97 -DXGI_FORMAT_BC7_UNORM = 98 -DXGI_FORMAT_BC7_UNORM_SRGB = 99 - - -class DdsImageFile(ImageFile.ImageFile): - format = "DDS" - format_description = "DirectDraw Surface" - - def _open(self): - if not _accept(self.fp.read(4)): - raise SyntaxError("not a DDS file") - (header_size,) = struct.unpack(" 0: - s = fp.read(min(lengthfile, 100 * 1024)) - if not s: - break - lengthfile -= len(s) - f.write(s) - - device = "pngalpha" if transparency else "ppmraw" - - # Build Ghostscript command - command = [ - "gs", - "-q", # quiet mode - "-g%dx%d" % size, # set output geometry (pixels) - "-r%fx%f" % res, # set input DPI (dots per inch) - "-dBATCH", # exit after processing - "-dNOPAUSE", # don't pause between pages - "-dSAFER", # safe mode - f"-sDEVICE={device}", - f"-sOutputFile={outfile}", # output file - # adjust for image origin - "-c", - f"{-bbox[0]} {-bbox[1]} translate", - "-f", - infile, # input file - # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) - "-c", - "showpage", - ] - - if gs_windows_binary is not None: - if not gs_windows_binary: - raise OSError("Unable to locate Ghostscript on paths") - command[0] = gs_windows_binary - - # push data through Ghostscript - try: - startupinfo = None - if sys.platform.startswith("win"): - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - subprocess.check_call(command, startupinfo=startupinfo) - out_im = Image.open(outfile) - out_im.load() - finally: - try: - os.unlink(outfile) - if infile_temp: - os.unlink(infile_temp) - except OSError: - pass - - im = out_im.im.copy() - out_im.close() - return im - - -class PSFile: - """ - Wrapper for bytesio object that treats either CR or LF as end of line. - """ - - def __init__(self, fp): - self.fp = fp - self.char = None - - def seek(self, offset, whence=io.SEEK_SET): - self.char = None - self.fp.seek(offset, whence) - - def readline(self): - s = [self.char or b""] - self.char = None - - c = self.fp.read(1) - while (c not in b"\r\n") and len(c): - s.append(c) - c = self.fp.read(1) - - self.char = self.fp.read(1) - # line endings can be 1 or 2 of \r \n, in either order - if self.char in b"\r\n": - self.char = None - - return b"".join(s).decode("latin-1") - - -def _accept(prefix): - return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) - - -## -# Image plugin for Encapsulated PostScript. This plugin supports only -# a few variants of this format. - - -class EpsImageFile(ImageFile.ImageFile): - """EPS File Parser for the Python Imaging Library""" - - format = "EPS" - format_description = "Encapsulated Postscript" - - mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} - - def _open(self): - (length, offset) = self._find_offset(self.fp) - - # Rewrap the open file pointer in something that will - # convert line endings and decode to latin-1. - fp = PSFile(self.fp) - - # go to offset - start of "%!PS" - fp.seek(offset) - - box = None - - self.mode = "RGB" - self._size = 1, 1 # FIXME: huh? - - # - # Load EPS header - - s_raw = fp.readline() - s = s_raw.strip("\r\n") - - while s_raw: - if s: - if len(s) > 255: - raise SyntaxError("not an EPS file") - - try: - m = split.match(s) - except re.error as e: - raise SyntaxError("not an EPS file") from e - - if m: - k, v = m.group(1, 2) - self.info[k] = v - if k == "BoundingBox": - try: - # Note: The DSC spec says that BoundingBox - # fields should be integers, but some drivers - # put floating point values there anyway. - box = [int(float(i)) for i in v.split()] - self._size = box[2] - box[0], box[3] - box[1] - self.tile = [ - ("eps", (0, 0) + self.size, offset, (length, box)) - ] - except Exception: - pass - - else: - m = field.match(s) - if m: - k = m.group(1) - - if k == "EndComments": - break - if k[:8] == "PS-Adobe": - self.info[k[:8]] = k[9:] - else: - self.info[k] = "" - elif s[0] == "%": - # handle non-DSC PostScript comments that some - # tools mistakenly put in the Comments section - pass - else: - raise OSError("bad EPS header") - - s_raw = fp.readline() - s = s_raw.strip("\r\n") - - if s and s[:1] != "%": - break - - # - # Scan for an "ImageData" descriptor - - while s[:1] == "%": - - if len(s) > 255: - raise SyntaxError("not an EPS file") - - if s[:11] == "%ImageData:": - # Encoded bitmapped image. - x, y, bi, mo = s[11:].split(None, 7)[:4] - - if int(bi) != 8: - break - try: - self.mode = self.mode_map[int(mo)] - except ValueError: - break - - self._size = int(x), int(y) - return - - s = fp.readline().strip("\r\n") - if not s: - break - - if not box: - raise OSError("cannot determine EPS bounding box") - - def _find_offset(self, fp): - - s = fp.read(160) - - if s[:4] == b"%!PS": - # for HEAD without binary preview - fp.seek(0, io.SEEK_END) - length = fp.tell() - offset = 0 - elif i32(s, 0) == 0xC6D3D0C5: - # FIX for: Some EPS file not handled correctly / issue #302 - # EPS can contain binary data - # or start directly with latin coding - # more info see: - # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf - offset = i32(s, 4) - length = i32(s, 8) - else: - raise SyntaxError("not an EPS file") - - return (length, offset) - - def load(self, scale=1, transparency=False): - # Load EPS via Ghostscript - if self.tile: - self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) - self.mode = self.im.mode - self._size = self.im.size - self.tile = [] - return Image.Image.load(self) - - def load_seek(self, *args, **kwargs): - # we can't incrementally load, so force ImageFile.parser to - # use our custom load method by defining this method. - pass - - -# -# -------------------------------------------------------------------- - - -def _save(im, fp, filename, eps=1): - """EPS Writer for the Python Imaging Library.""" - - # - # make sure image data is available - im.load() - - # - # determine PostScript image mode - if im.mode == "L": - operator = (8, 1, b"image") - elif im.mode == "RGB": - operator = (8, 3, b"false 3 colorimage") - elif im.mode == "CMYK": - operator = (8, 4, b"false 4 colorimage") - else: - raise ValueError("image mode is not supported") - - if eps: - # - # write EPS header - fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") - fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") - # fp.write("%%CreationDate: %s"...) - fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) - fp.write(b"%%Pages: 1\n") - fp.write(b"%%EndComments\n") - fp.write(b"%%Page: 1 1\n") - fp.write(b"%%ImageData: %d %d " % im.size) - fp.write(b'%d %d 0 1 1 "%s"\n' % operator) - - # - # image header - fp.write(b"gsave\n") - fp.write(b"10 dict begin\n") - fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) - fp.write(b"%d %d scale\n" % im.size) - fp.write(b"%d %d 8\n" % im.size) # <= bits - fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) - fp.write(b"{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + b"\n") - if hasattr(fp, "flush"): - fp.flush() - - ImageFile._save(im, fp, [("eps", (0, 0) + im.size, 0, None)]) - - fp.write(b"\n%%%%EndBinary\n") - fp.write(b"grestore end\n") - if hasattr(fp, "flush"): - fp.flush() - - -# -# -------------------------------------------------------------------- - - -Image.register_open(EpsImageFile.format, EpsImageFile, _accept) - -Image.register_save(EpsImageFile.format, _save) - -Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) - -Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/venv/Lib/site-packages/PIL/ExifTags.py b/venv/Lib/site-packages/PIL/ExifTags.py deleted file mode 100644 index 7da2dda..0000000 --- a/venv/Lib/site-packages/PIL/ExifTags.py +++ /dev/null @@ -1,331 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EXIF tags -# -# Copyright (c) 2003 by Secret Labs AB -# -# See the README file for information on usage and redistribution. -# - -""" -This module provides constants and clear-text names for various -well-known EXIF tags. -""" - - -TAGS = { - # possibly incomplete - 0x0001: "InteropIndex", - 0x000B: "ProcessingSoftware", - 0x00FE: "NewSubfileType", - 0x00FF: "SubfileType", - 0x0100: "ImageWidth", - 0x0101: "ImageLength", - 0x0102: "BitsPerSample", - 0x0103: "Compression", - 0x0106: "PhotometricInterpretation", - 0x0107: "Thresholding", - 0x0108: "CellWidth", - 0x0109: "CellLength", - 0x010A: "FillOrder", - 0x010D: "DocumentName", - 0x010E: "ImageDescription", - 0x010F: "Make", - 0x0110: "Model", - 0x0111: "StripOffsets", - 0x0112: "Orientation", - 0x0115: "SamplesPerPixel", - 0x0116: "RowsPerStrip", - 0x0117: "StripByteCounts", - 0x0118: "MinSampleValue", - 0x0119: "MaxSampleValue", - 0x011A: "XResolution", - 0x011B: "YResolution", - 0x011C: "PlanarConfiguration", - 0x011D: "PageName", - 0x0120: "FreeOffsets", - 0x0121: "FreeByteCounts", - 0x0122: "GrayResponseUnit", - 0x0123: "GrayResponseCurve", - 0x0124: "T4Options", - 0x0125: "T6Options", - 0x0128: "ResolutionUnit", - 0x0129: "PageNumber", - 0x012D: "TransferFunction", - 0x0131: "Software", - 0x0132: "DateTime", - 0x013B: "Artist", - 0x013C: "HostComputer", - 0x013D: "Predictor", - 0x013E: "WhitePoint", - 0x013F: "PrimaryChromaticities", - 0x0140: "ColorMap", - 0x0141: "HalftoneHints", - 0x0142: "TileWidth", - 0x0143: "TileLength", - 0x0144: "TileOffsets", - 0x0145: "TileByteCounts", - 0x014A: "SubIFDs", - 0x014C: "InkSet", - 0x014D: "InkNames", - 0x014E: "NumberOfInks", - 0x0150: "DotRange", - 0x0151: "TargetPrinter", - 0x0152: "ExtraSamples", - 0x0153: "SampleFormat", - 0x0154: "SMinSampleValue", - 0x0155: "SMaxSampleValue", - 0x0156: "TransferRange", - 0x0157: "ClipPath", - 0x0158: "XClipPathUnits", - 0x0159: "YClipPathUnits", - 0x015A: "Indexed", - 0x015B: "JPEGTables", - 0x015F: "OPIProxy", - 0x0200: "JPEGProc", - 0x0201: "JpegIFOffset", - 0x0202: "JpegIFByteCount", - 0x0203: "JpegRestartInterval", - 0x0205: "JpegLosslessPredictors", - 0x0206: "JpegPointTransforms", - 0x0207: "JpegQTables", - 0x0208: "JpegDCTables", - 0x0209: "JpegACTables", - 0x0211: "YCbCrCoefficients", - 0x0212: "YCbCrSubSampling", - 0x0213: "YCbCrPositioning", - 0x0214: "ReferenceBlackWhite", - 0x02BC: "XMLPacket", - 0x1000: "RelatedImageFileFormat", - 0x1001: "RelatedImageWidth", - 0x1002: "RelatedImageLength", - 0x4746: "Rating", - 0x4749: "RatingPercent", - 0x800D: "ImageID", - 0x828D: "CFARepeatPatternDim", - 0x828E: "CFAPattern", - 0x828F: "BatteryLevel", - 0x8298: "Copyright", - 0x829A: "ExposureTime", - 0x829D: "FNumber", - 0x83BB: "IPTCNAA", - 0x8649: "ImageResources", - 0x8769: "ExifOffset", - 0x8773: "InterColorProfile", - 0x8822: "ExposureProgram", - 0x8824: "SpectralSensitivity", - 0x8825: "GPSInfo", - 0x8827: "ISOSpeedRatings", - 0x8828: "OECF", - 0x8829: "Interlace", - 0x882A: "TimeZoneOffset", - 0x882B: "SelfTimerMode", - 0x8830: "SensitivityType", - 0x8831: "StandardOutputSensitivity", - 0x8832: "RecommendedExposureIndex", - 0x8833: "ISOSpeed", - 0x8834: "ISOSpeedLatitudeyyy", - 0x8835: "ISOSpeedLatitudezzz", - 0x9000: "ExifVersion", - 0x9003: "DateTimeOriginal", - 0x9004: "DateTimeDigitized", - 0x9010: "OffsetTime", - 0x9011: "OffsetTimeOriginal", - 0x9012: "OffsetTimeDigitized", - 0x9101: "ComponentsConfiguration", - 0x9102: "CompressedBitsPerPixel", - 0x9201: "ShutterSpeedValue", - 0x9202: "ApertureValue", - 0x9203: "BrightnessValue", - 0x9204: "ExposureBiasValue", - 0x9205: "MaxApertureValue", - 0x9206: "SubjectDistance", - 0x9207: "MeteringMode", - 0x9208: "LightSource", - 0x9209: "Flash", - 0x920A: "FocalLength", - 0x920B: "FlashEnergy", - 0x920C: "SpatialFrequencyResponse", - 0x920D: "Noise", - 0x9211: "ImageNumber", - 0x9212: "SecurityClassification", - 0x9213: "ImageHistory", - 0x9214: "SubjectLocation", - 0x9215: "ExposureIndex", - 0x9216: "TIFF/EPStandardID", - 0x927C: "MakerNote", - 0x9286: "UserComment", - 0x9290: "SubsecTime", - 0x9291: "SubsecTimeOriginal", - 0x9292: "SubsecTimeDigitized", - 0x9400: "AmbientTemperature", - 0x9401: "Humidity", - 0x9402: "Pressure", - 0x9403: "WaterDepth", - 0x9404: "Acceleration", - 0x9405: "CameraElevationAngle", - 0x9C9B: "XPTitle", - 0x9C9C: "XPComment", - 0x9C9D: "XPAuthor", - 0x9C9E: "XPKeywords", - 0x9C9F: "XPSubject", - 0xA000: "FlashPixVersion", - 0xA001: "ColorSpace", - 0xA002: "ExifImageWidth", - 0xA003: "ExifImageHeight", - 0xA004: "RelatedSoundFile", - 0xA005: "ExifInteroperabilityOffset", - 0xA20B: "FlashEnergy", - 0xA20C: "SpatialFrequencyResponse", - 0xA20E: "FocalPlaneXResolution", - 0xA20F: "FocalPlaneYResolution", - 0xA210: "FocalPlaneResolutionUnit", - 0xA214: "SubjectLocation", - 0xA215: "ExposureIndex", - 0xA217: "SensingMethod", - 0xA300: "FileSource", - 0xA301: "SceneType", - 0xA302: "CFAPattern", - 0xA401: "CustomRendered", - 0xA402: "ExposureMode", - 0xA403: "WhiteBalance", - 0xA404: "DigitalZoomRatio", - 0xA405: "FocalLengthIn35mmFilm", - 0xA406: "SceneCaptureType", - 0xA407: "GainControl", - 0xA408: "Contrast", - 0xA409: "Saturation", - 0xA40A: "Sharpness", - 0xA40B: "DeviceSettingDescription", - 0xA40C: "SubjectDistanceRange", - 0xA420: "ImageUniqueID", - 0xA430: "CameraOwnerName", - 0xA431: "BodySerialNumber", - 0xA432: "LensSpecification", - 0xA433: "LensMake", - 0xA434: "LensModel", - 0xA435: "LensSerialNumber", - 0xA460: "CompositeImage", - 0xA461: "CompositeImageCount", - 0xA462: "CompositeImageExposureTimes", - 0xA500: "Gamma", - 0xC4A5: "PrintImageMatching", - 0xC612: "DNGVersion", - 0xC613: "DNGBackwardVersion", - 0xC614: "UniqueCameraModel", - 0xC615: "LocalizedCameraModel", - 0xC616: "CFAPlaneColor", - 0xC617: "CFALayout", - 0xC618: "LinearizationTable", - 0xC619: "BlackLevelRepeatDim", - 0xC61A: "BlackLevel", - 0xC61B: "BlackLevelDeltaH", - 0xC61C: "BlackLevelDeltaV", - 0xC61D: "WhiteLevel", - 0xC61E: "DefaultScale", - 0xC61F: "DefaultCropOrigin", - 0xC620: "DefaultCropSize", - 0xC621: "ColorMatrix1", - 0xC622: "ColorMatrix2", - 0xC623: "CameraCalibration1", - 0xC624: "CameraCalibration2", - 0xC625: "ReductionMatrix1", - 0xC626: "ReductionMatrix2", - 0xC627: "AnalogBalance", - 0xC628: "AsShotNeutral", - 0xC629: "AsShotWhiteXY", - 0xC62A: "BaselineExposure", - 0xC62B: "BaselineNoise", - 0xC62C: "BaselineSharpness", - 0xC62D: "BayerGreenSplit", - 0xC62E: "LinearResponseLimit", - 0xC62F: "CameraSerialNumber", - 0xC630: "LensInfo", - 0xC631: "ChromaBlurRadius", - 0xC632: "AntiAliasStrength", - 0xC633: "ShadowScale", - 0xC634: "DNGPrivateData", - 0xC635: "MakerNoteSafety", - 0xC65A: "CalibrationIlluminant1", - 0xC65B: "CalibrationIlluminant2", - 0xC65C: "BestQualityScale", - 0xC65D: "RawDataUniqueID", - 0xC68B: "OriginalRawFileName", - 0xC68C: "OriginalRawFileData", - 0xC68D: "ActiveArea", - 0xC68E: "MaskedAreas", - 0xC68F: "AsShotICCProfile", - 0xC690: "AsShotPreProfileMatrix", - 0xC691: "CurrentICCProfile", - 0xC692: "CurrentPreProfileMatrix", - 0xC6BF: "ColorimetricReference", - 0xC6F3: "CameraCalibrationSignature", - 0xC6F4: "ProfileCalibrationSignature", - 0xC6F6: "AsShotProfileName", - 0xC6F7: "NoiseReductionApplied", - 0xC6F8: "ProfileName", - 0xC6F9: "ProfileHueSatMapDims", - 0xC6FA: "ProfileHueSatMapData1", - 0xC6FB: "ProfileHueSatMapData2", - 0xC6FC: "ProfileToneCurve", - 0xC6FD: "ProfileEmbedPolicy", - 0xC6FE: "ProfileCopyright", - 0xC714: "ForwardMatrix1", - 0xC715: "ForwardMatrix2", - 0xC716: "PreviewApplicationName", - 0xC717: "PreviewApplicationVersion", - 0xC718: "PreviewSettingsName", - 0xC719: "PreviewSettingsDigest", - 0xC71A: "PreviewColorSpace", - 0xC71B: "PreviewDateTime", - 0xC71C: "RawImageDigest", - 0xC71D: "OriginalRawFileDigest", - 0xC71E: "SubTileBlockSize", - 0xC71F: "RowInterleaveFactor", - 0xC725: "ProfileLookTableDims", - 0xC726: "ProfileLookTableData", - 0xC740: "OpcodeList1", - 0xC741: "OpcodeList2", - 0xC74E: "OpcodeList3", - 0xC761: "NoiseProfile", -} -"""Maps EXIF tags to tag names.""" - - -GPSTAGS = { - 0: "GPSVersionID", - 1: "GPSLatitudeRef", - 2: "GPSLatitude", - 3: "GPSLongitudeRef", - 4: "GPSLongitude", - 5: "GPSAltitudeRef", - 6: "GPSAltitude", - 7: "GPSTimeStamp", - 8: "GPSSatellites", - 9: "GPSStatus", - 10: "GPSMeasureMode", - 11: "GPSDOP", - 12: "GPSSpeedRef", - 13: "GPSSpeed", - 14: "GPSTrackRef", - 15: "GPSTrack", - 16: "GPSImgDirectionRef", - 17: "GPSImgDirection", - 18: "GPSMapDatum", - 19: "GPSDestLatitudeRef", - 20: "GPSDestLatitude", - 21: "GPSDestLongitudeRef", - 22: "GPSDestLongitude", - 23: "GPSDestBearingRef", - 24: "GPSDestBearing", - 25: "GPSDestDistanceRef", - 26: "GPSDestDistance", - 27: "GPSProcessingMethod", - 28: "GPSAreaInformation", - 29: "GPSDateStamp", - 30: "GPSDifferential", - 31: "GPSHPositioningError", -} -"""Maps EXIF GPS tags to tag names.""" diff --git a/venv/Lib/site-packages/PIL/FitsImagePlugin.py b/venv/Lib/site-packages/PIL/FitsImagePlugin.py deleted file mode 100644 index c16300e..0000000 --- a/venv/Lib/site-packages/PIL/FitsImagePlugin.py +++ /dev/null @@ -1,71 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# FITS file handling -# -# Copyright (c) 1998-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import math - -from . import Image, ImageFile - - -def _accept(prefix): - return prefix[:6] == b"SIMPLE" - - -class FitsImageFile(ImageFile.ImageFile): - - format = "FITS" - format_description = "FITS" - - def _open(self): - headers = {} - while True: - header = self.fp.read(80) - if not header: - raise OSError("Truncated FITS file") - keyword = header[:8].strip() - if keyword == b"END": - break - value = header[8:].strip() - if value.startswith(b"="): - value = value[1:].strip() - if not headers and (not _accept(keyword) or value != b"T"): - raise SyntaxError("Not a FITS file") - headers[keyword] = value - - naxis = int(headers[b"NAXIS"]) - if naxis == 0: - raise ValueError("No image data") - elif naxis == 1: - self._size = 1, int(headers[b"NAXIS1"]) - else: - self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"]) - - number_of_bits = int(headers[b"BITPIX"]) - if number_of_bits == 8: - self.mode = "L" - elif number_of_bits == 16: - self.mode = "I" - # rawmode = "I;16S" - elif number_of_bits == 32: - self.mode = "I" - elif number_of_bits in (-32, -64): - self.mode = "F" - # rawmode = "F" if number_of_bits == -32 else "F;64F" - - offset = math.ceil(self.fp.tell() / 2880) * 2880 - self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))] - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(FitsImageFile.format, FitsImageFile, _accept) - -Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/venv/Lib/site-packages/PIL/FitsStubImagePlugin.py b/venv/Lib/site-packages/PIL/FitsStubImagePlugin.py deleted file mode 100644 index 9eed029..0000000 --- a/venv/Lib/site-packages/PIL/FitsStubImagePlugin.py +++ /dev/null @@ -1,77 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# FITS stub adapter -# -# Copyright (c) 1998-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import warnings - -from . import FitsImagePlugin, Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific FITS image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - warnings.warn( - "FitsStubImagePlugin is deprecated and will be removed in Pillow " - "10 (2023-07-01). FITS images can now be read without a handler through " - "FitsImagePlugin instead.", - DeprecationWarning, - ) - - # Override FitsImagePlugin with this handler - # for backwards compatibility - try: - Image.ID.remove(FITSStubImageFile.format) - except ValueError: - pass - - Image.register_open( - FITSStubImageFile.format, FITSStubImageFile, FitsImagePlugin._accept - ) - - -class FITSStubImageFile(ImageFile.StubImageFile): - - format = FitsImagePlugin.FitsImageFile.format - format_description = FitsImagePlugin.FitsImageFile.format_description - - def _open(self): - offset = self.fp.tell() - - im = FitsImagePlugin.FitsImageFile(self.fp) - self._size = im.size - self.mode = im.mode - self.tile = [] - - self.fp.seek(offset) - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - raise OSError("FITS save handler not installed") - - -# -------------------------------------------------------------------- -# Registry - -Image.register_save(FITSStubImageFile.format, _save) diff --git a/venv/Lib/site-packages/PIL/FliImagePlugin.py b/venv/Lib/site-packages/PIL/FliImagePlugin.py deleted file mode 100644 index ea95033..0000000 --- a/venv/Lib/site-packages/PIL/FliImagePlugin.py +++ /dev/null @@ -1,171 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# FLI/FLC file handling. -# -# History: -# 95-09-01 fl Created -# 97-01-03 fl Fixed parser, setup decoder tile -# 98-07-15 fl Renamed offset attribute to avoid name clash -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 - -# -# decoder - - -def _accept(prefix): - return ( - len(prefix) >= 6 - and i16(prefix, 4) in [0xAF11, 0xAF12] - and i16(prefix, 14) in [0, 3] # flags - ) - - -## -# Image plugin for the FLI/FLC animation format. Use the seek -# method to load individual frames. - - -class FliImageFile(ImageFile.ImageFile): - - format = "FLI" - format_description = "Autodesk FLI/FLC Animation" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # HEAD - s = self.fp.read(128) - if not (_accept(s) and s[20:22] == b"\x00\x00"): - raise SyntaxError("not an FLI/FLC file") - - # frames - self.n_frames = i16(s, 6) - self.is_animated = self.n_frames > 1 - - # image characteristics - self.mode = "P" - self._size = i16(s, 8), i16(s, 10) - - # animation speed - duration = i32(s, 16) - magic = i16(s, 4) - if magic == 0xAF11: - duration = (duration * 1000) // 70 - self.info["duration"] = duration - - # look for palette - palette = [(a, a, a) for a in range(256)] - - s = self.fp.read(16) - - self.__offset = 128 - - if i16(s, 4) == 0xF100: - # prefix chunk; ignore it - self.__offset = self.__offset + i32(s) - s = self.fp.read(16) - - if i16(s, 4) == 0xF1FA: - # look for palette chunk - s = self.fp.read(6) - if i16(s, 4) == 11: - self._palette(palette, 2) - elif i16(s, 4) == 4: - self._palette(palette, 0) - - palette = [o8(r) + o8(g) + o8(b) for (r, g, b) in palette] - self.palette = ImagePalette.raw("RGB", b"".join(palette)) - - # set things up to decode first frame - self.__frame = -1 - self.__fp = self.fp - self.__rewind = self.fp.tell() - self.seek(0) - - def _palette(self, palette, shift): - # load palette - - i = 0 - for e in range(i16(self.fp.read(2))): - s = self.fp.read(2) - i = i + s[0] - n = s[1] - if n == 0: - n = 256 - s = self.fp.read(n * 3) - for n in range(0, len(s), 3): - r = s[n] << shift - g = s[n + 1] << shift - b = s[n + 2] << shift - palette[i] = (r, g, b) - i += 1 - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0) - - for f in range(self.__frame + 1, frame + 1): - self._seek(f) - - def _seek(self, frame): - if frame == 0: - self.__frame = -1 - self.__fp.seek(self.__rewind) - self.__offset = 128 - else: - # ensure that the previous frame was loaded - self.load() - - if frame != self.__frame + 1: - raise ValueError(f"cannot seek to frame {frame}") - self.__frame = frame - - # move to next frame - self.fp = self.__fp - self.fp.seek(self.__offset) - - s = self.fp.read(4) - if not s: - raise EOFError - - framesize = i32(s) - - self.decodermaxblock = framesize - self.tile = [("fli", (0, 0) + self.size, self.__offset, None)] - - self.__offset += framesize - - def tell(self): - return self.__frame - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -# -# registry - -Image.register_open(FliImageFile.format, FliImageFile, _accept) - -Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/venv/Lib/site-packages/PIL/FontFile.py b/venv/Lib/site-packages/PIL/FontFile.py deleted file mode 100644 index c5fc80b..0000000 --- a/venv/Lib/site-packages/PIL/FontFile.py +++ /dev/null @@ -1,111 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# base class for raster font file parsers -# -# history: -# 1997-06-05 fl created -# 1997-08-19 fl restrict image width -# -# Copyright (c) 1997-1998 by Secret Labs AB -# Copyright (c) 1997-1998 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -import os - -from . import Image, _binary - -WIDTH = 800 - - -def puti16(fp, values): - """Write network order (big-endian) 16-bit sequence""" - for v in values: - if v < 0: - v += 65536 - fp.write(_binary.o16be(v)) - - -class FontFile: - """Base class for raster font file handlers.""" - - bitmap = None - - def __init__(self): - - self.info = {} - self.glyph = [None] * 256 - - def __getitem__(self, ix): - return self.glyph[ix] - - def compile(self): - """Create metrics and bitmap""" - - if self.bitmap: - return - - # create bitmap large enough to hold all data - h = w = maxwidth = 0 - lines = 1 - for glyph in self: - if glyph: - d, dst, src, im = glyph - h = max(h, src[3] - src[1]) - w = w + (src[2] - src[0]) - if w > WIDTH: - lines += 1 - w = src[2] - src[0] - maxwidth = max(maxwidth, w) - - xsize = maxwidth - ysize = lines * h - - if xsize == 0 and ysize == 0: - return "" - - self.ysize = h - - # paste glyphs into bitmap - self.bitmap = Image.new("1", (xsize, ysize)) - self.metrics = [None] * 256 - x = y = 0 - for i in range(256): - glyph = self[i] - if glyph: - d, dst, src, im = glyph - xx = src[2] - src[0] - # yy = src[3] - src[1] - x0, y0 = x, y - x = x + xx - if x > WIDTH: - x, y = 0, y + h - x0, y0 = x, y - x = xx - s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 - self.bitmap.paste(im.crop(src), s) - self.metrics[i] = d, dst, s - - def save(self, filename): - """Save font""" - - self.compile() - - # font data - self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") - - # font metrics - with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: - fp.write(b"PILfont\n") - fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! - fp.write(b"DATA\n") - for id in range(256): - m = self.metrics[id] - if not m: - puti16(fp, [0] * 10) - else: - puti16(fp, m[0] + m[1] + m[2]) diff --git a/venv/Lib/site-packages/PIL/FpxImagePlugin.py b/venv/Lib/site-packages/PIL/FpxImagePlugin.py deleted file mode 100644 index 5e38546..0000000 --- a/venv/Lib/site-packages/PIL/FpxImagePlugin.py +++ /dev/null @@ -1,242 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library. -# $Id$ -# -# FlashPix support for PIL -# -# History: -# 97-01-25 fl Created (reads uncompressed RGB images only) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -import olefile - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# we map from colour field tuples to (mode, rawmode) descriptors -MODES = { - # opacity - (0x00007FFE): ("A", "L"), - # monochrome - (0x00010000,): ("L", "L"), - (0x00018000, 0x00017FFE): ("RGBA", "LA"), - # photo YCC - (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), - (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), - # standard RGB (NIFRGB) - (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), - (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), -} - - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for the FlashPix images. - - -class FpxImageFile(ImageFile.ImageFile): - - format = "FPX" - format_description = "FlashPix" - - def _open(self): - # - # read the OLE directory and see if this is a likely - # to be a FlashPix file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - raise SyntaxError("not an FPX file; invalid OLE file") from e - - if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": - raise SyntaxError("not an FPX file; bad root CLSID") - - self._open_index(1) - - def _open_index(self, index=1): - # - # get the Image Contents Property Set - - prop = self.ole.getproperties( - [f"Data Object Store {index:06d}", "\005Image Contents"] - ) - - # size (highest resolution) - - self._size = prop[0x1000002], prop[0x1000003] - - size = max(self.size) - i = 1 - while size > 64: - size = size / 2 - i += 1 - self.maxid = i - 1 - - # mode. instead of using a single field for this, flashpix - # requires you to specify the mode for each channel in each - # resolution subimage, and leaves it to the decoder to make - # sure that they all match. for now, we'll cheat and assume - # that this is always the case. - - id = self.maxid << 16 - - s = prop[0x2000002 | id] - - colors = [] - bands = i32(s, 4) - if bands > 4: - raise OSError("Invalid number of bands") - for i in range(bands): - # note: for now, we ignore the "uncalibrated" flag - colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF) - - self.mode, self.rawmode = MODES[tuple(colors)] - - # load JPEG tables, if any - self.jpeg = {} - for i in range(256): - id = 0x3000001 | (i << 16) - if id in prop: - self.jpeg[i] = prop[id] - - self._open_subimage(1, self.maxid) - - def _open_subimage(self, index=1, subimage=0): - # - # setup tile descriptors for a given subimage - - stream = [ - f"Data Object Store {index:06d}", - f"Resolution {subimage:04d}", - "Subimage 0000 Header", - ] - - fp = self.ole.openstream(stream) - - # skip prefix - fp.read(28) - - # header stream - s = fp.read(36) - - size = i32(s, 4), i32(s, 8) - # tilecount = i32(s, 12) - tilesize = i32(s, 16), i32(s, 20) - # channels = i32(s, 24) - offset = i32(s, 28) - length = i32(s, 32) - - if size != self.size: - raise OSError("subimage mismatch") - - # get tile descriptors - fp.seek(28 + offset) - s = fp.read(i32(s, 12) * length) - - x = y = 0 - xsize, ysize = size - xtile, ytile = tilesize - self.tile = [] - - for i in range(0, len(s), length): - - compression = i32(s, i + 8) - - if compression == 0: - self.tile.append( - ( - "raw", - (x, y, x + xtile, y + ytile), - i32(s, i) + 28, - (self.rawmode), - ) - ) - - elif compression == 1: - - # FIXME: the fill decoder is not implemented - self.tile.append( - ( - "fill", - (x, y, x + xtile, y + ytile), - i32(s, i) + 28, - (self.rawmode, s[12:16]), - ) - ) - - elif compression == 2: - - internal_color_conversion = s[14] - jpeg_tables = s[15] - rawmode = self.rawmode - - if internal_color_conversion: - # The image is stored as usual (usually YCbCr). - if rawmode == "RGBA": - # For "RGBA", data is stored as YCbCrA based on - # negative RGB. The following trick works around - # this problem : - jpegmode, rawmode = "YCbCrK", "CMYK" - else: - jpegmode = None # let the decoder decide - - else: - # The image is stored as defined by rawmode - jpegmode = rawmode - - self.tile.append( - ( - "jpeg", - (x, y, x + xtile, y + ytile), - i32(s, i) + 28, - (rawmode, jpegmode), - ) - ) - - # FIXME: jpeg tables are tile dependent; the prefix - # data must be placed in the tile descriptor itself! - - if jpeg_tables: - self.tile_prefix = self.jpeg[jpeg_tables] - - else: - raise OSError("unknown/invalid compression") - - x = x + xtile - if x >= xsize: - x, y = 0, y + ytile - if y >= ysize: - break # isn't really required - - self.stream = stream - self.fp = None - - def load(self): - - if not self.fp: - self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) - - return ImageFile.ImageFile.load(self) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(FpxImageFile.format, FpxImageFile, _accept) - -Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/venv/Lib/site-packages/PIL/FtexImagePlugin.py b/venv/Lib/site-packages/PIL/FtexImagePlugin.py deleted file mode 100644 index 55d28e1..0000000 --- a/venv/Lib/site-packages/PIL/FtexImagePlugin.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -A Pillow loader for .ftc and .ftu files (FTEX) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 - -The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a -packed custom format called FTEX. This file format uses file extensions FTC -and FTU. -* FTC files are compressed textures (using standard texture compression). -* FTU files are not compressed. -Texture File Format -The FTC and FTU texture files both use the same format. This -has the following structure: -{header} -{format_directory} -{data} -Where: -{header} = { - u32:magic, - u32:version, - u32:width, - u32:height, - u32:mipmap_count, - u32:format_count -} - -* The "magic" number is "FTEX". -* "width" and "height" are the dimensions of the texture. -* "mipmap_count" is the number of mipmaps in the texture. -* "format_count" is the number of texture formats (different versions of the -same texture) in this file. - -{format_directory} = format_count * { u32:format, u32:where } - -The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB -uncompressed textures. -The texture data for a format starts at the position "where" in the file. - -Each set of texture data in the file has the following structure: -{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } -* "mipmap_size" is the number of bytes in that mip level. For compressed -textures this is the size of the texture data compressed with DXT1. For 24 bit -uncompressed textures, this is 3 * width * height. Following this are the image -bytes for that mipmap level. - -Note: All data is stored in little-Endian (Intel) byte order. -""" - -import struct -import warnings -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile - -MAGIC = b"FTEX" - - -class Format(IntEnum): - DXT1 = 0 - UNCOMPRESSED = 1 - - -def __getattr__(name): - deprecated = "deprecated and will be removed in Pillow 10 (2023-07-01). " - for enum, prefix in {Format: "FORMAT_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - warnings.warn( - prefix - + name - + " is " - + deprecated - + "Use " - + enum.__name__ - + "." - + name - + " instead.", - DeprecationWarning, - stacklevel=2, - ) - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -class FtexImageFile(ImageFile.ImageFile): - format = "FTEX" - format_description = "Texture File Format (IW2:EOC)" - - def _open(self): - if not _accept(self.fp.read(4)): - raise SyntaxError("not an FTEX file") - struct.unpack("= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) - - -## -# Image plugin for the GIMP brush format. - - -class GbrImageFile(ImageFile.ImageFile): - - format = "GBR" - format_description = "GIMP brush file" - - def _open(self): - header_size = i32(self.fp.read(4)) - if header_size < 20: - raise SyntaxError("not a GIMP brush") - version = i32(self.fp.read(4)) - if version not in (1, 2): - raise SyntaxError(f"Unsupported GIMP brush version: {version}") - - width = i32(self.fp.read(4)) - height = i32(self.fp.read(4)) - color_depth = i32(self.fp.read(4)) - if width <= 0 or height <= 0: - raise SyntaxError("not a GIMP brush") - if color_depth not in (1, 4): - raise SyntaxError(f"Unsupported GIMP brush color depth: {color_depth}") - - if version == 1: - comment_length = header_size - 20 - else: - comment_length = header_size - 28 - magic_number = self.fp.read(4) - if magic_number != b"GIMP": - raise SyntaxError("not a GIMP brush, bad magic number") - self.info["spacing"] = i32(self.fp.read(4)) - - comment = self.fp.read(comment_length)[:-1] - - if color_depth == 1: - self.mode = "L" - else: - self.mode = "RGBA" - - self._size = width, height - - self.info["comment"] = comment - - # Image might not be small - Image._decompression_bomb_check(self.size) - - # Data is an uncompressed block of w * h * bytes/pixel - self._data_size = width * height * color_depth - - def load(self): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self._data_size)) - return Image.Image.load(self) - - -# -# registry - - -Image.register_open(GbrImageFile.format, GbrImageFile, _accept) -Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/venv/Lib/site-packages/PIL/GdImageFile.py b/venv/Lib/site-packages/PIL/GdImageFile.py deleted file mode 100644 index 9c34ada..0000000 --- a/venv/Lib/site-packages/PIL/GdImageFile.py +++ /dev/null @@ -1,90 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GD file handling -# -# History: -# 1996-04-12 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -""" -.. note:: - This format cannot be automatically recognized, so the - class is not registered for use with :py:func:`PIL.Image.open()`. To open a - gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. - -.. warning:: - THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This - implementation is provided for convenience and demonstrational - purposes only. -""" - - -from . import ImageFile, ImagePalette, UnidentifiedImageError -from ._binary import i16be as i16 -from ._binary import i32be as i32 - - -class GdImageFile(ImageFile.ImageFile): - """ - Image plugin for the GD uncompressed format. Note that this format - is not supported by the standard :py:func:`PIL.Image.open()` function. To use - this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and - use the :py:func:`PIL.GdImageFile.open()` function. - """ - - format = "GD" - format_description = "GD uncompressed images" - - def _open(self): - - # Header - s = self.fp.read(1037) - - if not i16(s) in [65534, 65535]: - raise SyntaxError("Not a valid GD 2.x .gd file") - - self.mode = "L" # FIXME: "P" - self._size = i16(s, 2), i16(s, 4) - - trueColor = s[6] - trueColorOffset = 2 if trueColor else 0 - - # transparency index - tindex = i32(s, 7 + trueColorOffset) - if tindex < 256: - self.info["transparency"] = tindex - - self.palette = ImagePalette.raw( - "XBGR", s[7 + trueColorOffset + 4 : 7 + trueColorOffset + 4 + 256 * 4] - ) - - self.tile = [ - ("raw", (0, 0) + self.size, 7 + trueColorOffset + 4 + 256 * 4, ("L", 0, 1)) - ] - - -def open(fp, mode="r"): - """ - Load texture from a GD image file. - - :param filename: GD file name, or an opened file handle. - :param mode: Optional mode. In this version, if the mode argument - is given, it must be "r". - :returns: An image instance. - :raises OSError: If the image could not be read. - """ - if mode != "r": - raise ValueError("bad mode") - - try: - return GdImageFile(fp) - except SyntaxError as e: - raise UnidentifiedImageError("cannot identify this image file") from e diff --git a/venv/Lib/site-packages/PIL/GifImagePlugin.py b/venv/Lib/site-packages/PIL/GifImagePlugin.py deleted file mode 100644 index b798bb9..0000000 --- a/venv/Lib/site-packages/PIL/GifImagePlugin.py +++ /dev/null @@ -1,1038 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GIF file handling -# -# History: -# 1995-09-01 fl Created -# 1996-12-14 fl Added interlace support -# 1996-12-30 fl Added animation support -# 1997-01-05 fl Added write support, fixed local colour map bug -# 1997-02-23 fl Make sure to load raster data in getdata() -# 1997-07-05 fl Support external decoder (0.4) -# 1998-07-09 fl Handle all modes when saving (0.5) -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) -# 2001-04-17 fl Added palette optimization (0.7) -# 2002-06-06 fl Added transparency support for save (0.8) -# 2004-02-24 fl Disable interlacing for small images -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import itertools -import math -import os -import subprocess -from enum import IntEnum - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - - -class LoadingStrategy(IntEnum): - """.. versionadded:: 9.1.0""" - - RGB_AFTER_FIRST = 0 - RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 - RGB_ALWAYS = 2 - - -#: .. versionadded:: 9.1.0 -LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST - -# -------------------------------------------------------------------- -# Identify/read GIF files - - -def _accept(prefix): - return prefix[:6] in [b"GIF87a", b"GIF89a"] - - -## -# Image plugin for GIF images. This plugin supports both GIF87 and -# GIF89 images. - - -class GifImageFile(ImageFile.ImageFile): - - format = "GIF" - format_description = "Compuserve GIF" - _close_exclusive_fp_after_loading = False - - global_palette = None - - def data(self): - s = self.fp.read(1) - if s and s[0]: - return self.fp.read(s[0]) - return None - - def _is_palette_needed(self, p): - for i in range(0, len(p), 3): - if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): - return True - return False - - def _open(self): - - # Screen - s = self.fp.read(13) - if not _accept(s): - raise SyntaxError("not a GIF file") - - self.info["version"] = s[:6] - self._size = i16(s, 6), i16(s, 8) - self.tile = [] - flags = s[10] - bits = (flags & 7) + 1 - - if flags & 128: - # get global palette - self.info["background"] = s[11] - # check if palette contains colour indices - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - p = ImagePalette.raw("RGB", p) - self.global_palette = self.palette = p - - self.__fp = self.fp # FIXME: hack - self.__rewind = self.fp.tell() - self._n_frames = None - self._is_animated = None - self._seek(0) # get ready to read first frame - - @property - def n_frames(self): - if self._n_frames is None: - current = self.tell() - try: - while True: - self._seek(self.tell() + 1, False) - except EOFError: - self._n_frames = self.tell() + 1 - self.seek(current) - return self._n_frames - - @property - def is_animated(self): - if self._is_animated is None: - if self._n_frames is not None: - self._is_animated = self._n_frames != 1 - else: - current = self.tell() - if current: - self._is_animated = True - else: - try: - self._seek(1, False) - self._is_animated = True - except EOFError: - self._is_animated = False - - self.seek(current) - return self._is_animated - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self.im = None - self._seek(0) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - raise EOFError("no more images in GIF file") from e - - def _seek(self, frame, update_image=True): - - if frame == 0: - # rewind - self.__offset = 0 - self.dispose = None - self.__frame = -1 - self.__fp.seek(self.__rewind) - self.disposal_method = 0 - else: - # ensure that the previous frame was loaded - if self.tile and update_image: - self.load() - - if frame != self.__frame + 1: - raise ValueError(f"cannot seek to frame {frame}") - - self.fp = self.__fp - if self.__offset: - # backup to last frame - self.fp.seek(self.__offset) - while self.data(): - pass - self.__offset = 0 - - s = self.fp.read(1) - if not s or s == b";": - raise EOFError - - self.__frame = frame - - self.tile = [] - - palette = None - - info = {} - frame_transparency = None - interlace = None - frame_dispose_extent = None - while True: - - if not s: - s = self.fp.read(1) - if not s or s == b";": - break - - elif s == b"!": - # - # extensions - # - s = self.fp.read(1) - block = self.data() - if s[0] == 249: - # - # graphic control extension - # - flags = block[0] - if flags & 1: - frame_transparency = block[3] - info["duration"] = i16(block, 1) * 10 - - # disposal method - find the value of bits 4 - 6 - dispose_bits = 0b00011100 & flags - dispose_bits = dispose_bits >> 2 - if dispose_bits: - # only set the dispose if it is not - # unspecified. I'm not sure if this is - # correct, but it seems to prevent the last - # frame from looking odd for some animations - self.disposal_method = dispose_bits - elif s[0] == 254: - # - # comment extension - # - while block: - if "comment" in info: - info["comment"] += block - else: - info["comment"] = block - block = self.data() - s = None - continue - elif s[0] == 255: - # - # application extension - # - info["extension"] = block, self.fp.tell() - if block[:11] == b"NETSCAPE2.0": - block = self.data() - if len(block) >= 3 and block[0] == 1: - info["loop"] = i16(block, 1) - while self.data(): - pass - - elif s == b",": - # - # local image - # - s = self.fp.read(9) - - # extent - x0, y0 = i16(s, 0), i16(s, 2) - x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) - if (x1 > self.size[0] or y1 > self.size[1]) and update_image: - self._size = max(x1, self.size[0]), max(y1, self.size[1]) - frame_dispose_extent = x0, y0, x1, y1 - flags = s[8] - - interlace = (flags & 64) != 0 - - if flags & 128: - bits = (flags & 7) + 1 - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - palette = ImagePalette.raw("RGB", p) - - # image data - bits = self.fp.read(1)[0] - self.__offset = self.fp.tell() - break - - else: - pass - # raise OSError, "illegal GIF tag `%x`" % s[0] - s = None - - if interlace is None: - # self.__fp = None - raise EOFError - if not update_image: - return - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - - self._frame_palette = palette or self.global_palette - if frame == 0: - if self._frame_palette: - self.mode = ( - "RGB" if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS else "P" - ) - else: - self.mode = "L" - - if not palette and self.global_palette: - from copy import copy - - palette = copy(self.global_palette) - self.palette = palette - else: - self._frame_transparency = frame_transparency - if self.mode == "P": - if ( - LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY - or palette - ): - self.pyaccess = None - if "transparency" in self.info: - self.im.putpalettealpha(self.info["transparency"], 0) - self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) - self.mode = "RGBA" - del self.info["transparency"] - else: - self.mode = "RGB" - self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) - - def _rgb(color): - if self._frame_palette: - color = tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) - else: - color = (color, color, color) - return color - - self.dispose_extent = frame_dispose_extent - try: - if self.disposal_method < 2: - # do not dispose or none specified - self.dispose = None - elif self.disposal_method == 2: - # replace with background colour - - # only dispose the extent in this frame - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - - # by convention, attempt to use transparency first - dispose_mode = "P" - color = self.info.get("transparency", frame_transparency) - if color is not None: - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(color) + (0,) - else: - color = self.info.get("background", 0) - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGB" - color = _rgb(color) - self.dispose = Image.core.fill(dispose_mode, dispose_size, color) - else: - # replace with previous contents - if self.im is not None: - # only dispose the extent in this frame - self.dispose = self._crop(self.im, self.dispose_extent) - elif frame_transparency is not None: - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - dispose_mode = "P" - color = frame_transparency - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(frame_transparency) + (0,) - self.dispose = Image.core.fill(dispose_mode, dispose_size, color) - except AttributeError: - pass - - if interlace is not None: - transparency = -1 - if frame_transparency is not None: - if frame == 0: - self.info["transparency"] = frame_transparency - elif self.mode not in ("RGB", "RGBA"): - transparency = frame_transparency - self.tile = [ - ( - "gif", - (x0, y0, x1, y1), - self.__offset, - (bits, interlace, transparency), - ) - ] - - for k in ["duration", "comment", "extension", "loop"]: - if k in info: - self.info[k] = info[k] - elif k in self.info: - del self.info[k] - - def load_prepare(self): - temp_mode = "P" if self._frame_palette else "L" - self._prev_im = None - if self.__frame == 0: - if "transparency" in self.info: - self.im = Image.core.fill( - temp_mode, self.size, self.info["transparency"] - ) - elif self.mode in ("RGB", "RGBA"): - self._prev_im = self.im - if self._frame_palette: - self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) - self.im.putpalette(*self._frame_palette.getdata()) - else: - self.im = None - self.mode = temp_mode - self._frame_palette = None - - super().load_prepare() - - def load_end(self): - if self.__frame == 0: - if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - self.mode = "RGB" - self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) - return - if self.mode == "P" and self._prev_im: - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - frame_im = self.im.convert("RGBA") - else: - frame_im = self.im.convert("RGB") - else: - if not self._prev_im: - return - frame_im = self.im - frame_im = self._crop(frame_im, self.dispose_extent) - - self.im = self._prev_im - self.mode = self.im.mode - if frame_im.mode == "RGBA": - self.im.paste(frame_im, self.dispose_extent, frame_im) - else: - self.im.paste(frame_im, self.dispose_extent) - - def tell(self): - return self.__frame - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -# -------------------------------------------------------------------- -# Write GIF files - - -RAWMODE = {"1": "L", "L": "L", "P": "P"} - - -def _normalize_mode(im): - """ - Takes an image (or frame), returns an image in a mode that is appropriate - for saving in a Gif. - - It may return the original image, or it may return an image converted to - palette or 'L' mode. - - :param im: Image object - :returns: Image object - """ - if im.mode in RAWMODE: - im.load() - return im - if Image.getmodebase(im.mode) == "RGB": - im = im.convert("P", palette=Image.Palette.ADAPTIVE) - if im.palette.mode == "RGBA": - for rgba in im.palette.colors.keys(): - if rgba[3] == 0: - im.info["transparency"] = im.palette.colors[rgba] - break - return im - return im.convert("L") - - -def _normalize_palette(im, palette, info): - """ - Normalizes the palette for image. - - Sets the palette to the incoming palette, if provided. - - Ensures that there's a palette for L mode images - - Optimizes the palette if necessary/desired. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: Image object - """ - source_palette = None - if palette: - # a bytes palette - if isinstance(palette, (bytes, bytearray, list)): - source_palette = bytearray(palette[:768]) - if isinstance(palette, ImagePalette.ImagePalette): - source_palette = bytearray(palette.palette) - - if im.mode == "P": - if not source_palette: - source_palette = im.im.getpalette("RGB")[:768] - else: # L-mode - if not source_palette: - source_palette = bytearray(i // 3 for i in range(768)) - im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) - - if palette: - used_palette_colors = [] - for i in range(0, len(source_palette), 3): - source_color = tuple(source_palette[i : i + 3]) - try: - index = im.palette.colors[source_color] - except KeyError: - index = None - used_palette_colors.append(index) - for i, index in enumerate(used_palette_colors): - if index is None: - for j in range(len(used_palette_colors)): - if j not in used_palette_colors: - used_palette_colors[i] = j - break - im = im.remap_palette(used_palette_colors) - else: - used_palette_colors = _get_optimize(im, info) - if used_palette_colors is not None: - return im.remap_palette(used_palette_colors, source_palette) - - im.palette.palette = source_palette - return im - - -def _write_single_frame(im, fp, palette): - im_out = _normalize_mode(im) - for k, v in im_out.info.items(): - im.encoderinfo.setdefault(k, v) - im_out = _normalize_palette(im_out, palette, im.encoderinfo) - - for s in _get_global_header(im_out, im.encoderinfo): - fp.write(s) - - # local image header - flags = 0 - if get_interlace(im): - flags = flags | 64 - _write_local_header(fp, im, (0, 0), flags) - - im_out.encoderconfig = (8, get_interlace(im)) - ImageFile._save(im_out, fp, [("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])]) - - fp.write(b"\0") # end of image data - - -def _write_multiple_frames(im, fp, palette): - - duration = im.encoderinfo.get("duration", im.info.get("duration")) - disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) - - im_frames = [] - frame_count = 0 - background_im = None - for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): - for im_frame in ImageSequence.Iterator(imSequence): - # a copy is required here since seek can still mutate the image - im_frame = _normalize_mode(im_frame.copy()) - if frame_count == 0: - for k, v in im_frame.info.items(): - im.encoderinfo.setdefault(k, v) - im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) - - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - frame_count += 1 - - if im_frames: - # delta frame - previous = im_frames[-1] - if encoderinfo.get("disposal") == 2: - if background_im is None: - color = im.encoderinfo.get( - "transparency", im.info.get("transparency", (0, 0, 0)) - ) - background = _get_background(im_frame, color) - background_im = Image.new("P", im_frame.size, background) - background_im.putpalette(im_frames[0]["im"].palette) - base_im = background_im - else: - base_im = previous["im"] - if _get_palette_bytes(im_frame) == _get_palette_bytes(base_im): - delta = ImageChops.subtract_modulo(im_frame, base_im) - else: - delta = ImageChops.subtract_modulo( - im_frame.convert("RGB"), base_im.convert("RGB") - ) - bbox = delta.getbbox() - if not bbox: - # This frame is identical to the previous frame - if duration: - previous["encoderinfo"]["duration"] += encoderinfo["duration"] - continue - else: - bbox = None - im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) - - if len(im_frames) > 1: - for frame_data in im_frames: - im_frame = frame_data["im"] - if not frame_data["bbox"]: - # global header - for s in _get_global_header(im_frame, frame_data["encoderinfo"]): - fp.write(s) - offset = (0, 0) - else: - # compress difference - if not palette: - frame_data["encoderinfo"]["include_color_table"] = True - - im_frame = im_frame.crop(frame_data["bbox"]) - offset = frame_data["bbox"][:2] - _write_frame_data(fp, im_frame, offset, frame_data["encoderinfo"]) - return True - elif "duration" in im.encoderinfo and isinstance( - im.encoderinfo["duration"], (list, tuple) - ): - # Since multiple frames will not be written, add together the frame durations - im.encoderinfo["duration"] = sum(im.encoderinfo["duration"]) - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -def _save(im, fp, filename, save_all=False): - # header - if "palette" in im.encoderinfo or "palette" in im.info: - palette = im.encoderinfo.get("palette", im.info.get("palette")) - else: - palette = None - im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) - - if not save_all or not _write_multiple_frames(im, fp, palette): - _write_single_frame(im, fp, palette) - - fp.write(b";") # end of file - - if hasattr(fp, "flush"): - fp.flush() - - -def get_interlace(im): - interlace = im.encoderinfo.get("interlace", 1) - - # workaround for @PIL153 - if min(im.size) < 16: - interlace = 0 - - return interlace - - -def _write_local_header(fp, im, offset, flags): - transparent_color_exists = False - try: - if "transparency" in im.encoderinfo: - transparency = im.encoderinfo["transparency"] - else: - transparency = im.info["transparency"] - transparency = int(transparency) - except (KeyError, ValueError): - pass - else: - # optimize the block away if transparent color is not used - transparent_color_exists = True - - used_palette_colors = _get_optimize(im, im.encoderinfo) - if used_palette_colors is not None: - # adjust the transparency index after optimize - try: - transparency = used_palette_colors.index(transparency) - except ValueError: - transparent_color_exists = False - - if "duration" in im.encoderinfo: - duration = int(im.encoderinfo["duration"] / 10) - else: - duration = 0 - - disposal = int(im.encoderinfo.get("disposal", 0)) - - if transparent_color_exists or duration != 0 or disposal: - packed_flag = 1 if transparent_color_exists else 0 - packed_flag |= disposal << 2 - if not transparent_color_exists: - transparency = 0 - - fp.write( - b"!" - + o8(249) # extension intro - + o8(4) # length - + o8(packed_flag) # packed fields - + o16(duration) # duration - + o8(transparency) # transparency index - + o8(0) - ) - - if "comment" in im.encoderinfo and 1 <= len(im.encoderinfo["comment"]): - fp.write(b"!" + o8(254)) # extension intro - comment = im.encoderinfo["comment"] - if isinstance(comment, str): - comment = comment.encode() - for i in range(0, len(comment), 255): - subblock = comment[i : i + 255] - fp.write(o8(len(subblock)) + subblock) - fp.write(o8(0)) - if "loop" in im.encoderinfo: - number_of_loops = im.encoderinfo["loop"] - fp.write( - b"!" - + o8(255) # extension intro - + o8(11) - + b"NETSCAPE2.0" - + o8(3) - + o8(1) - + o16(number_of_loops) # number of loops - + o8(0) - ) - include_color_table = im.encoderinfo.get("include_color_table") - if include_color_table: - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - if color_table_size: - flags = flags | 128 # local color table flag - flags = flags | color_table_size - - fp.write( - b"," - + o16(offset[0]) # offset - + o16(offset[1]) - + o16(im.size[0]) # size - + o16(im.size[1]) - + o8(flags) # flags - ) - if include_color_table and color_table_size: - fp.write(_get_header_palette(palette_bytes)) - fp.write(o8(8)) # bits - - -def _save_netpbm(im, fp, filename): - - # Unused by default. - # To use, uncomment the register_save call at the end of the file. - # - # If you need real GIF compression and/or RGB quantization, you - # can use the external NETPBM/PBMPLUS utilities. See comments - # below for information on how to enable this. - tempfile = im._dump() - - try: - with open(filename, "wb") as f: - if im.mode != "RGB": - subprocess.check_call( - ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL - ) - else: - # Pipe ppmquant output into ppmtogif - # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) - quant_cmd = ["ppmquant", "256", tempfile] - togif_cmd = ["ppmtogif"] - quant_proc = subprocess.Popen( - quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL - ) - togif_proc = subprocess.Popen( - togif_cmd, - stdin=quant_proc.stdout, - stdout=f, - stderr=subprocess.DEVNULL, - ) - - # Allow ppmquant to receive SIGPIPE if ppmtogif exits - quant_proc.stdout.close() - - retcode = quant_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, quant_cmd) - - retcode = togif_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, togif_cmd) - finally: - try: - os.unlink(tempfile) - except OSError: - pass - - -# Force optimization so that we can test performance against -# cases where it took lots of memory and time previously. -_FORCE_OPTIMIZE = False - - -def _get_optimize(im, info): - """ - Palette optimization is a potentially expensive operation. - - This function determines if the palette should be optimized using - some heuristics, then returns the list of palette entries in use. - - :param im: Image object - :param info: encoderinfo - :returns: list of indexes of palette entries in use, or None - """ - if im.mode in ("P", "L") and info and info.get("optimize", 0): - # Potentially expensive operation. - - # The palette saves 3 bytes per color not used, but palette - # lengths are restricted to 3*(2**N) bytes. Max saving would - # be 768 -> 6 bytes if we went all the way down to 2 colors. - # * If we're over 128 colors, we can't save any space. - # * If there aren't any holes, it's not worth collapsing. - # * If we have a 'large' image, the palette is in the noise. - - # create the new palette if not every color is used - optimise = _FORCE_OPTIMIZE or im.mode == "L" - if optimise or im.width * im.height < 512 * 512: - # check which colors are used - used_palette_colors = [] - for i, count in enumerate(im.histogram()): - if count: - used_palette_colors.append(i) - - if optimise or ( - len(used_palette_colors) <= 128 - and max(used_palette_colors) > len(used_palette_colors) - ): - return used_palette_colors - - -def _get_color_table_size(palette_bytes): - # calculate the palette size for the header - if not palette_bytes: - return 0 - elif len(palette_bytes) < 9: - return 1 - else: - return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 - - -def _get_header_palette(palette_bytes): - """ - Returns the palette, null padded to the next power of 2 (*3) bytes - suitable for direct inclusion in the GIF header - - :param palette_bytes: Unpadded palette bytes, in RGBRGB form - :returns: Null padded palette - """ - color_table_size = _get_color_table_size(palette_bytes) - - # add the missing amount of bytes - # the palette has to be 2< 0: - palette_bytes += o8(0) * 3 * actual_target_size_diff - return palette_bytes - - -def _get_palette_bytes(im): - """ - Gets the palette for inclusion in the gif header - - :param im: Image object - :returns: Bytes, len<=768 suitable for inclusion in gif header - """ - return im.palette.palette - - -def _get_background(im, infoBackground): - background = 0 - if infoBackground: - background = infoBackground - if isinstance(background, tuple): - # WebPImagePlugin stores an RGBA value in info["background"] - # So it must be converted to the same format as GifImagePlugin's - # info["background"] - a global color table index - try: - background = im.palette.getcolor(background, im) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for the background color - return 0 - else: - raise - return background - - -def _get_global_header(im, info): - """Return a list of strings representing a GIF header""" - - # Header Block - # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp - - version = b"87a" - for extensionKey in ["transparency", "duration", "loop", "comment"]: - if info and extensionKey in info: - if (extensionKey == "duration" and info[extensionKey] == 0) or ( - extensionKey == "comment" and not (1 <= len(info[extensionKey]) <= 255) - ): - continue - version = b"89a" - break - else: - if im.info.get("version") == b"89a": - version = b"89a" - - background = _get_background(im, info.get("background")) - - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - - return [ - b"GIF" # signature - + version # version - + o16(im.size[0]) # canvas width - + o16(im.size[1]), # canvas height - # Logical Screen Descriptor - # size of global color table + global color table flag - o8(color_table_size + 128), # packed fields - # background + reserved/aspect - o8(background) + o8(0), - # Global Color Table - _get_header_palette(palette_bytes), - ] - - -def _write_frame_data(fp, im_frame, offset, params): - try: - im_frame.encoderinfo = params - - # local image header - _write_local_header(fp, im_frame, offset, 0) - - ImageFile._save( - im_frame, fp, [("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])] - ) - - fp.write(b"\0") # end of image data - finally: - del im_frame.encoderinfo - - -# -------------------------------------------------------------------- -# Legacy GIF utilities - - -def getheader(im, palette=None, info=None): - """ - Legacy Method to get Gif data from image. - - Warning:: May modify image data. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: tuple of(list of header items, optimized palette) - - """ - used_palette_colors = _get_optimize(im, info) - - if info is None: - info = {} - - if "background" not in info and "background" in im.info: - info["background"] = im.info["background"] - - im_mod = _normalize_palette(im, palette, info) - im.palette = im_mod.palette - im.im = im_mod.im - header = _get_global_header(im, info) - - return header, used_palette_colors - - -# To specify duration, add the time in milliseconds to getdata(), -# e.g. getdata(im_frame, duration=1000) -def getdata(im, offset=(0, 0), **params): - """ - Legacy Method - - Return a list of strings representing this image. - The first string is a local image header, the rest contains - encoded image data. - - :param im: Image object - :param offset: Tuple of (x, y) pixels. Defaults to (0,0) - :param \\**params: E.g. duration or other encoder info parameters - :returns: List of Bytes containing gif encoded frame data - - """ - - class Collector: - data = [] - - def write(self, data): - self.data.append(data) - - im.load() # make sure raster data is available - - fp = Collector() - - _write_frame_data(fp, im, offset, params) - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GifImageFile.format, GifImageFile, _accept) -Image.register_save(GifImageFile.format, _save) -Image.register_save_all(GifImageFile.format, _save_all) -Image.register_extension(GifImageFile.format, ".gif") -Image.register_mime(GifImageFile.format, "image/gif") - -# -# Uncomment the following line if you wish to use NETPBM/PBMPLUS -# instead of the built-in "uncompressed" GIF encoder - -# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/venv/Lib/site-packages/PIL/GimpGradientFile.py b/venv/Lib/site-packages/PIL/GimpGradientFile.py deleted file mode 100644 index 7ab7f99..0000000 --- a/venv/Lib/site-packages/PIL/GimpGradientFile.py +++ /dev/null @@ -1,140 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read (and render) GIMP gradient files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -""" -Stuff to translate curve segments to palette values (derived from -the corresponding code in GIMP, written by Federico Mena Quintero. -See the GIMP distribution for more information.) -""" - - -from math import log, pi, sin, sqrt - -from ._binary import o8 - -EPSILON = 1e-10 -"""""" # Enable auto-doc for data member - - -def linear(middle, pos): - if pos <= middle: - if middle < EPSILON: - return 0.0 - else: - return 0.5 * pos / middle - else: - pos = pos - middle - middle = 1.0 - middle - if middle < EPSILON: - return 1.0 - else: - return 0.5 + 0.5 * pos / middle - - -def curved(middle, pos): - return pos ** (log(0.5) / log(max(middle, EPSILON))) - - -def sine(middle, pos): - return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 - - -def sphere_increasing(middle, pos): - return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) - - -def sphere_decreasing(middle, pos): - return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) - - -SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] -"""""" # Enable auto-doc for data member - - -class GradientFile: - - gradient = None - - def getpalette(self, entries=256): - - palette = [] - - ix = 0 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - for i in range(entries): - - x = i / (entries - 1) - - while x1 < x: - ix += 1 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - w = x1 - x0 - - if w < EPSILON: - scale = segment(0.5, 0.5) - else: - scale = segment((xm - x0) / w, (x - x0) / w) - - # expand to RGBA - r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) - g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) - b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) - a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) - - # add to palette - palette.append(r + g + b + a) - - return b"".join(palette), "RGBA" - - -class GimpGradientFile(GradientFile): - """File handler for GIMP's gradient format.""" - - def __init__(self, fp): - - if fp.readline()[:13] != b"GIMP Gradient": - raise SyntaxError("not a GIMP gradient file") - - line = fp.readline() - - # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do - if line.startswith(b"Name: "): - line = fp.readline().strip() - - count = int(line) - - gradient = [] - - for i in range(count): - - s = fp.readline().split() - w = [float(x) for x in s[:11]] - - x0, x1 = w[0], w[2] - xm = w[1] - rgb0 = w[3:7] - rgb1 = w[7:11] - - segment = SEGMENTS[int(s[11])] - cspace = int(s[12]) - - if cspace != 0: - raise OSError("cannot handle HSV colour space") - - gradient.append((x0, x1, xm, rgb0, rgb1, segment)) - - self.gradient = gradient diff --git a/venv/Lib/site-packages/PIL/GimpPaletteFile.py b/venv/Lib/site-packages/PIL/GimpPaletteFile.py deleted file mode 100644 index 4d7cfba..0000000 --- a/venv/Lib/site-packages/PIL/GimpPaletteFile.py +++ /dev/null @@ -1,56 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read GIMP palette files -# -# History: -# 1997-08-23 fl Created -# 2004-09-07 fl Support GIMP 2.0 palette files. -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1997-2004. -# -# See the README file for information on usage and redistribution. -# - -import re - -from ._binary import o8 - - -class GimpPaletteFile: - """File handler for GIMP's palette format.""" - - rawmode = "RGB" - - def __init__(self, fp): - - self.palette = [o8(i) * 3 for i in range(256)] - - if fp.readline()[:12] != b"GIMP Palette": - raise SyntaxError("not a GIMP palette file") - - for i in range(256): - - s = fp.readline() - if not s: - break - - # skip fields and comment lines - if re.match(rb"\w+:|#", s): - continue - if len(s) > 100: - raise SyntaxError("bad palette file") - - v = tuple(map(int, s.split()[:3])) - if len(v) != 3: - raise ValueError("bad palette entry") - - self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) - - self.palette = b"".join(self.palette) - - def getpalette(self): - - return self.palette, self.rawmode diff --git a/venv/Lib/site-packages/PIL/GribStubImagePlugin.py b/venv/Lib/site-packages/PIL/GribStubImagePlugin.py deleted file mode 100644 index cc9bc26..0000000 --- a/venv/Lib/site-packages/PIL/GribStubImagePlugin.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# GRIB stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific GRIB image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[0:4] == b"GRIB" and prefix[7] == 1 - - -class GribStubImageFile(ImageFile.StubImageFile): - - format = "GRIB" - format_description = "GRIB" - - def _open(self): - - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - raise SyntaxError("Not a GRIB file") - - self.fp.seek(offset) - - # make something up - self.mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("GRIB save handler not installed") - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) -Image.register_save(GribStubImageFile.format, _save) - -Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py b/venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py deleted file mode 100644 index df11cf2..0000000 --- a/venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# HDF5 stub adapter -# -# Copyright (c) 2000-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler): - """ - Install application-specific HDF5 image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix): - return prefix[:8] == b"\x89HDF\r\n\x1a\n" - - -class HDF5StubImageFile(ImageFile.StubImageFile): - - format = "HDF5" - format_description = "HDF5" - - def _open(self): - - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - raise SyntaxError("Not an HDF file") - - self.fp.seek(offset) - - # make something up - self.mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("HDF5 save handler not installed") - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) -Image.register_save(HDF5StubImageFile.format, _save) - -Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/venv/Lib/site-packages/PIL/IcnsImagePlugin.py b/venv/Lib/site-packages/PIL/IcnsImagePlugin.py deleted file mode 100644 index fa192f0..0000000 --- a/venv/Lib/site-packages/PIL/IcnsImagePlugin.py +++ /dev/null @@ -1,392 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# macOS icns file decoder, based on icns.py by Bob Ippolito. -# -# history: -# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. -# 2020-04-04 Allow saving on all operating systems. -# -# Copyright (c) 2004 by Bob Ippolito. -# Copyright (c) 2004 by Secret Labs. -# Copyright (c) 2004 by Fredrik Lundh. -# Copyright (c) 2014 by Alastair Houghton. -# Copyright (c) 2020 by Pan Jing. -# -# See the README file for information on usage and redistribution. -# - -import io -import os -import struct -import sys - -from PIL import Image, ImageFile, PngImagePlugin, features - -enable_jpeg2k = features.check_codec("jpg_2000") -if enable_jpeg2k: - from PIL import Jpeg2KImagePlugin - -MAGIC = b"icns" -HEADERSIZE = 8 - - -def nextheader(fobj): - return struct.unpack(">4sI", fobj.read(HEADERSIZE)) - - -def read_32t(fobj, start_length, size): - # The 128x128 icon seems to have an extra header for some reason. - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(4) - if sig != b"\x00\x00\x00\x00": - raise SyntaxError("Unknown signature, expecting 0x00000000") - return read_32(fobj, (start + 4, length - 4), size) - - -def read_32(fobj, start_length, size): - """ - Read a 32bit RGB icon resource. Seems to be either uncompressed or - an RLE packbits-like scheme. - """ - (start, length) = start_length - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - if length == sizesq * 3: - # uncompressed ("RGBRGBGB") - indata = fobj.read(length) - im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) - else: - # decode image - im = Image.new("RGB", pixel_size, None) - for band_ix in range(3): - data = [] - bytesleft = sizesq - while bytesleft > 0: - byte = fobj.read(1) - if not byte: - break - byte = byte[0] - if byte & 0x80: - blocksize = byte - 125 - byte = fobj.read(1) - for i in range(blocksize): - data.append(byte) - else: - blocksize = byte + 1 - data.append(fobj.read(blocksize)) - bytesleft -= blocksize - if bytesleft <= 0: - break - if bytesleft != 0: - raise SyntaxError(f"Error reading channel [{repr(bytesleft)} left]") - band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) - im.im.putband(band.im, band_ix) - return {"RGB": im} - - -def read_mk(fobj, start_length, size): - # Alpha masks seem to be uncompressed - start = start_length[0] - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) - return {"A": band} - - -def read_png_or_jpeg2000(fobj, start_length, size): - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(12) - if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": - fobj.seek(start) - im = PngImagePlugin.PngImageFile(fobj) - Image._decompression_bomb_check(im.size) - return {"RGBA": im} - elif ( - sig[:4] == b"\xff\x4f\xff\x51" - or sig[:4] == b"\x0d\x0a\x87\x0a" - or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ): - if not enable_jpeg2k: - raise ValueError( - "Unsupported icon subimage format (rebuild PIL " - "with JPEG 2000 support to fix this)" - ) - # j2k, jpc or j2c - fobj.seek(start) - jp2kstream = fobj.read(length) - f = io.BytesIO(jp2kstream) - im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) - Image._decompression_bomb_check(im.size) - if im.mode != "RGBA": - im = im.convert("RGBA") - return {"RGBA": im} - else: - raise ValueError("Unsupported icon subimage format") - - -class IcnsFile: - - SIZES = { - (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], - (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], - (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], - (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], - (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], - (128, 128, 1): [ - (b"ic07", read_png_or_jpeg2000), - (b"it32", read_32t), - (b"t8mk", read_mk), - ], - (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], - (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], - (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], - (32, 32, 1): [ - (b"icp5", read_png_or_jpeg2000), - (b"il32", read_32), - (b"l8mk", read_mk), - ], - (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], - (16, 16, 1): [ - (b"icp4", read_png_or_jpeg2000), - (b"is32", read_32), - (b"s8mk", read_mk), - ], - } - - def __init__(self, fobj): - """ - fobj is a file-like object as an icns resource - """ - # signature : (start, length) - self.dct = dct = {} - self.fobj = fobj - sig, filesize = nextheader(fobj) - if not _accept(sig): - raise SyntaxError("not an icns file") - i = HEADERSIZE - while i < filesize: - sig, blocksize = nextheader(fobj) - if blocksize <= 0: - raise SyntaxError("invalid block header") - i += HEADERSIZE - blocksize -= HEADERSIZE - dct[sig] = (i, blocksize) - fobj.seek(blocksize, io.SEEK_CUR) - i += blocksize - - def itersizes(self): - sizes = [] - for size, fmts in self.SIZES.items(): - for (fmt, reader) in fmts: - if fmt in self.dct: - sizes.append(size) - break - return sizes - - def bestsize(self): - sizes = self.itersizes() - if not sizes: - raise SyntaxError("No 32bit icon resources found") - return max(sizes) - - def dataforsize(self, size): - """ - Get an icon resource as {channel: array}. Note that - the arrays are bottom-up like windows bitmaps and will likely - need to be flipped or transposed in some way. - """ - dct = {} - for code, reader in self.SIZES[size]: - desc = self.dct.get(code) - if desc is not None: - dct.update(reader(self.fobj, desc, size)) - return dct - - def getimage(self, size=None): - if size is None: - size = self.bestsize() - if len(size) == 2: - size = (size[0], size[1], 1) - channels = self.dataforsize(size) - - im = channels.get("RGBA", None) - if im: - return im - - im = channels.get("RGB").copy() - try: - im.putalpha(channels["A"]) - except KeyError: - pass - return im - - -## -# Image plugin for Mac OS icons. - - -class IcnsImageFile(ImageFile.ImageFile): - """ - PIL image support for Mac OS .icns files. - Chooses the best resolution, but will possibly load - a different size image if you mutate the size attribute - before calling 'load'. - - The info dictionary has a key 'sizes' that is a list - of sizes that the icns file has. - """ - - format = "ICNS" - format_description = "Mac OS icns resource" - - def _open(self): - self.icns = IcnsFile(self.fp) - self.mode = "RGBA" - self.info["sizes"] = self.icns.itersizes() - self.best_size = self.icns.bestsize() - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - info_size = value - if info_size not in self.info["sizes"] and len(info_size) == 2: - info_size = (info_size[0], info_size[1], 1) - if ( - info_size not in self.info["sizes"] - and len(info_size) == 3 - and info_size[2] == 1 - ): - simple_sizes = [ - (size[0] * size[2], size[1] * size[2]) for size in self.info["sizes"] - ] - if value in simple_sizes: - info_size = self.info["sizes"][simple_sizes.index(value)] - if info_size not in self.info["sizes"]: - raise ValueError("This is not one of the allowed sizes of this image") - self._size = value - - def load(self): - if len(self.size) == 3: - self.best_size = self.size - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - px = Image.Image.load(self) - if self.im is not None and self.im.size == self.size: - # Already loaded - return px - self.load_prepare() - # This is likely NOT the best way to do it, but whatever. - im = self.icns.getimage(self.best_size) - - # If this is a PNG or JPEG 2000, it won't be loaded yet - px = im.load() - - self.im = im.im - self.mode = im.mode - self.size = im.size - - return px - - -def _save(im, fp, filename): - """ - Saves the image as a series of PNG files, - that are then combined into a .icns file. - """ - if hasattr(fp, "flush"): - fp.flush() - - sizes = { - b"ic07": 128, - b"ic08": 256, - b"ic09": 512, - b"ic10": 1024, - b"ic11": 32, - b"ic12": 64, - b"ic13": 256, - b"ic14": 512, - } - provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} - size_streams = {} - for size in set(sizes.values()): - image = ( - provided_images[size] - if size in provided_images - else im.resize((size, size)) - ) - - temp = io.BytesIO() - image.save(temp, "png") - size_streams[size] = temp.getvalue() - - entries = [] - for type, size in sizes.items(): - stream = size_streams[size] - entries.append( - {"type": type, "size": HEADERSIZE + len(stream), "stream": stream} - ) - - # Header - fp.write(MAGIC) - file_length = HEADERSIZE # Header - file_length += HEADERSIZE + 8 * len(entries) # TOC - file_length += sum(entry["size"] for entry in entries) - fp.write(struct.pack(">i", file_length)) - - # TOC - fp.write(b"TOC ") - fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) - for entry in entries: - fp.write(entry["type"]) - fp.write(struct.pack(">i", entry["size"])) - - # Data - for entry in entries: - fp.write(entry["type"]) - fp.write(struct.pack(">i", entry["size"])) - fp.write(entry["stream"]) - - if hasattr(fp, "flush"): - fp.flush() - - -def _accept(prefix): - return prefix[:4] == MAGIC - - -Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) -Image.register_extension(IcnsImageFile.format, ".icns") - -Image.register_save(IcnsImageFile.format, _save) -Image.register_mime(IcnsImageFile.format, "image/icns") - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 IcnsImagePlugin.py [file]") - sys.exit() - - with open(sys.argv[1], "rb") as fp: - imf = IcnsImageFile(fp) - for size in imf.info["sizes"]: - imf.size = size - imf.save("out-%s-%s-%s.png" % size) - with Image.open(sys.argv[1]) as im: - im.save("out.png") - if sys.platform == "windows": - os.startfile("out.png") diff --git a/venv/Lib/site-packages/PIL/IcoImagePlugin.py b/venv/Lib/site-packages/PIL/IcoImagePlugin.py deleted file mode 100644 index 17b9855..0000000 --- a/venv/Lib/site-packages/PIL/IcoImagePlugin.py +++ /dev/null @@ -1,355 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Icon support for PIL -# -# History: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis -# . -# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki -# -# Icon format references: -# * https://en.wikipedia.org/wiki/ICO_(file_format) -# * https://msdn.microsoft.com/en-us/library/ms997538.aspx - - -import warnings -from io import BytesIO -from math import ceil, log - -from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o16le as o16 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -_MAGIC = b"\0\0\1\0" - - -def _save(im, fp, filename): - fp.write(_MAGIC) # (2+2) - bmp = im.encoderinfo.get("bitmap_format") == "bmp" - sizes = im.encoderinfo.get( - "sizes", - [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], - ) - frames = [] - provided_ims = [im] + im.encoderinfo.get("append_images", []) - width, height = im.size - for size in sorted(set(sizes)): - if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: - continue - - for provided_im in provided_ims: - if provided_im.size != size: - continue - frames.append(provided_im) - if bmp: - bits = BmpImagePlugin.SAVE[provided_im.mode][1] - bits_used = [bits] - for other_im in provided_ims: - if other_im.size != size: - continue - bits = BmpImagePlugin.SAVE[other_im.mode][1] - if bits not in bits_used: - # Another image has been supplied for this size - # with a different bit depth - frames.append(other_im) - bits_used.append(bits) - break - else: - # TODO: invent a more convenient method for proportional scalings - frame = provided_im.copy() - frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) - frames.append(frame) - fp.write(o16(len(frames))) # idCount(2) - offset = fp.tell() + len(frames) * 16 - for frame in frames: - width, height = frame.size - # 0 means 256 - fp.write(o8(width if width < 256 else 0)) # bWidth(1) - fp.write(o8(height if height < 256 else 0)) # bHeight(1) - - bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) - fp.write(o8(colors)) # bColorCount(1) - fp.write(b"\0") # bReserved(1) - fp.write(b"\0\0") # wPlanes(2) - fp.write(o16(bits)) # wBitCount(2) - - image_io = BytesIO() - if bmp: - frame.save(image_io, "dib") - - if bits != 32: - and_mask = Image.new("1", size) - ImageFile._save( - and_mask, image_io, [("raw", (0, 0) + size, 0, ("1", 0, -1))] - ) - else: - frame.save(image_io, "png") - image_io.seek(0) - image_bytes = image_io.read() - if bmp: - image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] - bytes_len = len(image_bytes) - fp.write(o32(bytes_len)) # dwBytesInRes(4) - fp.write(o32(offset)) # dwImageOffset(4) - current = fp.tell() - fp.seek(offset) - fp.write(image_bytes) - offset = offset + bytes_len - fp.seek(current) - - -def _accept(prefix): - return prefix[:4] == _MAGIC - - -class IcoFile: - def __init__(self, buf): - """ - Parse image from file-like object containing ico file data - """ - - # check magic - s = buf.read(6) - if not _accept(s): - raise SyntaxError("not an ICO file") - - self.buf = buf - self.entry = [] - - # Number of items in file - self.nb_items = i16(s, 4) - - # Get headers for each item - for i in range(self.nb_items): - s = buf.read(16) - - icon_header = { - "width": s[0], - "height": s[1], - "nb_color": s[2], # No. of colors in image (0 if >=8bpp) - "reserved": s[3], - "planes": i16(s, 4), - "bpp": i16(s, 6), - "size": i32(s, 8), - "offset": i32(s, 12), - } - - # See Wikipedia - for j in ("width", "height"): - if not icon_header[j]: - icon_header[j] = 256 - - # See Wikipedia notes about color depth. - # We need this just to differ images with equal sizes - icon_header["color_depth"] = ( - icon_header["bpp"] - or ( - icon_header["nb_color"] != 0 - and ceil(log(icon_header["nb_color"], 2)) - ) - or 256 - ) - - icon_header["dim"] = (icon_header["width"], icon_header["height"]) - icon_header["square"] = icon_header["width"] * icon_header["height"] - - self.entry.append(icon_header) - - self.entry = sorted(self.entry, key=lambda x: x["color_depth"]) - # ICO images are usually squares - # self.entry = sorted(self.entry, key=lambda x: x['width']) - self.entry = sorted(self.entry, key=lambda x: x["square"]) - self.entry.reverse() - - def sizes(self): - """ - Get a list of all available icon sizes and color depths. - """ - return {(h["width"], h["height"]) for h in self.entry} - - def getentryindex(self, size, bpp=False): - for (i, h) in enumerate(self.entry): - if size == h["dim"] and (bpp is False or bpp == h["color_depth"]): - return i - return 0 - - def getimage(self, size, bpp=False): - """ - Get an image from the icon - """ - return self.frame(self.getentryindex(size, bpp)) - - def frame(self, idx): - """ - Get an image from frame idx - """ - - header = self.entry[idx] - - self.buf.seek(header["offset"]) - data = self.buf.read(8) - self.buf.seek(header["offset"]) - - if data[:8] == PngImagePlugin._MAGIC: - # png frame - im = PngImagePlugin.PngImageFile(self.buf) - Image._decompression_bomb_check(im.size) - else: - # XOR + AND mask bmp frame - im = BmpImagePlugin.DibImageFile(self.buf) - Image._decompression_bomb_check(im.size) - - # change tile dimension to only encompass XOR image - im._size = (im.size[0], int(im.size[1] / 2)) - d, e, o, a = im.tile[0] - im.tile[0] = d, (0, 0) + im.size, o, a - - # figure out where AND mask image starts - bpp = header["bpp"] - if 32 == bpp: - # 32-bit color depth icon image allows semitransparent areas - # PIL's DIB format ignores transparency bits, recover them. - # The DIB is packed in BGRX byte order where X is the alpha - # channel. - - # Back up to start of bmp data - self.buf.seek(o) - # extract every 4th byte (eg. 3,7,11,15,...) - alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] - - # convert to an 8bpp grayscale image - mask = Image.frombuffer( - "L", # 8bpp - im.size, # (w, h) - alpha_bytes, # source chars - "raw", # raw decoder - ("L", 0, -1), # 8bpp inverted, unpadded, reversed - ) - else: - # get AND image from end of bitmap - w = im.size[0] - if (w % 32) > 0: - # bitmap row data is aligned to word boundaries - w += 32 - (im.size[0] % 32) - - # the total mask data is - # padded row size * height / bits per char - - total_bytes = int((w * im.size[1]) / 8) - and_mask_offset = header["offset"] + header["size"] - total_bytes - - self.buf.seek(and_mask_offset) - mask_data = self.buf.read(total_bytes) - - # convert raw data to image - mask = Image.frombuffer( - "1", # 1 bpp - im.size, # (w, h) - mask_data, # source chars - "raw", # raw decoder - ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed - ) - - # now we have two images, im is XOR image and mask is AND image - - # apply mask image as alpha channel - im = im.convert("RGBA") - im.putalpha(mask) - - return im - - -## -# Image plugin for Windows Icon files. - - -class IcoImageFile(ImageFile.ImageFile): - """ - PIL read-only image support for Microsoft Windows .ico files. - - By default the largest resolution image in the file will be loaded. This - can be changed by altering the 'size' attribute before calling 'load'. - - The info dictionary has a key 'sizes' that is a list of the sizes available - in the icon file. - - Handles classic, XP and Vista icon formats. - - When saving, PNG compression is used. Support for this was only added in - Windows Vista. If you are unable to view the icon in Windows, convert the - image to "RGBA" mode before saving. - - This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis - . - https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki - """ - - format = "ICO" - format_description = "Windows Icon" - - def _open(self): - self.ico = IcoFile(self.fp) - self.info["sizes"] = self.ico.sizes() - self.size = self.ico.entry[0]["dim"] - self.load() - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - if value not in self.info["sizes"]: - raise ValueError("This is not one of the allowed sizes of this image") - self._size = value - - def load(self): - if self.im is not None and self.im.size == self.size: - # Already loaded - return Image.Image.load(self) - im = self.ico.getimage(self.size) - # if tile is PNG, it won't really be loaded yet - im.load() - self.im = im.im - self.mode = im.mode - if im.size != self.size: - warnings.warn("Image was not the expected size") - - index = self.ico.getentryindex(self.size) - sizes = list(self.info["sizes"]) - sizes[index] = im.size - self.info["sizes"] = set(sizes) - - self.size = im.size - - def load_seek(self): - # Flag the ImageFile.Parser so that it - # just does all the decode at the end. - pass - - -# -# -------------------------------------------------------------------- - - -Image.register_open(IcoImageFile.format, IcoImageFile, _accept) -Image.register_save(IcoImageFile.format, _save) -Image.register_extension(IcoImageFile.format, ".ico") - -Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/venv/Lib/site-packages/PIL/ImImagePlugin.py b/venv/Lib/site-packages/PIL/ImImagePlugin.py deleted file mode 100644 index f7e690b..0000000 --- a/venv/Lib/site-packages/PIL/ImImagePlugin.py +++ /dev/null @@ -1,376 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IFUNC IM file handling for PIL -# -# history: -# 1995-09-01 fl Created. -# 1997-01-03 fl Save palette images -# 1997-01-08 fl Added sequence support -# 1997-01-23 fl Added P and RGB save support -# 1997-05-31 fl Read floating point images -# 1997-06-22 fl Save floating point images -# 1997-08-27 fl Read and save 1-bit images -# 1998-06-25 fl Added support for RGB+LUT images -# 1998-07-02 fl Added support for YCC images -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 1998-12-29 fl Added I;16 support -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# 2003-09-26 fl Added LA/PA support -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -import os -import re - -from . import Image, ImageFile, ImagePalette - -# -------------------------------------------------------------------- -# Standard tags - -COMMENT = "Comment" -DATE = "Date" -EQUIPMENT = "Digitalization equipment" -FRAMES = "File size (no of images)" -LUT = "Lut" -NAME = "Name" -SCALE = "Scale (x,y)" -SIZE = "Image size (x*y)" -MODE = "Image type" - -TAGS = { - COMMENT: 0, - DATE: 0, - EQUIPMENT: 0, - FRAMES: 0, - LUT: 0, - NAME: 0, - SCALE: 0, - SIZE: 0, - MODE: 0, -} - -OPEN = { - # ifunc93/p3cfunc formats - "0 1 image": ("1", "1"), - "L 1 image": ("1", "1"), - "Greyscale image": ("L", "L"), - "Grayscale image": ("L", "L"), - "RGB image": ("RGB", "RGB;L"), - "RLB image": ("RGB", "RLB"), - "RYB image": ("RGB", "RLB"), - "B1 image": ("1", "1"), - "B2 image": ("P", "P;2"), - "B4 image": ("P", "P;4"), - "X 24 image": ("RGB", "RGB"), - "L 32 S image": ("I", "I;32"), - "L 32 F image": ("F", "F;32"), - # old p3cfunc formats - "RGB3 image": ("RGB", "RGB;T"), - "RYB3 image": ("RGB", "RYB;T"), - # extensions - "LA image": ("LA", "LA;L"), - "PA image": ("LA", "PA;L"), - "RGBA image": ("RGBA", "RGBA;L"), - "RGBX image": ("RGBX", "RGBX;L"), - "CMYK image": ("CMYK", "CMYK;L"), - "YCC image": ("YCbCr", "YCbCr;L"), -} - -# ifunc95 extensions -for i in ["8", "8S", "16", "16S", "32", "32F"]: - OPEN[f"L {i} image"] = ("F", f"F;{i}") - OPEN[f"L*{i} image"] = ("F", f"F;{i}") -for i in ["16", "16L", "16B"]: - OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") - OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") -for i in ["32S"]: - OPEN[f"L {i} image"] = ("I", f"I;{i}") - OPEN[f"L*{i} image"] = ("I", f"I;{i}") -for i in range(2, 33): - OPEN[f"L*{i} image"] = ("F", f"F;{i}") - - -# -------------------------------------------------------------------- -# Read IM directory - -split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") - - -def number(s): - try: - return int(s) - except ValueError: - return float(s) - - -## -# Image plugin for the IFUNC IM file format. - - -class ImImageFile(ImageFile.ImageFile): - - format = "IM" - format_description = "IFUNC Image Memory" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # Quick rejection: if there's not an LF among the first - # 100 bytes, this is (probably) not a text header. - - if b"\n" not in self.fp.read(100): - raise SyntaxError("not an IM file") - self.fp.seek(0) - - n = 0 - - # Default values - self.info[MODE] = "L" - self.info[SIZE] = (512, 512) - self.info[FRAMES] = 1 - - self.rawmode = "L" - - while True: - - s = self.fp.read(1) - - # Some versions of IFUNC uses \n\r instead of \r\n... - if s == b"\r": - continue - - if not s or s == b"\0" or s == b"\x1A": - break - - # FIXME: this may read whole file if not a text file - s = s + self.fp.readline() - - if len(s) > 100: - raise SyntaxError("not an IM file") - - if s[-2:] == b"\r\n": - s = s[:-2] - elif s[-1:] == b"\n": - s = s[:-1] - - try: - m = split.match(s) - except re.error as e: - raise SyntaxError("not an IM file") from e - - if m: - - k, v = m.group(1, 2) - - # Don't know if this is the correct encoding, - # but a decent guess (I guess) - k = k.decode("latin-1", "replace") - v = v.decode("latin-1", "replace") - - # Convert value as appropriate - if k in [FRAMES, SCALE, SIZE]: - v = v.replace("*", ",") - v = tuple(map(number, v.split(","))) - if len(v) == 1: - v = v[0] - elif k == MODE and v in OPEN: - v, self.rawmode = OPEN[v] - - # Add to dictionary. Note that COMMENT tags are - # combined into a list of strings. - if k == COMMENT: - if k in self.info: - self.info[k].append(v) - else: - self.info[k] = [v] - else: - self.info[k] = v - - if k in TAGS: - n += 1 - - else: - - raise SyntaxError( - "Syntax error in IM header: " + s.decode("ascii", "replace") - ) - - if not n: - raise SyntaxError("Not an IM file") - - # Basic attributes - self._size = self.info[SIZE] - self.mode = self.info[MODE] - - # Skip forward to start of image data - while s and s[0:1] != b"\x1A": - s = self.fp.read(1) - if not s: - raise SyntaxError("File truncated") - - if LUT in self.info: - # convert lookup table to palette or lut attribute - palette = self.fp.read(768) - greyscale = 1 # greyscale palette - linear = 1 # linear greyscale palette - for i in range(256): - if palette[i] == palette[i + 256] == palette[i + 512]: - if palette[i] != i: - linear = 0 - else: - greyscale = 0 - if self.mode in ["L", "LA", "P", "PA"]: - if greyscale: - if not linear: - self.lut = list(palette[:256]) - else: - if self.mode in ["L", "P"]: - self.mode = self.rawmode = "P" - elif self.mode in ["LA", "PA"]: - self.mode = "PA" - self.rawmode = "PA;L" - self.palette = ImagePalette.raw("RGB;L", palette) - elif self.mode == "RGB": - if not greyscale or not linear: - self.lut = list(palette) - - self.frame = 0 - - self.__offset = offs = self.fp.tell() - - self.__fp = self.fp # FIXME: hack - - if self.rawmode[:2] == "F;": - - # ifunc95 formats - try: - # use bit decoder (if necessary) - bits = int(self.rawmode[2:]) - if bits not in [8, 16, 32]: - self.tile = [("bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1))] - return - except ValueError: - pass - - if self.rawmode in ["RGB;T", "RYB;T"]: - # Old LabEye/3PC files. Would be very surprised if anyone - # ever stumbled upon such a file ;-) - size = self.size[0] * self.size[1] - self.tile = [ - ("raw", (0, 0) + self.size, offs, ("G", 0, -1)), - ("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), - ("raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1)), - ] - else: - # LabEye/IFUNC files - self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] - - @property - def n_frames(self): - return self.info[FRAMES] - - @property - def is_animated(self): - return self.info[FRAMES] > 1 - - def seek(self, frame): - if not self._seek_check(frame): - return - - self.frame = frame - - if self.mode == "1": - bits = 1 - else: - bits = 8 * len(self.mode) - - size = ((self.size[0] * bits + 7) // 8) * self.size[1] - offs = self.__offset + frame * size - - self.fp = self.__fp - - self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] - - def tell(self): - return self.frame - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -# -# -------------------------------------------------------------------- -# Save IM files - - -SAVE = { - # mode: (im type, raw mode) - "1": ("0 1", "1"), - "L": ("Greyscale", "L"), - "LA": ("LA", "LA;L"), - "P": ("Greyscale", "P"), - "PA": ("LA", "PA;L"), - "I": ("L 32S", "I;32S"), - "I;16": ("L 16", "I;16"), - "I;16L": ("L 16L", "I;16L"), - "I;16B": ("L 16B", "I;16B"), - "F": ("L 32F", "F;32F"), - "RGB": ("RGB", "RGB;L"), - "RGBA": ("RGBA", "RGBA;L"), - "RGBX": ("RGBX", "RGBX;L"), - "CMYK": ("CMYK", "CMYK;L"), - "YCbCr": ("YCC", "YCbCr;L"), -} - - -def _save(im, fp, filename): - - try: - image_type, rawmode = SAVE[im.mode] - except KeyError as e: - raise ValueError(f"Cannot save {im.mode} images as IM") from e - - frames = im.encoderinfo.get("frames", 1) - - fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) - if filename: - # Each line must be 100 characters or less, - # or: SyntaxError("not an IM file") - # 8 characters are used for "Name: " and "\r\n" - # Keep just the filename, ditch the potentially overlong path - name, ext = os.path.splitext(os.path.basename(filename)) - name = "".join([name[: 92 - len(ext)], ext]) - - fp.write(f"Name: {name}\r\n".encode("ascii")) - fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode("ascii")) - fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) - if im.mode in ["P", "PA"]: - fp.write(b"Lut: 1\r\n") - fp.write(b"\000" * (511 - fp.tell()) + b"\032") - if im.mode in ["P", "PA"]: - fp.write(im.im.getpalette("RGB", "RGB;L")) # 768 bytes - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))]) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(ImImageFile.format, ImImageFile) -Image.register_save(ImImageFile.format, _save) - -Image.register_extension(ImImageFile.format, ".im") diff --git a/venv/Lib/site-packages/PIL/Image.py b/venv/Lib/site-packages/PIL/Image.py deleted file mode 100644 index 813ac52..0000000 --- a/venv/Lib/site-packages/PIL/Image.py +++ /dev/null @@ -1,3697 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# the Image class wrapper -# -# partial release history: -# 1995-09-09 fl Created -# 1996-03-11 fl PIL release 0.0 (proof of concept) -# 1996-04-30 fl PIL release 0.1b1 -# 1999-07-28 fl PIL release 1.0 final -# 2000-06-07 fl PIL release 1.1 -# 2000-10-20 fl PIL release 1.1.1 -# 2001-05-07 fl PIL release 1.1.2 -# 2002-03-15 fl PIL release 1.1.3 -# 2003-05-10 fl PIL release 1.1.4 -# 2005-03-28 fl PIL release 1.1.5 -# 2006-12-02 fl PIL release 1.1.6 -# 2009-11-15 fl PIL release 1.1.7 -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import atexit -import builtins -import io -import logging -import math -import numbers -import os -import re -import struct -import sys -import tempfile -import warnings -from collections.abc import Callable, MutableMapping -from enum import IntEnum -from pathlib import Path - -try: - import defusedxml.ElementTree as ElementTree -except ImportError: - ElementTree = None - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -from . import ImageMode, TiffTags, UnidentifiedImageError, __version__, _plugins -from ._binary import i32le, o32be, o32le -from ._util import deferred_error, isPath - - -def __getattr__(name): - deprecated = "deprecated and will be removed in Pillow 10 (2023-07-01). " - categories = {"NORMAL": 0, "SEQUENCE": 1, "CONTAINER": 2} - if name in categories: - warnings.warn( - "Image categories are " + deprecated + "Use is_animated instead.", - DeprecationWarning, - stacklevel=2, - ) - return categories[name] - elif name in ("NEAREST", "NONE"): - warnings.warn( - name - + " is " - + deprecated - + "Use Resampling.NEAREST or Dither.NONE instead.", - DeprecationWarning, - stacklevel=2, - ) - return 0 - old_resampling = { - "LINEAR": "BILINEAR", - "CUBIC": "BICUBIC", - "ANTIALIAS": "LANCZOS", - } - if name in old_resampling: - warnings.warn( - name - + " is " - + deprecated - + "Use Resampling." - + old_resampling[name] - + " instead.", - DeprecationWarning, - stacklevel=2, - ) - return Resampling[old_resampling[name]] - for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): - if name in enum.__members__: - warnings.warn( - name - + " is " - + deprecated - + "Use " - + enum.__name__ - + "." - + name - + " instead.", - DeprecationWarning, - stacklevel=2, - ) - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -logger = logging.getLogger(__name__) - - -class DecompressionBombWarning(RuntimeWarning): - pass - - -class DecompressionBombError(Exception): - pass - - -# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image -MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 // 4 // 3) - - -try: - # If the _imaging C module is not present, Pillow will not load. - # Note that other modules should not refer to _imaging directly; - # import Image and use the Image.core variable instead. - # Also note that Image.core is not a publicly documented interface, - # and should be considered private and subject to change. - from . import _imaging as core - - if __version__ != getattr(core, "PILLOW_VERSION", None): - raise ImportError( - "The _imaging extension was built for another version of Pillow or PIL:\n" - f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" - f"Pillow version: {__version__}" - ) - -except ImportError as v: - core = deferred_error(ImportError("The _imaging C module is not installed.")) - # Explanations for ways that we know we might have an import error - if str(v).startswith("Module use of python"): - # The _imaging C module is present, but not compiled for - # the right version (windows only). Print a warning, if - # possible. - warnings.warn( - "The _imaging extension was built for another version of Python.", - RuntimeWarning, - ) - elif str(v).startswith("The _imaging extension"): - warnings.warn(str(v), RuntimeWarning) - # Fail here anyway. Don't let people run with a mostly broken Pillow. - # see docs/porting.rst - raise - - -# works everywhere, win for pypy, not cpython -USE_CFFI_ACCESS = hasattr(sys, "pypy_version_info") -try: - import cffi -except ImportError: - cffi = None - - -def isImageType(t): - """ - Checks if an object is an image object. - - .. warning:: - - This function is for internal use only. - - :param t: object to check if it's an image - :returns: True if the object is an image - """ - return hasattr(t, "im") - - -# -# Constants - -# transpose -class Transpose(IntEnum): - FLIP_LEFT_RIGHT = 0 - FLIP_TOP_BOTTOM = 1 - ROTATE_90 = 2 - ROTATE_180 = 3 - ROTATE_270 = 4 - TRANSPOSE = 5 - TRANSVERSE = 6 - - -# transforms (also defined in Imaging.h) -class Transform(IntEnum): - AFFINE = 0 - EXTENT = 1 - PERSPECTIVE = 2 - QUAD = 3 - MESH = 4 - - -# resampling filters (also defined in Imaging.h) -class Resampling(IntEnum): - NEAREST = 0 - BOX = 4 - BILINEAR = 2 - HAMMING = 5 - BICUBIC = 3 - LANCZOS = 1 - - -_filters_support = { - Resampling.BOX: 0.5, - Resampling.BILINEAR: 1.0, - Resampling.HAMMING: 1.0, - Resampling.BICUBIC: 2.0, - Resampling.LANCZOS: 3.0, -} - - -# dithers -class Dither(IntEnum): - NONE = 0 - ORDERED = 1 # Not yet implemented - RASTERIZE = 2 # Not yet implemented - FLOYDSTEINBERG = 3 # default - - -# palettes/quantizers -class Palette(IntEnum): - WEB = 0 - ADAPTIVE = 1 - - -class Quantize(IntEnum): - MEDIANCUT = 0 - MAXCOVERAGE = 1 - FASTOCTREE = 2 - LIBIMAGEQUANT = 3 - - -if hasattr(core, "DEFAULT_STRATEGY"): - DEFAULT_STRATEGY = core.DEFAULT_STRATEGY - FILTERED = core.FILTERED - HUFFMAN_ONLY = core.HUFFMAN_ONLY - RLE = core.RLE - FIXED = core.FIXED - - -# -------------------------------------------------------------------- -# Registries - -ID = [] -OPEN = {} -MIME = {} -SAVE = {} -SAVE_ALL = {} -EXTENSION = {} -DECODERS = {} -ENCODERS = {} - -# -------------------------------------------------------------------- -# Modes - -_ENDIAN = "<" if sys.byteorder == "little" else ">" - - -def _conv_type_shape(im): - m = ImageMode.getmode(im.mode) - shape = (im.height, im.width) - extra = len(m.bands) - if extra != 1: - shape += (extra,) - return shape, m.typestr - - -MODES = ["1", "CMYK", "F", "HSV", "I", "L", "LAB", "P", "RGB", "RGBA", "RGBX", "YCbCr"] - -# raw modes that may be memory mapped. NOTE: if you change this, you -# may have to modify the stride calculation in map.c too! -_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") - - -def getmodebase(mode): - """ - Gets the "base" mode for given mode. This function returns "L" for - images that contain grayscale data, and "RGB" for images that - contain color data. - - :param mode: Input mode. - :returns: "L" or "RGB". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basemode - - -def getmodetype(mode): - """ - Gets the storage type mode. Given a mode, this function returns a - single-layer mode suitable for storing individual bands. - - :param mode: Input mode. - :returns: "L", "I", or "F". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basetype - - -def getmodebandnames(mode): - """ - Gets a list of individual band names. Given a mode, this function returns - a tuple containing the names of individual bands (use - :py:method:`~PIL.Image.getmodetype` to get the mode used to store each - individual band. - - :param mode: Input mode. - :returns: A tuple containing band names. The length of the tuple - gives the number of bands in an image of the given mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).bands - - -def getmodebands(mode): - """ - Gets the number of individual bands for this mode. - - :param mode: Input mode. - :returns: The number of bands in this mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return len(ImageMode.getmode(mode).bands) - - -# -------------------------------------------------------------------- -# Helpers - -_initialized = 0 - - -def preinit(): - """Explicitly load standard file format drivers.""" - - global _initialized - if _initialized >= 1: - return - - try: - from . import BmpImagePlugin - - assert BmpImagePlugin - except ImportError: - pass - try: - from . import GifImagePlugin - - assert GifImagePlugin - except ImportError: - pass - try: - from . import JpegImagePlugin - - assert JpegImagePlugin - except ImportError: - pass - try: - from . import PpmImagePlugin - - assert PpmImagePlugin - except ImportError: - pass - try: - from . import PngImagePlugin - - assert PngImagePlugin - except ImportError: - pass - # try: - # import TiffImagePlugin - # assert TiffImagePlugin - # except ImportError: - # pass - - _initialized = 1 - - -def init(): - """ - Explicitly initializes the Python Imaging Library. This function - loads all available file format drivers. - """ - - global _initialized - if _initialized >= 2: - return 0 - - for plugin in _plugins: - try: - logger.debug("Importing %s", plugin) - __import__(f"PIL.{plugin}", globals(), locals(), []) - except ImportError as e: - logger.debug("Image: failed to import %s: %s", plugin, e) - - if OPEN or SAVE: - _initialized = 2 - return 1 - - -# -------------------------------------------------------------------- -# Codec factories (used by tobytes/frombytes and ImageFile.load) - - -def _getdecoder(mode, decoder_name, args, extra=()): - - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - decoder = DECODERS[decoder_name] - except KeyError: - pass - else: - return decoder(mode, *args + extra) - - try: - # get decoder - decoder = getattr(core, decoder_name + "_decoder") - except AttributeError as e: - raise OSError(f"decoder {decoder_name} not available") from e - return decoder(mode, *args + extra) - - -def _getencoder(mode, encoder_name, args, extra=()): - - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - encoder = ENCODERS[encoder_name] - except KeyError: - pass - else: - return encoder(mode, *args + extra) - - try: - # get encoder - encoder = getattr(core, encoder_name + "_encoder") - except AttributeError as e: - raise OSError(f"encoder {encoder_name} not available") from e - return encoder(mode, *args + extra) - - -# -------------------------------------------------------------------- -# Simple expression analyzer - - -def coerce_e(value): - return value if isinstance(value, _E) else _E(value) - - -class _E: - def __init__(self, data): - self.data = data - - def __add__(self, other): - return _E((self.data, "__add__", coerce_e(other).data)) - - def __mul__(self, other): - return _E((self.data, "__mul__", coerce_e(other).data)) - - -def _getscaleoffset(expr): - stub = ["stub"] - data = expr(_E(stub)).data - try: - (a, b, c) = data # simplified syntax - if a is stub and b == "__mul__" and isinstance(c, numbers.Number): - return c, 0.0 - if a is stub and b == "__add__" and isinstance(c, numbers.Number): - return 1.0, c - except TypeError: - pass - try: - ((a, b, c), d, e) = data # full syntax - if ( - a is stub - and b == "__mul__" - and isinstance(c, numbers.Number) - and d == "__add__" - and isinstance(e, numbers.Number) - ): - return c, e - except TypeError: - pass - raise ValueError("illegal expression") - - -# -------------------------------------------------------------------- -# Implementation wrapper - - -class Image: - """ - This class represents an image object. To create - :py:class:`~PIL.Image.Image` objects, use the appropriate factory - functions. There's hardly ever any reason to call the Image constructor - directly. - - * :py:func:`~PIL.Image.open` - * :py:func:`~PIL.Image.new` - * :py:func:`~PIL.Image.frombytes` - """ - - format = None - format_description = None - _close_exclusive_fp_after_loading = True - - def __init__(self): - # FIXME: take "new" parameters / other image? - # FIXME: turn mode and size into delegating properties? - self.im = None - self.mode = "" - self._size = (0, 0) - self.palette = None - self.info = {} - self._category = 0 - self.readonly = 0 - self.pyaccess = None - self._exif = None - - def __getattr__(self, name): - if name == "category": - warnings.warn( - "Image categories are deprecated and will be removed in Pillow 10 " - "(2023-07-01). Use is_animated instead.", - DeprecationWarning, - stacklevel=2, - ) - return self._category - raise AttributeError(name) - - @property - def width(self): - return self.size[0] - - @property - def height(self): - return self.size[1] - - @property - def size(self): - return self._size - - def _new(self, im): - new = Image() - new.im = im - new.mode = im.mode - new._size = im.size - if im.mode in ("P", "PA"): - if self.palette: - new.palette = self.palette.copy() - else: - from . import ImagePalette - - new.palette = ImagePalette.ImagePalette() - new.info = self.info.copy() - return new - - # Context manager support - def __enter__(self): - return self - - def __exit__(self, *args): - if hasattr(self, "fp") and getattr(self, "_exclusive_fp", False): - if hasattr(self, "_close__fp"): - self._close__fp() - if self.fp: - self.fp.close() - self.fp = None - - def close(self): - """ - Closes the file pointer, if possible. - - This operation will destroy the image core and release its memory. - The image data will be unusable afterward. - - This function is required to close images that have multiple frames or - have not had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for - more information. - """ - try: - if hasattr(self, "_close__fp"): - self._close__fp() - if self.fp: - self.fp.close() - self.fp = None - except Exception as msg: - logger.debug("Error closing: %s", msg) - - if getattr(self, "map", None): - self.map = None - - # Instead of simply setting to None, we're setting up a - # deferred error that will better explain that the core image - # object is gone. - self.im = deferred_error(ValueError("Operation on closed image")) - - def _copy(self): - self.load() - self.im = self.im.copy() - self.pyaccess = None - self.readonly = 0 - - def _ensure_mutable(self): - if self.readonly: - self._copy() - else: - self.load() - - def _dump(self, file=None, format=None, **options): - suffix = "" - if format: - suffix = "." + format - - if not file: - f, filename = tempfile.mkstemp(suffix) - os.close(f) - else: - filename = file - if not filename.endswith(suffix): - filename = filename + suffix - - self.load() - - if not format or format == "PPM": - self.im.save_ppm(filename) - else: - self.save(filename, format, **options) - - return filename - - def __eq__(self, other): - return ( - self.__class__ is other.__class__ - and self.mode == other.mode - and self.size == other.size - and self.info == other.info - and self._category == other._category - and self.getpalette() == other.getpalette() - and self.tobytes() == other.tobytes() - ) - - def __repr__(self): - return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - id(self), - ) - - def _repr_pretty_(self, p, cycle): - """IPython plain text display support""" - - # Same as __repr__ but without unpredicatable id(self), - # to keep Jupyter notebook `text/plain` output stable. - p.text( - "<%s.%s image mode=%s size=%dx%d>" - % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - ) - ) - - def _repr_png_(self): - """iPython display hook support - - :returns: png version of the image as bytes - """ - b = io.BytesIO() - try: - self.save(b, "PNG") - except Exception as e: - raise ValueError("Could not save to PNG for display") from e - return b.getvalue() - - class _ArrayData: - def __init__(self, new): - self.__array_interface__ = new - - def __array__(self, dtype=None): - # numpy array interface support - import numpy as np - - new = {} - shape, typestr = _conv_type_shape(self) - new["shape"] = shape - new["typestr"] = typestr - new["version"] = 3 - if self.mode == "1": - # Binary images need to be extended from bits to bytes - # See: https://github.com/python-pillow/Pillow/issues/350 - new["data"] = self.tobytes("raw", "L") - else: - new["data"] = self.tobytes() - - return np.array(self._ArrayData(new), dtype) - - def __getstate__(self): - return [self.info, self.mode, self.size, self.getpalette(), self.tobytes()] - - def __setstate__(self, state): - Image.__init__(self) - self.tile = [] - info, mode, size, palette, data = state - self.info = info - self.mode = mode - self._size = size - self.im = core.new(mode, size) - if mode in ("L", "LA", "P", "PA") and palette: - self.putpalette(palette) - self.frombytes(data) - - def tobytes(self, encoder_name="raw", *args): - """ - Return image as a bytes object. - - .. warning:: - - This method returns the raw image data from the internal - storage. For compressed image data (e.g. PNG, JPEG) use - :meth:`~.save`, with a BytesIO parameter for in-memory - data. - - :param encoder_name: What encoder to use. The default is to - use the standard "raw" encoder. - :param args: Extra arguments to the encoder. - :returns: A :py:class:`bytes` object. - """ - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if encoder_name == "raw" and args == (): - args = self.mode - - self.load() - - if self.width == 0 or self.height == 0: - return b"" - - # unpack data - e = _getencoder(self.mode, encoder_name, args) - e.setimage(self.im) - - bufsize = max(65536, self.size[0] * 4) # see RawEncode.c - - data = [] - while True: - l, s, d = e.encode(bufsize) - data.append(d) - if s: - break - if s < 0: - raise RuntimeError(f"encoder error {s} in tobytes") - - return b"".join(data) - - def tobitmap(self, name="image"): - """ - Returns the image converted to an X11 bitmap. - - .. note:: This method only works for mode "1" images. - - :param name: The name prefix to use for the bitmap variables. - :returns: A string containing an X11 bitmap. - :raises ValueError: If the mode is not "1" - """ - - self.load() - if self.mode != "1": - raise ValueError("not a bitmap") - data = self.tobytes("xbm") - return b"".join( - [ - f"#define {name}_width {self.size[0]}\n".encode("ascii"), - f"#define {name}_height {self.size[1]}\n".encode("ascii"), - f"static char {name}_bits[] = {{\n".encode("ascii"), - data, - b"};", - ] - ) - - def frombytes(self, data, decoder_name="raw", *args): - """ - Loads this image with pixel data from a bytes object. - - This method is similar to the :py:func:`~PIL.Image.frombytes` function, - but loads data into this image instead of creating a new image object. - """ - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - # default format - if decoder_name == "raw" and args == (): - args = self.mode - - # unpack data - d = _getdecoder(self.mode, decoder_name, args) - d.setimage(self.im) - s = d.decode(data) - - if s[0] >= 0: - raise ValueError("not enough image data") - if s[1] != 0: - raise ValueError("cannot decode image data") - - def load(self): - """ - Allocates storage for the image and loads the pixel data. In - normal cases, you don't need to call this method, since the - Image class automatically loads an opened image when it is - accessed for the first time. - - If the file associated with the image was opened by Pillow, then this - method will close it. The exception to this is if the image has - multiple frames, in which case the file will be left open for seek - operations. See :ref:`file-handling` for more information. - - :returns: An image access object. - :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` - """ - if self.im is not None and self.palette and self.palette.dirty: - # realize palette - mode, arr = self.palette.getdata() - self.im.putpalette(mode, arr) - self.palette.dirty = 0 - self.palette.rawmode = None - if "transparency" in self.info and mode in ("LA", "PA"): - if isinstance(self.info["transparency"], int): - self.im.putpalettealpha(self.info["transparency"], 0) - else: - self.im.putpalettealphas(self.info["transparency"]) - self.palette.mode = "RGBA" - else: - palette_mode = "RGBA" if mode.startswith("RGBA") else "RGB" - self.palette.mode = palette_mode - self.palette.palette = self.im.getpalette(palette_mode, palette_mode) - - if self.im is not None: - if cffi and USE_CFFI_ACCESS: - if self.pyaccess: - return self.pyaccess - from . import PyAccess - - self.pyaccess = PyAccess.new(self, self.readonly) - if self.pyaccess: - return self.pyaccess - return self.im.pixel_access(self.readonly) - - def verify(self): - """ - Verifies the contents of a file. For data read from a file, this - method attempts to determine if the file is broken, without - actually decoding the image data. If this method finds any - problems, it raises suitable exceptions. If you need to load - the image after using this method, you must reopen the image - file. - """ - pass - - def convert( - self, mode=None, matrix=None, dither=None, palette=Palette.WEB, colors=256 - ): - """ - Returns a converted copy of this image. For the "P" mode, this - method translates pixels through the palette. If mode is - omitted, a mode is chosen so that all information in the image - and the palette can be represented without a palette. - - The current version supports all possible conversions between - "L", "RGB" and "CMYK." The ``matrix`` argument only supports "L" - and "RGB". - - When translating a color image to greyscale (mode "L"), - the library uses the ITU-R 601-2 luma transform:: - - L = R * 299/1000 + G * 587/1000 + B * 114/1000 - - The default method of converting a greyscale ("L") or "RGB" - image into a bilevel (mode "1") image uses Floyd-Steinberg - dither to approximate the original image luminosity levels. If - dither is ``None``, all values larger than 127 are set to 255 (white), - all other values to 0 (black). To use other thresholds, use the - :py:meth:`~PIL.Image.Image.point` method. - - When converting from "RGBA" to "P" without a ``matrix`` argument, - this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, - and ``dither`` and ``palette`` are ignored. - - :param mode: The requested mode. See: :ref:`concept-modes`. - :param matrix: An optional conversion matrix. If given, this - should be 4- or 12-tuple containing floating point values. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). Note that this is not used when ``matrix`` is supplied. - :param palette: Palette to use when converting from mode "RGB" - to "P". Available palettes are :data:`Palette.WEB` or - :data:`Palette.ADAPTIVE`. - :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` - palette. Defaults to 256. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - has_transparency = self.info.get("transparency") is not None - if not mode and self.mode == "P": - # determine default mode - if self.palette: - mode = self.palette.mode - else: - mode = "RGB" - if mode == "RGB" and has_transparency: - mode = "RGBA" - if not mode or (mode == self.mode and not matrix): - return self.copy() - - if matrix: - # matrix conversion - if mode not in ("L", "RGB"): - raise ValueError("illegal conversion") - im = self.im.convert_matrix(mode, matrix) - new = self._new(im) - if has_transparency and self.im.bands == 3: - transparency = new.info["transparency"] - - def convert_transparency(m, v): - v = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 - return max(0, min(255, int(v))) - - if mode == "L": - transparency = convert_transparency(matrix, transparency) - elif len(mode) == 3: - transparency = tuple( - convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) - for i in range(0, len(transparency)) - ) - new.info["transparency"] = transparency - return new - - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) - - trns = None - delete_trns = False - # transparency handling - if has_transparency: - if (self.mode in ("1", "L", "I") and mode in ("LA", "RGBA")) or ( - self.mode == "RGB" and mode == "RGBA" - ): - # Use transparent conversion to promote from transparent - # color to an alpha channel. - new_im = self._new( - self.im.convert_transparent(mode, self.info["transparency"]) - ) - del new_im.info["transparency"] - return new_im - elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): - t = self.info["transparency"] - if isinstance(t, bytes): - # Dragons. This can't be represented by a single color - warnings.warn( - "Palette images with Transparency expressed in bytes should be " - "converted to RGBA images" - ) - delete_trns = True - else: - # get the new transparency color. - # use existing conversions - trns_im = Image()._new(core.new(self.mode, (1, 1))) - if self.mode == "P": - trns_im.putpalette(self.palette) - if isinstance(t, tuple): - err = "Couldn't allocate a palette color for transparency" - try: - t = trns_im.palette.getcolor(t, self) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - t = None - else: - raise ValueError(err) from e - if t is None: - trns = None - else: - trns_im.putpixel((0, 0), t) - - if mode in ("L", "RGB"): - trns_im = trns_im.convert(mode) - else: - # can't just retrieve the palette number, got to do it - # after quantization. - trns_im = trns_im.convert("RGB") - trns = trns_im.getpixel((0, 0)) - - elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): - t = self.info["transparency"] - delete_trns = True - - if isinstance(t, bytes): - self.im.putpalettealphas(t) - elif isinstance(t, int): - self.im.putpalettealpha(t, 0) - else: - raise ValueError("Transparency for P mode should be bytes or int") - - if mode == "P" and palette == Palette.ADAPTIVE: - im = self.im.quantize(colors) - new = self._new(im) - from . import ImagePalette - - new.palette = ImagePalette.ImagePalette("RGB", new.im.getpalette("RGB")) - if delete_trns: - # This could possibly happen if we requantize to fewer colors. - # The transparency would be totally off in that case. - del new.info["transparency"] - if trns is not None: - try: - new.info["transparency"] = new.palette.getcolor(trns, new) - except Exception: - # if we can't make a transparent color, don't leave the old - # transparency hanging around to mess us up. - del new.info["transparency"] - warnings.warn("Couldn't allocate palette entry for transparency") - return new - - # colorspace conversion - if dither is None: - dither = Dither.FLOYDSTEINBERG - - try: - im = self.im.convert(mode, dither) - except ValueError: - try: - # normalize source image and try again - im = self.im.convert(getmodebase(self.mode)) - im = im.convert(mode, dither) - except KeyError as e: - raise ValueError("illegal conversion") from e - - new_im = self._new(im) - if mode == "P" and palette != Palette.ADAPTIVE: - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette("RGB", list(range(256)) * 3) - if delete_trns: - # crash fail if we leave a bytes transparency in an rgb/l mode. - del new_im.info["transparency"] - if trns is not None: - if new_im.mode == "P": - try: - new_im.info["transparency"] = new_im.palette.getcolor(trns, new_im) - except ValueError as e: - del new_im.info["transparency"] - if str(e) != "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - warnings.warn( - "Couldn't allocate palette entry for transparency" - ) - else: - new_im.info["transparency"] = trns - return new_im - - def quantize( - self, - colors=256, - method=None, - kmeans=0, - palette=None, - dither=Dither.FLOYDSTEINBERG, - ): - """ - Convert the image to 'P' mode with the specified number - of colors. - - :param colors: The desired number of colors, <= 256 - :param method: :data:`Quantize.MEDIANCUT` (median cut), - :data:`Quantize.MAXCOVERAGE` (maximum coverage), - :data:`Quantize.FASTOCTREE` (fast octree), - :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support - using :py:func:`PIL.features.check_feature` with - ``feature="libimagequant"``). - - By default, :data:`Quantize.MEDIANCUT` will be used. - - The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` - and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so - :data:`Quantize.FASTOCTREE` is used by default instead. - :param kmeans: Integer - :param palette: Quantize to the palette of given - :py:class:`PIL.Image.Image`. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). - :returns: A new image - - """ - - self.load() - - if method is None: - # defaults: - method = Quantize.MEDIANCUT - if self.mode == "RGBA": - method = Quantize.FASTOCTREE - - if self.mode == "RGBA" and method not in ( - Quantize.FASTOCTREE, - Quantize.LIBIMAGEQUANT, - ): - # Caller specified an invalid mode. - raise ValueError( - "Fast Octree (method == 2) and libimagequant (method == 3) " - "are the only valid methods for quantizing RGBA images" - ) - - if palette: - # use palette from reference image - palette.load() - if palette.mode != "P": - raise ValueError("bad mode for palette image") - if self.mode != "RGB" and self.mode != "L": - raise ValueError( - "only RGB or L mode images can be quantized to a palette" - ) - im = self.im.convert("P", dither, palette.im) - new_im = self._new(im) - new_im.palette = palette.palette.copy() - return new_im - - im = self._new(self.im.quantize(colors, method, kmeans)) - - from . import ImagePalette - - mode = im.im.getpalettemode() - palette = im.im.getpalette(mode, mode)[: colors * len(mode)] - im.palette = ImagePalette.ImagePalette(mode, palette) - - return im - - def copy(self): - """ - Copies this image. Use this method if you wish to paste things - into an image, but still retain the original. - - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - self.load() - return self._new(self.im.copy()) - - __copy__ = copy - - def crop(self, box=None): - """ - Returns a rectangular region from this image. The box is a - 4-tuple defining the left, upper, right, and lower pixel - coordinate. See :ref:`coordinate-system`. - - Note: Prior to Pillow 3.4.0, this was a lazy operation. - - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if box is None: - return self.copy() - - if box[2] < box[0]: - raise ValueError("Coordinate 'right' is less than 'left'") - elif box[3] < box[1]: - raise ValueError("Coordinate 'lower' is less than 'upper'") - - self.load() - return self._new(self._crop(self.im, box)) - - def _crop(self, im, box): - """ - Returns a rectangular region from the core image object im. - - This is equivalent to calling im.crop((x0, y0, x1, y1)), but - includes additional sanity checks. - - :param im: a core image object - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :returns: A core image object. - """ - - x0, y0, x1, y1 = map(int, map(round, box)) - - absolute_values = (abs(x1 - x0), abs(y1 - y0)) - - _decompression_bomb_check(absolute_values) - - return im.crop((x0, y0, x1, y1)) - - def draft(self, mode, size): - """ - Configures the image file loader so it returns a version of the - image that as closely as possible matches the given mode and - size. For example, you can use this method to convert a color - JPEG to greyscale while loading it. - - If any changes are made, returns a tuple with the chosen ``mode`` and - ``box`` with coordinates of the original image within the altered one. - - Note that this method modifies the :py:class:`~PIL.Image.Image` object - in place. If the image has already been loaded, this method has no - effect. - - Note: This method is not implemented for most images. It is - currently implemented only for JPEG and MPO images. - - :param mode: The requested mode. - :param size: The requested size. - """ - pass - - def _expand(self, xmargin, ymargin=None): - if ymargin is None: - ymargin = xmargin - self.load() - return self._new(self.im.expand(xmargin, ymargin, 0)) - - def filter(self, filter): - """ - Filters this image using the given filter. For a list of - available filters, see the :py:mod:`~PIL.ImageFilter` module. - - :param filter: Filter kernel. - :returns: An :py:class:`~PIL.Image.Image` object.""" - - from . import ImageFilter - - self.load() - - if isinstance(filter, Callable): - filter = filter() - if not hasattr(filter, "filter"): - raise TypeError( - "filter argument should be ImageFilter.Filter instance or class" - ) - - multiband = isinstance(filter, ImageFilter.MultibandFilter) - if self.im.bands == 1 or multiband: - return self._new(filter.filter(self.im)) - - ims = [] - for c in range(self.im.bands): - ims.append(self._new(filter.filter(self.im.getband(c)))) - return merge(self.mode, ims) - - def getbands(self): - """ - Returns a tuple containing the name of each band in this image. - For example, ``getbands`` on an RGB image returns ("R", "G", "B"). - - :returns: A tuple containing band names. - :rtype: tuple - """ - return ImageMode.getmode(self.mode).bands - - def getbbox(self): - """ - Calculates the bounding box of the non-zero regions in the - image. - - :returns: The bounding box is returned as a 4-tuple defining the - left, upper, right, and lower pixel coordinate. See - :ref:`coordinate-system`. If the image is completely empty, this - method returns None. - - """ - - self.load() - return self.im.getbbox() - - def getcolors(self, maxcolors=256): - """ - Returns a list of colors used in this image. - - The colors will be in the image's mode. For example, an RGB image will - return a tuple of (red, green, blue) color values, and a P image will - return the index of the color in the palette. - - :param maxcolors: Maximum number of colors. If this number is - exceeded, this method returns None. The default limit is - 256 colors. - :returns: An unsorted list of (count, pixel) values. - """ - - self.load() - if self.mode in ("1", "L", "P"): - h = self.im.histogram() - out = [] - for i in range(256): - if h[i]: - out.append((h[i], i)) - if len(out) > maxcolors: - return None - return out - return self.im.getcolors(maxcolors) - - def getdata(self, band=None): - """ - Returns the contents of this image as a sequence object - containing pixel values. The sequence object is flattened, so - that values for line one follow directly after the values of - line zero, and so on. - - Note that the sequence object returned by this method is an - internal PIL data type, which only supports certain sequence - operations. To convert it to an ordinary sequence (e.g. for - printing), use ``list(im.getdata())``. - - :param band: What band to return. The default is to return - all bands. To return a single band, pass in the index - value (e.g. 0 to get the "R" band from an "RGB" image). - :returns: A sequence-like object. - """ - - self.load() - if band is not None: - return self.im.getband(band) - return self.im # could be abused - - def getextrema(self): - """ - Gets the the minimum and maximum pixel values for each band in - the image. - - :returns: For a single-band image, a 2-tuple containing the - minimum and maximum pixel value. For a multi-band image, - a tuple containing one 2-tuple for each band. - """ - - self.load() - if self.im.bands > 1: - extrema = [] - for i in range(self.im.bands): - extrema.append(self.im.getband(i).getextrema()) - return tuple(extrema) - return self.im.getextrema() - - def _getxmp(self, xmp_tags): - def get_name(tag): - return tag.split("}")[1] - - def get_value(element): - value = {get_name(k): v for k, v in element.attrib.items()} - children = list(element) - if children: - for child in children: - name = get_name(child.tag) - child_value = get_value(child) - if name in value: - if not isinstance(value[name], list): - value[name] = [value[name]] - value[name].append(child_value) - else: - value[name] = child_value - elif value: - if element.text: - value["text"] = element.text - else: - return element.text - return value - - if ElementTree is None: - warnings.warn("XMP data cannot be read without defusedxml dependency") - return {} - else: - root = ElementTree.fromstring(xmp_tags) - return {get_name(root.tag): get_value(root)} - - def getexif(self): - if self._exif is None: - self._exif = Exif() - - exif_info = self.info.get("exif") - if exif_info is None: - if "Raw profile type exif" in self.info: - exif_info = bytes.fromhex( - "".join(self.info["Raw profile type exif"].split("\n")[3:]) - ) - elif hasattr(self, "tag_v2"): - self._exif.bigtiff = self.tag_v2._bigtiff - self._exif.endian = self.tag_v2._endian - self._exif.load_from_fp(self.fp, self.tag_v2._offset) - if exif_info is not None: - self._exif.load(exif_info) - - # XMP tags - if 0x0112 not in self._exif: - xmp_tags = self.info.get("XML:com.adobe.xmp") - if xmp_tags: - match = re.search(r'tiff:Orientation="([0-9])"', xmp_tags) - if match: - self._exif[0x0112] = int(match[1]) - - return self._exif - - def getim(self): - """ - Returns a capsule that points to the internal image memory. - - :returns: A capsule object. - """ - - self.load() - return self.im.ptr - - def getpalette(self, rawmode="RGB"): - """ - Returns the image palette as a list. - - :param rawmode: The mode in which to return the palette. ``None`` will - return the palette in its current mode. - - .. versionadded:: 9.1.0 - - :returns: A list of color values [r, g, b, ...], or None if the - image has no palette. - """ - - self.load() - try: - mode = self.im.getpalettemode() - except ValueError: - return None # no palette - if rawmode is None: - rawmode = mode - return list(self.im.getpalette(mode, rawmode)) - - def getpixel(self, xy): - """ - Returns the pixel value at a given position. - - :param xy: The coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: The pixel value. If the image is a multi-layer image, - this method returns a tuple. - """ - - self.load() - if self.pyaccess: - return self.pyaccess.getpixel(xy) - return self.im.getpixel(xy) - - def getprojection(self): - """ - Get projection to x and y axes - - :returns: Two sequences, indicating where there are non-zero - pixels along the X-axis and the Y-axis, respectively. - """ - - self.load() - x, y = self.im.getprojection() - return list(x), list(y) - - def histogram(self, mask=None, extrema=None): - """ - Returns a histogram for the image. The histogram is returned as a - list of pixel counts, one for each pixel value in the source - image. Counts are grouped into 256 bins for each band, even if - the image has more than 8 bits per band. If the image has more - than one band, the histograms for all bands are concatenated (for - example, the histogram for an "RGB" image contains 768 values). - - A bilevel image (mode "1") is treated as a greyscale ("L") image - by this method. - - If a mask is provided, the method returns a histogram for those - parts of the image where the mask image is non-zero. The mask - image must have the same size as the image, and be either a - bi-level image (mode "1") or a greyscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A list containing pixel counts. - """ - self.load() - if mask: - mask.load() - return self.im.histogram((0, 0), mask.im) - if self.mode in ("I", "F"): - if extrema is None: - extrema = self.getextrema() - return self.im.histogram(extrema) - return self.im.histogram() - - def entropy(self, mask=None, extrema=None): - """ - Calculates and returns the entropy for the image. - - A bilevel image (mode "1") is treated as a greyscale ("L") - image by this method. - - If a mask is provided, the method employs the histogram for - those parts of the image where the mask image is non-zero. - The mask image must have the same size as the image, and be - either a bi-level image (mode "1") or a greyscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A float value representing the image entropy - """ - self.load() - if mask: - mask.load() - return self.im.entropy((0, 0), mask.im) - if self.mode in ("I", "F"): - if extrema is None: - extrema = self.getextrema() - return self.im.entropy(extrema) - return self.im.entropy() - - def paste(self, im, box=None, mask=None): - """ - Pastes another image into this image. The box argument is either - a 2-tuple giving the upper left corner, a 4-tuple defining the - left, upper, right, and lower pixel coordinate, or None (same as - (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size - of the pasted image must match the size of the region. - - If the modes don't match, the pasted image is converted to the mode of - this image (see the :py:meth:`~PIL.Image.Image.convert` method for - details). - - Instead of an image, the source can be a integer or tuple - containing pixel values. The method then fills the region - with the given color. When creating RGB images, you can - also use color strings as supported by the ImageColor module. - - If a mask is given, this method updates only the regions - indicated by the mask. You can use either "1", "L", "LA", "RGBA" - or "RGBa" images (if present, the alpha band is used as mask). - Where the mask is 255, the given image is copied as is. Where - the mask is 0, the current value is preserved. Intermediate - values will mix the two images together, including their alpha - channels if they have them. - - See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to - combine images with respect to their alpha channels. - - :param im: Source image or pixel value (integer or tuple). - :param box: An optional 4-tuple giving the region to paste into. - If a 2-tuple is used instead, it's treated as the upper left - corner. If omitted or None, the source is pasted into the - upper left corner. - - If an image is given as the second argument and there is no - third, the box defaults to (0, 0), and the second argument - is interpreted as a mask image. - :param mask: An optional mask image. - """ - - if isImageType(box) and mask is None: - # abbreviated paste(im, mask) syntax - mask = box - box = None - - if box is None: - box = (0, 0) - - if len(box) == 2: - # upper left corner given; get size from image or mask - if isImageType(im): - size = im.size - elif isImageType(mask): - size = mask.size - else: - # FIXME: use self.size here? - raise ValueError("cannot determine region size; use 4-item box") - box += (box[0] + size[0], box[1] + size[1]) - - if isinstance(im, str): - from . import ImageColor - - im = ImageColor.getcolor(im, self.mode) - - elif isImageType(im): - im.load() - if self.mode != im.mode: - if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): - # should use an adapter for this! - im = im.convert(self.mode) - im = im.im - - self._ensure_mutable() - - if mask: - mask.load() - self.im.paste(im, box, mask.im) - else: - self.im.paste(im, box) - - def alpha_composite(self, im, dest=(0, 0), source=(0, 0)): - """'In-place' analog of Image.alpha_composite. Composites an image - onto this image. - - :param im: image to composite over this one - :param dest: Optional 2 tuple (left, top) specifying the upper - left corner in this (destination) image. - :param source: Optional 2 (left, top) tuple for the upper left - corner in the overlay source image, or 4 tuple (left, top, right, - bottom) for the bounds of the source rectangle - - Performance Note: Not currently implemented in-place in the core layer. - """ - - if not isinstance(source, (list, tuple)): - raise ValueError("Source must be a tuple") - if not isinstance(dest, (list, tuple)): - raise ValueError("Destination must be a tuple") - if not len(source) in (2, 4): - raise ValueError("Source must be a 2 or 4-tuple") - if not len(dest) == 2: - raise ValueError("Destination must be a 2-tuple") - if min(source) < 0: - raise ValueError("Source must be non-negative") - - if len(source) == 2: - source = source + im.size - - # over image, crop if it's not the whole thing. - if source == (0, 0) + im.size: - overlay = im - else: - overlay = im.crop(source) - - # target for the paste - box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) - - # destination image. don't copy if we're using the whole image. - if box == (0, 0) + self.size: - background = self - else: - background = self.crop(box) - - result = alpha_composite(background, overlay) - self.paste(result, box) - - def point(self, lut, mode=None): - """ - Maps this image through a lookup table or function. - - :param lut: A lookup table, containing 256 (or 65536 if - self.mode=="I" and mode == "L") values per band in the - image. A function can be used instead, it should take a - single argument. The function is called once for each - possible pixel value, and the resulting table is applied to - all bands of the image. - - It may also be an :py:class:`~PIL.Image.ImagePointHandler` - object:: - - class Example(Image.ImagePointHandler): - def point(self, data): - # Return result - :param mode: Output mode (default is same as input). In the - current version, this can only be used if the source image - has mode "L" or "P", and the output has mode "1" or the - source image mode is "I" and the output mode is "L". - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - if isinstance(lut, ImagePointHandler): - return lut.point(self) - - if callable(lut): - # if it isn't a list, it should be a function - if self.mode in ("I", "I;16", "F"): - # check if the function can be used with point_transform - # UNDONE wiredfool -- I think this prevents us from ever doing - # a gamma function point transform on > 8bit images. - scale, offset = _getscaleoffset(lut) - return self._new(self.im.point_transform(scale, offset)) - # for other modes, convert the function to a table - lut = [lut(i) for i in range(256)] * self.im.bands - - if self.mode == "F": - # FIXME: _imaging returns a confusing error message for this case - raise ValueError("point operation not supported for this mode") - - return self._new(self.im.point(lut, mode)) - - def putalpha(self, alpha): - """ - Adds or replaces the alpha layer in this image. If the image - does not have an alpha layer, it's converted to "LA" or "RGBA". - The new layer must be either "L" or "1". - - :param alpha: The new alpha layer. This can either be an "L" or "1" - image having the same size as this image, or an integer or - other color value. - """ - - self._ensure_mutable() - - if self.mode not in ("LA", "PA", "RGBA"): - # attempt to promote self to a matching alpha mode - try: - mode = getmodebase(self.mode) + "A" - try: - self.im.setmode(mode) - except (AttributeError, ValueError) as e: - # do things the hard way - im = self.im.convert(mode) - if im.mode not in ("LA", "PA", "RGBA"): - raise ValueError from e # sanity check - self.im = im - self.pyaccess = None - self.mode = self.im.mode - except KeyError as e: - raise ValueError("illegal image mode") from e - - if self.mode in ("LA", "PA"): - band = 1 - else: - band = 3 - - if isImageType(alpha): - # alpha layer - if alpha.mode not in ("1", "L"): - raise ValueError("illegal image mode") - alpha.load() - if alpha.mode == "1": - alpha = alpha.convert("L") - else: - # constant alpha - try: - self.im.fillband(band, alpha) - except (AttributeError, ValueError): - # do things the hard way - alpha = new("L", self.size, alpha) - else: - return - - self.im.putband(alpha.im, band) - - def putdata(self, data, scale=1.0, offset=0.0): - """ - Copies pixel data from a flattened sequence object into the image. The - values should start at the upper left corner (0, 0), continue to the - end of the line, followed directly by the first value of the second - line, and so on. Data will be read until either the image or the - sequence ends. The scale and offset values are used to adjust the - sequence values: **pixel = value*scale + offset**. - - :param data: A flattened sequence object. - :param scale: An optional scale value. The default is 1.0. - :param offset: An optional offset value. The default is 0.0. - """ - - self._ensure_mutable() - - self.im.putdata(data, scale, offset) - - def putpalette(self, data, rawmode="RGB"): - """ - Attaches a palette to this image. The image must be a "P", "PA", "L" - or "LA" image. - - The palette sequence must contain at most 256 colors, made up of one - integer value for each channel in the raw mode. - For example, if the raw mode is "RGB", then it can contain at most 768 - values, made up of red, green and blue values for the corresponding pixel - index in the 256 colors. - If the raw mode is "RGBA", then it can contain at most 1024 values, - containing red, green, blue and alpha values. - - Alternatively, an 8-bit string may be used instead of an integer sequence. - - :param data: A palette sequence (either a list or a string). - :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode - that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). - """ - from . import ImagePalette - - if self.mode not in ("L", "LA", "P", "PA"): - raise ValueError("illegal image mode") - if isinstance(data, ImagePalette.ImagePalette): - palette = ImagePalette.raw(data.rawmode, data.palette) - else: - if not isinstance(data, bytes): - data = bytes(data) - palette = ImagePalette.raw(rawmode, data) - self.mode = "PA" if "A" in self.mode else "P" - self.palette = palette - self.palette.mode = "RGB" - self.load() # install new palette - - def putpixel(self, xy, value): - """ - Modifies the pixel at the given position. The color is given as - a single numerical value for single-band images, and a tuple for - multi-band images. In addition to this, RGB and RGBA tuples are - accepted for P images. - - Note that this method is relatively slow. For more extensive changes, - use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` - module instead. - - See: - - * :py:meth:`~PIL.Image.Image.paste` - * :py:meth:`~PIL.Image.Image.putdata` - * :py:mod:`~PIL.ImageDraw` - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param value: The pixel value. - """ - - if self.readonly: - self._copy() - self.load() - - if self.pyaccess: - return self.pyaccess.putpixel(xy, value) - - if ( - self.mode == "P" - and isinstance(value, (list, tuple)) - and len(value) in [3, 4] - ): - # RGB or RGBA value for a P image - value = self.palette.getcolor(value, self) - return self.im.putpixel(xy, value) - - def remap_palette(self, dest_map, source_palette=None): - """ - Rewrites the image to reorder the palette. - - :param dest_map: A list of indexes into the original palette. - e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` - is the identity transform. - :param source_palette: Bytes or None. - :returns: An :py:class:`~PIL.Image.Image` object. - - """ - from . import ImagePalette - - if self.mode not in ("L", "P"): - raise ValueError("illegal image mode") - - if source_palette is None: - if self.mode == "P": - self.load() - source_palette = self.im.getpalette("RGB")[:768] - else: # L-mode - source_palette = bytearray(i // 3 for i in range(768)) - - palette_bytes = b"" - new_positions = [0] * 256 - - # pick only the used colors from the palette - for i, oldPosition in enumerate(dest_map): - palette_bytes += source_palette[oldPosition * 3 : oldPosition * 3 + 3] - new_positions[oldPosition] = i - - # replace the palette color id of all pixel with the new id - - # Palette images are [0..255], mapped through a 1 or 3 - # byte/color map. We need to remap the whole image - # from palette 1 to palette 2. New_positions is - # an array of indexes into palette 1. Palette 2 is - # palette 1 with any holes removed. - - # We're going to leverage the convert mechanism to use the - # C code to remap the image from palette 1 to palette 2, - # by forcing the source image into 'L' mode and adding a - # mapping 'L' mode palette, then converting back to 'L' - # sans palette thus converting the image bytes, then - # assigning the optimized RGB palette. - - # perf reference, 9500x4000 gif, w/~135 colors - # 14 sec prepatch, 1 sec postpatch with optimization forced. - - mapping_palette = bytearray(new_positions) - - m_im = self.copy() - m_im.mode = "P" - - m_im.palette = ImagePalette.ImagePalette("RGB", palette=mapping_palette * 3) - # possibly set palette dirty, then - # m_im.putpalette(mapping_palette, 'L') # converts to 'P' - # or just force it. - # UNDONE -- this is part of the general issue with palettes - m_im.im.putpalette("RGB;L", m_im.palette.tobytes()) - - m_im = m_im.convert("L") - - # Internally, we require 768 bytes for a palette. - new_palette_bytes = palette_bytes + (768 - len(palette_bytes)) * b"\x00" - m_im.putpalette(new_palette_bytes) - m_im.palette = ImagePalette.ImagePalette("RGB", palette=palette_bytes) - - return m_im - - def _get_safe_box(self, size, resample, box): - """Expands the box so it includes adjacent pixels - that may be used by resampling with the given resampling filter. - """ - filter_support = _filters_support[resample] - 0.5 - scale_x = (box[2] - box[0]) / size[0] - scale_y = (box[3] - box[1]) / size[1] - support_x = filter_support * scale_x - support_y = filter_support * scale_y - - return ( - max(0, int(box[0] - support_x)), - max(0, int(box[1] - support_y)), - min(self.size[0], math.ceil(box[2] + support_x)), - min(self.size[1], math.ceil(box[3] + support_y)), - ) - - def resize(self, size, resample=None, box=None, reducing_gap=None): - """ - Returns a resized copy of this image. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param resample: An optional resampling filter. This can be - one of :py:data:`PIL.Image.Resampling.NEAREST`, - :py:data:`PIL.Image.Resampling.BOX`, - :py:data:`PIL.Image.Resampling.BILINEAR`, - :py:data:`PIL.Image.Resampling.HAMMING`, - :py:data:`PIL.Image.Resampling.BICUBIC` or - :py:data:`PIL.Image.Resampling.LANCZOS`. - If the image has mode "1" or "P", it is always set to - :py:data:`PIL.Image.Resampling.NEAREST`. - If the image mode specifies a number of bits, such as "I;16", then the - default filter is :py:data:`PIL.Image.Resampling.NEAREST`. - Otherwise, the default filter is - :py:data:`PIL.Image.Resampling.BICUBIC`. See: :ref:`concept-filters`. - :param box: An optional 4-tuple of floats providing - the source image region to be scaled. - The values must be within (0, 0, width, height) rectangle. - If omitted or None, the entire source is used. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce`. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is None (no optimization). - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if resample is None: - type_special = ";" in self.mode - resample = Resampling.NEAREST if type_special else Resampling.BICUBIC - elif resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - Resampling.LANCZOS, - Resampling.BOX, - Resampling.HAMMING, - ): - message = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - (Resampling.BOX, "Image.Resampling.BOX"), - (Resampling.HAMMING, "Image.Resampling.HAMMING"), - ) - ] - raise ValueError( - message + " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] - ) - - if reducing_gap is not None and reducing_gap < 1.0: - raise ValueError("reducing_gap must be 1.0 or greater") - - size = tuple(size) - - if box is None: - box = (0, 0) + self.size - else: - box = tuple(box) - - if self.size == size and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ("1", "P"): - resample = Resampling.NEAREST - - if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.resize(size, resample, box) - return im.convert(self.mode) - - self.load() - - if reducing_gap is not None and resample != Resampling.NEAREST: - factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 - factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 - if factor_x > 1 or factor_y > 1: - reduce_box = self._get_safe_box(size, resample, box) - factor = (factor_x, factor_y) - if callable(self.reduce): - self = self.reduce(factor, box=reduce_box) - else: - self = Image.reduce(self, factor, box=reduce_box) - box = ( - (box[0] - reduce_box[0]) / factor_x, - (box[1] - reduce_box[1]) / factor_y, - (box[2] - reduce_box[0]) / factor_x, - (box[3] - reduce_box[1]) / factor_y, - ) - - return self._new(self.im.resize(size, resample, box)) - - def reduce(self, factor, box=None): - """ - Returns a copy of the image reduced ``factor`` times. - If the size of the image is not dividable by ``factor``, - the resulting size will be rounded up. - - :param factor: A greater than 0 integer or tuple of two integers - for width and height separately. - :param box: An optional 4-tuple of ints providing - the source image region to be reduced. - The values must be within ``(0, 0, width, height)`` rectangle. - If omitted or ``None``, the entire source is used. - """ - if not isinstance(factor, (list, tuple)): - factor = (factor, factor) - - if box is None: - box = (0, 0) + self.size - else: - box = tuple(box) - - if factor == (1, 1) and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ["LA", "RGBA"]: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.reduce(factor, box) - return im.convert(self.mode) - - self.load() - - return self._new(self.im.reduce(factor, box)) - - def rotate( - self, - angle, - resample=Resampling.NEAREST, - expand=0, - center=None, - translate=None, - fillcolor=None, - ): - """ - Returns a rotated copy of this image. This method returns a - copy of this image, rotated the given number of degrees counter - clockwise around its centre. - - :param angle: In degrees counter clockwise. - :param resample: An optional resampling filter. This can be - one of :py:data:`PIL.Image.Resampling.NEAREST` (use nearest neighbour), - :py:data:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`PIL.Image.Resampling.BICUBIC` - (cubic spline interpolation in a 4x4 environment). - If omitted, or if the image has mode "1" or "P", it is - set to :py:data:`PIL.Image.Resampling.NEAREST`. See :ref:`concept-filters`. - :param expand: Optional expansion flag. If true, expands the output - image to make it large enough to hold the entire rotated image. - If false or omitted, make the output image the same size as the - input image. Note that the expand flag assumes rotation around - the center and no translation. - :param center: Optional center of rotation (a 2-tuple). Origin is - the upper left corner. Default is the center of the image. - :param translate: An optional post-rotate translation (a 2-tuple). - :param fillcolor: An optional color for area outside the rotated image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - angle = angle % 360.0 - - # Fast paths regardless of filter, as long as we're not - # translating or changing the center. - if not (center or translate): - if angle == 0: - return self.copy() - if angle == 180: - return self.transpose(Transpose.ROTATE_180) - if angle in (90, 270) and (expand or self.width == self.height): - return self.transpose( - Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 - ) - - # Calculate the affine matrix. Note that this is the reverse - # transformation (from destination image to source) because we - # want to interpolate the (discrete) destination pixel from - # the local area around the (floating) source pixel. - - # The matrix we actually want (note that it operates from the right): - # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) - # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) - # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) - - # The reverse matrix is thus: - # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) - # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) - # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) - - # In any case, the final translation may be updated at the end to - # compensate for the expand flag. - - w, h = self.size - - if translate is None: - post_trans = (0, 0) - else: - post_trans = translate - if center is None: - # FIXME These should be rounded to ints? - rotn_center = (w / 2.0, h / 2.0) - else: - rotn_center = center - - angle = -math.radians(angle) - matrix = [ - round(math.cos(angle), 15), - round(math.sin(angle), 15), - 0.0, - round(-math.sin(angle), 15), - round(math.cos(angle), 15), - 0.0, - ] - - def transform(x, y, matrix): - (a, b, c, d, e, f) = matrix - return a * x + b * y + c, d * x + e * y + f - - matrix[2], matrix[5] = transform( - -rotn_center[0] - post_trans[0], -rotn_center[1] - post_trans[1], matrix - ) - matrix[2] += rotn_center[0] - matrix[5] += rotn_center[1] - - if expand: - # calculate output size - xx = [] - yy = [] - for x, y in ((0, 0), (w, 0), (w, h), (0, h)): - x, y = transform(x, y, matrix) - xx.append(x) - yy.append(y) - nw = math.ceil(max(xx)) - math.floor(min(xx)) - nh = math.ceil(max(yy)) - math.floor(min(yy)) - - # We multiply a translation matrix from the right. Because of its - # special form, this is the same as taking the image of the - # translation vector as new translation vector. - matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) - w, h = nw, nh - - return self.transform( - (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor - ) - - def save(self, fp, format=None, **params): - """ - Saves this image under the given filename. If no format is - specified, the format to use is determined from the filename - extension, if possible. - - Keyword options can be used to provide additional instructions - to the writer. If a writer doesn't recognise an option, it is - silently ignored. The available options are described in the - :doc:`image format documentation - <../handbook/image-file-formats>` for each writer. - - You can use a file object instead of a filename. In this case, - you must always specify the format. The file object must - implement the ``seek``, ``tell``, and ``write`` - methods, and be opened in binary mode. - - :param fp: A filename (string), pathlib.Path object or file object. - :param format: Optional format override. If omitted, the - format to use is determined from the filename extension. - If a file object was used instead of a filename, this - parameter should always be used. - :param params: Extra parameters to the image writer. - :returns: None - :exception ValueError: If the output format could not be determined - from the file name. Use the format option to solve this. - :exception OSError: If the file could not be written. The file - may have been created, and may contain partial data. - """ - - filename = "" - open_fp = False - if isinstance(fp, Path): - filename = str(fp) - open_fp = True - elif isPath(fp): - filename = fp - open_fp = True - elif fp == sys.stdout: - try: - fp = sys.stdout.buffer - except AttributeError: - pass - if not filename and hasattr(fp, "name") and isPath(fp.name): - # only set the name for metadata purposes - filename = fp.name - - # may mutate self! - self._ensure_mutable() - - save_all = params.pop("save_all", False) - self.encoderinfo = params - self.encoderconfig = () - - preinit() - - ext = os.path.splitext(filename)[1].lower() - - if not format: - if ext not in EXTENSION: - init() - try: - format = EXTENSION[ext] - except KeyError as e: - raise ValueError(f"unknown file extension: {ext}") from e - - if format.upper() not in SAVE: - init() - if save_all: - save_handler = SAVE_ALL[format.upper()] - else: - save_handler = SAVE[format.upper()] - - created = False - if open_fp: - created = not os.path.exists(filename) - if params.get("append", False): - # Open also for reading ("+"), because TIFF save_all - # writer needs to go back and edit the written data. - fp = builtins.open(filename, "r+b") - else: - fp = builtins.open(filename, "w+b") - - try: - save_handler(self, fp, filename) - except Exception: - if open_fp: - fp.close() - if created: - try: - os.remove(filename) - except PermissionError: - pass - raise - if open_fp: - fp.close() - - def seek(self, frame): - """ - Seeks to the given frame in this sequence file. If you seek - beyond the end of the sequence, the method raises an - ``EOFError`` exception. When a sequence file is opened, the - library automatically seeks to frame 0. - - See :py:meth:`~PIL.Image.Image.tell`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :param frame: Frame number, starting at 0. - :exception EOFError: If the call attempts to seek beyond the end - of the sequence. - """ - - # overridden by file handlers - if frame != 0: - raise EOFError - - def show(self, title=None): - """ - Displays this image. This method is mainly intended for debugging purposes. - - This method calls :py:func:`PIL.ImageShow.show` internally. You can use - :py:func:`PIL.ImageShow.register` to override its default behaviour. - - The image is first saved to a temporary file. By default, it will be in - PNG format. - - On Unix, the image is then opened using the **display**, **eog** or - **xv** utility, depending on which one can be found. - - On macOS, the image is opened with the native Preview application. - - On Windows, the image is opened with the standard PNG display utility. - - :param title: Optional title to use for the image window, where possible. - """ - - _show(self, title=title) - - def split(self): - """ - Split this image into individual bands. This method returns a - tuple of individual image bands from an image. For example, - splitting an "RGB" image creates three new images each - containing a copy of one of the original bands (red, green, - blue). - - If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` - method can be more convenient and faster. - - :returns: A tuple containing bands. - """ - - self.load() - if self.im.bands == 1: - ims = [self.copy()] - else: - ims = map(self._new, self.im.split()) - return tuple(ims) - - def getchannel(self, channel): - """ - Returns an image containing a single channel of the source image. - - :param channel: What channel to return. Could be index - (0 for "R" channel of "RGB") or channel name - ("A" for alpha channel of "RGBA"). - :returns: An image in "L" mode. - - .. versionadded:: 4.3.0 - """ - self.load() - - if isinstance(channel, str): - try: - channel = self.getbands().index(channel) - except ValueError as e: - raise ValueError(f'The image has no channel "{channel}"') from e - - return self._new(self.im.getband(channel)) - - def tell(self): - """ - Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :returns: Frame number, starting with 0. - """ - return 0 - - def thumbnail(self, size, resample=Resampling.BICUBIC, reducing_gap=2.0): - """ - Make this image into a thumbnail. This method modifies the - image to contain a thumbnail version of itself, no larger than - the given size. This method calculates an appropriate thumbnail - size to preserve the aspect of the image, calls the - :py:meth:`~PIL.Image.Image.draft` method to configure the file reader - (where applicable), and finally resizes the image. - - Note that this function modifies the :py:class:`~PIL.Image.Image` - object in place. If you need to use the full resolution image as well, - apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original - image. - - :param size: Requested size. - :param resample: Optional resampling filter. This can be one - of :py:data:`PIL.Image.Resampling.NEAREST`, - :py:data:`PIL.Image.Resampling.BOX`, - :py:data:`PIL.Image.Resampling.BILINEAR`, - :py:data:`PIL.Image.Resampling.HAMMING`, - :py:data:`PIL.Image.Resampling.BICUBIC` or - :py:data:`PIL.Image.Resampling.LANCZOS`. - If omitted, it defaults to :py:data:`PIL.Image.Resampling.BICUBIC`. - (was :py:data:`PIL.Image.Resampling.NEAREST` prior to version 2.5.0). - See: :ref:`concept-filters`. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce` or - :py:meth:`~PIL.Image.Image.draft` for JPEG images. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is 2.0 (very close to fair resampling - while still being faster in many cases). - :returns: None - """ - - x, y = map(math.floor, size) - if x >= self.width and y >= self.height: - return - - def round_aspect(number, key): - return max(min(math.floor(number), math.ceil(number), key=key), 1) - - # preserve aspect ratio - aspect = self.width / self.height - if x / y >= aspect: - x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) - else: - y = round_aspect( - x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) - ) - size = (x, y) - - box = None - if reducing_gap is not None: - res = self.draft(None, (size[0] * reducing_gap, size[1] * reducing_gap)) - if res is not None: - box = res[1] - - if self.size != size: - im = self.resize(size, resample, box=box, reducing_gap=reducing_gap) - - self.im = im.im - self._size = size - self.mode = self.im.mode - - self.readonly = 0 - self.pyaccess = None - - # FIXME: the different transform methods need further explanation - # instead of bloating the method docs, add a separate chapter. - def transform( - self, - size, - method, - data=None, - resample=Resampling.NEAREST, - fill=1, - fillcolor=None, - ): - """ - Transforms this image. This method creates a new image with the - given size, and the same mode as the original, and copies data - to the new image using the given transform. - - :param size: The output size. - :param method: The transformation method. This is one of - :py:data:`PIL.Image.Transform.EXTENT` (cut out a rectangular subregion), - :py:data:`PIL.Image.Transform.AFFINE` (affine transform), - :py:data:`PIL.Image.Transform.PERSPECTIVE` (perspective transform), - :py:data:`PIL.Image.Transform.QUAD` (map a quadrilateral to a rectangle), or - :py:data:`PIL.Image.Transform.MESH` (map a number of source quadrilaterals - in one operation). - - It may also be an :py:class:`~PIL.Image.ImageTransformHandler` - object:: - - class Example(Image.ImageTransformHandler): - def transform(self, size, data, resample, fill=1): - # Return result - - It may also be an object with a ``method.getdata`` method - that returns a tuple supplying new ``method`` and ``data`` values:: - - class Example: - def getdata(self): - method = Image.Transform.EXTENT - data = (0, 0, 100, 100) - return method, data - :param data: Extra data to the transformation method. - :param resample: Optional resampling filter. It can be one of - :py:data:`PIL.Image.Resampling.NEAREST` (use nearest neighbour), - :py:data:`PIL.Image.Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`PIL.Image.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image - has mode "1" or "P", it is set to :py:data:`PIL.Image.Resampling.NEAREST`. - See: :ref:`concept-filters`. - :param fill: If ``method`` is an - :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of - the arguments passed to it. Otherwise, it is unused. - :param fillcolor: Optional fill color for the area outside the - transform in the output image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: - return ( - self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - .transform(size, method, data, resample, fill, fillcolor) - .convert(self.mode) - ) - - if isinstance(method, ImageTransformHandler): - return method.transform(size, self, resample=resample, fill=fill) - - if hasattr(method, "getdata"): - # compatibility w. old-style transform objects - method, data = method.getdata() - - if data is None: - raise ValueError("missing method data") - - im = new(self.mode, size, fillcolor) - if self.mode == "P" and self.palette: - im.palette = self.palette.copy() - im.info = self.info.copy() - if method == Transform.MESH: - # list of quads - for box, quad in data: - im.__transformer( - box, self, Transform.QUAD, quad, resample, fillcolor is None - ) - else: - im.__transformer( - (0, 0) + size, self, method, data, resample, fillcolor is None - ) - - return im - - def __transformer( - self, box, image, method, data, resample=Resampling.NEAREST, fill=1 - ): - w = box[2] - box[0] - h = box[3] - box[1] - - if method == Transform.AFFINE: - data = data[0:6] - - elif method == Transform.EXTENT: - # convert extent to an affine transform - x0, y0, x1, y1 = data - xs = (x1 - x0) / w - ys = (y1 - y0) / h - method = Transform.AFFINE - data = (xs, 0, x0, 0, ys, y0) - - elif method == Transform.PERSPECTIVE: - data = data[0:8] - - elif method == Transform.QUAD: - # quadrilateral warp. data specifies the four corners - # given as NW, SW, SE, and NE. - nw = data[0:2] - sw = data[2:4] - se = data[4:6] - ne = data[6:8] - x0, y0 = nw - As = 1.0 / w - At = 1.0 / h - data = ( - x0, - (ne[0] - x0) * As, - (sw[0] - x0) * At, - (se[0] - sw[0] - ne[0] + x0) * As * At, - y0, - (ne[1] - y0) * As, - (sw[1] - y0) * At, - (se[1] - sw[1] - ne[1] + y0) * As * At, - ) - - else: - raise ValueError("unknown transformation method") - - if resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - ): - if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): - message = { - Resampling.BOX: "Image.Resampling.BOX", - Resampling.HAMMING: "Image.Resampling.HAMMING", - Resampling.LANCZOS: "Image.Resampling.LANCZOS", - }[resample] + f" ({resample}) cannot be used." - else: - message = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - ) - ] - raise ValueError( - message + " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] - ) - - image.load() - - self.load() - - if image.mode in ("1", "P"): - resample = Resampling.NEAREST - - self.im.transform2(box, image.im, method, data, resample, fill) - - def transpose(self, method): - """ - Transpose image (flip or rotate in 90 degree steps) - - :param method: One of :py:data:`PIL.Image.Transpose.FLIP_LEFT_RIGHT`, - :py:data:`PIL.Image.Transpose.FLIP_TOP_BOTTOM`, - :py:data:`PIL.Image.Transpose.ROTATE_90`, - :py:data:`PIL.Image.Transpose.ROTATE_180`, - :py:data:`PIL.Image.Transpose.ROTATE_270`, - :py:data:`PIL.Image.Transpose.TRANSPOSE` or - :py:data:`PIL.Image.Transpose.TRANSVERSE`. - :returns: Returns a flipped or rotated copy of this image. - """ - - self.load() - return self._new(self.im.transpose(method)) - - def effect_spread(self, distance): - """ - Randomly spread pixels in an image. - - :param distance: Distance to spread pixels. - """ - self.load() - return self._new(self.im.effect_spread(distance)) - - def toqimage(self): - """Returns a QImage copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.toqimage(self) - - def toqpixmap(self): - """Returns a QPixmap copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.toqpixmap(self) - - -# -------------------------------------------------------------------- -# Abstract handlers. - - -class ImagePointHandler: - """ - Used as a mixin by point transforms - (for use with :py:meth:`~PIL.Image.Image.point`) - """ - - pass - - -class ImageTransformHandler: - """ - Used as a mixin by geometry transforms - (for use with :py:meth:`~PIL.Image.Image.transform`) - """ - - pass - - -# -------------------------------------------------------------------- -# Factories - -# -# Debugging - - -def _wedge(): - """Create greyscale wedge (for debugging only)""" - - return Image()._new(core.wedge("L")) - - -def _check_size(size): - """ - Common check to enforce type and sanity check on size tuples - - :param size: Should be a 2 tuple of (width, height) - :returns: True, or raises a ValueError - """ - - if not isinstance(size, (list, tuple)): - raise ValueError("Size must be a tuple") - if len(size) != 2: - raise ValueError("Size must be a tuple of length 2") - if size[0] < 0 or size[1] < 0: - raise ValueError("Width and height must be >= 0") - - return True - - -def new(mode, size, color=0): - """ - Creates a new image with the given mode and size. - - :param mode: The mode to use for the new image. See: - :ref:`concept-modes`. - :param size: A 2-tuple, containing (width, height) in pixels. - :param color: What color to use for the image. Default is black. - If given, this should be a single integer or floating point value - for single-band modes, and a tuple for multi-band modes (one value - per band). When creating RGB images, you can also use color - strings as supported by the ImageColor module. If the color is - None, the image is not initialised. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - if color is None: - # don't initialize - return Image()._new(core.new(mode, size)) - - if isinstance(color, str): - # css3-style specifier - - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - - im = Image() - if mode == "P" and isinstance(color, (list, tuple)) and len(color) in [3, 4]: - # RGB or RGBA value for a P image - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette() - color = im.palette.getcolor(color) - return im._new(core.fill(mode, size, color)) - - -def frombytes(mode, size, data, decoder_name="raw", *args): - """ - Creates a copy of an image memory from pixel data in a buffer. - - In its simplest form, this function takes three arguments - (mode, size, and unpacked pixel data). - - You can also use any pixel decoder supported by PIL. For more - information on available decoders, see the section - :ref:`Writing Your Own File Codec `. - - Note that this function decodes pixel data only, not entire images. - If you have an entire image in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load - it. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A byte buffer containing raw data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw" and args == (): - args = mode - - im = new(mode, size) - im.frombytes(data, decoder_name, args) - return im - - -def frombuffer(mode, size, data, decoder_name="raw", *args): - """ - Creates an image memory referencing pixel data in a byte buffer. - - This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data - in the byte buffer, where possible. This means that changes to the - original buffer object are reflected in this image). Not all modes can - share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". - - Note that this function decodes pixel data only, not entire images. - If you have an entire image file in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. - - In the current version, the default parameters used for the "raw" decoder - differs from that used for :py:func:`~PIL.Image.frombytes`. This is a - bug, and will probably be fixed in a future release. The current release - issues a warning if you do this; to disable the warning, you should provide - the full set of parameters. See below for details. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A bytes or other buffer object containing raw - data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. For the - default encoder ("raw"), it's recommended that you provide the - full set of parameters:: - - frombuffer(mode, size, data, "raw", mode, 0, 1) - - :returns: An :py:class:`~PIL.Image.Image` object. - - .. versionadded:: 1.1.4 - """ - - _check_size(size) - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw": - if args == (): - args = mode, 0, 1 - if args[0] in _MAPMODES: - im = new(mode, (1, 1)) - im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) - im.readonly = 1 - return im - - return frombytes(mode, size, data, decoder_name, args) - - -def fromarray(obj, mode=None): - """ - Creates an image memory from an object exporting the array interface - (using the buffer protocol). - - If ``obj`` is not contiguous, then the ``tobytes`` method is called - and :py:func:`~PIL.Image.frombuffer` is used. - - If you have an image in NumPy:: - - from PIL import Image - import numpy as np - im = Image.open("hopper.jpg") - a = np.asarray(im) - - Then this can be used to convert it to a Pillow image:: - - im = Image.fromarray(a) - - :param obj: Object with array interface - :param mode: Optional mode to use when reading ``obj``. Will be determined from - type if ``None``. - - This will not be used to convert the data after reading, but will be used to - change how the data is read:: - - from PIL import Image - import numpy as np - a = np.full((1, 1), 300) - im = Image.fromarray(a, mode="L") - im.getpixel((0, 0)) # 44 - im = Image.fromarray(a, mode="RGB") - im.getpixel((0, 0)) # (44, 1, 0) - - See: :ref:`concept-modes` for general information about modes. - :returns: An image object. - - .. versionadded:: 1.1.6 - """ - arr = obj.__array_interface__ - shape = arr["shape"] - ndim = len(shape) - strides = arr.get("strides", None) - if mode is None: - try: - typekey = (1, 1) + shape[2:], arr["typestr"] - except KeyError as e: - raise TypeError("Cannot handle this data type") from e - try: - mode, rawmode = _fromarray_typemap[typekey] - except KeyError as e: - raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e - else: - rawmode = mode - if mode in ["1", "L", "I", "P", "F"]: - ndmax = 2 - elif mode == "RGB": - ndmax = 3 - else: - ndmax = 4 - if ndim > ndmax: - raise ValueError(f"Too many dimensions: {ndim} > {ndmax}.") - - size = 1 if ndim == 1 else shape[1], shape[0] - if strides is not None: - if hasattr(obj, "tobytes"): - obj = obj.tobytes() - else: - obj = obj.tostring() - - return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) - - -def fromqimage(im): - """Creates an image instance from a QImage image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.fromqimage(im) - - -def fromqpixmap(im): - """Creates an image instance from a QPixmap image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - raise ImportError("Qt bindings are not installed") - return ImageQt.fromqpixmap(im) - - -_fromarray_typemap = { - # (shape, typestr) => mode, rawmode - # first two members of shape are set to one - ((1, 1), "|b1"): ("1", "1;8"), - ((1, 1), "|u1"): ("L", "L"), - ((1, 1), "|i1"): ("I", "I;8"), - ((1, 1), "u2"): ("I", "I;16B"), - ((1, 1), "i2"): ("I", "I;16BS"), - ((1, 1), "u4"): ("I", "I;32B"), - ((1, 1), "i4"): ("I", "I;32BS"), - ((1, 1), "f4"): ("F", "F;32BF"), - ((1, 1), "f8"): ("F", "F;64BF"), - ((1, 1, 2), "|u1"): ("LA", "LA"), - ((1, 1, 3), "|u1"): ("RGB", "RGB"), - ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), -} - -# shortcuts -_fromarray_typemap[((1, 1), _ENDIAN + "i4")] = ("I", "I") -_fromarray_typemap[((1, 1), _ENDIAN + "f4")] = ("F", "F") - - -def _decompression_bomb_check(size): - if MAX_IMAGE_PIXELS is None: - return - - pixels = size[0] * size[1] - - if pixels > 2 * MAX_IMAGE_PIXELS: - raise DecompressionBombError( - f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " - "pixels, could be decompression bomb DOS attack." - ) - - if pixels > MAX_IMAGE_PIXELS: - warnings.warn( - f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " - "could be decompression bomb DOS attack.", - DecompressionBombWarning, - ) - - -def open(fp, mode="r", formats=None): - """ - Opens and identifies the given image file. - - This is a lazy operation; this function identifies the file, but - the file remains open and the actual image data is not read from - the file until you try to process the data (or call the - :py:meth:`~PIL.Image.Image.load` method). See - :py:func:`~PIL.Image.new`. See :ref:`file-handling`. - - :param fp: A filename (string), pathlib.Path object or a file object. - The file object must implement ``file.read``, - ``file.seek``, and ``file.tell`` methods, - and be opened in binary mode. - :param mode: The mode. If given, this argument must be "r". - :param formats: A list or tuple of formats to attempt to load the file in. - This can be used to restrict the set of formats checked. - Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python3 -m PIL`` or using - the :py:func:`PIL.features.pilinfo` function. - :returns: An :py:class:`~PIL.Image.Image` object. - :exception FileNotFoundError: If the file cannot be found. - :exception PIL.UnidentifiedImageError: If the image cannot be opened and - identified. - :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` - instance is used for ``fp``. - :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. - """ - - if mode != "r": - raise ValueError(f"bad mode {repr(mode)}") - elif isinstance(fp, io.StringIO): - raise ValueError( - "StringIO cannot be used to open an image. " - "Binary data must be used instead." - ) - - if formats is None: - formats = ID - elif not isinstance(formats, (list, tuple)): - raise TypeError("formats must be a list or tuple") - - exclusive_fp = False - filename = "" - if isinstance(fp, Path): - filename = str(fp.resolve()) - elif isPath(fp): - filename = fp - - if filename: - fp = builtins.open(filename, "rb") - exclusive_fp = True - - try: - fp.seek(0) - except (AttributeError, io.UnsupportedOperation): - fp = io.BytesIO(fp.read()) - exclusive_fp = True - - prefix = fp.read(16) - - preinit() - - accept_warnings = [] - - def _open_core(fp, filename, prefix, formats): - for i in formats: - i = i.upper() - if i not in OPEN: - init() - try: - factory, accept = OPEN[i] - result = not accept or accept(prefix) - if type(result) in [str, bytes]: - accept_warnings.append(result) - elif result: - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError, struct.error): - # Leave disabled by default, spams the logs with image - # opening failures that are entirely expected. - # logger.debug("", exc_info=True) - continue - except BaseException: - if exclusive_fp: - fp.close() - raise - return None - - im = _open_core(fp, filename, prefix, formats) - - if im is None: - if init(): - im = _open_core(fp, filename, prefix, formats) - - if im: - im._exclusive_fp = exclusive_fp - return im - - if exclusive_fp: - fp.close() - for message in accept_warnings: - warnings.warn(message) - raise UnidentifiedImageError( - "cannot identify image file %r" % (filename if filename else fp) - ) - - -# -# Image processing. - - -def alpha_composite(im1, im2): - """ - Alpha composite im2 over im1. - - :param im1: The first image. Must have mode RGBA. - :param im2: The second image. Must have mode RGBA, and the same size as - the first image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.alpha_composite(im1.im, im2.im)) - - -def blend(im1, im2, alpha): - """ - Creates a new image by interpolating between two input images, using - a constant alpha:: - - out = image1 * (1.0 - alpha) + image2 * alpha - - :param im1: The first image. - :param im2: The second image. Must have the same mode and size as - the first image. - :param alpha: The interpolation alpha factor. If alpha is 0.0, a - copy of the first image is returned. If alpha is 1.0, a copy of - the second image is returned. There are no restrictions on the - alpha value. If necessary, the result is clipped to fit into - the allowed output range. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.blend(im1.im, im2.im, alpha)) - - -def composite(image1, image2, mask): - """ - Create composite image by blending images using a transparency mask. - - :param image1: The first image. - :param image2: The second image. Must have the same mode and - size as the first image. - :param mask: A mask image. This image can have mode - "1", "L", or "RGBA", and must have the same size as the - other two images. - """ - - image = image2.copy() - image.paste(image1, None, mask) - return image - - -def eval(image, *args): - """ - Applies the function (which should take one argument) to each pixel - in the given image. If the image has more than one band, the same - function is applied to each band. Note that the function is - evaluated once for each possible pixel value, so you cannot use - random components or other generators. - - :param image: The input image. - :param function: A function object, taking one integer argument. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - return image.point(args[0]) - - -def merge(mode, bands): - """ - Merge a set of single band images into a new multiband image. - - :param mode: The mode to use for the output image. See: - :ref:`concept-modes`. - :param bands: A sequence containing one single-band image for - each band in the output image. All bands must have the - same size. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if getmodebands(mode) != len(bands) or "*" in mode: - raise ValueError("wrong number of bands") - for band in bands[1:]: - if band.mode != getmodetype(mode): - raise ValueError("mode mismatch") - if band.size != bands[0].size: - raise ValueError("size mismatch") - for band in bands: - band.load() - return bands[0]._new(core.merge(mode, *[b.im for b in bands])) - - -# -------------------------------------------------------------------- -# Plugin registry - - -def register_open(id, factory, accept=None): - """ - Register an image file plugin. This function should not be used - in application code. - - :param id: An image format identifier. - :param factory: An image file factory method. - :param accept: An optional function that can be used to quickly - reject images having another format. - """ - id = id.upper() - ID.append(id) - OPEN[id] = factory, accept - - -def register_mime(id, mimetype): - """ - Registers an image MIME type. This function should not be used - in application code. - - :param id: An image format identifier. - :param mimetype: The image MIME type for this format. - """ - MIME[id.upper()] = mimetype - - -def register_save(id, driver): - """ - Registers an image save function. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE[id.upper()] = driver - - -def register_save_all(id, driver): - """ - Registers an image function to save all the frames - of a multiframe format. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE_ALL[id.upper()] = driver - - -def register_extension(id, extension): - """ - Registers an image extension. This function should not be - used in application code. - - :param id: An image format identifier. - :param extension: An extension used for this format. - """ - EXTENSION[extension.lower()] = id.upper() - - -def register_extensions(id, extensions): - """ - Registers image extensions. This function should not be - used in application code. - - :param id: An image format identifier. - :param extensions: A list of extensions used for this format. - """ - for extension in extensions: - register_extension(id, extension) - - -def registered_extensions(): - """ - Returns a dictionary containing all file extensions belonging - to registered plugins - """ - if not EXTENSION: - init() - return EXTENSION - - -def register_decoder(name, decoder): - """ - Registers an image decoder. This function should not be - used in application code. - - :param name: The name of the decoder - :param decoder: A callable(mode, args) that returns an - ImageFile.PyDecoder object - - .. versionadded:: 4.1.0 - """ - DECODERS[name] = decoder - - -def register_encoder(name, encoder): - """ - Registers an image encoder. This function should not be - used in application code. - - :param name: The name of the encoder - :param encoder: A callable(mode, args) that returns an - ImageFile.PyEncoder object - - .. versionadded:: 4.1.0 - """ - ENCODERS[name] = encoder - - -# -------------------------------------------------------------------- -# Simple display support. - - -def _show(image, **options): - from . import ImageShow - - ImageShow.show(image, **options) - - -# -------------------------------------------------------------------- -# Effects - - -def effect_mandelbrot(size, extent, quality): - """ - Generate a Mandelbrot set covering the given extent. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param extent: The extent to cover, as a 4-tuple: - (x0, y0, x1, y2). - :param quality: Quality. - """ - return Image()._new(core.effect_mandelbrot(size, extent, quality)) - - -def effect_noise(size, sigma): - """ - Generate Gaussian noise centered around 128. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param sigma: Standard deviation of noise. - """ - return Image()._new(core.effect_noise(size, sigma)) - - -def linear_gradient(mode): - """ - Generate 256x256 linear gradient from black to white, top to bottom. - - :param mode: Input mode. - """ - return Image()._new(core.linear_gradient(mode)) - - -def radial_gradient(mode): - """ - Generate 256x256 radial gradient from black to white, centre to edge. - - :param mode: Input mode. - """ - return Image()._new(core.radial_gradient(mode)) - - -# -------------------------------------------------------------------- -# Resources - - -def _apply_env_variables(env=None): - if env is None: - env = os.environ - - for var_name, setter in [ - ("PILLOW_ALIGNMENT", core.set_alignment), - ("PILLOW_BLOCK_SIZE", core.set_block_size), - ("PILLOW_BLOCKS_MAX", core.set_blocks_max), - ]: - if var_name not in env: - continue - - var = env[var_name].lower() - - units = 1 - for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: - if var.endswith(postfix): - units = mul - var = var[: -len(postfix)] - - try: - var = int(var) * units - except ValueError: - warnings.warn(f"{var_name} is not int") - continue - - try: - setter(var) - except ValueError as e: - warnings.warn(f"{var_name}: {e}") - - -_apply_env_variables() -atexit.register(core.clear_cache) - - -class Exif(MutableMapping): - endian = None - bigtiff = False - - def __init__(self): - self._data = {} - self._ifds = {} - self._info = None - self._loaded_exif = None - - def _fixup(self, value): - try: - if len(value) == 1 and isinstance(value, tuple): - return value[0] - except Exception: - pass - return value - - def _fixup_dict(self, src_dict): - # Helper function - # returns a dict with any single item tuples/lists as individual values - return {k: self._fixup(v) for k, v in src_dict.items()} - - def _get_ifd_dict(self, offset): - try: - # an offset pointer to the location of the nested embedded IFD. - # It should be a long, but may be corrupted. - self.fp.seek(offset) - except (KeyError, TypeError): - pass - else: - from . import TiffImagePlugin - - info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - info.load(self.fp) - return self._fixup_dict(info) - - def _get_head(self): - version = b"\x2B" if self.bigtiff else b"\x2A" - if self.endian == "<": - head = b"II" + version + b"\x00" + o32le(8) - else: - head = b"MM\x00" + version + o32be(8) - if self.bigtiff: - head += o32le(8) if self.endian == "<" else o32be(8) - head += b"\x00\x00\x00\x00" - return head - - def load(self, data): - # Extract EXIF information. This is highly experimental, - # and is likely to be replaced with something better in a future - # version. - - # The EXIF record consists of a TIFF file embedded in a JPEG - # application marker (!). - if data == self._loaded_exif: - return - self._loaded_exif = data - self._data.clear() - self._ifds.clear() - if data and data.startswith(b"Exif\x00\x00"): - data = data[6:] - if not data: - self._info = None - return - - self.fp = io.BytesIO(data) - self.head = self.fp.read(8) - # process dictionary - from . import TiffImagePlugin - - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - self.endian = self._info._endian - self.fp.seek(self._info.next) - self._info.load(self.fp) - - def load_from_fp(self, fp, offset=None): - self._loaded_exif = None - self._data.clear() - self._ifds.clear() - - # process dictionary - from . import TiffImagePlugin - - self.fp = fp - if offset is not None: - self.head = self._get_head() - else: - self.head = self.fp.read(8) - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - if self.endian is None: - self.endian = self._info._endian - if offset is None: - offset = self._info.next - self.fp.seek(offset) - self._info.load(self.fp) - - def _get_merged_dict(self): - merged_dict = dict(self) - - # get EXIF extension - if 0x8769 in self: - ifd = self._get_ifd_dict(self[0x8769]) - if ifd: - merged_dict.update(ifd) - - # GPS - if 0x8825 in self: - merged_dict[0x8825] = self._get_ifd_dict(self[0x8825]) - - return merged_dict - - def tobytes(self, offset=8): - from . import TiffImagePlugin - - head = self._get_head() - ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) - for tag, value in self.items(): - if tag in [0x8769, 0x8225, 0x8825] and not isinstance(value, dict): - value = self.get_ifd(tag) - if ( - tag == 0x8769 - and 0xA005 in value - and not isinstance(value[0xA005], dict) - ): - value = value.copy() - value[0xA005] = self.get_ifd(0xA005) - ifd[tag] = value - return b"Exif\x00\x00" + head + ifd.tobytes(offset) - - def get_ifd(self, tag): - if tag not in self._ifds: - if tag in [0x8769, 0x8825]: - # exif, gpsinfo - if tag in self: - self._ifds[tag] = self._get_ifd_dict(self[tag]) - elif tag in [0xA005, 0x927C]: - # interop, makernote - if 0x8769 not in self._ifds: - self.get_ifd(0x8769) - tag_data = self._ifds[0x8769][tag] - if tag == 0x927C: - # makernote - from .TiffImagePlugin import ImageFileDirectory_v2 - - if tag_data[:8] == b"FUJIFILM": - ifd_offset = i32le(tag_data, 8) - ifd_data = tag_data[ifd_offset:] - - makernote = {} - for i in range(0, struct.unpack(" 4: - (offset,) = struct.unpack("H", tag_data[:2])[0]): - ifd_tag, typ, count, data = struct.unpack( - ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] - ) - if ifd_tag == 0x1101: - # CameraInfo - (offset,) = struct.unpack(">L", data) - self.fp.seek(offset) - - camerainfo = {"ModelID": self.fp.read(4)} - - self.fp.read(4) - # Seconds since 2000 - camerainfo["TimeStamp"] = i32le(self.fp.read(12)) - - self.fp.read(4) - camerainfo["InternalSerialNumber"] = self.fp.read(4) - - self.fp.read(12) - parallax = self.fp.read(4) - handler = ImageFileDirectory_v2._load_dispatch[ - TiffTags.FLOAT - ][1] - camerainfo["Parallax"] = handler( - ImageFileDirectory_v2(), parallax, False - ) - - self.fp.read(4) - camerainfo["Category"] = self.fp.read(2) - - makernote = {0x1101: dict(self._fixup_dict(camerainfo))} - self._ifds[tag] = makernote - else: - # interop - self._ifds[tag] = self._get_ifd_dict(tag_data) - return self._ifds.get(tag, {}) - - def __str__(self): - if self._info is not None: - # Load all keys into self._data - for tag in self._info.keys(): - self[tag] - - return str(self._data) - - def __len__(self): - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return len(keys) - - def __getitem__(self, tag): - if self._info is not None and tag not in self._data and tag in self._info: - self._data[tag] = self._fixup(self._info[tag]) - del self._info[tag] - return self._data[tag] - - def __contains__(self, tag): - return tag in self._data or (self._info is not None and tag in self._info) - - def __setitem__(self, tag, value): - if self._info is not None and tag in self._info: - del self._info[tag] - self._data[tag] = value - - def __delitem__(self, tag): - if self._info is not None and tag in self._info: - del self._info[tag] - else: - del self._data[tag] - - def __iter__(self): - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return iter(keys) diff --git a/venv/Lib/site-packages/PIL/ImageChops.py b/venv/Lib/site-packages/PIL/ImageChops.py deleted file mode 100644 index 61d3a29..0000000 --- a/venv/Lib/site-packages/PIL/ImageChops.py +++ /dev/null @@ -1,328 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard channel operations -# -# History: -# 1996-03-24 fl Created -# 1996-08-13 fl Added logical operations (for "1" images) -# 2000-10-12 fl Added offset method (from Image.py) -# -# Copyright (c) 1997-2000 by Secret Labs AB -# Copyright (c) 1996-2000 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image - - -def constant(image, value): - """Fill a channel with a given grey level. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.new("L", image.size, value) - - -def duplicate(image): - """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return image.copy() - - -def invert(image): - """ - Invert an image (channel). - - .. code-block:: python - - out = MAX - image - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image.load() - return image._new(image.im.chop_invert()) - - -def lighter(image1, image2): - """ - Compares the two images, pixel by pixel, and returns a new image containing - the lighter values. - - .. code-block:: python - - out = max(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_lighter(image2.im)) - - -def darker(image1, image2): - """ - Compares the two images, pixel by pixel, and returns a new image containing - the darker values. - - .. code-block:: python - - out = min(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_darker(image2.im)) - - -def difference(image1, image2): - """ - Returns the absolute value of the pixel-by-pixel difference between the two - images. - - .. code-block:: python - - out = abs(image1 - image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_difference(image2.im)) - - -def multiply(image1, image2): - """ - Superimposes two images on top of each other. - - If you multiply an image with a solid black image, the result is black. If - you multiply with a solid white image, the image is unaffected. - - .. code-block:: python - - out = image1 * image2 / MAX - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_multiply(image2.im)) - - -def screen(image1, image2): - """ - Superimposes two inverted images on top of each other. - - .. code-block:: python - - out = MAX - ((MAX - image1) * (MAX - image2) / MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_screen(image2.im)) - - -def soft_light(image1, image2): - """ - Superimposes two images on top of each other using the Soft Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_soft_light(image2.im)) - - -def hard_light(image1, image2): - """ - Superimposes two images on top of each other using the Hard Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_hard_light(image2.im)) - - -def overlay(image1, image2): - """ - Superimposes two images on top of each other using the Overlay algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_overlay(image2.im)) - - -def add(image1, image2, scale=1.0, offset=0): - """ - Adds two images, dividing the result by scale and adding the - offset. If omitted, scale defaults to 1.0, and offset to 0.0. - - .. code-block:: python - - out = ((image1 + image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add(image2.im, scale, offset)) - - -def subtract(image1, image2, scale=1.0, offset=0): - """ - Subtracts two images, dividing the result by scale and adding the offset. - If omitted, scale defaults to 1.0, and offset to 0.0. - - .. code-block:: python - - out = ((image1 - image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) - - -def add_modulo(image1, image2): - """Add two images, without clipping the result. - - .. code-block:: python - - out = ((image1 + image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add_modulo(image2.im)) - - -def subtract_modulo(image1, image2): - """Subtract two images, without clipping the result. - - .. code-block:: python - - out = ((image1 - image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract_modulo(image2.im)) - - -def logical_and(image1, image2): - """Logical AND between two images. - - Both of the images must have mode "1". If you would like to perform a - logical AND on an image with a mode other than "1", try - :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask - as the second image. - - .. code-block:: python - - out = ((image1 and image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_and(image2.im)) - - -def logical_or(image1, image2): - """Logical OR between two images. - - Both of the images must have mode "1". - - .. code-block:: python - - out = ((image1 or image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_or(image2.im)) - - -def logical_xor(image1, image2): - """Logical XOR between two images. - - Both of the images must have mode "1". - - .. code-block:: python - - out = ((bool(image1) != bool(image2)) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_xor(image2.im)) - - -def blend(image1, image2, alpha): - """Blend images using constant transparency weight. Alias for - :py:func:`PIL.Image.blend`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.blend(image1, image2, alpha) - - -def composite(image1, image2, mask): - """Create composite using transparency mask. Alias for - :py:func:`PIL.Image.composite`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.composite(image1, image2, mask) - - -def offset(image, xoffset, yoffset=None): - """Returns a copy of the image where data has been offset by the given - distances. Data wraps around the edges. If ``yoffset`` is omitted, it - is assumed to be equal to ``xoffset``. - - :param xoffset: The horizontal distance. - :param yoffset: The vertical distance. If omitted, both - distances are set to the same value. - :rtype: :py:class:`~PIL.Image.Image` - """ - - if yoffset is None: - yoffset = xoffset - image.load() - return image._new(image.im.offset(xoffset, yoffset)) diff --git a/venv/Lib/site-packages/PIL/ImageCms.py b/venv/Lib/site-packages/PIL/ImageCms.py deleted file mode 100644 index ea328e1..0000000 --- a/venv/Lib/site-packages/PIL/ImageCms.py +++ /dev/null @@ -1,1029 +0,0 @@ -# The Python Imaging Library. -# $Id$ - -# Optional color management support, based on Kevin Cazabon's PyCMS -# library. - -# History: - -# 2009-03-08 fl Added to PIL. - -# Copyright (C) 2002-2003 Kevin Cazabon -# Copyright (c) 2009 by Fredrik Lundh -# Copyright (c) 2013 by Eric Soroos - -# See the README file for information on usage and redistribution. See -# below for the original description. - -import sys -import warnings -from enum import IntEnum - -from PIL import Image - -try: - from PIL import _imagingcms -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import deferred_error - - _imagingcms = deferred_error(ex) - -DESCRIPTION = """ -pyCMS - - a Python / PIL interface to the littleCMS ICC Color Management System - Copyright (C) 2002-2003 Kevin Cazabon - kevin@cazabon.com - https://www.cazabon.com - - pyCMS home page: https://www.cazabon.com/pyCMS - littleCMS home page: https://www.littlecms.com - (littleCMS is Copyright (C) 1998-2001 Marti Maria) - - Originally released under LGPL. Graciously donated to PIL in - March 2009, for distribution under the standard PIL license - - The pyCMS.py module provides a "clean" interface between Python/PIL and - pyCMSdll, taking care of some of the more complex handling of the direct - pyCMSdll functions, as well as error-checking and making sure that all - relevant data is kept together. - - While it is possible to call pyCMSdll functions directly, it's not highly - recommended. - - Version History: - - 1.0.0 pil Oct 2013 Port to LCMS 2. - - 0.1.0 pil mod March 10, 2009 - - Renamed display profile to proof profile. The proof - profile is the profile of the device that is being - simulated, not the profile of the device which is - actually used to display/print the final simulation - (that'd be the output profile) - also see LCMSAPI.txt - input colorspace -> using 'renderingIntent' -> proof - colorspace -> using 'proofRenderingIntent' -> output - colorspace - - Added LCMS FLAGS support. - Added FLAGS["SOFTPROOFING"] as default flag for - buildProofTransform (otherwise the proof profile/intent - would be ignored). - - 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms - - 0.0.2 alpha Jan 6, 2002 - - Added try/except statements around type() checks of - potential CObjects... Python won't let you use type() - on them, and raises a TypeError (stupid, if you ask - me!) - - Added buildProofTransformFromOpenProfiles() function. - Additional fixes in DLL, see DLL code for details. - - 0.0.1 alpha first public release, Dec. 26, 2002 - - Known to-do list with current version (of Python interface, not pyCMSdll): - - none - -""" - -VERSION = "1.0.0 pil" - -# --------------------------------------------------------------------. - -core = _imagingcms - -# -# intent/direction values - - -class Intent(IntEnum): - PERCEPTUAL = 0 - RELATIVE_COLORIMETRIC = 1 - SATURATION = 2 - ABSOLUTE_COLORIMETRIC = 3 - - -class Direction(IntEnum): - INPUT = 0 - OUTPUT = 1 - PROOF = 2 - - -def __getattr__(name): - deprecated = "deprecated and will be removed in Pillow 10 (2023-07-01). " - for enum, prefix in {Intent: "INTENT_", Direction: "DIRECTION_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - warnings.warn( - prefix - + name - + " is " - + deprecated - + "Use " - + enum.__name__ - + "." - + name - + " instead.", - DeprecationWarning, - stacklevel=2, - ) - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -# -# flags - -FLAGS = { - "MATRIXINPUT": 1, - "MATRIXOUTPUT": 2, - "MATRIXONLY": (1 | 2), - "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot - # Don't create prelinearization tables on precalculated transforms - # (internal use): - "NOPRELINEARIZATION": 16, - "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) - "NOTCACHE": 64, # Inhibit 1-pixel cache - "NOTPRECALC": 256, - "NULLTRANSFORM": 512, # Don't transform anyway - "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy - "LOWRESPRECALC": 2048, # Use less memory to minimize resources - "WHITEBLACKCOMPENSATION": 8192, - "BLACKPOINTCOMPENSATION": 8192, - "GAMUTCHECK": 4096, # Out of Gamut alarm - "SOFTPROOFING": 16384, # Do softproofing - "PRESERVEBLACK": 32768, # Black preservation - "NODEFAULTRESOURCEDEF": 16777216, # CRD special - "GRIDPOINTS": lambda n: ((n) & 0xFF) << 16, # Gridpoints -} - -_MAX_FLAG = 0 -for flag in FLAGS.values(): - if isinstance(flag, int): - _MAX_FLAG = _MAX_FLAG | flag - - -# --------------------------------------------------------------------. -# Experimental PIL-level API -# --------------------------------------------------------------------. - -## -# Profile. - - -class ImageCmsProfile: - def __init__(self, profile): - """ - :param profile: Either a string representing a filename, - a file like object containing a profile or a - low-level profile object - - """ - - if isinstance(profile, str): - if sys.platform == "win32": - profile_bytes_path = profile.encode() - try: - profile_bytes_path.decode("ascii") - except UnicodeDecodeError: - with open(profile, "rb") as f: - self._set(core.profile_frombytes(f.read())) - return - self._set(core.profile_open(profile), profile) - elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) - elif isinstance(profile, _imagingcms.CmsProfile): - self._set(profile) - else: - raise TypeError("Invalid type for Profile") - - def _set(self, profile, filename=None): - self.profile = profile - self.filename = filename - if profile: - self.product_name = None # profile.product_name - self.product_info = None # profile.product_info - else: - self.product_name = None - self.product_info = None - - def tobytes(self): - """ - Returns the profile in a format suitable for embedding in - saved images. - - :returns: a bytes object containing the ICC profile. - """ - - return core.profile_tobytes(self.profile) - - -class ImageCmsTransform(Image.ImagePointHandler): - - """ - Transform. This can be used with the procedural API, or with the standard - :py:func:`~PIL.Image.Image.point` method. - - Will return the output profile in the ``output.info['icc_profile']``. - """ - - def __init__( - self, - input, - output, - input_mode, - output_mode, - intent=Intent.PERCEPTUAL, - proof=None, - proof_intent=Intent.ABSOLUTE_COLORIMETRIC, - flags=0, - ): - if proof is None: - self.transform = core.buildTransform( - input.profile, output.profile, input_mode, output_mode, intent, flags - ) - else: - self.transform = core.buildProofTransform( - input.profile, - output.profile, - proof.profile, - input_mode, - output_mode, - intent, - proof_intent, - flags, - ) - # Note: inputMode and outputMode are for pyCMS compatibility only - self.input_mode = self.inputMode = input_mode - self.output_mode = self.outputMode = output_mode - - self.output_profile = output - - def point(self, im): - return self.apply(im) - - def apply(self, im, imOut=None): - im.load() - if imOut is None: - imOut = Image.new(self.output_mode, im.size, None) - self.transform.apply(im.im.id, imOut.im.id) - imOut.info["icc_profile"] = self.output_profile.tobytes() - return imOut - - def apply_in_place(self, im): - im.load() - if im.mode != self.output_mode: - raise ValueError("mode mismatch") # wrong output mode - self.transform.apply(im.im.id, im.im.id) - im.info["icc_profile"] = self.output_profile.tobytes() - return im - - -def get_display_profile(handle=None): - """ - (experimental) Fetches the profile for the current display device. - - :returns: ``None`` if the profile is not known. - """ - - if sys.platform != "win32": - return None - - from PIL import ImageWin - - if isinstance(handle, ImageWin.HDC): - profile = core.get_display_profile_win32(handle, 1) - else: - profile = core.get_display_profile_win32(handle or 0) - if profile is None: - return None - return ImageCmsProfile(profile) - - -# --------------------------------------------------------------------. -# pyCMS compatible layer -# --------------------------------------------------------------------. - - -class PyCMSError(Exception): - - """(pyCMS) Exception class. - This is used for all errors in the pyCMS API.""" - - pass - - -def profileToProfile( - im, - inputProfile, - outputProfile, - renderingIntent=Intent.PERCEPTUAL, - outputMode=None, - inPlace=False, - flags=0, -): - """ - (pyCMS) Applies an ICC transformation to a given image, mapping from - ``inputProfile`` to ``outputProfile``. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and - ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. - If an error occurs during application of the profiles, - a :exc:`PyCMSError` will be raised. - If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), - a :exc:`PyCMSError` will be raised. - - This function applies an ICC transformation to im from ``inputProfile``'s - color space to ``outputProfile``'s color space using the specified rendering - intent to decide how to handle out-of-gamut colors. - - ``outputMode`` can be used to specify that a color mode conversion is to - be done using these profiles, but the specified profiles must be able - to handle that mode. I.e., if converting im from RGB to CMYK using - profiles, the input profile must handle RGB data, and the output - profile must handle CMYK data. - - :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) - or Image.open(...), etc.) - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this image, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this image, or a profile object - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param outputMode: A valid PIL mode for the output image (i.e. "RGB", - "CMYK", etc.). Note: if rendering the image "inPlace", outputMode - MUST be the same mode as the input, or omitted completely. If - omitted, the outputMode will be the same as the mode of the input - image (im.mode) - :param inPlace: Boolean. If ``True``, the original image is modified in-place, - and ``None`` is returned. If ``False`` (default), a new - :py:class:`~PIL.Image.Image` object is returned with the transform applied. - :param flags: Integer (0-...) specifying additional flags - :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on - the value of ``inPlace`` - :exception PyCMSError: - """ - - if outputMode is None: - outputMode = im.mode - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - raise PyCMSError("renderingIntent must be an integer between 0 and 3") - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - transform = ImageCmsTransform( - inputProfile, - outputProfile, - im.mode, - outputMode, - renderingIntent, - flags=flags, - ) - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def getOpenProfile(profileFilename): - """ - (pyCMS) Opens an ICC profile file. - - The PyCMSProfile object can be passed back into pyCMS for use in creating - transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). - - If ``profileFilename`` is not a valid filename for an ICC profile, - a :exc:`PyCMSError` will be raised. - - :param profileFilename: String, as a valid filename path to the ICC profile - you wish to open, or a file-like object. - :returns: A CmsProfile class object. - :exception PyCMSError: - """ - - try: - return ImageCmsProfile(profileFilename) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildTransform( - inputProfile, - outputProfile, - inMode, - outMode, - renderingIntent=Intent.PERCEPTUAL, - flags=0, -): - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``. Use applyTransform to apply the transform to a given - image. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If an error occurs during creation - of the transform, a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile`` using the ``renderingIntent`` to determine what to do - with out-of-gamut colors. It will ONLY work for converting images that - are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, - i.e. "RGB", "RGBA", "CMYK", etc.). - - Building the transform is a fair part of the overhead in - ImageCms.profileToProfile(), so if you're planning on converting multiple - images using the same input/output settings, this can save you time. - Once you have a transform object, it can be used with - ImageCms.applyProfile() to convert images without the need to re-compute - the lookup table for the transform. - - The reason pyCMS returns a class object rather than a handle directly - to the transform is that it needs to keep track of the PIL input/output - modes that the transform is meant for. These attributes are stored in - the ``inMode`` and ``outMode`` attributes of the object (which can be - manually overridden if you really want to, but I don't know of any - time that would be of use, or would even work). - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - raise PyCMSError("renderingIntent must be an integer between 0 and 3") - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - return ImageCmsTransform( - inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildProofTransform( - inputProfile, - outputProfile, - proofProfile, - inMode, - outMode, - renderingIntent=Intent.PERCEPTUAL, - proofRenderingIntent=Intent.ABSOLUTE_COLORIMETRIC, - flags=FLAGS["SOFTPROOFING"], -): - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device. - - If the input, output, or proof profiles specified are not valid - filenames, a :exc:`PyCMSError` will be raised. - - If an error occurs during creation of the transform, - a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device using ``renderingIntent`` and - ``proofRenderingIntent`` to determine what to do with out-of-gamut - colors. This is known as "soft-proofing". It will ONLY work for - converting images that are in ``inMode`` to images that are in outMode - color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). - - Usage of the resulting transform object is exactly the same as with - ImageCms.buildTransform(). - - Proof profiling is generally used when using an output device to get a - good idea of what the final printed/displayed image would look like on - the ``proofProfile`` device when it's quicker and easier to use the - output device for judging color. Generally, this means that the - output device is a monitor, or a dye-sub printer (etc.), and the simulated - device is something more expensive, complicated, or time consuming - (making it difficult to make a real print for color judgement purposes). - - Soft-proofing basically functions by adjusting the colors on the - output device to match the colors of the device being simulated. However, - when the simulated device has a much wider gamut than the output - device, you may obtain marginal results. - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - (monitor, usually) profile you wish to use for this transform, or a - profile object - :param proofProfile: String, as a valid filename path to the ICC proof - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the input->proof (simulated) transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param proofRenderingIntent: Integer (0-3) specifying the rendering intent - you wish to use for proof->output transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - raise PyCMSError("renderingIntent must be an integer between 0 and 3") - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - if not isinstance(proofProfile, ImageCmsProfile): - proofProfile = ImageCmsProfile(proofProfile) - return ImageCmsTransform( - inputProfile, - outputProfile, - inMode, - outMode, - renderingIntent, - proofProfile, - proofRenderingIntent, - flags, - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -buildTransformFromOpenProfiles = buildTransform -buildProofTransformFromOpenProfiles = buildProofTransform - - -def applyTransform(im, transform, inPlace=False): - """ - (pyCMS) Applies a transform to a given image. - - If ``im.mode != transform.inMode``, a :exc:`PyCMSError` is raised. - - If ``inPlace`` is ``True`` and ``transform.inMode != transform.outMode``, a - :exc:`PyCMSError` is raised. - - If ``im.mode``, ``transform.inMode`` or ``transform.outMode`` is not - supported by pyCMSdll or the profiles you used for the transform, a - :exc:`PyCMSError` is raised. - - If an error occurs while the transform is being applied, - a :exc:`PyCMSError` is raised. - - This function applies a pre-calculated transform (from - ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) - to an image. The transform can be used for multiple images, saving - considerable calculation time if doing the same conversion multiple times. - - If you want to modify im in-place instead of receiving a new image as - the return value, set ``inPlace`` to ``True``. This can only be done if - ``transform.inMode`` and ``transform.outMode`` are the same, because we can't - change the mode in-place (the buffer sizes for some modes are - different). The default behavior is to return a new :py:class:`~PIL.Image.Image` - object of the same dimensions in mode ``transform.outMode``. - - :param im: An :py:class:`~PIL.Image.Image` object, and im.mode must be the same - as the ``inMode`` supported by the transform. - :param transform: A valid CmsTransform class object - :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is - returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the - transform applied is returned (and ``im`` is not changed). The default is - ``False``. - :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, - depending on the value of ``inPlace``. The profile will be returned in - the image's ``info['icc_profile']``. - :exception PyCMSError: - """ - - try: - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def createProfile(colorSpace, colorTemp=-1): - """ - (pyCMS) Creates a profile. - - If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, - a :exc:`PyCMSError` is raised. - - If using LAB and ``colorTemp`` is not a positive integer, - a :exc:`PyCMSError` is raised. - - If an error occurs while creating the profile, - a :exc:`PyCMSError` is raised. - - Use this function to create common profiles on-the-fly instead of - having to supply a profile on disk and knowing the path to it. It - returns a normal CmsProfile object that can be passed to - ImageCms.buildTransformFromOpenProfiles() to create a transform to apply - to images. - - :param colorSpace: String, the color space of the profile you wish to - create. - Currently only "LAB", "XYZ", and "sRGB" are supported. - :param colorTemp: Positive integer for the white point for the profile, in - degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 - illuminant if omitted (5000k). colorTemp is ONLY applied to LAB - profiles, and is ignored for XYZ and sRGB. - :returns: A CmsProfile class object - :exception PyCMSError: - """ - - if colorSpace not in ["LAB", "XYZ", "sRGB"]: - raise PyCMSError( - f"Color space not supported for on-the-fly profile creation ({colorSpace})" - ) - - if colorSpace == "LAB": - try: - colorTemp = float(colorTemp) - except (TypeError, ValueError) as e: - raise PyCMSError( - f'Color temperature must be numeric, "{colorTemp}" not valid' - ) from e - - try: - return core.createProfile(colorSpace, colorTemp) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileName(profile): - """ - - (pyCMS) Gets the internal product name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised If an error occurs while trying - to obtain the name tag, a :exc:`PyCMSError` is raised. - - Use this function to obtain the INTERNAL name of the profile (stored - in an ICC tag in the profile itself), usually the one used when the - profile was originally created. Sometimes this tag also contains - additional information supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal name of the profile as stored - in an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # do it in python, not c. - # // name was "%s - %s" (model, manufacturer) || Description , - # // but if the Model and Manufacturer were the same or the model - # // was long, Just the model, in 1.x - model = profile.profile.model - manufacturer = profile.profile.manufacturer - - if not (model or manufacturer): - return (profile.profile.profile_description or "") + "\n" - if not manufacturer or len(model) > 30: - return model + "\n" - return f"{model} - {manufacturer}\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileInfo(profile): - """ - (pyCMS) Gets the internal product information for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the info tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - info tag. This often contains details about the profile, and how it - was created, as supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # add an extra newline to preserve pyCMS compatibility - # Python, not C. the white point bits weren't working well, - # so skipping. - # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint - description = profile.profile.profile_description - cpright = profile.profile.copyright - arr = [] - for elt in (description, cpright): - if elt: - arr.append(elt) - return "\r\n\r\n".join(arr) + "\r\n\r\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileCopyright(profile): - """ - (pyCMS) Gets the copyright for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the copyright tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - copyright tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.copyright or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileManufacturer(profile): - """ - (pyCMS) Gets the manufacturer for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the manufacturer tag, a - :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - manufacturer tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.manufacturer or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileModel(profile): - """ - (pyCMS) Gets the model for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the model tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - model tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.model or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileDescription(profile): - """ - (pyCMS) Gets the description for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the description tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - description tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in an - ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.profile_description or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getDefaultIntent(profile): - """ - (pyCMS) Gets the default intent name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the default intent, a - :exc:`PyCMSError` is raised. - - Use this function to determine the default (and usually best optimized) - rendering intent for this profile. Most profiles support multiple - rendering intents, but are intended mostly for one type of conversion. - If you wish to use a different intent than returned, use - ImageCms.isIntentSupported() to verify it will work first. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: Integer 0-3 specifying the default rendering intent for this - profile. - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return profile.profile.rendering_intent - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def isIntentSupported(profile, intent, direction): - """ - (pyCMS) Checks if a given intent is supported. - - Use this function to verify that you can use your desired - ``intent`` with ``profile``, and that ``profile`` can be used for the - input/output/proof profile as you desire. - - Some profiles are created specifically for one "direction", can cannot - be used for others. Some profiles can only be used for certain - rendering intents, so it's best to either verify this before trying - to create a transform with them (using this function), or catch the - potential :exc:`PyCMSError` that will occur if they don't - support the modes you select. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :param intent: Integer (0-3) specifying the rendering intent you wish to - use with this profile - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param direction: Integer specifying if the profile is to be used for - input, output, or proof - - INPUT = 0 (or use ImageCms.Direction.INPUT) - OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) - PROOF = 2 (or use ImageCms.Direction.PROOF) - - :returns: 1 if the intent/direction are supported, -1 if they are not. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # FIXME: I get different results for the same data w. different - # compilers. Bug in LittleCMS or in the binding? - if profile.profile.is_intent_supported(intent, direction): - return 1 - else: - return -1 - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def versions(): - """ - (pyCMS) Fetches versions. - """ - - return (VERSION, core.littlecms_version, sys.version.split()[0], Image.__version__) diff --git a/venv/Lib/site-packages/PIL/ImageColor.py b/venv/Lib/site-packages/PIL/ImageColor.py deleted file mode 100644 index 25f92f2..0000000 --- a/venv/Lib/site-packages/PIL/ImageColor.py +++ /dev/null @@ -1,302 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# map CSS3-style colour description strings to RGB -# -# History: -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-15 fl Added RGBA support -# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 -# 2004-07-19 fl Fixed gray/grey spelling issues -# 2009-03-05 fl Fixed rounding error in grayscale calculation -# -# Copyright (c) 2002-2004 by Secret Labs AB -# Copyright (c) 2002-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import re - -from . import Image - - -def getrgb(color): - """ - Convert a color string to an RGB or RGBA tuple. If the string cannot be - parsed, this function raises a :py:exc:`ValueError` exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :return: ``(red, green, blue[, alpha])`` - """ - if len(color) > 100: - raise ValueError("color specifier is too long") - color = color.lower() - - rgb = colormap.get(color, None) - if rgb: - if isinstance(rgb, tuple): - return rgb - colormap[color] = rgb = getrgb(rgb) - return rgb - - # check for known string formats - if re.match("#[a-f0-9]{3}$", color): - return (int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16)) - - if re.match("#[a-f0-9]{4}$", color): - return ( - int(color[1] * 2, 16), - int(color[2] * 2, 16), - int(color[3] * 2, 16), - int(color[4] * 2, 16), - ) - - if re.match("#[a-f0-9]{6}$", color): - return (int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16)) - - if re.match("#[a-f0-9]{8}$", color): - return ( - int(color[1:3], 16), - int(color[3:5], 16), - int(color[5:7], 16), - int(color[7:9], 16), - ) - - m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return (int(m.group(1)), int(m.group(2)), int(m.group(3))) - - m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) - if m: - return ( - int((int(m.group(1)) * 255) / 100.0 + 0.5), - int((int(m.group(2)) * 255) / 100.0 + 0.5), - int((int(m.group(3)) * 255) / 100.0 + 0.5), - ) - - m = re.match( - r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hls_to_rgb - - rgb = hls_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(3)) / 100.0, - float(m.group(2)) / 100.0, - ) - return ( - int(rgb[0] * 255 + 0.5), - int(rgb[1] * 255 + 0.5), - int(rgb[2] * 255 + 0.5), - ) - - m = re.match( - r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hsv_to_rgb - - rgb = hsv_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(2)) / 100.0, - float(m.group(3)) / 100.0, - ) - return ( - int(rgb[0] * 255 + 0.5), - int(rgb[1] * 255 + 0.5), - int(rgb[2] * 255 + 0.5), - ) - - m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return (int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4))) - raise ValueError(f"unknown color specifier: {repr(color)}") - - -def getcolor(color, mode): - """ - Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a - greyscale value if the mode is not color or a palette image. If the string - cannot be parsed, this function raises a :py:exc:`ValueError` exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :return: ``(graylevel [, alpha]) or (red, green, blue[, alpha])`` - """ - # same as getrgb, but converts the result to the given mode - color, alpha = getrgb(color), 255 - if len(color) == 4: - color, alpha = color[0:3], color[3] - - if Image.getmodebase(mode) == "L": - r, g, b = color - # ITU-R Recommendation 601-2 for nonlinear RGB - # scaled to 24 bits to match the convert's implementation. - color = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 - if mode[-1] == "A": - return (color, alpha) - else: - if mode[-1] == "A": - return color + (alpha,) - return color - - -colormap = { - # X11 colour table from https://drafts.csswg.org/css-color-4/, with - # gray/grey spelling issues fixed. This is a superset of HTML 4.0 - # colour names used in CSS 1. - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "black": "#000000", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgrey": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkslategrey": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dimgrey": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "grey": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred": "#cd5c5c", - "indigo": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgreen": "#90ee90", - "lightgray": "#d3d3d3", - "lightgrey": "#d3d3d3", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightslategrey": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370db", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#db7093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "rebeccapurple": "#663399", - "red": "#ff0000", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "slategrey": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "white": "#ffffff", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32", -} diff --git a/venv/Lib/site-packages/PIL/ImageDraw.py b/venv/Lib/site-packages/PIL/ImageDraw.py deleted file mode 100644 index 610ccd4..0000000 --- a/venv/Lib/site-packages/PIL/ImageDraw.py +++ /dev/null @@ -1,1004 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# drawing interface operations -# -# History: -# 1996-04-13 fl Created (experimental) -# 1996-08-07 fl Filled polygons, ellipses. -# 1996-08-13 fl Added text support -# 1998-06-28 fl Handle I and F images -# 1998-12-29 fl Added arc; use arc primitive to draw ellipses -# 1999-01-10 fl Added shape stuff (experimental) -# 1999-02-06 fl Added bitmap support -# 1999-02-11 fl Changed all primitives to take options -# 1999-02-20 fl Fixed backwards compatibility -# 2000-10-12 fl Copy on write, when necessary -# 2001-02-18 fl Use default ink for bitmap/text also in fill mode -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing -# 2002-12-11 fl Refactored low-level drawing API (work in progress) -# 2004-08-26 fl Made Draw() a factory function, added getdraw() support -# 2004-09-04 fl Added width support to line primitive -# 2004-09-10 fl Added font mode handling -# 2006-06-19 fl Added font bearing support (getmask2) -# -# Copyright (c) 1997-2006 by Secret Labs AB -# Copyright (c) 1996-2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import math -import numbers - -from . import Image, ImageColor, ImageFont - -""" -A simple 2D drawing interface for PIL images. -

-Application code should use the Draw factory, instead of -directly. -""" - - -class ImageDraw: - def __init__(self, im, mode=None): - """ - Create a drawing instance. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - im.load() - if im.readonly: - im._copy() # make it writeable - blend = 0 - if mode is None: - mode = im.mode - if mode != im.mode: - if mode == "RGBA" and im.mode == "RGB": - blend = 1 - else: - raise ValueError("mode mismatch") - if mode == "P": - self.palette = im.palette - else: - self.palette = None - self._image = im - self.im = im.im - self.draw = Image.core.draw(self.im, blend) - self.mode = mode - if mode in ("I", "F"): - self.ink = self.draw.draw_ink(1) - else: - self.ink = self.draw.draw_ink(-1) - if mode in ("1", "P", "I", "F"): - # FIXME: fix Fill2 to properly support matte for I+F images - self.fontmode = "1" - else: - self.fontmode = "L" # aliasing is okay for other modes - self.fill = 0 - self.font = None - - def getfont(self): - """ - Get the current default font. - - :returns: An image font.""" - if not self.font: - # FIXME: should add a font repository - from . import ImageFont - - self.font = ImageFont.load_default() - return self.font - - def _getink(self, ink, fill=None): - if ink is None and fill is None: - if self.fill: - fill = self.ink - else: - ink = self.ink - else: - if ink is not None: - if isinstance(ink, str): - ink = ImageColor.getcolor(ink, self.mode) - if self.palette and not isinstance(ink, numbers.Number): - ink = self.palette.getcolor(ink, self._image) - ink = self.draw.draw_ink(ink) - if fill is not None: - if isinstance(fill, str): - fill = ImageColor.getcolor(fill, self.mode) - if self.palette and not isinstance(fill, numbers.Number): - fill = self.palette.getcolor(fill, self._image) - fill = self.draw.draw_ink(fill) - return ink, fill - - def arc(self, xy, start, end, fill=None, width=1): - """Draw an arc.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_arc(xy, start, end, ink, width) - - def bitmap(self, xy, bitmap, fill=None): - """Draw a bitmap.""" - bitmap.load() - ink, fill = self._getink(fill) - if ink is None: - ink = fill - if ink is not None: - self.draw.draw_bitmap(xy, bitmap.im, ink) - - def chord(self, xy, start, end, fill=None, outline=None, width=1): - """Draw a chord.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_chord(xy, start, end, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_chord(xy, start, end, ink, 0, width) - - def ellipse(self, xy, fill=None, outline=None, width=1): - """Draw an ellipse.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_ellipse(xy, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_ellipse(xy, ink, 0, width) - - def line(self, xy, fill=None, width=0, joint=None): - """Draw a line, or a connected sequence of line segments.""" - ink = self._getink(fill)[0] - if ink is not None: - self.draw.draw_lines(xy, ink, width) - if joint == "curve" and width > 4: - if not isinstance(xy[0], (list, tuple)): - xy = [tuple(xy[i : i + 2]) for i in range(0, len(xy), 2)] - for i in range(1, len(xy) - 1): - point = xy[i] - angles = [ - math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) - % 360 - for start, end in ((xy[i - 1], point), (point, xy[i + 1])) - ] - if angles[0] == angles[1]: - # This is a straight line, so no joint is required - continue - - def coord_at_angle(coord, angle): - x, y = coord - angle -= 90 - distance = width / 2 - 1 - return tuple( - p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) - for p, p_d in ( - (x, distance * math.cos(math.radians(angle))), - (y, distance * math.sin(math.radians(angle))), - ) - ) - - flipped = ( - angles[1] > angles[0] and angles[1] - 180 > angles[0] - ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) - coords = [ - (point[0] - width / 2 + 1, point[1] - width / 2 + 1), - (point[0] + width / 2 - 1, point[1] + width / 2 - 1), - ] - if flipped: - start, end = (angles[1] + 90, angles[0] + 90) - else: - start, end = (angles[0] - 90, angles[1] - 90) - self.pieslice(coords, start - 90, end - 90, fill) - - if width > 8: - # Cover potential gaps between the line and the joint - if flipped: - gapCoords = [ - coord_at_angle(point, angles[0] + 90), - point, - coord_at_angle(point, angles[1] + 90), - ] - else: - gapCoords = [ - coord_at_angle(point, angles[0] - 90), - point, - coord_at_angle(point, angles[1] - 90), - ] - self.line(gapCoords, fill, width=3) - - def shape(self, shape, fill=None, outline=None): - """(Experimental) Draw a shape.""" - shape.close() - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_outline(shape, fill, 1) - if ink is not None and ink != fill: - self.draw.draw_outline(shape, ink, 0) - - def pieslice(self, xy, start, end, fill=None, outline=None, width=1): - """Draw a pieslice.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_pieslice(xy, start, end, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_pieslice(xy, start, end, ink, 0, width) - - def point(self, xy, fill=None): - """Draw one or more individual pixels.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_points(xy, ink) - - def polygon(self, xy, fill=None, outline=None, width=1): - """Draw a polygon.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_polygon(xy, fill, 1) - if ink is not None and ink != fill and width != 0: - if width == 1: - self.draw.draw_polygon(xy, ink, 0, width) - else: - # To avoid expanding the polygon outwards, - # use the fill as a mask - mask = Image.new("1", self.im.size) - mask_ink = self._getink(1)[0] - - fill_im = mask.copy() - draw = Draw(fill_im) - draw.draw.draw_polygon(xy, mask_ink, 1) - - ink_im = mask.copy() - draw = Draw(ink_im) - width = width * 2 - 1 - draw.draw.draw_polygon(xy, mask_ink, 0, width) - - mask.paste(ink_im, mask=fill_im) - - im = Image.new(self.mode, self.im.size) - draw = Draw(im) - draw.draw.draw_polygon(xy, ink, 0, width) - self.im.paste(im.im, (0, 0) + im.size, mask.im) - - def regular_polygon( - self, bounding_circle, n_sides, rotation=0, fill=None, outline=None - ): - """Draw a regular polygon.""" - xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) - self.polygon(xy, fill, outline) - - def rectangle(self, xy, fill=None, outline=None, width=1): - """Draw a rectangle.""" - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_rectangle(xy, fill, 1) - if ink is not None and ink != fill and width != 0: - self.draw.draw_rectangle(xy, ink, 0, width) - - def rounded_rectangle(self, xy, radius=0, fill=None, outline=None, width=1): - """Draw a rounded rectangle.""" - if isinstance(xy[0], (list, tuple)): - (x0, y0), (x1, y1) = xy - else: - x0, y0, x1, y1 = xy - - d = radius * 2 - - full_x = d >= x1 - x0 - if full_x: - # The two left and two right corners are joined - d = x1 - x0 - full_y = d >= y1 - y0 - if full_y: - # The two top and two bottom corners are joined - d = y1 - y0 - if full_x and full_y: - # If all corners are joined, that is a circle - return self.ellipse(xy, fill, outline, width) - - if d == 0: - # If the corners have no curve, that is a rectangle - return self.rectangle(xy, fill, outline, width) - - r = d // 2 - ink, fill = self._getink(outline, fill) - - def draw_corners(pieslice): - if full_x: - # Draw top and bottom halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 180, 360), - ((x0, y1 - d, x0 + d, y1), 0, 180), - ) - elif full_y: - # Draw left and right halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 90, 270), - ((x1 - d, y0, x1, y0 + d), 270, 90), - ) - else: - # Draw four separate corners - parts = ( - ((x1 - d, y0, x1, y0 + d), 270, 360), - ((x1 - d, y1 - d, x1, y1), 0, 90), - ((x0, y1 - d, x0 + d, y1), 90, 180), - ((x0, y0, x0 + d, y0 + d), 180, 270), - ) - for part in parts: - if pieslice: - self.draw.draw_pieslice(*(part + (fill, 1))) - else: - self.draw.draw_arc(*(part + (ink, width))) - - if fill is not None: - draw_corners(True) - - if full_x: - self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill, 1) - else: - self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill, 1) - if not full_x and not full_y: - self.draw.draw_rectangle((x0, y0 + r + 1, x0 + r, y1 - r - 1), fill, 1) - self.draw.draw_rectangle((x1 - r, y0 + r + 1, x1, y1 - r - 1), fill, 1) - if ink is not None and ink != fill and width != 0: - draw_corners(False) - - if not full_x: - self.draw.draw_rectangle( - (x0 + r + 1, y0, x1 - r - 1, y0 + width - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x0 + r + 1, y1 - width + 1, x1 - r - 1, y1), ink, 1 - ) - if not full_y: - self.draw.draw_rectangle( - (x0, y0 + r + 1, x0 + width - 1, y1 - r - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x1 - width + 1, y0 + r + 1, x1, y1 - r - 1), ink, 1 - ) - - def _multiline_check(self, text): - """Draw text.""" - split_character = "\n" if isinstance(text, str) else b"\n" - - return split_character in text - - def _multiline_split(self, text): - split_character = "\n" if isinstance(text, str) else b"\n" - - return text.split(split_character) - - def text( - self, - xy, - text, - fill=None, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - stroke_fill=None, - embedded_color=False, - *args, - **kwargs, - ): - if self._multiline_check(text): - return self.multiline_text( - xy, - text, - fill, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - stroke_fill, - embedded_color, - ) - - if embedded_color and self.mode not in ("RGB", "RGBA"): - raise ValueError("Embedded color supported only in RGB and RGBA modes") - - if font is None: - font = self.getfont() - - def getink(fill): - ink, fill = self._getink(fill) - if ink is None: - return fill - return ink - - def draw_text(ink, stroke_width=0, stroke_offset=None): - mode = self.fontmode - if stroke_width == 0 and embedded_color: - mode = "RGBA" - coord = xy - try: - mask, offset = font.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - *args, - **kwargs, - ) - coord = coord[0] + offset[0], coord[1] + offset[1] - except AttributeError: - try: - mask = font.getmask( - text, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - *args, - **kwargs, - ) - except TypeError: - mask = font.getmask(text) - if stroke_offset: - coord = coord[0] + stroke_offset[0], coord[1] + stroke_offset[1] - if mode == "RGBA": - # font.getmask2(mode="RGBA") returns color in RGB bands and mask in A - # extract mask and set text alpha - color, mask = mask, mask.getband(3) - color.fillband(3, (ink >> 24) & 0xFF) - coord2 = coord[0] + mask.size[0], coord[1] + mask.size[1] - self.im.paste(color, coord + coord2, mask) - else: - self.draw.draw_bitmap(coord, mask, ink) - - ink = getink(fill) - if ink is not None: - stroke_ink = None - if stroke_width: - stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink - - if stroke_ink is not None: - # Draw stroked text - draw_text(stroke_ink, stroke_width) - - # Draw normal text - draw_text(ink, 0) - else: - # Only draw normal text - draw_text(ink) - - def multiline_text( - self, - xy, - text, - fill=None, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - stroke_fill=None, - embedded_color=False, - ): - if direction == "ttb": - raise ValueError("ttb direction is unsupported for multiline text") - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - raise ValueError("anchor must be a 2 character string") - elif anchor[1] in "tb": - raise ValueError("anchor not supported for multiline text") - - widths = [] - max_width = 0 - lines = self._multiline_split(text) - line_spacing = ( - self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing - ) - for line in lines: - line_width = self.textlength( - line, font, direction=direction, features=features, language=language - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - raise ValueError('align must be "left", "center" or "right"') - - self.text( - (left, top), - line, - fill, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - stroke_fill=stroke_fill, - embedded_color=embedded_color, - ) - top += line_spacing - - def textsize( - self, - text, - font=None, - spacing=4, - direction=None, - features=None, - language=None, - stroke_width=0, - ): - """Get the size of a given string, in pixels.""" - if self._multiline_check(text): - return self.multiline_textsize( - text, font, spacing, direction, features, language, stroke_width - ) - - if font is None: - font = self.getfont() - return font.getsize(text, direction, features, language, stroke_width) - - def multiline_textsize( - self, - text, - font=None, - spacing=4, - direction=None, - features=None, - language=None, - stroke_width=0, - ): - max_width = 0 - lines = self._multiline_split(text) - line_spacing = ( - self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing - ) - for line in lines: - line_width, line_height = self.textsize( - line, font, spacing, direction, features, language, stroke_width - ) - max_width = max(max_width, line_width) - return max_width, len(lines) * line_spacing - spacing - - def textlength( - self, - text, - font=None, - direction=None, - features=None, - language=None, - embedded_color=False, - ): - """Get the length of a given string, in pixels with 1/64 precision.""" - if self._multiline_check(text): - raise ValueError("can't measure length of multiline text") - if embedded_color and self.mode not in ("RGB", "RGBA"): - raise ValueError("Embedded color supported only in RGB and RGBA modes") - - if font is None: - font = self.getfont() - mode = "RGBA" if embedded_color else self.fontmode - try: - return font.getlength(text, mode, direction, features, language) - except AttributeError: - size = self.textsize( - text, font, direction=direction, features=features, language=language - ) - if direction == "ttb": - return size[1] - return size[0] - - def textbbox( - self, - xy, - text, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - embedded_color=False, - ): - """Get the bounding box of a given string, in pixels.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - raise ValueError("Embedded color supported only in RGB and RGBA modes") - - if self._multiline_check(text): - return self.multiline_textbbox( - xy, - text, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - embedded_color, - ) - - if font is None: - font = self.getfont() - if not isinstance(font, ImageFont.FreeTypeFont): - raise ValueError("Only supported for TrueType fonts") - mode = "RGBA" if embedded_color else self.fontmode - bbox = font.getbbox( - text, mode, direction, features, language, stroke_width, anchor - ) - return bbox[0] + xy[0], bbox[1] + xy[1], bbox[2] + xy[0], bbox[3] + xy[1] - - def multiline_textbbox( - self, - xy, - text, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - embedded_color=False, - ): - if direction == "ttb": - raise ValueError("ttb direction is unsupported for multiline text") - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - raise ValueError("anchor must be a 2 character string") - elif anchor[1] in "tb": - raise ValueError("anchor not supported for multiline text") - - widths = [] - max_width = 0 - lines = self._multiline_split(text) - line_spacing = ( - self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing - ) - for line in lines: - line_width = self.textlength( - line, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - bbox = None - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - raise ValueError('align must be "left", "center" or "right"') - - bbox_line = self.textbbox( - (left, top), - line, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - embedded_color=embedded_color, - ) - if bbox is None: - bbox = bbox_line - else: - bbox = ( - min(bbox[0], bbox_line[0]), - min(bbox[1], bbox_line[1]), - max(bbox[2], bbox_line[2]), - max(bbox[3], bbox_line[3]), - ) - - top += line_spacing - - if bbox is None: - return xy[0], xy[1], xy[0], xy[1] - return bbox - - -def Draw(im, mode=None): - """ - A simple 2D drawing interface for PIL images. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - try: - return im.getdraw(mode) - except AttributeError: - return ImageDraw(im, mode) - - -# experimental access to the outline API -try: - Outline = Image.core.outline -except AttributeError: - Outline = None - - -def getdraw(im=None, hints=None): - """ - (Experimental) A more advanced 2D drawing interface for PIL images, - based on the WCK interface. - - :param im: The image to draw in. - :param hints: An optional list of hints. - :returns: A (drawing context, drawing resource factory) tuple. - """ - # FIXME: this needs more work! - # FIXME: come up with a better 'hints' scheme. - handler = None - if not hints or "nicest" in hints: - try: - from . import _imagingagg as handler - except ImportError: - pass - if handler is None: - from . import ImageDraw2 as handler - if im: - im = handler.Draw(im) - return im, handler - - -def floodfill(image, xy, value, border=None, thresh=0): - """ - (experimental) Fills a bounded region with a given color. - - :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). See - :ref:`coordinate-system`. - :param value: Fill color. - :param border: Optional border value. If given, the region consists of - pixels with a color different from the border color. If not given, - the region consists of pixels having the same color as the seed - pixel. - :param thresh: Optional threshold value which specifies a maximum - tolerable difference of a pixel value from the 'background' in - order for it to be replaced. Useful for filling regions of - non-homogeneous, but similar, colors. - """ - # based on an implementation by Eric S. Raymond - # amended by yo1995 @20180806 - pixel = image.load() - x, y = xy - try: - background = pixel[x, y] - if _color_diff(value, background) <= thresh: - return # seed point already has fill color - pixel[x, y] = value - except (ValueError, IndexError): - return # seed point outside image - edge = {(x, y)} - # use a set to keep record of current and previous edge pixels - # to reduce memory consumption - full_edge = set() - while edge: - new_edge = set() - for (x, y) in edge: # 4 adjacent method - for (s, t) in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): - # If already processed, or if a coordinate is negative, skip - if (s, t) in full_edge or s < 0 or t < 0: - continue - try: - p = pixel[s, t] - except (ValueError, IndexError): - pass - else: - full_edge.add((s, t)) - if border is None: - fill = _color_diff(p, background) <= thresh - else: - fill = p != value and p != border - if fill: - pixel[s, t] = value - new_edge.add((s, t)) - full_edge = edge # discard pixels processed - edge = new_edge - - -def _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation): - """ - Generate a list of vertices for a 2D regular polygon. - - :param bounding_circle: The bounding circle is a tuple defined - by a point and radius. The polygon is inscribed in this circle. - (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) - :param n_sides: Number of sides - (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) - :param rotation: Apply an arbitrary rotation to the polygon - (e.g. ``rotation=90``, applies a 90 degree rotation) - :return: List of regular polygon vertices - (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) - - How are the vertices computed? - 1. Compute the following variables - - theta: Angle between the apothem & the nearest polygon vertex - - side_length: Length of each polygon edge - - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) - - polygon_radius: Polygon radius (last element of bounding_circle) - - angles: Location of each polygon vertex in polar grid - (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) - - 2. For each angle in angles, get the polygon vertex at that angle - The vertex is computed using the equation below. - X= xcos(φ) + ysin(φ) - Y= −xsin(φ) + ycos(φ) - - Note: - φ = angle in degrees - x = 0 - y = polygon_radius - - The formula above assumes rotation around the origin. - In our case, we are rotating around the centroid. - To account for this, we use the formula below - X = xcos(φ) + ysin(φ) + centroid_x - Y = −xsin(φ) + ycos(φ) + centroid_y - """ - # 1. Error Handling - # 1.1 Check `n_sides` has an appropriate value - if not isinstance(n_sides, int): - raise TypeError("n_sides should be an int") - if n_sides < 3: - raise ValueError("n_sides should be an int > 2") - - # 1.2 Check `bounding_circle` has an appropriate value - if not isinstance(bounding_circle, (list, tuple)): - raise TypeError("bounding_circle should be a tuple") - - if len(bounding_circle) == 3: - *centroid, polygon_radius = bounding_circle - elif len(bounding_circle) == 2: - centroid, polygon_radius = bounding_circle - else: - raise ValueError( - "bounding_circle should contain 2D coordinates " - "and a radius (e.g. (x, y, r) or ((x, y), r) )" - ) - - if not all(isinstance(i, (int, float)) for i in (*centroid, polygon_radius)): - raise ValueError("bounding_circle should only contain numeric data") - - if not len(centroid) == 2: - raise ValueError( - "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" - ) - - if polygon_radius <= 0: - raise ValueError("bounding_circle radius should be > 0") - - # 1.3 Check `rotation` has an appropriate value - if not isinstance(rotation, (int, float)): - raise ValueError("rotation should be an int or float") - - # 2. Define Helper Functions - def _apply_rotation(point, degrees, centroid): - return ( - round( - point[0] * math.cos(math.radians(360 - degrees)) - - point[1] * math.sin(math.radians(360 - degrees)) - + centroid[0], - 2, - ), - round( - point[1] * math.cos(math.radians(360 - degrees)) - + point[0] * math.sin(math.radians(360 - degrees)) - + centroid[1], - 2, - ), - ) - - def _compute_polygon_vertex(centroid, polygon_radius, angle): - start_point = [polygon_radius, 0] - return _apply_rotation(start_point, angle, centroid) - - def _get_angles(n_sides, rotation): - angles = [] - degrees = 360 / n_sides - # Start with the bottom left polygon vertex - current_angle = (270 - 0.5 * degrees) + rotation - for _ in range(0, n_sides): - angles.append(current_angle) - current_angle += degrees - if current_angle > 360: - current_angle -= 360 - return angles - - # 3. Variable Declarations - angles = _get_angles(n_sides, rotation) - - # 4. Compute Vertices - return [ - _compute_polygon_vertex(centroid, polygon_radius, angle) for angle in angles - ] - - -def _color_diff(color1, color2): - """ - Uses 1-norm distance to calculate difference between two values. - """ - if isinstance(color2, tuple): - return sum(abs(color1[i] - color2[i]) for i in range(0, len(color2))) - else: - return abs(color1 - color2) diff --git a/venv/Lib/site-packages/PIL/ImageDraw2.py b/venv/Lib/site-packages/PIL/ImageDraw2.py deleted file mode 100644 index 1f63110..0000000 --- a/venv/Lib/site-packages/PIL/ImageDraw2.py +++ /dev/null @@ -1,179 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WCK-style drawing interface operations -# -# History: -# 2003-12-07 fl created -# 2005-05-15 fl updated; added to PIL as ImageDraw2 -# 2005-05-15 fl added text support -# 2005-05-20 fl added arc/chord/pieslice support -# -# Copyright (c) 2003-2005 by Secret Labs AB -# Copyright (c) 2003-2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -""" -(Experimental) WCK-style drawing interface operations - -.. seealso:: :py:mod:`PIL.ImageDraw` -""" - - -from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath - - -class Pen: - """Stores an outline color and width.""" - - def __init__(self, color, width=1, opacity=255): - self.color = ImageColor.getrgb(color) - self.width = width - - -class Brush: - """Stores a fill color""" - - def __init__(self, color, opacity=255): - self.color = ImageColor.getrgb(color) - - -class Font: - """Stores a TrueType font and color""" - - def __init__(self, color, file, size=12): - # FIXME: add support for bitmap fonts - self.color = ImageColor.getrgb(color) - self.font = ImageFont.truetype(file, size) - - -class Draw: - """ - (Experimental) WCK-style drawing interface - """ - - def __init__(self, image, size=None, color=None): - if not hasattr(image, "im"): - image = Image.new(image, size, color) - self.draw = ImageDraw.Draw(image) - self.image = image - self.transform = None - - def flush(self): - return self.image - - def render(self, op, xy, pen, brush=None): - # handle color arguments - outline = fill = None - width = 1 - if isinstance(pen, Pen): - outline = pen.color - width = pen.width - elif isinstance(brush, Pen): - outline = brush.color - width = brush.width - if isinstance(brush, Brush): - fill = brush.color - elif isinstance(pen, Brush): - fill = pen.color - # handle transformation - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - # render the item - if op == "line": - self.draw.line(xy, fill=outline, width=width) - else: - getattr(self.draw, op)(xy, fill=fill, outline=outline) - - def settransform(self, offset): - """Sets a transformation offset.""" - (xoffset, yoffset) = offset - self.transform = (1, 0, xoffset, 0, 1, yoffset) - - def arc(self, xy, start, end, *options): - """ - Draws an arc (a portion of a circle outline) between the start and end - angles, inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` - """ - self.render("arc", xy, start, end, *options) - - def chord(self, xy, start, end, *options): - """ - Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points - with a straight line. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` - """ - self.render("chord", xy, start, end, *options) - - def ellipse(self, xy, *options): - """ - Draws an ellipse inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` - """ - self.render("ellipse", xy, *options) - - def line(self, xy, *options): - """ - Draws a line between the coordinates in the ``xy`` list. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` - """ - self.render("line", xy, *options) - - def pieslice(self, xy, start, end, *options): - """ - Same as arc, but also draws straight lines between the end points and the - center of the bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` - """ - self.render("pieslice", xy, start, end, *options) - - def polygon(self, xy, *options): - """ - Draws a polygon. - - The polygon outline consists of straight lines between the given - coordinates, plus a straight line between the last and the first - coordinate. - - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` - """ - self.render("polygon", xy, *options) - - def rectangle(self, xy, *options): - """ - Draws a rectangle. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` - """ - self.render("rectangle", xy, *options) - - def text(self, xy, text, font): - """ - Draws the string at the given position. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` - """ - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - self.draw.text(xy, text, font=font.font, fill=font.color) - - def textsize(self, text, font): - """ - Return the size of the given string, in pixels. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textsize` - """ - return self.draw.textsize(text, font=font.font) diff --git a/venv/Lib/site-packages/PIL/ImageEnhance.py b/venv/Lib/site-packages/PIL/ImageEnhance.py deleted file mode 100644 index 3b79d5c..0000000 --- a/venv/Lib/site-packages/PIL/ImageEnhance.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image enhancement classes -# -# For a background, see "Image Processing By Interpolation and -# Extrapolation", Paul Haeberli and Douglas Voorhies. Available -# at http://www.graficaobscura.com/interp/index.html -# -# History: -# 1996-03-23 fl Created -# 2009-06-16 fl Fixed mean calculation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFilter, ImageStat - - -class _Enhance: - def enhance(self, factor): - """ - Returns an enhanced image. - - :param factor: A floating point value controlling the enhancement. - Factor 1.0 always returns a copy of the original image, - lower factors mean less color (brightness, contrast, - etc), and higher values more. There are no restrictions - on this value. - :rtype: :py:class:`~PIL.Image.Image` - """ - return Image.blend(self.degenerate, self.image, factor) - - -class Color(_Enhance): - """Adjust image color balance. - - This class can be used to adjust the colour balance of an image, in - a manner similar to the controls on a colour TV set. An enhancement - factor of 0.0 gives a black and white image. A factor of 1.0 gives - the original image. - """ - - def __init__(self, image): - self.image = image - self.intermediate_mode = "L" - if "A" in image.getbands(): - self.intermediate_mode = "LA" - - self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) - - -class Contrast(_Enhance): - """Adjust image contrast. - - This class can be used to control the contrast of an image, similar - to the contrast control on a TV set. An enhancement factor of 0.0 - gives a solid grey image. A factor of 1.0 gives the original image. - """ - - def __init__(self, image): - self.image = image - mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) - self.degenerate = Image.new("L", image.size, mean).convert(image.mode) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Brightness(_Enhance): - """Adjust image brightness. - - This class can be used to control the brightness of an image. An - enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the - original image. - """ - - def __init__(self, image): - self.image = image - self.degenerate = Image.new(image.mode, image.size, 0) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Sharpness(_Enhance): - """Adjust image sharpness. - - This class can be used to adjust the sharpness of an image. An - enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the - original image, and a factor of 2.0 gives a sharpened image. - """ - - def __init__(self, image): - self.image = image - self.degenerate = image.filter(ImageFilter.SMOOTH) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) diff --git a/venv/Lib/site-packages/PIL/ImageFile.py b/venv/Lib/site-packages/PIL/ImageFile.py deleted file mode 100644 index 34f344f..0000000 --- a/venv/Lib/site-packages/PIL/ImageFile.py +++ /dev/null @@ -1,748 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# base class for image file handlers -# -# history: -# 1995-09-09 fl Created -# 1996-03-11 fl Fixed load mechanism. -# 1996-04-15 fl Added pcx/xbm decoders. -# 1996-04-30 fl Added encoders. -# 1996-12-14 fl Added load helpers -# 1997-01-11 fl Use encode_to_file where possible -# 1997-08-27 fl Flush output in _save -# 1998-03-05 fl Use memory mapping for some modes -# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" -# 1999-05-31 fl Added image parser -# 2000-10-12 fl Set readonly flag on memory-mapped images -# 2002-03-20 fl Use better messages for common decoder errors -# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available -# 2003-10-30 fl Added StubImageFile class -# 2004-02-25 fl Made incremental parser more robust -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import io -import itertools -import struct -import sys - -from . import Image -from ._util import isPath - -MAXBLOCK = 65536 - -SAFEBLOCK = 1024 * 1024 - -LOAD_TRUNCATED_IMAGES = False -"""Whether or not to load truncated image files. User code may change this.""" - -ERRORS = { - -1: "image buffer overrun error", - -2: "decoding error", - -3: "unknown error", - -8: "bad configuration", - -9: "out of memory error", -} -""" -Dict of known error codes returned from :meth:`.PyDecoder.decode`, -:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and -:meth:`.PyEncoder.encode_to_file`. -""" - - -# -# -------------------------------------------------------------------- -# Helpers - - -def raise_oserror(error): - try: - message = Image.core.getcodecstatus(error) - except AttributeError: - message = ERRORS.get(error) - if not message: - message = f"decoder error {error}" - raise OSError(message + " when reading image file") - - -def _tilesort(t): - # sort on offset - return t[2] - - -# -# -------------------------------------------------------------------- -# ImageFile base class - - -class ImageFile(Image.Image): - """Base class for image file format handlers.""" - - def __init__(self, fp=None, filename=None): - super().__init__() - - self._min_frame = 0 - - self.custom_mimetype = None - - self.tile = None - """ A list of tile descriptors, or ``None`` """ - - self.readonly = 1 # until we know better - - self.decoderconfig = () - self.decodermaxblock = MAXBLOCK - - if isPath(fp): - # filename - self.fp = open(fp, "rb") - self.filename = fp - self._exclusive_fp = True - else: - # stream - self.fp = fp - self.filename = filename - # can be overridden - self._exclusive_fp = None - - try: - try: - self._open() - except ( - IndexError, # end of data - TypeError, # end of data (ord) - KeyError, # unsupported mode - EOFError, # got header but not the first frame - struct.error, - ) as v: - raise SyntaxError(v) from v - - if not self.mode or self.size[0] <= 0: - raise SyntaxError("not identified by this driver") - except BaseException: - # close the file only if we have opened it this constructor - if self._exclusive_fp: - self.fp.close() - raise - - def get_format_mimetype(self): - if self.custom_mimetype: - return self.custom_mimetype - if self.format is not None: - return Image.MIME.get(self.format.upper()) - - def verify(self): - """Check file integrity""" - - # raise exception if something's wrong. must be called - # directly after open, and closes file when finished. - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def load(self): - """Load image data based on tile list""" - - if self.tile is None: - raise OSError("cannot load this image") - - pixel = Image.Image.load(self) - if not self.tile: - return pixel - - self.map = None - use_mmap = self.filename and len(self.tile) == 1 - # As of pypy 2.1.0, memory mapping was failing here. - use_mmap = use_mmap and not hasattr(sys, "pypy_version_info") - - readonly = 0 - - # look for read/seek overrides - try: - read = self.load_read - # don't use mmap if there are custom read/seek functions - use_mmap = False - except AttributeError: - read = self.fp.read - - try: - seek = self.load_seek - use_mmap = False - except AttributeError: - seek = self.fp.seek - - if use_mmap: - # try memory mapping - decoder_name, extents, offset, args = self.tile[0] - if ( - decoder_name == "raw" - and len(args) >= 3 - and args[0] == self.mode - and args[0] in Image._MAPMODES - ): - try: - # use mmap, if possible - import mmap - - with open(self.filename) as fp: - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, offset, args - ) - readonly = 1 - # After trashing self.im, - # we might need to reload the palette data. - if self.palette: - self.palette.dirty = 1 - except (AttributeError, OSError, ImportError): - self.map = None - - self.load_prepare() - err_code = -3 # initialize to unknown error - if not self.map: - # sort tiles in file order - self.tile.sort(key=_tilesort) - - try: - # FIXME: This is a hack to handle TIFF's JpegTables tag. - prefix = self.tile_prefix - except AttributeError: - prefix = b"" - - # Remove consecutive duplicates that only differ by their offset - self.tile = [ - list(tiles)[-1] - for _, tiles in itertools.groupby( - self.tile, lambda tile: (tile[0], tile[1], tile[3]) - ) - ] - for decoder_name, extents, offset, args in self.tile: - seek(offset) - decoder = Image._getdecoder( - self.mode, decoder_name, args, self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - if decoder.pulls_fd: - decoder.setfd(self.fp) - err_code = decoder.decode(b"")[1] - else: - b = prefix - while True: - try: - s = read(self.decodermaxblock) - except (IndexError, struct.error) as e: - # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - raise OSError("image file is truncated") from e - - if not s: # truncated jpeg - if LOAD_TRUNCATED_IMAGES: - break - else: - raise OSError( - "image file is truncated " - f"({len(b)} bytes not processed)" - ) - - b = b + s - n, err_code = decoder.decode(b) - if n < 0: - break - b = b[n:] - finally: - # Need to cleanup here to prevent leaks - decoder.cleanup() - - self.tile = [] - self.readonly = readonly - - self.load_end() - - if self._exclusive_fp and self._close_exclusive_fp_after_loading: - self.fp.close() - self.fp = None - - if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: - # still raised if decoder fails to return anything - raise_oserror(err_code) - - return Image.Image.load(self) - - def load_prepare(self): - # create image memory if necessary - if not self.im or self.im.mode != self.mode or self.im.size != self.size: - self.im = Image.core.new(self.mode, self.size) - # create palette (optional) - if self.mode == "P": - Image.Image.load(self) - - def load_end(self): - # may be overridden - pass - - # may be defined for contained formats - # def load_seek(self, pos): - # pass - - # may be defined for blocked formats (e.g. PNG) - # def load_read(self, bytes): - # pass - - def _seek_check(self, frame): - if ( - frame < self._min_frame - # Only check upper limit on frames if additional seek operations - # are not required to do so - or ( - not (hasattr(self, "_n_frames") and self._n_frames is None) - and frame >= self.n_frames + self._min_frame - ) - ): - raise EOFError("attempt to seek outside sequence") - - return self.tell() != frame - - -class StubImageFile(ImageFile): - """ - Base class for stub image loaders. - - A stub loader is an image loader that can identify files of a - certain format, but relies on external code to load the file. - """ - - def _open(self): - raise NotImplementedError("StubImageFile subclass must implement _open") - - def load(self): - loader = self._load() - if loader is None: - raise OSError(f"cannot find loader for this {self.format} file") - image = loader.load(self) - assert image is not None - # become the other object (!) - self.__class__ = image.__class__ - self.__dict__ = image.__dict__ - return image.load() - - def _load(self): - """(Hook) Find actual image loader.""" - raise NotImplementedError("StubImageFile subclass must implement _load") - - -class Parser: - """ - Incremental image parser. This class implements the standard - feed/close consumer interface. - """ - - incremental = None - image = None - data = None - decoder = None - offset = 0 - finished = 0 - - def reset(self): - """ - (Consumer) Reset the parser. Note that you can only call this - method immediately after you've created a parser; parser - instances cannot be reused. - """ - assert self.data is None, "cannot reuse parsers" - - def feed(self, data): - """ - (Consumer) Feed data to the parser. - - :param data: A string buffer. - :exception OSError: If the parser failed to parse the image file. - """ - # collect data - - if self.finished: - return - - if self.data is None: - self.data = data - else: - self.data = self.data + data - - # parse what we have - if self.decoder: - - if self.offset > 0: - # skip header - skip = min(len(self.data), self.offset) - self.data = self.data[skip:] - self.offset = self.offset - skip - if self.offset > 0 or not self.data: - return - - n, e = self.decoder.decode(self.data) - - if n < 0: - # end of stream - self.data = None - self.finished = 1 - if e < 0: - # decoding error - self.image = None - raise_oserror(e) - else: - # end of image - return - self.data = self.data[n:] - - elif self.image: - - # if we end up here with no decoder, this file cannot - # be incrementally parsed. wait until we've gotten all - # available data - pass - - else: - - # attempt to open this file - try: - with io.BytesIO(self.data) as fp: - im = Image.open(fp) - except OSError: - # traceback.print_exc() - pass # not enough data - else: - flag = hasattr(im, "load_seek") or hasattr(im, "load_read") - if flag or len(im.tile) != 1: - # custom load code, or multiple tiles - self.decode = None - else: - # initialize decoder - im.load_prepare() - d, e, o, a = im.tile[0] - im.tile = [] - self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) - self.decoder.setimage(im.im, e) - - # calculate decoder offset - self.offset = o - if self.offset <= len(self.data): - self.data = self.data[self.offset :] - self.offset = 0 - - self.image = im - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - """ - (Consumer) Close the stream. - - :returns: An image object. - :exception OSError: If the parser failed to parse the image file either - because it cannot be identified or cannot be - decoded. - """ - # finish decoding - if self.decoder: - # get rid of what's left in the buffers - self.feed(b"") - self.data = self.decoder = None - if not self.finished: - raise OSError("image was incomplete") - if not self.image: - raise OSError("cannot parse this image") - if self.data: - # incremental parsing not possible; reopen the file - # not that we have all data - with io.BytesIO(self.data) as fp: - try: - self.image = Image.open(fp) - finally: - self.image.load() - return self.image - - -# -------------------------------------------------------------------- - - -def _save(im, fp, tile, bufsize=0): - """Helper to save image based on tile list - - :param im: Image object. - :param fp: File object. - :param tile: Tile list. - :param bufsize: Optional buffer size - """ - - im.load() - if not hasattr(im, "encoderconfig"): - im.encoderconfig = () - tile.sort(key=_tilesort) - # FIXME: make MAXBLOCK a configuration parameter - # It would be great if we could have the encoder specify what it needs - # But, it would need at least the image size in most cases. RawEncode is - # a tricky case. - bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - try: - fh = fp.fileno() - fp.flush() - exc = None - except (AttributeError, io.UnsupportedOperation) as e: - exc = e - for e, b, o, a in tile: - if o > 0: - fp.seek(o) - encoder = Image._getencoder(im.mode, e, a, im.encoderconfig) - try: - encoder.setimage(im.im, b) - if encoder.pushes_fd: - encoder.setfd(fp) - l, s = encoder.encode_to_pyfd() - else: - if exc: - # compress to Python file-compatible object - while True: - l, s, d = encoder.encode(bufsize) - fp.write(d) - if s: - break - else: - # slight speedup: compress to real file object - s = encoder.encode_to_file(fh, bufsize) - if s < 0: - raise OSError(f"encoder error {s} when writing image file") from exc - finally: - encoder.cleanup() - if hasattr(fp, "flush"): - fp.flush() - - -def _safe_read(fp, size): - """ - Reads large blocks in a safe way. Unlike fp.read(n), this function - doesn't trust the user. If the requested size is larger than - SAFEBLOCK, the file is read block by block. - - :param fp: File handle. Must implement a read method. - :param size: Number of bytes to read. - :returns: A string containing size bytes of data. - - Raises an OSError if the file is truncated and the read cannot be completed - - """ - if size <= 0: - return b"" - if size <= SAFEBLOCK: - data = fp.read(size) - if len(data) < size: - raise OSError("Truncated File Read") - return data - data = [] - remaining_size = size - while remaining_size > 0: - block = fp.read(min(remaining_size, SAFEBLOCK)) - if not block: - break - data.append(block) - remaining_size -= len(block) - if sum(len(d) for d in data) < size: - raise OSError("Truncated File Read") - return b"".join(data) - - -class PyCodecState: - def __init__(self): - self.xsize = 0 - self.ysize = 0 - self.xoff = 0 - self.yoff = 0 - - def extents(self): - return (self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize) - - -class PyCodec: - def __init__(self, mode, *args): - self.im = None - self.state = PyCodecState() - self.fd = None - self.mode = mode - self.init(args) - - def init(self, args): - """ - Override to perform codec specific initialization - - :param args: Array of args items from the tile entry - :returns: None - """ - self.args = args - - def cleanup(self): - """ - Override to perform codec specific cleanup - - :returns: None - """ - pass - - def setfd(self, fd): - """ - Called from ImageFile to set the Python file-like object - - :param fd: A Python file-like object - :returns: None - """ - self.fd = fd - - def setimage(self, im, extents=None): - """ - Called from ImageFile to set the core output image for the codec - - :param im: A core image object - :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle - for this tile - :returns: None - """ - - # following c code - self.im = im - - if extents: - (x0, y0, x1, y1) = extents - else: - (x0, y0, x1, y1) = (0, 0, 0, 0) - - if x0 == 0 and x1 == 0: - self.state.xsize, self.state.ysize = self.im.size - else: - self.state.xoff = x0 - self.state.yoff = y0 - self.state.xsize = x1 - x0 - self.state.ysize = y1 - y0 - - if self.state.xsize <= 0 or self.state.ysize <= 0: - raise ValueError("Size cannot be negative") - - if ( - self.state.xsize + self.state.xoff > self.im.size[0] - or self.state.ysize + self.state.yoff > self.im.size[1] - ): - raise ValueError("Tile cannot extend outside image") - - -class PyDecoder(PyCodec): - """ - Python implementation of a format decoder. Override this class and - add the decoding logic in the :meth:`decode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pulls_fd = False - - @property - def pulls_fd(self): - return self._pulls_fd - - def decode(self, buffer): - """ - Override to perform the decoding process. - - :param buffer: A bytes object with the data to be decoded. - :returns: A tuple of ``(bytes consumed, errcode)``. - If finished with decoding return -1 for the bytes consumed. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - raise NotImplementedError() - - def set_as_raw(self, data, rawmode=None): - """ - Convenience method to set the internal image from a stream of raw data - - :param data: Bytes to be set - :param rawmode: The rawmode to be used for the decoder. - If not specified, it will default to the mode of the image - :returns: None - """ - - if not rawmode: - rawmode = self.mode - d = Image._getdecoder(self.mode, "raw", (rawmode)) - d.setimage(self.im, self.state.extents()) - s = d.decode(data) - - if s[0] >= 0: - raise ValueError("not enough image data") - if s[1] != 0: - raise ValueError("cannot decode image data") - - -class PyEncoder(PyCodec): - """ - Python implementation of a format encoder. Override this class and - add the decoding logic in the :meth:`encode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pushes_fd = False - - @property - def pushes_fd(self): - return self._pushes_fd - - def encode(self, bufsize): - """ - Override to perform the encoding process. - - :param bufsize: Buffer size. - :returns: A tuple of ``(bytes encoded, errcode, bytes)``. - If finished with encoding return 1 for the error code. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - raise NotImplementedError() - - def encode_to_pyfd(self): - """ - If ``pushes_fd`` is ``True``, then this method will be used, - and ``encode()`` will only be called once. - - :returns: A tuple of ``(bytes consumed, errcode)``. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - if not self.pushes_fd: - return 0, -8 # bad configuration - bytes_consumed, errcode, data = self.encode(0) - if data: - self.fd.write(data) - return bytes_consumed, errcode - - def encode_to_file(self, fh, bufsize): - """ - :param fh: File handle. - :param bufsize: Buffer size. - - :returns: If finished successfully, return 0. - Otherwise, return an error code. Err codes are from - :data:`.ImageFile.ERRORS`. - """ - errcode = 0 - while errcode == 0: - status, errcode, buf = self.encode(bufsize) - if status > 0: - fh.write(buf[status:]) - return errcode diff --git a/venv/Lib/site-packages/PIL/ImageFilter.py b/venv/Lib/site-packages/PIL/ImageFilter.py deleted file mode 100644 index 1320af8..0000000 --- a/venv/Lib/site-packages/PIL/ImageFilter.py +++ /dev/null @@ -1,538 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard filters -# -# History: -# 1995-11-27 fl Created -# 2002-06-08 fl Added rank and mode filters -# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2002 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -import functools - - -class Filter: - pass - - -class MultibandFilter(Filter): - pass - - -class BuiltinFilter(MultibandFilter): - def filter(self, image): - if image.mode == "P": - raise ValueError("cannot filter palette images") - return image.filter(*self.filterargs) - - -class Kernel(BuiltinFilter): - """ - Create a convolution kernel. The current version only - supports 3x3 and 5x5 integer and floating point kernels. - - In the current version, kernels can only be applied to - "L" and "RGB" images. - - :param size: Kernel size, given as (width, height). In the current - version, this must be (3,3) or (5,5). - :param kernel: A sequence containing kernel weights. - :param scale: Scale factor. If given, the result for each pixel is - divided by this value. The default is the sum of the - kernel weights. - :param offset: Offset. If given, this value is added to the result, - after it has been divided by the scale factor. - """ - - name = "Kernel" - - def __init__(self, size, kernel, scale=None, offset=0): - if scale is None: - # default scale is sum of kernel - scale = functools.reduce(lambda a, b: a + b, kernel) - if size[0] * size[1] != len(kernel): - raise ValueError("not enough coefficients in kernel") - self.filterargs = size, scale, offset, kernel - - -class RankFilter(Filter): - """ - Create a rank filter. The rank filter sorts all pixels in - a window of the given size, and returns the ``rank``'th value. - - :param size: The kernel size, in pixels. - :param rank: What pixel value to pick. Use 0 for a min filter, - ``size * size / 2`` for a median filter, ``size * size - 1`` - for a max filter, etc. - """ - - name = "Rank" - - def __init__(self, size, rank): - self.size = size - self.rank = rank - - def filter(self, image): - if image.mode == "P": - raise ValueError("cannot filter palette images") - image = image.expand(self.size // 2, self.size // 2) - return image.rankfilter(self.size, self.rank) - - -class MedianFilter(RankFilter): - """ - Create a median filter. Picks the median pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Median" - - def __init__(self, size=3): - self.size = size - self.rank = size * size // 2 - - -class MinFilter(RankFilter): - """ - Create a min filter. Picks the lowest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Min" - - def __init__(self, size=3): - self.size = size - self.rank = 0 - - -class MaxFilter(RankFilter): - """ - Create a max filter. Picks the largest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Max" - - def __init__(self, size=3): - self.size = size - self.rank = size * size - 1 - - -class ModeFilter(Filter): - """ - Create a mode filter. Picks the most frequent pixel value in a box with the - given size. Pixel values that occur only once or twice are ignored; if no - pixel value occurs more than twice, the original pixel value is preserved. - - :param size: The kernel size, in pixels. - """ - - name = "Mode" - - def __init__(self, size=3): - self.size = size - - def filter(self, image): - return image.modefilter(self.size) - - -class GaussianBlur(MultibandFilter): - """Blurs the image with a sequence of extended box filters, which - approximates a Gaussian kernel. For details on accuracy see - - - :param radius: Standard deviation of the Gaussian kernel. - """ - - name = "GaussianBlur" - - def __init__(self, radius=2): - self.radius = radius - - def filter(self, image): - return image.gaussian_blur(self.radius) - - -class BoxBlur(MultibandFilter): - """Blurs the image by setting each pixel to the average value of the pixels - in a square box extending radius pixels in each direction. - Supports float radius of arbitrary size. Uses an optimized implementation - which runs in linear time relative to the size of the image - for any radius value. - - :param radius: Size of the box in one direction. Radius 0 does not blur, - returns an identical image. Radius 1 takes 1 pixel - in each direction, i.e. 9 pixels in total. - """ - - name = "BoxBlur" - - def __init__(self, radius): - self.radius = radius - - def filter(self, image): - return image.box_blur(self.radius) - - -class UnsharpMask(MultibandFilter): - """Unsharp mask filter. - - See Wikipedia's entry on `digital unsharp masking`_ for an explanation of - the parameters. - - :param radius: Blur Radius - :param percent: Unsharp strength, in percent - :param threshold: Threshold controls the minimum brightness change that - will be sharpened - - .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking - - """ # noqa: E501 - - name = "UnsharpMask" - - def __init__(self, radius=2, percent=150, threshold=3): - self.radius = radius - self.percent = percent - self.threshold = threshold - - def filter(self, image): - return image.unsharp_mask(self.radius, self.percent, self.threshold) - - -class BLUR(BuiltinFilter): - name = "Blur" - # fmt: off - filterargs = (5, 5), 16, 0, ( - 1, 1, 1, 1, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class CONTOUR(BuiltinFilter): - name = "Contour" - # fmt: off - filterargs = (3, 3), 1, 255, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class DETAIL(BuiltinFilter): - name = "Detail" - # fmt: off - filterargs = (3, 3), 6, 0, ( - 0, -1, 0, - -1, 10, -1, - 0, -1, 0, - ) - # fmt: on - - -class EDGE_ENHANCE(BuiltinFilter): - name = "Edge-enhance" - # fmt: off - filterargs = (3, 3), 2, 0, ( - -1, -1, -1, - -1, 10, -1, - -1, -1, -1, - ) - # fmt: on - - -class EDGE_ENHANCE_MORE(BuiltinFilter): - name = "Edge-enhance More" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 9, -1, - -1, -1, -1, - ) - # fmt: on - - -class EMBOSS(BuiltinFilter): - name = "Emboss" - # fmt: off - filterargs = (3, 3), 1, 128, ( - -1, 0, 0, - 0, 1, 0, - 0, 0, 0, - ) - # fmt: on - - -class FIND_EDGES(BuiltinFilter): - name = "Find Edges" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - # fmt: off - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2, - ) - # fmt: on - - -class SMOOTH(BuiltinFilter): - name = "Smooth" - # fmt: off - filterargs = (3, 3), 13, 0, ( - 1, 1, 1, - 1, 5, 1, - 1, 1, 1, - ) - # fmt: on - - -class SMOOTH_MORE(BuiltinFilter): - name = "Smooth More" - # fmt: off - filterargs = (5, 5), 100, 0, ( - 1, 1, 1, 1, 1, - 1, 5, 5, 5, 1, - 1, 5, 44, 5, 1, - 1, 5, 5, 5, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class Color3DLUT(MultibandFilter): - """Three-dimensional color lookup table. - - Transforms 3-channel pixels using the values of the channels as coordinates - in the 3D lookup table and interpolating the nearest elements. - - This method allows you to apply almost any color transformation - in constant time by using pre-calculated decimated tables. - - .. versionadded:: 5.2.0 - - :param size: Size of the table. One int or tuple of (int, int, int). - Minimal size in any dimension is 2, maximum is 65. - :param table: Flat lookup table. A list of ``channels * size**3`` - float elements or a list of ``size**3`` channels-sized - tuples with floats. Channels are changed first, - then first dimension, then second, then third. - Value 0.0 corresponds lowest value of output, 1.0 highest. - :param channels: Number of channels in the table. Could be 3 or 4. - Default is 3. - :param target_mode: A mode for the result image. Should have not less - than ``channels`` channels. Default is ``None``, - which means that mode wouldn't be changed. - """ - - name = "Color 3D LUT" - - def __init__(self, size, table, channels=3, target_mode=None, **kwargs): - if channels not in (3, 4): - raise ValueError("Only 3 or 4 output channels are supported") - self.size = size = self._check_size(size) - self.channels = channels - self.mode = target_mode - - # Hidden flag `_copy_table=False` could be used to avoid extra copying - # of the table if the table is specially made for the constructor. - copy_table = kwargs.get("_copy_table", True) - items = size[0] * size[1] * size[2] - wrong_size = False - - numpy = None - if hasattr(table, "shape"): - try: - import numpy - except ImportError: # pragma: no cover - pass - - if numpy and isinstance(table, numpy.ndarray): - if copy_table: - table = table.copy() - - if table.shape in [ - (items * channels,), - (items, channels), - (size[2], size[1], size[0], channels), - ]: - table = table.reshape(items * channels) - else: - wrong_size = True - - else: - if copy_table: - table = list(table) - - # Convert to a flat list - if table and isinstance(table[0], (list, tuple)): - table, raw_table = [], table - for pixel in raw_table: - if len(pixel) != channels: - raise ValueError( - "The elements of the table should " - "have a length of {}.".format(channels) - ) - table.extend(pixel) - - if wrong_size or len(table) != items * channels: - raise ValueError( - "The table should have either channels * size**3 float items " - "or size**3 items of channels-sized tuples with floats. " - f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " - f"Actual length: {len(table)}" - ) - self.table = table - - @staticmethod - def _check_size(size): - try: - _, _, _ = size - except ValueError as e: - raise ValueError( - "Size should be either an integer or a tuple of three integers." - ) from e - except TypeError: - size = (size, size, size) - size = [int(x) for x in size] - for size1D in size: - if not 2 <= size1D <= 65: - raise ValueError("Size should be in [2, 65] range.") - return size - - @classmethod - def generate(cls, size, callback, channels=3, target_mode=None): - """Generates new LUT using provided callback. - - :param size: Size of the table. Passed to the constructor. - :param callback: Function with three parameters which correspond - three color channels. Will be called ``size**3`` - times with values from 0.0 to 1.0 and should return - a tuple with ``channels`` elements. - :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - size1D, size2D, size3D = cls._check_size(size) - if channels not in (3, 4): - raise ValueError("Only 3 or 4 output channels are supported") - - table = [0] * (size1D * size2D * size3D * channels) - idx_out = 0 - for b in range(size3D): - for g in range(size2D): - for r in range(size1D): - table[idx_out : idx_out + channels] = callback( - r / (size1D - 1), g / (size2D - 1), b / (size3D - 1) - ) - idx_out += channels - - return cls( - (size1D, size2D, size3D), - table, - channels=channels, - target_mode=target_mode, - _copy_table=False, - ) - - def transform(self, callback, with_normals=False, channels=None, target_mode=None): - """Transforms the table values using provided callback and returns - a new LUT with altered values. - - :param callback: A function which takes old lookup table values - and returns a new set of values. The number - of arguments which function should take is - ``self.channels`` or ``3 + self.channels`` - if ``with_normals`` flag is set. - Should return a tuple of ``self.channels`` or - ``channels`` elements if it is set. - :param with_normals: If true, ``callback`` will be called with - coordinates in the color cube as the first - three arguments. Otherwise, ``callback`` - will be called only with actual color values. - :param channels: The number of channels in the resulting lookup table. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - if channels not in (None, 3, 4): - raise ValueError("Only 3 or 4 output channels are supported") - ch_in = self.channels - ch_out = channels or ch_in - size1D, size2D, size3D = self.size - - table = [0] * (size1D * size2D * size3D * ch_out) - idx_in = 0 - idx_out = 0 - for b in range(size3D): - for g in range(size2D): - for r in range(size1D): - values = self.table[idx_in : idx_in + ch_in] - if with_normals: - values = callback( - r / (size1D - 1), - g / (size2D - 1), - b / (size3D - 1), - *values, - ) - else: - values = callback(*values) - table[idx_out : idx_out + ch_out] = values - idx_in += ch_in - idx_out += ch_out - - return type(self)( - self.size, - table, - channels=ch_out, - target_mode=target_mode or self.mode, - _copy_table=False, - ) - - def __repr__(self): - r = [ - f"{self.__class__.__name__} from {self.table.__class__.__name__}", - "size={:d}x{:d}x{:d}".format(*self.size), - f"channels={self.channels:d}", - ] - if self.mode: - r.append(f"target_mode={self.mode}") - return "<{}>".format(" ".join(r)) - - def filter(self, image): - from . import Image - - return image.color_lut_3d( - self.mode or image.mode, - Image.Resampling.BILINEAR, - self.channels, - self.size[0], - self.size[1], - self.size[2], - self.table, - ) diff --git a/venv/Lib/site-packages/PIL/ImageFont.py b/venv/Lib/site-packages/PIL/ImageFont.py deleted file mode 100644 index f21b6de..0000000 --- a/venv/Lib/site-packages/PIL/ImageFont.py +++ /dev/null @@ -1,1083 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIL raster font management -# -# History: -# 1996-08-07 fl created (experimental) -# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 -# 1999-02-06 fl rewrote most font management stuff in C -# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) -# 2001-02-17 fl added freetype support -# 2001-05-09 fl added TransposedFont wrapper class -# 2002-03-04 fl make sure we have a "L" or "1" font -# 2002-12-04 fl skip non-directory entries in the system path -# 2003-04-29 fl add embedded default font -# 2003-09-27 fl added support for truetype charmap encodings -# -# Todo: -# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import base64 -import os -import sys -import warnings -from enum import IntEnum -from io import BytesIO - -from . import Image -from ._util import isDirectory, isPath - - -class Layout(IntEnum): - BASIC = 0 - RAQM = 1 - - -def __getattr__(name): - deprecated = "deprecated and will be removed in Pillow 10 (2023-07-01). " - for enum, prefix in {Layout: "LAYOUT_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - warnings.warn( - prefix - + name - + " is " - + deprecated - + "Use " - + enum.__name__ - + "." - + name - + " instead.", - DeprecationWarning, - stacklevel=2, - ) - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -class _imagingft_not_installed: - # module placeholder - def __getattr__(self, id): - raise ImportError("The _imagingft C module is not installed") - - -try: - from . import _imagingft as core -except ImportError: - core = _imagingft_not_installed() - - -# FIXME: add support for pilfont2 format (see FontFile.py) - -# -------------------------------------------------------------------- -# Font metrics format: -# "PILfont" LF -# fontdescriptor LF -# (optional) key=value... LF -# "DATA" LF -# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) -# -# To place a character, cut out srcbox and paste at dstbox, -# relative to the character position. Then move the character -# position according to dx, dy. -# -------------------------------------------------------------------- - - -class ImageFont: - "PIL font wrapper" - - def _load_pilfont(self, filename): - - with open(filename, "rb") as fp: - image = None - for ext in (".png", ".gif", ".pbm"): - if image: - image.close() - try: - fullname = os.path.splitext(filename)[0] + ext - image = Image.open(fullname) - except Exception: - pass - else: - if image and image.mode in ("1", "L"): - break - else: - if image: - image.close() - raise OSError("cannot find glyph data file") - - self.file = fullname - - self._load_pilfont_data(fp, image) - image.close() - - def _load_pilfont_data(self, file, image): - - # read PILfont header - if file.readline() != b"PILfont\n": - raise SyntaxError("Not a PILfont file") - file.readline().split(b";") - self.info = [] # FIXME: should be a dictionary - while True: - s = file.readline() - if not s or s == b"DATA\n": - break - self.info.append(s) - - # read PILfont metrics - data = file.read(256 * 20) - - # check image - if image.mode not in ("1", "L"): - raise TypeError("invalid font image mode") - - image.load() - - self.font = Image.core.font(image.im, data) - - def getsize(self, text, *args, **kwargs): - """ - Returns width and height (in pixels) of given text. - - :param text: Text to measure. - - :return: (width, height) - """ - return self.font.getsize(text) - - def getmask(self, text, mode="", *args, **kwargs): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.font.getmask(text, mode) - - -## -# Wrapper for FreeType fonts. Application code should use the -# truetype factory function to create font objects. - - -class FreeTypeFont: - "FreeType font wrapper (requires _imagingft service)" - - def __init__(self, font=None, size=10, index=0, encoding="", layout_engine=None): - # FIXME: use service provider instead - - self.path = font - self.size = size - self.index = index - self.encoding = encoding - - if layout_engine not in (Layout.BASIC, Layout.RAQM): - layout_engine = Layout.BASIC - if core.HAVE_RAQM: - layout_engine = Layout.RAQM - elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: - import warnings - - warnings.warn( - "Raqm layout was requested, but Raqm is not available. " - "Falling back to basic layout." - ) - layout_engine = Layout.BASIC - - self.layout_engine = layout_engine - - def load_from_bytes(f): - self.font_bytes = f.read() - self.font = core.getfont( - "", size, index, encoding, self.font_bytes, layout_engine - ) - - if isPath(font): - if sys.platform == "win32": - font_bytes_path = font if isinstance(font, bytes) else font.encode() - try: - font_bytes_path.decode("ascii") - except UnicodeDecodeError: - # FreeType cannot load fonts with non-ASCII characters on Windows - # So load it into memory first - with open(font, "rb") as f: - load_from_bytes(f) - return - self.font = core.getfont( - font, size, index, encoding, layout_engine=layout_engine - ) - else: - load_from_bytes(font) - - def __getstate__(self): - return [self.path, self.size, self.index, self.encoding, self.layout_engine] - - def __setstate__(self, state): - path, size, index, encoding, layout_engine = state - self.__init__(path, size, index, encoding, layout_engine) - - def _multiline_split(self, text): - split_character = "\n" if isinstance(text, str) else b"\n" - return text.split(split_character) - - def getname(self): - """ - :return: A tuple of the font family (e.g. Helvetica) and the font style - (e.g. Bold) - """ - return self.font.family, self.font.style - - def getmetrics(self): - """ - :return: A tuple of the font ascent (the distance from the baseline to - the highest outline point) and descent (the distance from the - baseline to the lowest outline point, a negative value) - """ - return self.font.ascent, self.font.descent - - def getlength(self, text, mode="", direction=None, features=None, language=None): - """ - Returns length (in pixels with 1/64 precision) of given text when rendered - in font with provided direction, features, and language. - - This is the amount by which following text should be offset. - Text bounding box may extend past the length in some fonts, - e.g. when using italics or accents. - - The result is returned as a float; it is a whole number if using basic layout. - - Note that the sum of two lengths may not equal the length of a concatenated - string due to kerning. If you need to adjust for kerning, include the following - character and subtract its length. - - For example, instead of - - .. code-block:: python - - hello = font.getlength("Hello") - world = font.getlength("World") - hello_world = hello + world # not adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # may fail - - use - - .. code-block:: python - - hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning - world = font.getlength("World") - hello_world = hello + world # adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # True - - or disable kerning with (requires libraqm) - - .. code-block:: python - - hello = draw.textlength("Hello", font, features=["-kern"]) - world = draw.textlength("World", font, features=["-kern"]) - hello_world = hello + world # kerning is disabled, no need to adjust - assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) - - .. versionadded:: 8.0.0 - - :param text: Text to measure. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :return: Width for horizontal, height for vertical text. - """ - return self.font.getlength(text, mode, direction, features, language) / 64 - - def getbbox( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ): - """ - Returns bounding box (in pixels) of given text relative to given anchor - when rendered in font with provided direction, features, and language. - - Use :py:meth:`getlength()` to get the offset of following text with - 1/64 pixel precision. The bounding box includes extra margins for - some fonts, e.g. italics or accents. - - .. versionadded:: 8.0.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :param stroke_width: The width of the text stroke. - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left. - See :ref:`text-anchors` for valid values. - - :return: ``(left, top, right, bottom)`` bounding box - """ - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - left, top = offset[0] - stroke_width, offset[1] - stroke_width - width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width - return left, top, left + width, top + height - - def getsize( - self, text, direction=None, features=None, language=None, stroke_width=0 - ): - """ - Returns width and height (in pixels) of given text if rendered in font with - provided direction, features, and language. - - Use :py:meth:`getlength()` to measure the offset of following text with - 1/64 pixel precision. - Use :py:meth:`getbbox()` to get the exact bounding box based on an anchor. - - .. note:: For historical reasons this function measures text height from - the ascender line instead of the top, see :ref:`text-anchors`. - If you wish to measure text height from the top, it is recommended - to use the bottom value of :meth:`getbbox` with ``anchor='lt'`` instead. - - :param text: Text to measure. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :return: (width, height) - """ - # vertical offset is added for historical reasons - # see https://github.com/python-pillow/Pillow/pull/4910#discussion_r486682929 - size, offset = self.font.getsize(text, "L", direction, features, language) - return ( - size[0] + stroke_width * 2, - size[1] + stroke_width * 2 + offset[1], - ) - - def getsize_multiline( - self, - text, - direction=None, - spacing=4, - features=None, - language=None, - stroke_width=0, - ): - """ - Returns width and height (in pixels) of given text if rendered in font - with provided direction, features, and language, while respecting - newline characters. - - :param text: Text to measure. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param spacing: The vertical gap between lines, defaulting to 4 pixels. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :return: (width, height) - """ - max_width = 0 - lines = self._multiline_split(text) - line_spacing = self.getsize("A", stroke_width=stroke_width)[1] + spacing - for line in lines: - line_width, line_height = self.getsize( - line, direction, features, language, stroke_width - ) - max_width = max(max_width, line_width) - - return max_width, len(lines) * line_spacing - spacing - - def getoffset(self, text): - """ - Returns the offset of given text. This is the gap between the - starting coordinate and the first marking. Note that this gap is - included in the result of :py:func:`~PIL.ImageFont.FreeTypeFont.getsize`. - - :param text: Text to measure. - - :return: A tuple of the x and y offset - """ - return self.font.getsize(text)[1] - - def getmask( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left. - See :ref:`text-anchors` for valid values. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - )[0] - - def getmask2( - self, - text, - mode="", - fill=Image.core.fill, - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - *args, - **kwargs, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left. - See :ref:`text-anchors` for valid values. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :return: A tuple of an internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module, and the text offset, the - gap between the starting coordinate and the first marking - """ - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - size = size[0] + stroke_width * 2, size[1] + stroke_width * 2 - offset = offset[0] - stroke_width, offset[1] - stroke_width - Image._decompression_bomb_check(size) - im = fill("RGBA" if mode == "RGBA" else "L", size, 0) - self.font.render( - text, im.id, mode, direction, features, language, stroke_width, ink - ) - return im, offset - - def font_variant( - self, font=None, size=None, index=None, encoding=None, layout_engine=None - ): - """ - Create a copy of this FreeTypeFont object, - using any specified arguments to override the settings. - - Parameters are identical to the parameters used to initialize this - object. - - :return: A FreeTypeFont object. - """ - return FreeTypeFont( - font=self.path if font is None else font, - size=self.size if size is None else size, - index=self.index if index is None else index, - encoding=self.encoding if encoding is None else encoding, - layout_engine=layout_engine or self.layout_engine, - ) - - def get_variation_names(self): - """ - :returns: A list of the named styles in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - names = self.font.getvarnames() - except AttributeError as e: - raise NotImplementedError("FreeType 2.9.1 or greater is required") from e - return [name.replace(b"\x00", b"") for name in names] - - def set_variation_by_name(self, name): - """ - :param name: The name of the style. - :exception OSError: If the font is not a variation font. - """ - names = self.get_variation_names() - if not isinstance(name, bytes): - name = name.encode() - index = names.index(name) - - if index == getattr(self, "_last_variation_index", None): - # When the same name is set twice in a row, - # there is an 'unknown freetype error' - # https://savannah.nongnu.org/bugs/?56186 - return - self._last_variation_index = index - - self.font.setvarname(index) - - def get_variation_axes(self): - """ - :returns: A list of the axes in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - axes = self.font.getvaraxes() - except AttributeError as e: - raise NotImplementedError("FreeType 2.9.1 or greater is required") from e - for axis in axes: - axis["name"] = axis["name"].replace(b"\x00", b"") - return axes - - def set_variation_by_axes(self, axes): - """ - :param axes: A list of values for each axis. - :exception OSError: If the font is not a variation font. - """ - try: - self.font.setvaraxes(axes) - except AttributeError as e: - raise NotImplementedError("FreeType 2.9.1 or greater is required") from e - - -class TransposedFont: - "Wrapper for writing rotated or mirrored text" - - def __init__(self, font, orientation=None): - """ - Wrapper that creates a transposed font from any existing font - object. - - :param font: A font object. - :param orientation: An optional orientation. If given, this should - be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, - Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or - Image.Transpose.ROTATE_270. - """ - self.font = font - self.orientation = orientation # any 'transpose' argument, or None - - def getsize(self, text, *args, **kwargs): - w, h = self.font.getsize(text) - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - return h, w - return w, h - - def getmask(self, text, mode="", *args, **kwargs): - im = self.font.getmask(text, mode, *args, **kwargs) - if self.orientation is not None: - return im.transpose(self.orientation) - return im - - -def load(filename): - """ - Load a font file. This function loads a font object from the given - bitmap font file, and returns the corresponding font object. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - f = ImageFont() - f._load_pilfont(filename) - return f - - -def truetype(font=None, size=10, index=0, encoding="", layout_engine=None): - """ - Load a TrueType or OpenType font from a file or file-like object, - and create a font object. - This function loads a font object from the given file or file-like - object, and creates a font object for a font of the given size. - - Pillow uses FreeType to open font files. If you are opening many fonts - simultaneously on Windows, be aware that Windows limits the number of files - that can be open in C at once to 512. If you approach that limit, an - ``OSError`` may be thrown, reporting that FreeType "cannot open resource". - - This function requires the _imagingft service. - - :param font: A filename or file-like object containing a TrueType font. - If the file is not found in this filename, the loader may also - search in other directories, such as the :file:`fonts/` - directory on Windows or :file:`/Library/Fonts/`, - :file:`/System/Library/Fonts/` and :file:`~/Library/Fonts/` on - macOS. - - :param size: The requested size, in pixels. - :param index: Which font face to load (default is first available face). - :param encoding: Which font encoding to use (default is Unicode). Possible - encodings include (see the FreeType documentation for more - information): - - * "unic" (Unicode) - * "symb" (Microsoft Symbol) - * "ADOB" (Adobe Standard) - * "ADBE" (Adobe Expert) - * "ADBC" (Adobe Custom) - * "armn" (Apple Roman) - * "sjis" (Shift JIS) - * "gb " (PRC) - * "big5" - * "wans" (Extended Wansung) - * "joha" (Johab) - * "lat1" (Latin-1) - - This specifies the character set to use. It does not alter the - encoding of any text provided in subsequent operations. - :param layout_engine: Which layout engine to use, if available: - :data:`.ImageFont.Layout.BASIC` or :data:`.ImageFont.Layout.RAQM`. - - You can check support for Raqm layout using - :py:func:`PIL.features.check_feature` with ``feature="raqm"``. - - .. versionadded:: 4.2.0 - :return: A font object. - :exception OSError: If the file could not be read. - """ - - def freetype(font): - return FreeTypeFont(font, size, index, encoding, layout_engine) - - try: - return freetype(font) - except OSError: - if not isPath(font): - raise - ttf_filename = os.path.basename(font) - - dirs = [] - if sys.platform == "win32": - # check the windows font repository - # NOTE: must use uppercase WINDIR, to work around bugs in - # 1.5.2's os.environ.get() - windir = os.environ.get("WINDIR") - if windir: - dirs.append(os.path.join(windir, "fonts")) - elif sys.platform in ("linux", "linux2"): - lindirs = os.environ.get("XDG_DATA_DIRS", "") - if not lindirs: - # According to the freedesktop spec, XDG_DATA_DIRS should - # default to /usr/share - lindirs = "/usr/share" - dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] - elif sys.platform == "darwin": - dirs += [ - "/Library/Fonts", - "/System/Library/Fonts", - os.path.expanduser("~/Library/Fonts"), - ] - - ext = os.path.splitext(ttf_filename)[1] - first_font_with_a_different_extension = None - for directory in dirs: - for walkroot, walkdir, walkfilenames in os.walk(directory): - for walkfilename in walkfilenames: - if ext and walkfilename == ttf_filename: - return freetype(os.path.join(walkroot, walkfilename)) - elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: - fontpath = os.path.join(walkroot, walkfilename) - if os.path.splitext(fontpath)[1] == ".ttf": - return freetype(fontpath) - if not ext and first_font_with_a_different_extension is None: - first_font_with_a_different_extension = fontpath - if first_font_with_a_different_extension: - return freetype(first_font_with_a_different_extension) - raise - - -def load_path(filename): - """ - Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a - bitmap font along the Python path. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - for directory in sys.path: - if isDirectory(directory): - if not isinstance(filename, str): - filename = filename.decode("utf-8") - try: - return load(os.path.join(directory, filename)) - except OSError: - pass - raise OSError("cannot find font file") - - -def load_default(): - """Load a "better than nothing" default font. - - .. versionadded:: 1.1.4 - - :return: A font object. - """ - f = ImageFont() - f._load_pilfont_data( - # courB08 - BytesIO( - base64.b64decode( - b""" -UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA -BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL -AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA -AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB -ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A -BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB -//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA -AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH -AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA -ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv -AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ -/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 -AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA -AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG -AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA -BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA -AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA -2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF -AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// -+gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA -////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA -BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv -AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA -AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA -AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA -BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// -//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA -AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF -AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB -mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn -AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA -AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 -AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA -Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB -//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA -AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ -AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC -DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ -AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ -+wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 -AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ -///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG -AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA -BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA -Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC -eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG -AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// -+gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA -////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA -BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT -AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A -AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA -Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA -Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// -//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA -AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ -AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA -LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 -AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA -AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 -AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA -AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG -AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA -EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK -AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA -pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG -AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// -+QAGAAIAzgAKANUAEw== -""" - ) - ), - Image.open( - BytesIO( - base64.b64decode( - b""" -iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u -Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 -M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g -LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F -IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA -Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 -NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx -in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 -SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY -AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt -y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG -ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY -lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H -/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 -AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 -c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ -/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw -pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv -oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR -evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA -AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// -Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR -w7IkEbzhVQAAAABJRU5ErkJggg== -""" - ) - ) - ), - ) - return f diff --git a/venv/Lib/site-packages/PIL/ImageGrab.py b/venv/Lib/site-packages/PIL/ImageGrab.py deleted file mode 100644 index 8bd14d3..0000000 --- a/venv/Lib/site-packages/PIL/ImageGrab.py +++ /dev/null @@ -1,124 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# screen grabber -# -# History: -# 2001-04-26 fl created -# 2001-09-17 fl use builtin driver, if present -# 2002-11-19 fl added grabclipboard support -# -# Copyright (c) 2001-2002 by Secret Labs AB -# Copyright (c) 2001-2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import sys - -from . import Image - -if sys.platform == "darwin": - import os - import subprocess - import tempfile - - -def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None): - if xdisplay is None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - args = ["screencapture"] - if bbox: - left, top, right, bottom = bbox - args += ["-R", f"{left},{right},{right-left},{bottom-top}"] - subprocess.call(args + ["-x", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_resized = im.resize((right - left, bottom - top)) - im.close() - return im_resized - return im - elif sys.platform == "win32": - offset, size, data = Image.core.grabscreen_win32( - include_layered_windows, all_screens - ) - im = Image.frombytes( - "RGB", - size, - data, - # RGB, 32-bit line padding, origin lower left corner - "raw", - "BGR", - (size[0] * 3 + 3) & -4, - -1, - ) - if bbox: - x0, y0 = offset - left, top, right, bottom = bbox - im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) - return im - # use xdisplay=None for default display on non-win32/macOS systems - if not Image.core.HAVE_XCB: - raise OSError("Pillow was built without XCB support") - size, data = Image.core.grabscreen_x11(xdisplay) - im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) - if bbox: - im = im.crop(bbox) - return im - - -def grabclipboard(): - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".jpg") - os.close(fh) - commands = [ - 'set theFile to (open for access POSIX file "' - + filepath - + '" with write permission)', - "try", - " write (the clipboard as JPEG picture) to theFile", - "end try", - "close access theFile", - ] - script = ["osascript"] - for command in commands: - script += ["-e", command] - subprocess.call(script) - - im = None - if os.stat(filepath).st_size != 0: - im = Image.open(filepath) - im.load() - os.unlink(filepath) - return im - elif sys.platform == "win32": - fmt, data = Image.core.grabclipboard_win32() - if fmt == "file": # CF_HDROP - import struct - - o = struct.unpack_from("I", data)[0] - if data[16] != 0: - files = data[o:].decode("utf-16le").split("\0") - else: - files = data[o:].decode("mbcs").split("\0") - return files[: files.index("")] - if isinstance(data, bytes): - import io - - data = io.BytesIO(data) - if fmt == "png": - from . import PngImagePlugin - - return PngImagePlugin.PngImageFile(data) - elif fmt == "DIB": - from . import BmpImagePlugin - - return BmpImagePlugin.DibImageFile(data) - return None - else: - raise NotImplementedError("ImageGrab.grabclipboard() is macOS and Windows only") diff --git a/venv/Lib/site-packages/PIL/ImageMath.py b/venv/Lib/site-packages/PIL/ImageMath.py deleted file mode 100644 index 09d9898..0000000 --- a/venv/Lib/site-packages/PIL/ImageMath.py +++ /dev/null @@ -1,259 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# a simple math add-on for the Python Imaging Library -# -# History: -# 1999-02-15 fl Original PIL Plus release -# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 -# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 -# -# Copyright (c) 1999-2005 by Secret Labs AB -# Copyright (c) 2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import builtins - -from . import Image, _imagingmath - - -def _isconstant(v): - return isinstance(v, (int, float)) - - -class _Operand: - """Wraps an image operand, providing standard operators""" - - def __init__(self, im): - self.im = im - - def __fixup(self, im1): - # convert image to suitable mode - if isinstance(im1, _Operand): - # argument was an image. - if im1.im.mode in ("1", "L"): - return im1.im.convert("I") - elif im1.im.mode in ("I", "F"): - return im1.im - else: - raise ValueError(f"unsupported mode: {im1.im.mode}") - else: - # argument was a constant - if _isconstant(im1) and self.im.mode in ("1", "L", "I"): - return Image.new("I", self.im.size, im1) - else: - return Image.new("F", self.im.size, im1) - - def apply(self, op, im1, im2=None, mode=None): - im1 = self.__fixup(im1) - if im2 is None: - # unary operation - out = Image.new(mode or im1.mode, im1.size, None) - im1.load() - try: - op = getattr(_imagingmath, op + "_" + im1.mode) - except AttributeError as e: - raise TypeError(f"bad operand type for '{op}'") from e - _imagingmath.unop(op, out.im.id, im1.im.id) - else: - # binary operation - im2 = self.__fixup(im2) - if im1.mode != im2.mode: - # convert both arguments to floating point - if im1.mode != "F": - im1 = im1.convert("F") - if im2.mode != "F": - im2 = im2.convert("F") - if im1.size != im2.size: - # crop both arguments to a common size - size = (min(im1.size[0], im2.size[0]), min(im1.size[1], im2.size[1])) - if im1.size != size: - im1 = im1.crop((0, 0) + size) - if im2.size != size: - im2 = im2.crop((0, 0) + size) - out = Image.new(mode or im1.mode, im1.size, None) - im1.load() - im2.load() - try: - op = getattr(_imagingmath, op + "_" + im1.mode) - except AttributeError as e: - raise TypeError(f"bad operand type for '{op}'") from e - _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) - return _Operand(out) - - # unary operators - def __bool__(self): - # an image is "true" if it contains at least one non-zero pixel - return self.im.getbbox() is not None - - def __abs__(self): - return self.apply("abs", self) - - def __pos__(self): - return self - - def __neg__(self): - return self.apply("neg", self) - - # binary operators - def __add__(self, other): - return self.apply("add", self, other) - - def __radd__(self, other): - return self.apply("add", other, self) - - def __sub__(self, other): - return self.apply("sub", self, other) - - def __rsub__(self, other): - return self.apply("sub", other, self) - - def __mul__(self, other): - return self.apply("mul", self, other) - - def __rmul__(self, other): - return self.apply("mul", other, self) - - def __truediv__(self, other): - return self.apply("div", self, other) - - def __rtruediv__(self, other): - return self.apply("div", other, self) - - def __mod__(self, other): - return self.apply("mod", self, other) - - def __rmod__(self, other): - return self.apply("mod", other, self) - - def __pow__(self, other): - return self.apply("pow", self, other) - - def __rpow__(self, other): - return self.apply("pow", other, self) - - # bitwise - def __invert__(self): - return self.apply("invert", self) - - def __and__(self, other): - return self.apply("and", self, other) - - def __rand__(self, other): - return self.apply("and", other, self) - - def __or__(self, other): - return self.apply("or", self, other) - - def __ror__(self, other): - return self.apply("or", other, self) - - def __xor__(self, other): - return self.apply("xor", self, other) - - def __rxor__(self, other): - return self.apply("xor", other, self) - - def __lshift__(self, other): - return self.apply("lshift", self, other) - - def __rshift__(self, other): - return self.apply("rshift", self, other) - - # logical - def __eq__(self, other): - return self.apply("eq", self, other) - - def __ne__(self, other): - return self.apply("ne", self, other) - - def __lt__(self, other): - return self.apply("lt", self, other) - - def __le__(self, other): - return self.apply("le", self, other) - - def __gt__(self, other): - return self.apply("gt", self, other) - - def __ge__(self, other): - return self.apply("ge", self, other) - - -# conversions -def imagemath_int(self): - return _Operand(self.im.convert("I")) - - -def imagemath_float(self): - return _Operand(self.im.convert("F")) - - -# logical -def imagemath_equal(self, other): - return self.apply("eq", self, other, mode="I") - - -def imagemath_notequal(self, other): - return self.apply("ne", self, other, mode="I") - - -def imagemath_min(self, other): - return self.apply("min", self, other) - - -def imagemath_max(self, other): - return self.apply("max", self, other) - - -def imagemath_convert(self, mode): - return _Operand(self.im.convert(mode)) - - -ops = {} -for k, v in list(globals().items()): - if k[:10] == "imagemath_": - ops[k[10:]] = v - - -def eval(expression, _dict={}, **kw): - """ - Evaluates an image expression. - - :param expression: A string containing a Python-style expression. - :param options: Values to add to the evaluation context. You - can either use a dictionary, or one or more keyword - arguments. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - # build execution namespace - args = ops.copy() - args.update(_dict) - args.update(kw) - for k, v in list(args.items()): - if hasattr(v, "im"): - args[k] = _Operand(v) - - compiled_code = compile(expression, "", "eval") - - def scan(code): - for const in code.co_consts: - if type(const) == type(compiled_code): - scan(const) - - for name in code.co_names: - if name not in args and name != "abs": - raise ValueError(f"'{name}' not allowed") - - scan(compiled_code) - out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) - try: - return out.im - except AttributeError: - return out diff --git a/venv/Lib/site-packages/PIL/ImageMode.py b/venv/Lib/site-packages/PIL/ImageMode.py deleted file mode 100644 index 0973536..0000000 --- a/venv/Lib/site-packages/PIL/ImageMode.py +++ /dev/null @@ -1,91 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard mode descriptors -# -# History: -# 2006-03-20 fl Added -# -# Copyright (c) 2006 by Secret Labs AB. -# Copyright (c) 2006 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import sys - -# mode descriptor cache -_modes = None - - -class ModeDescriptor: - """Wrapper for mode strings.""" - - def __init__(self, mode, bands, basemode, basetype, typestr): - self.mode = mode - self.bands = bands - self.basemode = basemode - self.basetype = basetype - self.typestr = typestr - - def __str__(self): - return self.mode - - -def getmode(mode): - """Gets a mode descriptor for the given mode.""" - global _modes - if not _modes: - # initialize mode cache - modes = {} - endian = "<" if sys.byteorder == "little" else ">" - for m, (basemode, basetype, bands, typestr) in { - # core modes - # Bits need to be extended to bytes - "1": ("L", "L", ("1",), "|b1"), - "L": ("L", "L", ("L",), "|u1"), - "I": ("L", "I", ("I",), endian + "i4"), - "F": ("L", "F", ("F",), endian + "f4"), - "P": ("P", "L", ("P",), "|u1"), - "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), - "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), - "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), - "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), - "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), - # UNDONE - unsigned |u1i1i1 - "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), - "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), - # extra experimental modes - "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), - "BGR;15": ("RGB", "L", ("B", "G", "R"), endian + "u2"), - "BGR;16": ("RGB", "L", ("B", "G", "R"), endian + "u2"), - "BGR;24": ("RGB", "L", ("B", "G", "R"), endian + "u3"), - "BGR;32": ("RGB", "L", ("B", "G", "R"), endian + "u4"), - "LA": ("L", "L", ("L", "A"), "|u1"), - "La": ("L", "L", ("L", "a"), "|u1"), - "PA": ("RGB", "L", ("P", "A"), "|u1"), - }.items(): - modes[m] = ModeDescriptor(m, bands, basemode, basetype, typestr) - # mapping modes - for i16mode, typestr in { - # I;16 == I;16L, and I;32 == I;32L - "I;16": "u2", - "I;16BS": ">i2", - "I;16N": endian + "u2", - "I;16NS": endian + "i2", - "I;32": "u4", - "I;32L": "i4", - "I;32LS": " - -import re - -from . import Image, _imagingmorph - -LUT_SIZE = 1 << 9 - -# fmt: off -ROTATION_MATRIX = [ - 6, 3, 0, - 7, 4, 1, - 8, 5, 2, -] -MIRROR_MATRIX = [ - 2, 1, 0, - 5, 4, 3, - 8, 7, 6, -] -# fmt: on - - -class LutBuilder: - """A class for building a MorphLut from a descriptive language - - The input patterns is a list of a strings sequences like these:: - - 4:(... - .1. - 111)->1 - - (whitespaces including linebreaks are ignored). The option 4 - describes a series of symmetry operations (in this case a - 4-rotation), the pattern is described by: - - - . or X - Ignore - - 1 - Pixel is on - - 0 - Pixel is off - - The result of the operation is described after "->" string. - - The default is to return the current pixel value, which is - returned if no other match is found. - - Operations: - - - 4 - 4 way rotation - - N - Negate - - 1 - Dummy op for no other operation (an op must always be given) - - M - Mirroring - - Example:: - - lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) - lut = lb.build_lut() - - """ - - def __init__(self, patterns=None, op_name=None): - if patterns is not None: - self.patterns = patterns - else: - self.patterns = [] - self.lut = None - if op_name is not None: - known_patterns = { - "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], - "dilation4": ["4:(... .0. .1.)->1"], - "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], - "erosion4": ["4:(... .1. .0.)->0"], - "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], - "edge": [ - "1:(... ... ...)->0", - "4:(.0. .1. ...)->1", - "4:(01. .1. ...)->1", - ], - } - if op_name not in known_patterns: - raise Exception("Unknown pattern " + op_name + "!") - - self.patterns = known_patterns[op_name] - - def add_patterns(self, patterns): - self.patterns += patterns - - def build_default_lut(self): - symbols = [0, 1] - m = 1 << 4 # pos of current pixel - self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) - - def get_lut(self): - return self.lut - - def _string_permute(self, pattern, permutation): - """string_permute takes a pattern and a permutation and returns the - string permuted according to the permutation list. - """ - assert len(permutation) == 9 - return "".join(pattern[p] for p in permutation) - - def _pattern_permute(self, basic_pattern, options, basic_result): - """pattern_permute takes a basic pattern and its result and clones - the pattern according to the modifications described in the $options - parameter. It returns a list of all cloned patterns.""" - patterns = [(basic_pattern, basic_result)] - - # rotations - if "4" in options: - res = patterns[-1][1] - for i in range(4): - patterns.append( - (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) - ) - # mirror - if "M" in options: - n = len(patterns) - for pattern, res in patterns[0:n]: - patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) - - # negate - if "N" in options: - n = len(patterns) - for pattern, res in patterns[0:n]: - # Swap 0 and 1 - pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") - res = 1 - int(res) - patterns.append((pattern, res)) - - return patterns - - def build_lut(self): - """Compile all patterns into a morphology lut. - - TBD :Build based on (file) morphlut:modify_lut - """ - self.build_default_lut() - patterns = [] - - # Parse and create symmetries of the patterns strings - for p in self.patterns: - m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) - if not m: - raise Exception('Syntax error in pattern "' + p + '"') - options = m.group(1) - pattern = m.group(2) - result = int(m.group(3)) - - # Get rid of spaces - pattern = pattern.replace(" ", "").replace("\n", "") - - patterns += self._pattern_permute(pattern, options, result) - - # compile the patterns into regular expressions for speed - for i, pattern in enumerate(patterns): - p = pattern[0].replace(".", "X").replace("X", "[01]") - p = re.compile(p) - patterns[i] = (p, pattern[1]) - - # Step through table and find patterns that match. - # Note that all the patterns are searched. The last one - # caught overrides - for i in range(LUT_SIZE): - # Build the bit pattern - bitpattern = bin(i)[2:] - bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] - - for p, r in patterns: - if p.match(bitpattern): - self.lut[i] = [0, 1][r] - - return self.lut - - -class MorphOp: - """A class for binary morphological operators""" - - def __init__(self, lut=None, op_name=None, patterns=None): - """Create a binary morphological operator""" - self.lut = lut - if op_name is not None: - self.lut = LutBuilder(op_name=op_name).build_lut() - elif patterns is not None: - self.lut = LutBuilder(patterns=patterns).build_lut() - - def apply(self, image): - """Run a single morphological operation on an image - - Returns a tuple of the number of changed pixels and the - morphed image""" - if self.lut is None: - raise Exception("No operator loaded") - - if image.mode != "L": - raise ValueError("Image mode must be L") - outimage = Image.new(image.mode, image.size, None) - count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id) - return count, outimage - - def match(self, image): - """Get a list of coordinates matching the morphological operation on - an image. - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - if self.lut is None: - raise Exception("No operator loaded") - - if image.mode != "L": - raise ValueError("Image mode must be L") - return _imagingmorph.match(bytes(self.lut), image.im.id) - - def get_on_pixels(self, image): - """Get a list of all turned on pixels in a binary image - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - - if image.mode != "L": - raise ValueError("Image mode must be L") - return _imagingmorph.get_on_pixels(image.im.id) - - def load_lut(self, filename): - """Load an operator from an mrl file""" - with open(filename, "rb") as f: - self.lut = bytearray(f.read()) - - if len(self.lut) != LUT_SIZE: - self.lut = None - raise Exception("Wrong size operator file!") - - def save_lut(self, filename): - """Save an operator to an mrl file""" - if self.lut is None: - raise Exception("No operator loaded") - with open(filename, "wb") as f: - f.write(self.lut) - - def set_lut(self, lut): - """Set the lut from an external source""" - self.lut = lut diff --git a/venv/Lib/site-packages/PIL/ImageOps.py b/venv/Lib/site-packages/PIL/ImageOps.py deleted file mode 100644 index f0d4545..0000000 --- a/venv/Lib/site-packages/PIL/ImageOps.py +++ /dev/null @@ -1,610 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard image operations -# -# History: -# 2001-10-20 fl Created -# 2001-10-23 fl Added autocontrast operator -# 2001-12-18 fl Added Kevin's fit operator -# 2004-03-14 fl Fixed potential division by zero in equalize -# 2005-05-05 fl Fixed equalize for low number of values -# -# Copyright (c) 2001-2004 by Secret Labs AB -# Copyright (c) 2001-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import functools -import operator -import re - -from . import Image - -# -# helpers - - -def _border(border): - if isinstance(border, tuple): - if len(border) == 2: - left, top = right, bottom = border - elif len(border) == 4: - left, top, right, bottom = border - else: - left = top = right = bottom = border - return left, top, right, bottom - - -def _color(color, mode): - if isinstance(color, str): - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - return color - - -def _lut(image, lut): - if image.mode == "P": - # FIXME: apply to lookup table, not image data - raise NotImplementedError("mode P support coming soon") - elif image.mode in ("L", "RGB"): - if image.mode == "RGB" and len(lut) == 256: - lut = lut + lut + lut - return image.point(lut) - else: - raise OSError("not supported for this image mode") - - -# -# actions - - -def autocontrast(image, cutoff=0, ignore=None, mask=None, preserve_tone=False): - """ - Maximize (normalize) image contrast. This function calculates a - histogram of the input image (or mask region), removes ``cutoff`` percent of the - lightest and darkest pixels from the histogram, and remaps the image - so that the darkest pixel becomes black (0), and the lightest - becomes white (255). - - :param image: The image to process. - :param cutoff: The percent to cut off from the histogram on the low and - high ends. Either a tuple of (low, high), or a single - number for both. - :param ignore: The background pixel value (use None for no background). - :param mask: Histogram used in contrast operation is computed using pixels - within the mask. If no mask is given the entire image is used - for histogram computation. - :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. - - .. versionadded:: 8.2.0 - - :return: An image. - """ - if preserve_tone: - histogram = image.convert("L").histogram(mask) - else: - histogram = image.histogram(mask) - - lut = [] - for layer in range(0, len(histogram), 256): - h = histogram[layer : layer + 256] - if ignore is not None: - # get rid of outliers - try: - h[ignore] = 0 - except TypeError: - # assume sequence - for ix in ignore: - h[ix] = 0 - if cutoff: - # cut off pixels from both ends of the histogram - if not isinstance(cutoff, tuple): - cutoff = (cutoff, cutoff) - # get number of pixels - n = 0 - for ix in range(256): - n = n + h[ix] - # remove cutoff% pixels from the low end - cut = n * cutoff[0] // 100 - for lo in range(256): - if cut > h[lo]: - cut = cut - h[lo] - h[lo] = 0 - else: - h[lo] -= cut - cut = 0 - if cut <= 0: - break - # remove cutoff% samples from the high end - cut = n * cutoff[1] // 100 - for hi in range(255, -1, -1): - if cut > h[hi]: - cut = cut - h[hi] - h[hi] = 0 - else: - h[hi] -= cut - cut = 0 - if cut <= 0: - break - # find lowest/highest samples after preprocessing - for lo in range(256): - if h[lo]: - break - for hi in range(255, -1, -1): - if h[hi]: - break - if hi <= lo: - # don't bother - lut.extend(list(range(256))) - else: - scale = 255.0 / (hi - lo) - offset = -lo * scale - for ix in range(256): - ix = int(ix * scale + offset) - if ix < 0: - ix = 0 - elif ix > 255: - ix = 255 - lut.append(ix) - return _lut(image, lut) - - -def colorize(image, black, white, mid=None, blackpoint=0, whitepoint=255, midpoint=127): - """ - Colorize grayscale image. - This function calculates a color wedge which maps all black pixels in - the source image to the first color and all white pixels to the - second color. If ``mid`` is specified, it uses three-color mapping. - The ``black`` and ``white`` arguments should be RGB tuples or color names; - optionally you can use three-color mapping by also specifying ``mid``. - Mapping positions for any of the colors can be specified - (e.g. ``blackpoint``), where these parameters are the integer - value corresponding to where the corresponding color should be mapped. - These parameters must have logical order, such that - ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). - - :param image: The image to colorize. - :param black: The color to use for black input pixels. - :param white: The color to use for white input pixels. - :param mid: The color to use for midtone input pixels. - :param blackpoint: an int value [0, 255] for the black mapping. - :param whitepoint: an int value [0, 255] for the white mapping. - :param midpoint: an int value [0, 255] for the midtone mapping. - :return: An image. - """ - - # Initial asserts - assert image.mode == "L" - if mid is None: - assert 0 <= blackpoint <= whitepoint <= 255 - else: - assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 - - # Define colors from arguments - black = _color(black, "RGB") - white = _color(white, "RGB") - if mid is not None: - mid = _color(mid, "RGB") - - # Empty lists for the mapping - red = [] - green = [] - blue = [] - - # Create the low-end values - for i in range(0, blackpoint): - red.append(black[0]) - green.append(black[1]) - blue.append(black[2]) - - # Create the mapping (2-color) - if mid is None: - - range_map = range(0, whitepoint - blackpoint) - - for i in range_map: - red.append(black[0] + i * (white[0] - black[0]) // len(range_map)) - green.append(black[1] + i * (white[1] - black[1]) // len(range_map)) - blue.append(black[2] + i * (white[2] - black[2]) // len(range_map)) - - # Create the mapping (3-color) - else: - - range_map1 = range(0, midpoint - blackpoint) - range_map2 = range(0, whitepoint - midpoint) - - for i in range_map1: - red.append(black[0] + i * (mid[0] - black[0]) // len(range_map1)) - green.append(black[1] + i * (mid[1] - black[1]) // len(range_map1)) - blue.append(black[2] + i * (mid[2] - black[2]) // len(range_map1)) - for i in range_map2: - red.append(mid[0] + i * (white[0] - mid[0]) // len(range_map2)) - green.append(mid[1] + i * (white[1] - mid[1]) // len(range_map2)) - blue.append(mid[2] + i * (white[2] - mid[2]) // len(range_map2)) - - # Create the high-end values - for i in range(0, 256 - whitepoint): - red.append(white[0]) - green.append(white[1]) - blue.append(white[2]) - - # Return converted image - image = image.convert("RGB") - return _lut(image, red + green + blue) - - -def contain(image, size, method=Image.Resampling.BICUBIC): - """ - Returns a resized version of the image, set to the maximum width and height - within the requested size, while maintaining the original aspect ratio. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio > dest_ratio: - new_height = int(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = int(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def pad(image, size, method=Image.Resampling.BICUBIC, color=None, centering=(0.5, 0.5)): - """ - Returns a resized and padded version of the image, expanded to fill the - requested aspect ratio and size. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :param color: The background color of the padded image. - :param centering: Control the position of the original image within the - padded version. - - (0.5, 0.5) will keep the image centered - (0, 0) will keep the image aligned to the top left - (1, 1) will keep the image aligned to the bottom - right - :return: An image. - """ - - resized = contain(image, size, method) - if resized.size == size: - out = resized - else: - out = Image.new(image.mode, size, color) - if resized.width != size[0]: - x = int((size[0] - resized.width) * max(0, min(centering[0], 1))) - out.paste(resized, (x, 0)) - else: - y = int((size[1] - resized.height) * max(0, min(centering[1], 1))) - out.paste(resized, (0, y)) - return out - - -def crop(image, border=0): - """ - Remove border from image. The same amount of pixels are removed - from all four sides. This function works on all image modes. - - .. seealso:: :py:meth:`~PIL.Image.Image.crop` - - :param image: The image to crop. - :param border: The number of pixels to remove. - :return: An image. - """ - left, top, right, bottom = _border(border) - return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) - - -def scale(image, factor, resample=Image.Resampling.BICUBIC): - """ - Returns a rescaled image by a specific factor given in parameter. - A factor greater than 1 expands the image, between 0 and 1 contracts the - image. - - :param image: The image to rescale. - :param factor: The expansion factor, as a float. - :param resample: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - if factor == 1: - return image.copy() - elif factor <= 0: - raise ValueError("the factor must be greater than 0") - else: - size = (round(factor * image.width), round(factor * image.height)) - return image.resize(size, resample) - - -def deform(image, deformer, resample=Image.Resampling.BILINEAR): - """ - Deform the image. - - :param image: The image to deform. - :param deformer: A deformer object. Any object that implements a - ``getmesh`` method can be used. - :param resample: An optional resampling filter. Same values possible as - in the PIL.Image.transform function. - :return: An image. - """ - return image.transform( - image.size, Image.Transform.MESH, deformer.getmesh(image), resample - ) - - -def equalize(image, mask=None): - """ - Equalize the image histogram. This function applies a non-linear - mapping to the input image, in order to create a uniform - distribution of grayscale values in the output image. - - :param image: The image to equalize. - :param mask: An optional mask. If given, only the pixels selected by - the mask are included in the analysis. - :return: An image. - """ - if image.mode == "P": - image = image.convert("RGB") - h = image.histogram(mask) - lut = [] - for b in range(0, len(h), 256): - histo = [_f for _f in h[b : b + 256] if _f] - if len(histo) <= 1: - lut.extend(list(range(256))) - else: - step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 - if not step: - lut.extend(list(range(256))) - else: - n = step // 2 - for i in range(256): - lut.append(n // step) - n = n + h[i + b] - return _lut(image, lut) - - -def expand(image, border=0, fill=0): - """ - Add border to the image - - :param image: The image to expand. - :param border: Border width, in pixels. - :param fill: Pixel fill value (a color value). Default is 0 (black). - :return: An image. - """ - left, top, right, bottom = _border(border) - width = left + image.size[0] + right - height = top + image.size[1] + bottom - color = _color(fill, image.mode) - if image.mode == "P" and image.palette: - image.load() - palette = image.palette.copy() - if isinstance(color, tuple): - color = palette.getcolor(color) - else: - palette = None - out = Image.new(image.mode, (width, height), color) - if palette: - out.putpalette(palette.palette) - out.paste(image, (left, top)) - return out - - -def fit(image, size, method=Image.Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5)): - """ - Returns a resized and cropped version of the image, cropped to the - requested aspect ratio and size. - - This function was contributed by Kevin Cazabon. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. - :param bleed: Remove a border around the outside of the image from all - four edges. The value is a decimal percentage (use 0.01 for - one percent). The default value is 0 (no border). - Cannot be greater than or equal to 0.5. - :param centering: Control the cropping position. Use (0.5, 0.5) for - center cropping (e.g. if cropping the width, take 50% off - of the left side, and therefore 50% off the right side). - (0.0, 0.0) will crop from the top left corner (i.e. if - cropping the width, take all of the crop off of the right - side, and if cropping the height, take all of it off the - bottom). (1.0, 0.0) will crop from the bottom left - corner, etc. (i.e. if cropping the width, take all of the - crop off the left side, and if cropping the height take - none from the top, and therefore all off the bottom). - :return: An image. - """ - - # by Kevin Cazabon, Feb 17/2000 - # kevin@cazabon.com - # https://www.cazabon.com - - # ensure centering is mutable - centering = list(centering) - - if not 0.0 <= centering[0] <= 1.0: - centering[0] = 0.5 - if not 0.0 <= centering[1] <= 1.0: - centering[1] = 0.5 - - if not 0.0 <= bleed < 0.5: - bleed = 0.0 - - # calculate the area to use for resizing and cropping, subtracting - # the 'bleed' around the edges - - # number of pixels to trim off on Top and Bottom, Left and Right - bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) - - live_size = ( - image.size[0] - bleed_pixels[0] * 2, - image.size[1] - bleed_pixels[1] * 2, - ) - - # calculate the aspect ratio of the live_size - live_size_ratio = live_size[0] / live_size[1] - - # calculate the aspect ratio of the output image - output_ratio = size[0] / size[1] - - # figure out if the sides or top/bottom will be cropped off - if live_size_ratio == output_ratio: - # live_size is already the needed ratio - crop_width = live_size[0] - crop_height = live_size[1] - elif live_size_ratio >= output_ratio: - # live_size is wider than what's needed, crop the sides - crop_width = output_ratio * live_size[1] - crop_height = live_size[1] - else: - # live_size is taller than what's needed, crop the top and bottom - crop_width = live_size[0] - crop_height = live_size[0] / output_ratio - - # make the crop - crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering[0] - crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering[1] - - crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) - - # resize the image and return it - return image.resize(size, method, box=crop) - - -def flip(image): - """ - Flip the image vertically (top to bottom). - - :param image: The image to flip. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) - - -def grayscale(image): - """ - Convert the image to grayscale. - - :param image: The image to convert. - :return: An image. - """ - return image.convert("L") - - -def invert(image): - """ - Invert (negate) the image. - - :param image: The image to invert. - :return: An image. - """ - lut = [] - for i in range(256): - lut.append(255 - i) - return image.point(lut) if image.mode == "1" else _lut(image, lut) - - -def mirror(image): - """ - Flip image horizontally (left to right). - - :param image: The image to mirror. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -def posterize(image, bits): - """ - Reduce the number of bits for each color channel. - - :param image: The image to posterize. - :param bits: The number of bits to keep for each channel (1-8). - :return: An image. - """ - lut = [] - mask = ~(2 ** (8 - bits) - 1) - for i in range(256): - lut.append(i & mask) - return _lut(image, lut) - - -def solarize(image, threshold=128): - """ - Invert all pixel values above a threshold. - - :param image: The image to solarize. - :param threshold: All pixels above this greyscale level are inverted. - :return: An image. - """ - lut = [] - for i in range(256): - if i < threshold: - lut.append(i) - else: - lut.append(255 - i) - return _lut(image, lut) - - -def exif_transpose(image): - """ - If an image has an EXIF Orientation tag, return a new image that is - transposed accordingly. Otherwise, return a copy of the image. - - :param image: The image to transpose. - :return: An image. - """ - exif = image.getexif() - orientation = exif.get(0x0112) - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(orientation) - if method is not None: - transposed_image = image.transpose(method) - transposed_exif = transposed_image.getexif() - if 0x0112 in transposed_exif: - del transposed_exif[0x0112] - if "exif" in transposed_image.info: - transposed_image.info["exif"] = transposed_exif.tobytes() - elif "Raw profile type exif" in transposed_image.info: - transposed_image.info[ - "Raw profile type exif" - ] = transposed_exif.tobytes().hex() - elif "XML:com.adobe.xmp" in transposed_image.info: - transposed_image.info["XML:com.adobe.xmp"] = re.sub( - r'tiff:Orientation="([0-9])"', - "", - transposed_image.info["XML:com.adobe.xmp"], - ) - return transposed_image - return image.copy() diff --git a/venv/Lib/site-packages/PIL/ImagePalette.py b/venv/Lib/site-packages/PIL/ImagePalette.py deleted file mode 100644 index 1e0d36b..0000000 --- a/venv/Lib/site-packages/PIL/ImagePalette.py +++ /dev/null @@ -1,261 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image palette object -# -# History: -# 1996-03-11 fl Rewritten. -# 1997-01-03 fl Up and running. -# 1997-08-23 fl Added load hack -# 2001-04-16 fl Fixed randint shadow bug in random() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import array -import warnings - -from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile - - -class ImagePalette: - """ - Color palette for palette mapped images - - :param mode: The mode to use for the palette. See: - :ref:`concept-modes`. Defaults to "RGB" - :param palette: An optional palette. If given, it must be a bytearray, - an array or a list of ints between 0-255. The list must consist of - all channels for one color followed by the next color (e.g. RGBRGBRGB). - Defaults to an empty palette. - :param size: An optional palette size. If given, an error is raised - if ``palette`` is not of equal length. - """ - - def __init__(self, mode="RGB", palette=None, size=0): - self.mode = mode - self.rawmode = None # if set, palette contains raw data - self.palette = palette or bytearray() - self.dirty = None - if size != 0: - warnings.warn( - "The size parameter is deprecated and will be removed in Pillow 10 " - "(2023-07-01).", - DeprecationWarning, - ) - if size != len(self.palette): - raise ValueError("wrong palette size") - - @property - def palette(self): - return self._palette - - @palette.setter - def palette(self, palette): - self._palette = palette - - mode_len = len(self.mode) - self.colors = {} - for i in range(0, len(self.palette), mode_len): - color = tuple(self.palette[i : i + mode_len]) - if color in self.colors: - continue - self.colors[color] = i // mode_len - - def copy(self): - new = ImagePalette() - - new.mode = self.mode - new.rawmode = self.rawmode - if self.palette is not None: - new.palette = self.palette[:] - new.dirty = self.dirty - - return new - - def getdata(self): - """ - Get palette contents in format suitable for the low-level - ``im.putpalette`` primitive. - - .. warning:: This method is experimental. - """ - if self.rawmode: - return self.rawmode, self.palette - return self.mode, self.tobytes() - - def tobytes(self): - """Convert palette to bytes. - - .. warning:: This method is experimental. - """ - if self.rawmode: - raise ValueError("palette contains raw palette data") - if isinstance(self.palette, bytes): - return self.palette - arr = array.array("B", self.palette) - return arr.tobytes() - - # Declare tostring as an alias for tobytes - tostring = tobytes - - def getcolor(self, color, image=None): - """Given an rgb tuple, allocate palette entry. - - .. warning:: This method is experimental. - """ - if self.rawmode: - raise ValueError("palette contains raw palette data") - if isinstance(color, tuple): - if self.mode == "RGB": - if len(color) == 4 and color[3] == 255: - color = color[:3] - elif self.mode == "RGBA": - if len(color) == 3: - color += (255,) - try: - return self.colors[color] - except KeyError as e: - # allocate new color slot - if not isinstance(self.palette, bytearray): - self._palette = bytearray(self.palette) - index = len(self.palette) // 3 - special_colors = () - if image: - special_colors = ( - image.info.get("background"), - image.info.get("transparency"), - ) - while index in special_colors: - index += 1 - if index >= 256: - if image: - # Search for an unused index - for i, count in reversed(list(enumerate(image.histogram()))): - if count == 0 and i not in special_colors: - index = i - break - if index >= 256: - raise ValueError("cannot allocate more than 256 colors") from e - self.colors[color] = index - if index * 3 < len(self.palette): - self._palette = ( - self.palette[: index * 3] - + bytes(color) - + self.palette[index * 3 + 3 :] - ) - else: - self._palette += bytes(color) - self.dirty = 1 - return index - else: - raise ValueError(f"unknown color specifier: {repr(color)}") - - def save(self, fp): - """Save palette to text file. - - .. warning:: This method is experimental. - """ - if self.rawmode: - raise ValueError("palette contains raw palette data") - if isinstance(fp, str): - fp = open(fp, "w") - fp.write("# Palette\n") - fp.write(f"# Mode: {self.mode}\n") - for i in range(256): - fp.write(f"{i}") - for j in range(i * len(self.mode), (i + 1) * len(self.mode)): - try: - fp.write(f" {self.palette[j]}") - except IndexError: - fp.write(" 0") - fp.write("\n") - fp.close() - - -# -------------------------------------------------------------------- -# Internal - - -def raw(rawmode, data): - palette = ImagePalette() - palette.rawmode = rawmode - palette.palette = data - palette.dirty = 1 - return palette - - -# -------------------------------------------------------------------- -# Factories - - -def make_linear_lut(black, white): - lut = [] - if black == 0: - for i in range(256): - lut.append(white * i // 255) - else: - raise NotImplementedError # FIXME - return lut - - -def make_gamma_lut(exp): - lut = [] - for i in range(256): - lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) - return lut - - -def negative(mode="RGB"): - palette = list(range(256 * len(mode))) - palette.reverse() - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def random(mode="RGB"): - from random import randint - - palette = [] - for i in range(256 * len(mode)): - palette.append(randint(0, 255)) - return ImagePalette(mode, palette) - - -def sepia(white="#fff0c0"): - bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] - return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) - - -def wedge(mode="RGB"): - palette = list(range(256 * len(mode))) - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def load(filename): - - # FIXME: supports GIMP gradients only - - with open(filename, "rb") as fp: - - for paletteHandler in [ - GimpPaletteFile.GimpPaletteFile, - GimpGradientFile.GimpGradientFile, - PaletteFile.PaletteFile, - ]: - try: - fp.seek(0) - lut = paletteHandler(fp).getpalette() - if lut: - break - except (SyntaxError, ValueError): - # import traceback - # traceback.print_exc() - pass - else: - raise OSError("cannot load palette") - - return lut # data, rawmode diff --git a/venv/Lib/site-packages/PIL/ImagePath.py b/venv/Lib/site-packages/PIL/ImagePath.py deleted file mode 100644 index 3d3538c..0000000 --- a/venv/Lib/site-packages/PIL/ImagePath.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# path interface -# -# History: -# 1996-11-04 fl Created -# 2002-04-14 fl Added documentation stub class -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -from . import Image - -Path = Image.core.path diff --git a/venv/Lib/site-packages/PIL/ImageQt.py b/venv/Lib/site-packages/PIL/ImageQt.py deleted file mode 100644 index db8fa0f..0000000 --- a/venv/Lib/site-packages/PIL/ImageQt.py +++ /dev/null @@ -1,223 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a simple Qt image interface. -# -# history: -# 2006-06-03 fl: created -# 2006-06-04 fl: inherit from QImage instead of wrapping it -# 2006-06-05 fl: removed toimage helper; move string support to ImageQt -# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) -# -# Copyright (c) 2006 by Secret Labs AB -# Copyright (c) 2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import sys -from io import BytesIO - -from . import Image -from ._util import isPath - -qt_versions = [ - ["6", "PyQt6"], - ["side6", "PySide6"], - ["5", "PyQt5"], - ["side2", "PySide2"], -] - -# If a version has already been imported, attempt it first -qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True) -for qt_version, qt_module in qt_versions: - try: - if qt_module == "PyQt6": - from PyQt6.QtCore import QBuffer, QIODevice - from PyQt6.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PySide6": - from PySide6.QtCore import QBuffer, QIODevice - from PySide6.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PyQt5": - from PyQt5.QtCore import QBuffer, QIODevice - from PyQt5.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PySide2": - from PySide2.QtCore import QBuffer, QIODevice - from PySide2.QtGui import QImage, QPixmap, qRgba - except (ImportError, RuntimeError): - continue - qt_is_installed = True - break -else: - qt_is_installed = False - qt_version = None - - -def rgb(r, g, b, a=255): - """(Internal) Turns an RGB color into a Qt compatible color integer.""" - # use qRgb to pack the colors, and then turn the resulting long - # into a negative integer with the same bitpattern. - return qRgba(r, g, b, a) & 0xFFFFFFFF - - -def fromqimage(im): - """ - :param im: QImage or PIL ImageQt object - """ - buffer = QBuffer() - if qt_version == "6": - try: - qt_openmode = QIODevice.OpenModeFlag - except AttributeError: - qt_openmode = QIODevice.OpenMode - else: - qt_openmode = QIODevice - buffer.open(qt_openmode.ReadWrite) - # preserve alpha channel with png - # otherwise ppm is more friendly with Image.open - if im.hasAlphaChannel(): - im.save(buffer, "png") - else: - im.save(buffer, "ppm") - - b = BytesIO() - b.write(buffer.data()) - buffer.close() - b.seek(0) - - return Image.open(b) - - -def fromqpixmap(im): - return fromqimage(im) - # buffer = QBuffer() - # buffer.open(QIODevice.ReadWrite) - # # im.save(buffer) - # # What if png doesn't support some image features like animation? - # im.save(buffer, 'ppm') - # bytes_io = BytesIO() - # bytes_io.write(buffer.data()) - # buffer.close() - # bytes_io.seek(0) - # return Image.open(bytes_io) - - -def align8to32(bytes, width, mode): - """ - converts each scanline of data from 8 bit to 32 bit aligned - """ - - bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode] - - # calculate bytes per line and the extra padding if needed - bits_per_line = bits_per_pixel * width - full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) - bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) - - extra_padding = -bytes_per_line % 4 - - # already 32 bit aligned by luck - if not extra_padding: - return bytes - - new_data = [] - for i in range(len(bytes) // bytes_per_line): - new_data.append( - bytes[i * bytes_per_line : (i + 1) * bytes_per_line] - + b"\x00" * extra_padding - ) - - return b"".join(new_data) - - -def _toqclass_helper(im): - data = None - colortable = None - exclusive_fp = False - - # handle filename, if given instead of image name - if hasattr(im, "toUtf8"): - # FIXME - is this really the best way to do this? - im = str(im.toUtf8(), "utf-8") - if isPath(im): - im = Image.open(im) - exclusive_fp = True - - qt_format = QImage.Format if qt_version == "6" else QImage - if im.mode == "1": - format = qt_format.Format_Mono - elif im.mode == "L": - format = qt_format.Format_Indexed8 - colortable = [] - for i in range(256): - colortable.append(rgb(i, i, i)) - elif im.mode == "P": - format = qt_format.Format_Indexed8 - colortable = [] - palette = im.getpalette() - for i in range(0, len(palette), 3): - colortable.append(rgb(*palette[i : i + 3])) - elif im.mode == "RGB": - # Populate the 4th channel with 255 - im = im.convert("RGBA") - - data = im.tobytes("raw", "BGRA") - format = qt_format.Format_RGB32 - elif im.mode == "RGBA": - data = im.tobytes("raw", "BGRA") - format = qt_format.Format_ARGB32 - elif im.mode == "I;16" and hasattr(qt_format, "Format_Grayscale16"): # Qt 5.13+ - im = im.point(lambda i: i * 256) - - format = qt_format.Format_Grayscale16 - else: - if exclusive_fp: - im.close() - raise ValueError(f"unsupported image mode {repr(im.mode)}") - - size = im.size - __data = data or align8to32(im.tobytes(), size[0], im.mode) - if exclusive_fp: - im.close() - return {"data": __data, "size": size, "format": format, "colortable": colortable} - - -if qt_is_installed: - - class ImageQt(QImage): - def __init__(self, im): - """ - An PIL image wrapper for Qt. This is a subclass of PyQt's QImage - class. - - :param im: A PIL Image object, or a file name (given either as - Python string or a PyQt string object). - """ - im_data = _toqclass_helper(im) - # must keep a reference, or Qt will crash! - # All QImage constructors that take data operate on an existing - # buffer, so this buffer has to hang on for the life of the image. - # Fixes https://github.com/python-pillow/Pillow/issues/1370 - self.__data = im_data["data"] - super().__init__( - self.__data, - im_data["size"][0], - im_data["size"][1], - im_data["format"], - ) - if im_data["colortable"]: - self.setColorTable(im_data["colortable"]) - - -def toqimage(im): - return ImageQt(im) - - -def toqpixmap(im): - # # This doesn't work. For now using a dumb approach. - # im_data = _toqclass_helper(im) - # result = QPixmap(im_data["size"][0], im_data["size"][1]) - # result.loadFromData(im_data["data"]) - qimage = toqimage(im) - return QPixmap.fromImage(qimage) diff --git a/venv/Lib/site-packages/PIL/ImageSequence.py b/venv/Lib/site-packages/PIL/ImageSequence.py deleted file mode 100644 index 9df910a..0000000 --- a/venv/Lib/site-packages/PIL/ImageSequence.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# sequence support classes -# -# history: -# 1997-02-20 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## - - -class Iterator: - """ - This class implements an iterator object that can be used to loop - over an image sequence. - - You can use the ``[]`` operator to access elements by index. This operator - will raise an :py:exc:`IndexError` if you try to access a nonexistent - frame. - - :param im: An image object. - """ - - def __init__(self, im): - if not hasattr(im, "seek"): - raise AttributeError("im must have seek method") - self.im = im - self.position = getattr(self.im, "_min_frame", 0) - - def __getitem__(self, ix): - try: - self.im.seek(ix) - return self.im - except EOFError as e: - raise IndexError from e # end of sequence - - def __iter__(self): - return self - - def __next__(self): - try: - self.im.seek(self.position) - self.position += 1 - return self.im - except EOFError as e: - raise StopIteration from e - - -def all_frames(im, func=None): - """ - Applies a given function to all frames in an image or a list of images. - The frames are returned as a list of separate images. - - :param im: An image, or a list of images. - :param func: The function to apply to all of the image frames. - :returns: A list of images. - """ - if not isinstance(im, list): - im = [im] - - ims = [] - for imSequence in im: - current = imSequence.tell() - - ims += [im_frame.copy() for im_frame in Iterator(imSequence)] - - imSequence.seek(current) - return [func(im) for im in ims] if func else ims diff --git a/venv/Lib/site-packages/PIL/ImageShow.py b/venv/Lib/site-packages/PIL/ImageShow.py deleted file mode 100644 index 395bb22..0000000 --- a/venv/Lib/site-packages/PIL/ImageShow.py +++ /dev/null @@ -1,417 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# im.show() drivers -# -# History: -# 2008-04-06 fl Created -# -# Copyright (c) Secret Labs AB 2008. -# -# See the README file for information on usage and redistribution. -# -import os -import shutil -import subprocess -import sys -import warnings -from shlex import quote - -from PIL import Image - -_viewers = [] - - -def register(viewer, order=1): - """ - The :py:func:`register` function is used to register additional viewers:: - - from PIL import ImageShow - ImageShow.register(MyViewer()) # MyViewer will be used as a last resort - ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised - ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised - - :param viewer: The viewer to be registered. - :param order: - Zero or a negative integer to prepend this viewer to the list, - a positive integer to append it. - """ - try: - if issubclass(viewer, Viewer): - viewer = viewer() - except TypeError: - pass # raised if viewer wasn't a class - if order > 0: - _viewers.append(viewer) - else: - _viewers.insert(0, viewer) - - -def show(image, title=None, **options): - r""" - Display a given image. - - :param image: An image object. - :param title: Optional title. Not all viewers can display the title. - :param \**options: Additional viewer options. - :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. - """ - for viewer in _viewers: - if viewer.show(image, title=title, **options): - return True - return False - - -class Viewer: - """Base class for viewers.""" - - # main api - - def show(self, image, **options): - """ - The main function for displaying an image. - Converts the given image to the target format and displays it. - """ - - if not ( - image.mode in ("1", "RGBA") - or (self.format == "PNG" and image.mode in ("I;16", "LA")) - ): - base = Image.getmodebase(image.mode) - if image.mode != base: - image = image.convert(base) - - return self.show_image(image, **options) - - # hook methods - - format = None - """The format to convert the image into.""" - options = {} - """Additional options used to convert the image.""" - - def get_format(self, image): - """Return format name, or ``None`` to save as PGM/PPM.""" - return self.format - - def get_command(self, file, **options): - """ - Returns the command used to display the file. - Not implemented in the base class. - """ - raise NotImplementedError - - def save_image(self, image): - """Save to temporary file and return filename.""" - return image._dump(format=self.get_format(image), **self.options) - - def show_image(self, image, **options): - """Display the given image.""" - return self.show_file(self.save_image(image), **options) - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used - instead. - """ - if path is None: - if "file" in options: - warnings.warn( - "The 'file' argument is deprecated and will be removed in Pillow " - "10 (2023-07-01). Use 'path' instead.", - DeprecationWarning, - ) - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - os.system(self.get_command(path, **options)) - return 1 - - -# -------------------------------------------------------------------- - - -class WindowsViewer(Viewer): - """The default viewer on Windows is the default system application for PNG files.""" - - format = "PNG" - options = {"compress_level": 1} - - def get_command(self, file, **options): - return ( - f'start "Pillow" /WAIT "{file}" ' - "&& ping -n 2 127.0.0.1 >NUL " - f'&& del /f "{file}"' - ) - - -if sys.platform == "win32": - register(WindowsViewer) - - -class MacViewer(Viewer): - """The default viewer on macOS using ``Preview.app``.""" - - format = "PNG" - options = {"compress_level": 1} - - def get_command(self, file, **options): - # on darwin open returns immediately resulting in the temp - # file removal while app is opening - command = "open -a Preview.app" - command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" - return command - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used - instead. - """ - if path is None: - if "file" in options: - warnings.warn( - "The 'file' argument is deprecated and will be removed in Pillow " - "10 (2023-07-01). Use 'path' instead.", - DeprecationWarning, - ) - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.call(["open", "-a", "Preview.app", path]) - subprocess.Popen( - [ - sys.executable, - "-c", - "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", - path, - ] - ) - return 1 - - -if sys.platform == "darwin": - register(MacViewer) - - -class UnixViewer(Viewer): - format = "PNG" - options = {"compress_level": 1} - - def get_command(self, file, **options): - command = self.get_command_ex(file, **options)[0] - return f"({command} {quote(file)}" - - -class XDGViewer(UnixViewer): - """ - The freedesktop.org ``xdg-open`` command. - """ - - def get_command_ex(self, file, **options): - command = executable = "xdg-open" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and will be removed in Pillow 10.0.0 (2023-07-01). ``path`` should be used - instead. - """ - if path is None: - if "file" in options: - warnings.warn( - "The 'file' argument is deprecated and will be removed in Pillow " - "10 (2023-07-01). Use 'path' instead.", - DeprecationWarning, - ) - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.Popen(["xdg-open", path]) - return 1 - - -class DisplayViewer(UnixViewer): - """ - The ImageMagick ``display`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex(self, file, title=None, **options): - command = executable = "display" - if title: - command += f" -title {quote(title)}" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - warnings.warn( - "The 'file' argument is deprecated and will be removed in Pillow " - "10 (2023-07-01). Use 'path' instead.", - DeprecationWarning, - ) - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - args = ["display"] - title = options.get("title") - if title: - args += ["-title", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -class GmDisplayViewer(UnixViewer): - """The GraphicsMagick ``gm display`` command.""" - - def get_command_ex(self, file, **options): - executable = "gm" - command = "gm display" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - warnings.warn( - "The 'file' argument is deprecated and will be removed in Pillow " - "10 (2023-07-01). Use 'path' instead.", - DeprecationWarning, - ) - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.Popen(["gm", "display", path]) - return 1 - - -class EogViewer(UnixViewer): - """The GNOME Image Viewer ``eog`` command.""" - - def get_command_ex(self, file, **options): - executable = "eog" - command = "eog -n" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - warnings.warn( - "The 'file' argument is deprecated and will be removed in Pillow " - "10 (2023-07-01). Use 'path' instead.", - DeprecationWarning, - ) - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - subprocess.Popen(["eog", "-n", path]) - return 1 - - -class XVViewer(UnixViewer): - """ - The X Viewer ``xv`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex(self, file, title=None, **options): - # note: xv is pretty outdated. most modern systems have - # imagemagick's display command instead. - command = executable = "xv" - if title: - command += f" -name {quote(title)}" - return command, executable - - def show_file(self, path=None, **options): - """ - Display given file. - - Before Pillow 9.1.0, the first argument was ``file``. This is now deprecated, - and ``path`` should be used instead. - """ - if path is None: - if "file" in options: - warnings.warn( - "The 'file' argument is deprecated and will be removed in Pillow " - "10 (2023-07-01). Use 'path' instead.", - DeprecationWarning, - ) - path = options.pop("file") - else: - raise TypeError("Missing required argument: 'path'") - args = ["xv"] - title = options.get("title") - if title: - args += ["-name", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -if sys.platform not in ("win32", "darwin"): # unixoids - if shutil.which("xdg-open"): - register(XDGViewer) - if shutil.which("display"): - register(DisplayViewer) - if shutil.which("gm"): - register(GmDisplayViewer) - if shutil.which("eog"): - register(EogViewer) - if shutil.which("xv"): - register(XVViewer) - - -class IPythonViewer(Viewer): - """The viewer for IPython frontends.""" - - def show_image(self, image, **options): - ipython_display(image) - return 1 - - -try: - from IPython.display import display as ipython_display -except ImportError: - pass -else: - register(IPythonViewer) - - -if __name__ == "__main__": - - if len(sys.argv) < 2: - print("Syntax: python3 ImageShow.py imagefile [title]") - sys.exit() - - with Image.open(sys.argv[1]) as im: - print(show(im, *sys.argv[2:])) diff --git a/venv/Lib/site-packages/PIL/ImageStat.py b/venv/Lib/site-packages/PIL/ImageStat.py deleted file mode 100644 index ef4a1d6..0000000 --- a/venv/Lib/site-packages/PIL/ImageStat.py +++ /dev/null @@ -1,147 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# global image statistics -# -# History: -# 1996-04-05 fl Created -# 1997-05-21 fl Added mask; added rms, var, stddev attributes -# 1997-08-05 fl Added median -# 1998-07-05 hk Fixed integer overflow error -# -# Notes: -# This class shows how to implement delayed evaluation of attributes. -# To get a certain value, simply access the corresponding attribute. -# The __getattr__ dispatcher takes care of the rest. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996-97. -# -# See the README file for information on usage and redistribution. -# - -import functools -import math -import operator - - -class Stat: - def __init__(self, image_or_list, mask=None): - try: - if mask: - self.h = image_or_list.histogram(mask) - else: - self.h = image_or_list.histogram() - except AttributeError: - self.h = image_or_list # assume it to be a histogram list - if not isinstance(self.h, list): - raise TypeError("first argument must be image or list") - self.bands = list(range(len(self.h) // 256)) - - def __getattr__(self, id): - """Calculate missing attribute""" - if id[:4] == "_get": - raise AttributeError(id) - # calculate missing attribute - v = getattr(self, "_get" + id)() - setattr(self, id, v) - return v - - def _getextrema(self): - """Get min/max values for each band in the image""" - - def minmax(histogram): - n = 255 - x = 0 - for i in range(256): - if histogram[i]: - n = min(n, i) - x = max(x, i) - return n, x # returns (255, 0) if there's no data in the histogram - - v = [] - for i in range(0, len(self.h), 256): - v.append(minmax(self.h[i:])) - return v - - def _getcount(self): - """Get total number of pixels in each layer""" - - v = [] - for i in range(0, len(self.h), 256): - v.append(functools.reduce(operator.add, self.h[i : i + 256])) - return v - - def _getsum(self): - """Get sum of all pixels in each layer""" - - v = [] - for i in range(0, len(self.h), 256): - layerSum = 0.0 - for j in range(256): - layerSum += j * self.h[i + j] - v.append(layerSum) - return v - - def _getsum2(self): - """Get squared sum of all pixels in each layer""" - - v = [] - for i in range(0, len(self.h), 256): - sum2 = 0.0 - for j in range(256): - sum2 += (j**2) * float(self.h[i + j]) - v.append(sum2) - return v - - def _getmean(self): - """Get average pixel level for each layer""" - - v = [] - for i in self.bands: - v.append(self.sum[i] / self.count[i]) - return v - - def _getmedian(self): - """Get median pixel level for each layer""" - - v = [] - for i in self.bands: - s = 0 - half = self.count[i] // 2 - b = i * 256 - for j in range(256): - s = s + self.h[b + j] - if s > half: - break - v.append(j) - return v - - def _getrms(self): - """Get RMS for each layer""" - - v = [] - for i in self.bands: - v.append(math.sqrt(self.sum2[i] / self.count[i])) - return v - - def _getvar(self): - """Get variance for each layer""" - - v = [] - for i in self.bands: - n = self.count[i] - v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n) - return v - - def _getstddev(self): - """Get standard deviation for each layer""" - - v = [] - for i in self.bands: - v.append(math.sqrt(self.var[i])) - return v - - -Global = Stat # compatibility diff --git a/venv/Lib/site-packages/PIL/ImageTk.py b/venv/Lib/site-packages/PIL/ImageTk.py deleted file mode 100644 index d151b9b..0000000 --- a/venv/Lib/site-packages/PIL/ImageTk.py +++ /dev/null @@ -1,301 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Tk display interface -# -# History: -# 96-04-08 fl Created -# 96-09-06 fl Added getimage method -# 96-11-01 fl Rewritten, removed image attribute and crop method -# 97-05-09 fl Use PyImagingPaste method instead of image type -# 97-05-12 fl Minor tweaks to match the IFUNC95 interface -# 97-05-17 fl Support the "pilbitmap" booster patch -# 97-06-05 fl Added file= and data= argument to image constructors -# 98-03-09 fl Added width and height methods to Image classes -# 98-07-02 fl Use default mode for "P" images without palette attribute -# 98-07-02 fl Explicitly destroy Tkinter image objects -# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) -# 99-07-26 fl Automatically hook into Tkinter (if possible) -# 99-08-15 fl Hook uses _imagingtk instead of _imaging -# -# Copyright (c) 1997-1999 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import tkinter -from io import BytesIO - -from . import Image - -# -------------------------------------------------------------------- -# Check for Tkinter interface hooks - -_pilbitmap_ok = None - - -def _pilbitmap_check(): - global _pilbitmap_ok - if _pilbitmap_ok is None: - try: - im = Image.new("1", (1, 1)) - tkinter.BitmapImage(data=f"PIL:{im.im.id}") - _pilbitmap_ok = 1 - except tkinter.TclError: - _pilbitmap_ok = 0 - return _pilbitmap_ok - - -def _get_image_from_kw(kw): - source = None - if "file" in kw: - source = kw.pop("file") - elif "data" in kw: - source = BytesIO(kw.pop("data")) - if source: - return Image.open(source) - - -def _pyimagingtkcall(command, photo, id): - tk = photo.tk - try: - tk.call(command, photo, id) - except tkinter.TclError: - # activate Tkinter hook - # may raise an error if it cannot attach to Tkinter - from . import _imagingtk - - try: - if hasattr(tk, "interp"): - # Required for PyPy, which always has CFFI installed - from cffi import FFI - - ffi = FFI() - - # PyPy is using an FFI CDATA element - # (Pdb) self.tk.interp - # - _imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1) - else: - _imagingtk.tkinit(tk.interpaddr(), 1) - except AttributeError: - _imagingtk.tkinit(id(tk), 0) - tk.call(command, photo, id) - - -# -------------------------------------------------------------------- -# PhotoImage - - -class PhotoImage: - """ - A Tkinter-compatible photo image. This can be used - everywhere Tkinter expects an image object. If the image is an RGBA - image, pixels having alpha 0 are treated as transparent. - - The constructor takes either a PIL image, or a mode and a size. - Alternatively, you can use the ``file`` or ``data`` options to initialize - the photo image object. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. - :param size: If the first argument is a mode string, this defines the size - of the image. - :keyword file: A filename to load the image from (using - ``Image.open(file)``). - :keyword data: An 8-bit string containing image data (as loaded from an - image file). - """ - - def __init__(self, image=None, size=None, **kw): - - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if hasattr(image, "mode") and hasattr(image, "size"): - # got an image instead of a mode - mode = image.mode - if mode == "P": - # palette mapped data - image.load() - try: - mode = image.palette.mode - except AttributeError: - mode = "RGB" # default - size = image.size - kw["width"], kw["height"] = size - else: - mode = image - image = None - - if mode not in ["1", "L", "RGB", "RGBA"]: - mode = Image.getmodebase(mode) - - self.__mode = mode - self.__size = size - self.__photo = tkinter.PhotoImage(**kw) - self.tk = self.__photo.tk - if image: - self.paste(image) - - def __del__(self): - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def __str__(self): - """ - Get the Tkinter photo image identifier. This method is automatically - called by Tkinter whenever a PhotoImage object is passed to a Tkinter - method. - - :return: A Tkinter photo image identifier (a string). - """ - return str(self.__photo) - - def width(self): - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self): - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def paste(self, im, box=None): - """ - Paste a PIL image into the photo image. Note that this can - be very slow if the photo image is displayed. - - :param im: A PIL image. The size must match the target region. If the - mode does not match, the image is converted to the mode of - the bitmap image. - :param box: A 4-tuple defining the left, upper, right, and lower pixel - coordinate. See :ref:`coordinate-system`. If None is given - instead of a tuple, all of the image is assumed. - """ - - # convert to blittable - im.load() - image = im.im - if image.isblock() and im.mode == self.__mode: - block = image - else: - block = image.new_block(self.__mode, im.size) - image.convert2(block, image) # convert directly between buffers - - _pyimagingtkcall("PyImagingPhoto", self.__photo, block.id) - - -# -------------------------------------------------------------------- -# BitmapImage - - -class BitmapImage: - """ - A Tkinter-compatible bitmap image. This can be used everywhere Tkinter - expects an image object. - - The given image must have mode "1". Pixels having value 0 are treated as - transparent. Options, if any, are passed on to Tkinter. The most commonly - used option is ``foreground``, which is used to specify the color for the - non-transparent parts. See the Tkinter documentation for information on - how to specify colours. - - :param image: A PIL image. - """ - - def __init__(self, image=None, **kw): - - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - self.__mode = image.mode - self.__size = image.size - - if _pilbitmap_check(): - # fast way (requires the pilbitmap booster patch) - image.load() - kw["data"] = f"PIL:{image.im.id}" - self.__im = image # must keep a reference - else: - # slow but safe way - kw["data"] = image.tobitmap() - self.__photo = tkinter.BitmapImage(**kw) - - def __del__(self): - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def width(self): - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self): - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def __str__(self): - """ - Get the Tkinter bitmap image identifier. This method is automatically - called by Tkinter whenever a BitmapImage object is passed to a Tkinter - method. - - :return: A Tkinter bitmap image identifier (a string). - """ - return str(self.__photo) - - -def getimage(photo): - """Copies the contents of a PhotoImage to a PIL image memory.""" - im = Image.new("RGBA", (photo.width(), photo.height())) - block = im.im - - _pyimagingtkcall("PyImagingPhotoGet", photo, block.id) - - return im - - -def _show(image, title): - """Helper for the Image.show method.""" - - class UI(tkinter.Label): - def __init__(self, master, im): - if im.mode == "1": - self.image = BitmapImage(im, foreground="white", master=master) - else: - self.image = PhotoImage(im, master=master) - super().__init__(master, image=self.image, bg="black", bd=0) - - if not tkinter._default_root: - raise OSError("tkinter not initialized") - top = tkinter.Toplevel() - if title: - top.title(title) - UI(top, image).pack() diff --git a/venv/Lib/site-packages/PIL/ImageTransform.py b/venv/Lib/site-packages/PIL/ImageTransform.py deleted file mode 100644 index 7881f0d..0000000 --- a/venv/Lib/site-packages/PIL/ImageTransform.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# transform wrappers -# -# History: -# 2002-04-08 fl Created -# -# Copyright (c) 2002 by Secret Labs AB -# Copyright (c) 2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from . import Image - - -class Transform(Image.ImageTransformHandler): - def __init__(self, data): - self.data = data - - def getdata(self): - return self.method, self.data - - def transform(self, size, image, **options): - # can be overridden - method, data = self.getdata() - return image.transform(size, method, data, **options) - - -class AffineTransform(Transform): - """ - Define an affine image transform. - - This function takes a 6-tuple (a, b, c, d, e, f) which contain the first - two rows from an affine transform matrix. For each pixel (x, y) in the - output image, the new value is taken from a position (a x + b y + c, - d x + e y + f) in the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`~PIL.Image.Image.transform` - - :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows - from an affine transform matrix. - """ - - method = Image.Transform.AFFINE - - -class ExtentTransform(Transform): - """ - Define a transform to extract a subregion from an image. - - Maps a rectangle (defined by two corners) from the image to a rectangle of - the given size. The resulting image will contain data sampled from between - the corners, such that (x0, y0) in the input image will end up at (0,0) in - the output image, and (x1, y1) at size. - - This method can be used to crop, stretch, shrink, or mirror an arbitrary - rectangle in the current image. It is slightly slower than crop, but about - as fast as a corresponding resize operation. - - See :py:meth:`~PIL.Image.Image.transform` - - :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the - input image's coordinate system. See :ref:`coordinate-system`. - """ - - method = Image.Transform.EXTENT - - -class QuadTransform(Transform): - """ - Define a quad image transform. - - Maps a quadrilateral (a region defined by four corners) from the image to a - rectangle of the given size. - - See :py:meth:`~PIL.Image.Image.transform` - - :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the - upper left, lower left, lower right, and upper right corner of the - source quadrilateral. - """ - - method = Image.Transform.QUAD - - -class MeshTransform(Transform): - """ - Define a mesh image transform. A mesh transform consists of one or more - individual quad transforms. - - See :py:meth:`~PIL.Image.Image.transform` - - :param data: A list of (bbox, quad) tuples. - """ - - method = Image.Transform.MESH diff --git a/venv/Lib/site-packages/PIL/ImageWin.py b/venv/Lib/site-packages/PIL/ImageWin.py deleted file mode 100644 index ca9b14c..0000000 --- a/venv/Lib/site-packages/PIL/ImageWin.py +++ /dev/null @@ -1,230 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Windows DIB display interface -# -# History: -# 1996-05-20 fl Created -# 1996-09-20 fl Fixed subregion exposure -# 1997-09-21 fl Added draw primitive (for tzPrint) -# 2003-05-21 fl Added experimental Window/ImageWindow classes -# 2003-09-05 fl Added fromstring/tostring methods -# -# Copyright (c) Secret Labs AB 1997-2003. -# Copyright (c) Fredrik Lundh 1996-2003. -# -# See the README file for information on usage and redistribution. -# - -from . import Image - - -class HDC: - """ - Wraps an HDC integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods. - """ - - def __init__(self, dc): - self.dc = dc - - def __int__(self): - return self.dc - - -class HWND: - """ - Wraps an HWND integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods, instead of a DC. - """ - - def __init__(self, wnd): - self.wnd = wnd - - def __int__(self): - return self.wnd - - -class Dib: - """ - A Windows bitmap with the given mode and size. The mode can be one of "1", - "L", "P", or "RGB". - - If the display requires a palette, this constructor creates a suitable - palette and associates it with the image. For an "L" image, 128 greylevels - are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together - with 20 greylevels. - - To make sure that palettes work properly under Windows, you must call the - ``palette`` method upon certain events from Windows. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. The mode can be one of "1", - "L", "P", or "RGB". - :param size: If the first argument is a mode string, this - defines the size of the image. - """ - - def __init__(self, image, size=None): - if hasattr(image, "mode") and hasattr(image, "size"): - mode = image.mode - size = image.size - else: - mode = image - image = None - if mode not in ["1", "L", "P", "RGB"]: - mode = Image.getmodebase(mode) - self.image = Image.core.display(mode, size) - self.mode = mode - self.size = size - if image: - self.paste(image) - - def expose(self, handle): - """ - Copy the bitmap contents to a device context. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. In PythonWin, you can use - ``CDC.GetHandleAttrib()`` to get a suitable handle. - """ - if isinstance(handle, HWND): - dc = self.image.getdc(handle) - try: - result = self.image.expose(dc) - finally: - self.image.releasedc(handle, dc) - else: - result = self.image.expose(handle) - return result - - def draw(self, handle, dst, src=None): - """ - Same as expose, but allows you to specify where to draw the image, and - what part of it to draw. - - The destination and source areas are given as 4-tuple rectangles. If - the source is omitted, the entire image is copied. If the source and - the destination have different sizes, the image is resized as - necessary. - """ - if not src: - src = (0, 0) + self.size - if isinstance(handle, HWND): - dc = self.image.getdc(handle) - try: - result = self.image.draw(dc, dst, src) - finally: - self.image.releasedc(handle, dc) - else: - result = self.image.draw(handle, dst, src) - return result - - def query_palette(self, handle): - """ - Installs the palette associated with the image in the given device - context. - - This method should be called upon **QUERYNEWPALETTE** and - **PALETTECHANGED** events from Windows. If this method returns a - non-zero value, one or more display palette entries were changed, and - the image should be redrawn. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. - :return: A true value if one or more entries were changed (this - indicates that the image should be redrawn). - """ - if isinstance(handle, HWND): - handle = self.image.getdc(handle) - try: - result = self.image.query_palette(handle) - finally: - self.image.releasedc(handle, handle) - else: - result = self.image.query_palette(handle) - return result - - def paste(self, im, box=None): - """ - Paste a PIL image into the bitmap image. - - :param im: A PIL image. The size must match the target region. - If the mode does not match, the image is converted to the - mode of the bitmap image. - :param box: A 4-tuple defining the left, upper, right, and - lower pixel coordinate. See :ref:`coordinate-system`. If - None is given instead of a tuple, all of the image is - assumed. - """ - im.load() - if self.mode != im.mode: - im = im.convert(self.mode) - if box: - self.image.paste(im.im, box) - else: - self.image.paste(im.im) - - def frombytes(self, buffer): - """ - Load display memory contents from byte data. - - :param buffer: A buffer containing display data (usually - data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) - """ - return self.image.frombytes(buffer) - - def tobytes(self): - """ - Copy display memory contents to bytes object. - - :return: A bytes object containing display data. - """ - return self.image.tobytes() - - -class Window: - """Create a Window with the given title size.""" - - def __init__(self, title="PIL", width=None, height=None): - self.hwnd = Image.core.createwindow( - title, self.__dispatcher, width or 0, height or 0 - ) - - def __dispatcher(self, action, *args): - return getattr(self, "ui_handle_" + action)(*args) - - def ui_handle_clear(self, dc, x0, y0, x1, y1): - pass - - def ui_handle_damage(self, x0, y0, x1, y1): - pass - - def ui_handle_destroy(self): - pass - - def ui_handle_repair(self, dc, x0, y0, x1, y1): - pass - - def ui_handle_resize(self, width, height): - pass - - def mainloop(self): - Image.core.eventloop() - - -class ImageWindow(Window): - """Create an image window which displays the given image.""" - - def __init__(self, image, title="PIL"): - if not isinstance(image, Dib): - image = Dib(image) - self.image = image - width, height = image.size - super().__init__(title, width=width, height=height) - - def ui_handle_repair(self, dc, x0, y0, x1, y1): - self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/venv/Lib/site-packages/PIL/ImtImagePlugin.py b/venv/Lib/site-packages/PIL/ImtImagePlugin.py deleted file mode 100644 index 5790acd..0000000 --- a/venv/Lib/site-packages/PIL/ImtImagePlugin.py +++ /dev/null @@ -1,93 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IM Tools support for PIL -# -# history: -# 1996-05-27 fl Created (read 8-bit images only) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# - - -import re - -from . import Image, ImageFile - -# -# -------------------------------------------------------------------- - -field = re.compile(rb"([a-z]*) ([^ \r\n]*)") - - -## -# Image plugin for IM Tools images. - - -class ImtImageFile(ImageFile.ImageFile): - - format = "IMT" - format_description = "IM Tools" - - def _open(self): - - # Quick rejection: if there's not a LF among the first - # 100 bytes, this is (probably) not a text header. - - if b"\n" not in self.fp.read(100): - raise SyntaxError("not an IM file") - self.fp.seek(0) - - xsize = ysize = 0 - - while True: - - s = self.fp.read(1) - if not s: - break - - if s == b"\x0C": - - # image data begins - self.tile = [ - ("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1)) - ] - - break - - else: - - # read key/value pair - # FIXME: dangerous, may read whole file - s = s + self.fp.readline() - if len(s) == 1 or len(s) > 100: - break - if s[0] == ord(b"*"): - continue # comment - - m = field.match(s) - if not m: - break - k, v = m.group(1, 2) - if k == "width": - xsize = int(v) - self._size = xsize, ysize - elif k == "height": - ysize = int(v) - self._size = xsize, ysize - elif k == "pixel" and v == "n8": - self.mode = "L" - - -# -# -------------------------------------------------------------------- - -Image.register_open(ImtImageFile.format, ImtImageFile) - -# -# no extension registered (".im" is simply too common) diff --git a/venv/Lib/site-packages/PIL/IptcImagePlugin.py b/venv/Lib/site-packages/PIL/IptcImagePlugin.py deleted file mode 100644 index 0bbe506..0000000 --- a/venv/Lib/site-packages/PIL/IptcImagePlugin.py +++ /dev/null @@ -1,230 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IPTC/NAA file handling -# -# history: -# 1995-10-01 fl Created -# 1998-03-09 fl Cleaned up and added to PIL -# 2002-06-18 fl Added getiptcinfo helper -# -# Copyright (c) Secret Labs AB 1997-2002. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# -import os -import tempfile - -from . import Image, ImageFile -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 - -COMPRESSION = {1: "raw", 5: "jpeg"} - -PAD = o8(0) * 4 - - -# -# Helpers - - -def i(c): - return i32((PAD + c)[-4:]) - - -def dump(c): - for i in c: - print("%02x" % i8(i), end=" ") - print() - - -## -# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields -# from TIFF and JPEG files, use the getiptcinfo function. - - -class IptcImageFile(ImageFile.ImageFile): - - format = "IPTC" - format_description = "IPTC/NAA" - - def getint(self, key): - return i(self.info[key]) - - def field(self): - # - # get a IPTC field header - s = self.fp.read(5) - if not len(s): - return None, 0 - - tag = s[1], s[2] - - # syntax - if s[0] != 0x1C or tag[0] < 1 or tag[0] > 9: - raise SyntaxError("invalid IPTC/NAA file") - - # field size - size = s[3] - if size > 132: - raise OSError("illegal field length in IPTC/NAA file") - elif size == 128: - size = 0 - elif size > 128: - size = i(self.fp.read(size - 128)) - else: - size = i16(s, 3) - - return tag, size - - def _open(self): - - # load descriptive fields - while True: - offset = self.fp.tell() - tag, size = self.field() - if not tag or tag == (8, 10): - break - if size: - tagdata = self.fp.read(size) - else: - tagdata = None - if tag in self.info: - if isinstance(self.info[tag], list): - self.info[tag].append(tagdata) - else: - self.info[tag] = [self.info[tag], tagdata] - else: - self.info[tag] = tagdata - - # mode - layers = i8(self.info[(3, 60)][0]) - component = i8(self.info[(3, 60)][1]) - if (3, 65) in self.info: - id = i8(self.info[(3, 65)][0]) - 1 - else: - id = 0 - if layers == 1 and not component: - self.mode = "L" - elif layers == 3 and component: - self.mode = "RGB"[id] - elif layers == 4 and component: - self.mode = "CMYK"[id] - - # size - self._size = self.getint((3, 20)), self.getint((3, 30)) - - # compression - try: - compression = COMPRESSION[self.getint((3, 120))] - except KeyError as e: - raise OSError("Unknown IPTC image compression") from e - - # tile - if tag == (8, 10): - self.tile = [ - ("iptc", (compression, offset), (0, 0, self.size[0], self.size[1])) - ] - - def load(self): - - if len(self.tile) != 1 or self.tile[0][0] != "iptc": - return ImageFile.ImageFile.load(self) - - type, tile, box = self.tile[0] - - encoding, offset = tile - - self.fp.seek(offset) - - # Copy image data to temporary file - o_fd, outfile = tempfile.mkstemp(text=False) - o = os.fdopen(o_fd) - if encoding == "raw": - # To simplify access to the extracted file, - # prepend a PPM header - o.write("P5\n%d %d\n255\n" % self.size) - while True: - type, size = self.field() - if type != (8, 10): - break - while size > 0: - s = self.fp.read(min(size, 8192)) - if not s: - break - o.write(s) - size -= len(s) - o.close() - - try: - with Image.open(outfile) as _im: - _im.load() - self.im = _im.im - finally: - try: - os.unlink(outfile) - except OSError: - pass - - -Image.register_open(IptcImageFile.format, IptcImageFile) - -Image.register_extension(IptcImageFile.format, ".iim") - - -def getiptcinfo(im): - """ - Get IPTC information from TIFF, JPEG, or IPTC file. - - :param im: An image containing IPTC data. - :returns: A dictionary containing IPTC information, or None if - no IPTC information block was found. - """ - import io - - from . import JpegImagePlugin, TiffImagePlugin - - data = None - - if isinstance(im, IptcImageFile): - # return info dictionary right away - return im.info - - elif isinstance(im, JpegImagePlugin.JpegImageFile): - # extract the IPTC/NAA resource - photoshop = im.info.get("photoshop") - if photoshop: - data = photoshop.get(0x0404) - - elif isinstance(im, TiffImagePlugin.TiffImageFile): - # get raw data from the IPTC/NAA tag (PhotoShop tags the data - # as 4-byte integers, so we cannot use the get method...) - try: - data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] - except (AttributeError, KeyError): - pass - - if data is None: - return None # no properties - - # create an IptcImagePlugin object without initializing it - class FakeImage: - pass - - im = FakeImage() - im.__class__ = IptcImageFile - - # parse the IPTC information chunk - im.info = {} - im.fp = io.BytesIO(data) - - try: - im._open() - except (IndexError, KeyError): - pass # expected failure - - return im.info diff --git a/venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py b/venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py deleted file mode 100644 index fb5d70c..0000000 --- a/venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py +++ /dev/null @@ -1,362 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# JPEG2000 file handling -# -# History: -# 2014-03-12 ajh Created -# 2021-06-30 rogermb Extract dpi information from the 'resc' header box -# -# Copyright (c) 2014 Coriolis Systems Limited -# Copyright (c) 2014 Alastair Houghton -# -# See the README file for information on usage and redistribution. -# -import io -import os -import struct - -from . import Image, ImageFile - - -class BoxReader: - """ - A small helper class to read fields stored in JPEG2000 header boxes - and to easily step into and read sub-boxes. - """ - - def __init__(self, fp, length=-1): - self.fp = fp - self.has_length = length >= 0 - self.length = length - self.remaining_in_box = -1 - - def _can_read(self, num_bytes): - if self.has_length and self.fp.tell() + num_bytes > self.length: - # Outside box: ensure we don't read past the known file length - return False - if self.remaining_in_box >= 0: - # Inside box contents: ensure read does not go past box boundaries - return num_bytes <= self.remaining_in_box - else: - return True # No length known, just read - - def _read_bytes(self, num_bytes): - if not self._can_read(num_bytes): - raise SyntaxError("Not enough data in header") - - data = self.fp.read(num_bytes) - if len(data) < num_bytes: - raise OSError( - f"Expected to read {num_bytes} bytes but only got {len(data)}." - ) - - if self.remaining_in_box > 0: - self.remaining_in_box -= num_bytes - return data - - def read_fields(self, field_format): - size = struct.calcsize(field_format) - data = self._read_bytes(size) - return struct.unpack(field_format, data) - - def read_boxes(self): - size = self.remaining_in_box - data = self._read_bytes(size) - return BoxReader(io.BytesIO(data), size) - - def has_next_box(self): - if self.has_length: - return self.fp.tell() + self.remaining_in_box < self.length - else: - return True - - def next_box_type(self): - # Skip the rest of the box if it has not been read - if self.remaining_in_box > 0: - self.fp.seek(self.remaining_in_box, os.SEEK_CUR) - self.remaining_in_box = -1 - - # Read the length and type of the next box - lbox, tbox = self.read_fields(">I4s") - if lbox == 1: - lbox = self.read_fields(">Q")[0] - hlen = 16 - else: - hlen = 8 - - if lbox < hlen or not self._can_read(lbox - hlen): - raise SyntaxError("Invalid header length") - - self.remaining_in_box = lbox - hlen - return tbox - - -def _parse_codestream(fp): - """Parse the JPEG 2000 codestream to extract the size and component - count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" - - hdr = fp.read(2) - lsiz = struct.unpack(">H", hdr)[0] - siz = hdr + fp.read(lsiz - 2) - lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( - ">HHIIIIIIIIH", siz - ) - ssiz = [None] * csiz - xrsiz = [None] * csiz - yrsiz = [None] * csiz - for i in range(csiz): - ssiz[i], xrsiz[i], yrsiz[i] = struct.unpack_from(">BBB", siz, 36 + 3 * i) - - size = (xsiz - xosiz, ysiz - yosiz) - if csiz == 1: - if (yrsiz[0] & 0x7F) > 8: - mode = "I;16" - else: - mode = "L" - elif csiz == 2: - mode = "LA" - elif csiz == 3: - mode = "RGB" - elif csiz == 4: - mode = "RGBA" - else: - mode = None - - return (size, mode) - - -def _res_to_dpi(num, denom, exp): - """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, - calculated as (num / denom) * 10^exp and stored in dots per meter, - to floating-point dots per inch.""" - if denom != 0: - return (254 * num * (10**exp)) / (10000 * denom) - - -def _parse_jp2_header(fp): - """Parse the JP2 header box to extract size, component count, - color space information, and optionally DPI information, - returning a (size, mode, mimetype, dpi) tuple.""" - - # Find the JP2 header box - reader = BoxReader(fp) - header = None - mimetype = None - while reader.has_next_box(): - tbox = reader.next_box_type() - - if tbox == b"jp2h": - header = reader.read_boxes() - break - elif tbox == b"ftyp": - if reader.read_fields(">4s")[0] == b"jpx ": - mimetype = "image/jpx" - - size = None - mode = None - bpc = None - nc = None - dpi = None # 2-tuple of DPI info, or None - - while header.has_next_box(): - tbox = header.next_box_type() - - if tbox == b"ihdr": - height, width, nc, bpc = header.read_fields(">IIHB") - size = (width, height) - if nc == 1 and (bpc & 0x7F) > 8: - mode = "I;16" - elif nc == 1: - mode = "L" - elif nc == 2: - mode = "LA" - elif nc == 3: - mode = "RGB" - elif nc == 4: - mode = "RGBA" - elif tbox == b"res ": - res = header.read_boxes() - while res.has_next_box(): - tres = res.next_box_type() - if tres == b"resc": - vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") - hres = _res_to_dpi(hrcn, hrcd, hrce) - vres = _res_to_dpi(vrcn, vrcd, vrce) - if hres is not None and vres is not None: - dpi = (hres, vres) - break - - if size is None or mode is None: - raise SyntaxError("Malformed JP2 header") - - return (size, mode, mimetype, dpi) - - -## -# Image plugin for JPEG2000 images. - - -class Jpeg2KImageFile(ImageFile.ImageFile): - format = "JPEG2000" - format_description = "JPEG 2000 (ISO 15444)" - - def _open(self): - sig = self.fp.read(4) - if sig == b"\xff\x4f\xff\x51": - self.codec = "j2k" - self._size, self.mode = _parse_codestream(self.fp) - else: - sig = sig + self.fp.read(8) - - if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": - self.codec = "jp2" - header = _parse_jp2_header(self.fp) - self._size, self.mode, self.custom_mimetype, dpi = header - if dpi is not None: - self.info["dpi"] = dpi - else: - raise SyntaxError("not a JPEG 2000 file") - - if self.size is None or self.mode is None: - raise SyntaxError("unable to determine size/mode") - - self._reduce = 0 - self.layers = 0 - - fd = -1 - length = -1 - - try: - fd = self.fp.fileno() - length = os.fstat(fd).st_size - except Exception: - fd = -1 - try: - pos = self.fp.tell() - self.fp.seek(0, io.SEEK_END) - length = self.fp.tell() - self.fp.seek(pos) - except Exception: - length = -1 - - self.tile = [ - ( - "jpeg2k", - (0, 0) + self.size, - 0, - (self.codec, self._reduce, self.layers, fd, length), - ) - ] - - @property - def reduce(self): - # https://github.com/python-pillow/Pillow/issues/4343 found that the - # new Image 'reduce' method was shadowed by this plugin's 'reduce' - # property. This attempts to allow for both scenarios - return self._reduce or super().reduce - - @reduce.setter - def reduce(self, value): - self._reduce = value - - def load(self): - if self.tile and self._reduce: - power = 1 << self._reduce - adjust = power >> 1 - self._size = ( - int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power), - ) - - # Update the reduce and layers settings - t = self.tile[0] - t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) - self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] - - return ImageFile.ImageFile.load(self) - - -def _accept(prefix): - return ( - prefix[:4] == b"\xff\x4f\xff\x51" - or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ) - - -# ------------------------------------------------------------ -# Save support - - -def _save(im, fp, filename): - # Get the keyword arguments - info = im.encoderinfo - - if filename.endswith(".j2k") or info.get("no_jp2", False): - kind = "j2k" - else: - kind = "jp2" - - offset = info.get("offset", None) - tile_offset = info.get("tile_offset", None) - tile_size = info.get("tile_size", None) - quality_mode = info.get("quality_mode", "rates") - quality_layers = info.get("quality_layers", None) - if quality_layers is not None and not ( - isinstance(quality_layers, (list, tuple)) - and all( - [ - isinstance(quality_layer, (int, float)) - for quality_layer in quality_layers - ] - ) - ): - raise ValueError("quality_layers must be a sequence of numbers") - - num_resolutions = info.get("num_resolutions", 0) - cblk_size = info.get("codeblock_size", None) - precinct_size = info.get("precinct_size", None) - irreversible = info.get("irreversible", False) - progression = info.get("progression", "LRCP") - cinema_mode = info.get("cinema_mode", "no") - mct = info.get("mct", 0) - fd = -1 - - if hasattr(fp, "fileno"): - try: - fd = fp.fileno() - except Exception: - fd = -1 - - im.encoderconfig = ( - offset, - tile_offset, - tile_size, - quality_mode, - quality_layers, - num_resolutions, - cblk_size, - precinct_size, - irreversible, - progression, - cinema_mode, - mct, - fd, - ) - - ImageFile._save(im, fp, [("jpeg2k", (0, 0) + im.size, 0, kind)]) - - -# ------------------------------------------------------------ -# Registry stuff - - -Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) -Image.register_save(Jpeg2KImageFile.format, _save) - -Image.register_extensions( - Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] -) - -Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/venv/Lib/site-packages/PIL/JpegImagePlugin.py b/venv/Lib/site-packages/PIL/JpegImagePlugin.py deleted file mode 100644 index 93741ec..0000000 --- a/venv/Lib/site-packages/PIL/JpegImagePlugin.py +++ /dev/null @@ -1,830 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# JPEG (JFIF) file handling -# -# See "Digital Compression and Coding of Continuous-Tone Still Images, -# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) -# -# History: -# 1995-09-09 fl Created -# 1995-09-13 fl Added full parser -# 1996-03-25 fl Added hack to use the IJG command line utilities -# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug -# 1996-05-28 fl Added draft support, JFIF version (0.1) -# 1996-12-30 fl Added encoder options, added progression property (0.2) -# 1997-08-27 fl Save mode 1 images as BW (0.3) -# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) -# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) -# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) -# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) -# 2003-04-25 fl Added experimental EXIF decoder (0.5) -# 2003-06-06 fl Added experimental EXIF GPSinfo decoder -# 2003-09-13 fl Extract COM markers -# 2009-09-06 fl Added icc_profile support (from Florian Hoech) -# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) -# 2009-03-08 fl Added subsampling support (from Justin Huff). -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -import array -import io -import math -import os -import struct -import subprocess -import sys -import tempfile -import warnings - -from . import Image, ImageFile, TiffImagePlugin -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from .JpegPresets import presets - -# -# Parser - - -def Skip(self, marker): - n = i16(self.fp.read(2)) - 2 - ImageFile._safe_read(self.fp, n) - - -def APP(self, marker): - # - # Application marker. Store these in the APP dictionary. - # Also look for well-known application markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - app = "APP%d" % (marker & 15) - - self.app[app] = s # compatibility - self.applist.append((app, s)) - - if marker == 0xFFE0 and s[:4] == b"JFIF": - # extract JFIF information - self.info["jfif"] = version = i16(s, 5) # version - self.info["jfif_version"] = divmod(version, 256) - # extract JFIF properties - try: - jfif_unit = s[7] - jfif_density = i16(s, 8), i16(s, 10) - except Exception: - pass - else: - if jfif_unit == 1: - self.info["dpi"] = jfif_density - self.info["jfif_unit"] = jfif_unit - self.info["jfif_density"] = jfif_density - elif marker == 0xFFE1 and s[:5] == b"Exif\0": - if "exif" not in self.info: - # extract EXIF information (incomplete) - self.info["exif"] = s # FIXME: value will change - elif marker == 0xFFE2 and s[:5] == b"FPXR\0": - # extract FlashPix information (incomplete) - self.info["flashpix"] = s # FIXME: value will change - elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": - # Since an ICC profile can be larger than the maximum size of - # a JPEG marker (64K), we need provisions to split it into - # multiple markers. The format defined by the ICC specifies - # one or more APP2 markers containing the following data: - # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) - # Marker sequence number 1, 2, etc (1 byte) - # Number of markers Total of APP2's used (1 byte) - # Profile data (remainder of APP2 data) - # Decoders should use the marker sequence numbers to - # reassemble the profile, rather than assuming that the APP2 - # markers appear in the correct sequence. - self.icclist.append(s) - elif marker == 0xFFED and s[:14] == b"Photoshop 3.0\x00": - # parse the image resource block - offset = 14 - photoshop = self.info.setdefault("photoshop", {}) - while s[offset : offset + 4] == b"8BIM": - try: - offset += 4 - # resource code - code = i16(s, offset) - offset += 2 - # resource name (usually empty) - name_len = s[offset] - # name = s[offset+1:offset+1+name_len] - offset += 1 + name_len - offset += offset & 1 # align - # resource data block - size = i32(s, offset) - offset += 4 - data = s[offset : offset + size] - if code == 0x03ED: # ResolutionInfo - data = { - "XResolution": i32(data, 0) / 65536, - "DisplayedUnitsX": i16(data, 4), - "YResolution": i32(data, 8) / 65536, - "DisplayedUnitsY": i16(data, 12), - } - photoshop[code] = data - offset += size - offset += offset & 1 # align - except struct.error: - break # insufficient data - - elif marker == 0xFFEE and s[:5] == b"Adobe": - self.info["adobe"] = i16(s, 5) - # extract Adobe custom properties - try: - adobe_transform = s[11] - except IndexError: - pass - else: - self.info["adobe_transform"] = adobe_transform - elif marker == 0xFFE2 and s[:4] == b"MPF\0": - # extract MPO information - self.info["mp"] = s[4:] - # offset is current location minus buffer size - # plus constant header size - self.info["mpoffset"] = self.fp.tell() - n + 4 - - # If DPI isn't in JPEG header, fetch from EXIF - if "dpi" not in self.info and "exif" in self.info: - try: - exif = self.getexif() - resolution_unit = exif[0x0128] - x_resolution = exif[0x011A] - try: - dpi = float(x_resolution[0]) / x_resolution[1] - except TypeError: - dpi = x_resolution - if math.isnan(dpi): - raise ValueError - if resolution_unit == 3: # cm - # 1 dpcm = 2.54 dpi - dpi *= 2.54 - self.info["dpi"] = dpi, dpi - except (TypeError, KeyError, SyntaxError, ValueError, ZeroDivisionError): - # SyntaxError for invalid/unreadable EXIF - # KeyError for dpi not included - # ZeroDivisionError for invalid dpi rational value - # ValueError or TypeError for dpi being an invalid float - self.info["dpi"] = 72, 72 - - -def COM(self, marker): - # - # Comment marker. Store these in the APP dictionary. - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - self.info["comment"] = s - self.app["COM"] = s # compatibility - self.applist.append(("COM", s)) - - -def SOF(self, marker): - # - # Start of frame marker. Defines the size and mode of the - # image. JPEG is colour blind, so we use some simple - # heuristics to map the number of layers to an appropriate - # mode. Note that this could be made a bit brighter, by - # looking for JFIF and Adobe APP markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - self._size = i16(s, 3), i16(s, 1) - - self.bits = s[0] - if self.bits != 8: - raise SyntaxError(f"cannot handle {self.bits}-bit layers") - - self.layers = s[5] - if self.layers == 1: - self.mode = "L" - elif self.layers == 3: - self.mode = "RGB" - elif self.layers == 4: - self.mode = "CMYK" - else: - raise SyntaxError(f"cannot handle {self.layers}-layer images") - - if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: - self.info["progressive"] = self.info["progression"] = 1 - - if self.icclist: - # fixup icc profile - self.icclist.sort() # sort by sequence number - if self.icclist[0][13] == len(self.icclist): - profile = [] - for p in self.icclist: - profile.append(p[14:]) - icc_profile = b"".join(profile) - else: - icc_profile = None # wrong number of fragments - self.info["icc_profile"] = icc_profile - self.icclist = [] - - for i in range(6, len(s), 3): - t = s[i : i + 3] - # 4-tuples: id, vsamp, hsamp, qtable - self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) - - -def DQT(self, marker): - # - # Define quantization table. Note that there might be more - # than one table in each marker. - - # FIXME: The quantization tables can be used to estimate the - # compression quality. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - while len(s): - v = s[0] - precision = 1 if (v // 16 == 0) else 2 # in bytes - qt_length = 1 + precision * 64 - if len(s) < qt_length: - raise SyntaxError("bad quantization table marker") - data = array.array("B" if precision == 1 else "H", s[1:qt_length]) - if sys.byteorder == "little" and precision > 1: - data.byteswap() # the values are always big-endian - self.quantization[v & 15] = [data[i] for i in zigzag_index] - s = s[qt_length:] - - -# -# JPEG marker table - -MARKER = { - 0xFFC0: ("SOF0", "Baseline DCT", SOF), - 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), - 0xFFC2: ("SOF2", "Progressive DCT", SOF), - 0xFFC3: ("SOF3", "Spatial lossless", SOF), - 0xFFC4: ("DHT", "Define Huffman table", Skip), - 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), - 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), - 0xFFC7: ("SOF7", "Differential spatial", SOF), - 0xFFC8: ("JPG", "Extension", None), - 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), - 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), - 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), - 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), - 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), - 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), - 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), - 0xFFD0: ("RST0", "Restart 0", None), - 0xFFD1: ("RST1", "Restart 1", None), - 0xFFD2: ("RST2", "Restart 2", None), - 0xFFD3: ("RST3", "Restart 3", None), - 0xFFD4: ("RST4", "Restart 4", None), - 0xFFD5: ("RST5", "Restart 5", None), - 0xFFD6: ("RST6", "Restart 6", None), - 0xFFD7: ("RST7", "Restart 7", None), - 0xFFD8: ("SOI", "Start of image", None), - 0xFFD9: ("EOI", "End of image", None), - 0xFFDA: ("SOS", "Start of scan", Skip), - 0xFFDB: ("DQT", "Define quantization table", DQT), - 0xFFDC: ("DNL", "Define number of lines", Skip), - 0xFFDD: ("DRI", "Define restart interval", Skip), - 0xFFDE: ("DHP", "Define hierarchical progression", SOF), - 0xFFDF: ("EXP", "Expand reference component", Skip), - 0xFFE0: ("APP0", "Application segment 0", APP), - 0xFFE1: ("APP1", "Application segment 1", APP), - 0xFFE2: ("APP2", "Application segment 2", APP), - 0xFFE3: ("APP3", "Application segment 3", APP), - 0xFFE4: ("APP4", "Application segment 4", APP), - 0xFFE5: ("APP5", "Application segment 5", APP), - 0xFFE6: ("APP6", "Application segment 6", APP), - 0xFFE7: ("APP7", "Application segment 7", APP), - 0xFFE8: ("APP8", "Application segment 8", APP), - 0xFFE9: ("APP9", "Application segment 9", APP), - 0xFFEA: ("APP10", "Application segment 10", APP), - 0xFFEB: ("APP11", "Application segment 11", APP), - 0xFFEC: ("APP12", "Application segment 12", APP), - 0xFFED: ("APP13", "Application segment 13", APP), - 0xFFEE: ("APP14", "Application segment 14", APP), - 0xFFEF: ("APP15", "Application segment 15", APP), - 0xFFF0: ("JPG0", "Extension 0", None), - 0xFFF1: ("JPG1", "Extension 1", None), - 0xFFF2: ("JPG2", "Extension 2", None), - 0xFFF3: ("JPG3", "Extension 3", None), - 0xFFF4: ("JPG4", "Extension 4", None), - 0xFFF5: ("JPG5", "Extension 5", None), - 0xFFF6: ("JPG6", "Extension 6", None), - 0xFFF7: ("JPG7", "Extension 7", None), - 0xFFF8: ("JPG8", "Extension 8", None), - 0xFFF9: ("JPG9", "Extension 9", None), - 0xFFFA: ("JPG10", "Extension 10", None), - 0xFFFB: ("JPG11", "Extension 11", None), - 0xFFFC: ("JPG12", "Extension 12", None), - 0xFFFD: ("JPG13", "Extension 13", None), - 0xFFFE: ("COM", "Comment", COM), -} - - -def _accept(prefix): - # Magic number was taken from https://en.wikipedia.org/wiki/JPEG - return prefix[0:3] == b"\xFF\xD8\xFF" - - -## -# Image plugin for JPEG and JFIF images. - - -class JpegImageFile(ImageFile.ImageFile): - - format = "JPEG" - format_description = "JPEG (ISO 10918)" - - def _open(self): - - s = self.fp.read(3) - - if not _accept(s): - raise SyntaxError("not a JPEG file") - s = b"\xFF" - - # Create attributes - self.bits = self.layers = 0 - - # JPEG specifics (internal) - self.layer = [] - self.huffman_dc = {} - self.huffman_ac = {} - self.quantization = {} - self.app = {} # compatibility - self.applist = [] - self.icclist = [] - - while True: - - i = s[0] - if i == 0xFF: - s = s + self.fp.read(1) - i = i16(s) - else: - # Skip non-0xFF junk - s = self.fp.read(1) - continue - - if i in MARKER: - name, description, handler = MARKER[i] - if handler is not None: - handler(self, i) - if i == 0xFFDA: # start of scan - rawmode = self.mode - if self.mode == "CMYK": - rawmode = "CMYK;I" # assume adobe conventions - self.tile = [("jpeg", (0, 0) + self.size, 0, (rawmode, ""))] - # self.__offset = self.fp.tell() - break - s = self.fp.read(1) - elif i == 0 or i == 0xFFFF: - # padded marker or junk; move on - s = b"\xff" - elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) - s = self.fp.read(1) - else: - raise SyntaxError("no marker found") - - def load_read(self, read_bytes): - """ - internal: read more image data - For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker - so libjpeg can finish decoding - """ - s = self.fp.read(read_bytes) - - if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): - # Premature EOF. - # Pretend file is finished adding EOI marker - self._ended = True - return b"\xFF\xD9" - - return s - - def draft(self, mode, size): - - if len(self.tile) != 1: - return - - # Protect from second call - if self.decoderconfig: - return - - d, e, o, a = self.tile[0] - scale = 1 - original_size = self.size - - if a[0] == "RGB" and mode in ["L", "YCbCr"]: - self.mode = mode - a = mode, "" - - if size: - scale = min(self.size[0] // size[0], self.size[1] // size[1]) - for s in [8, 4, 2, 1]: - if scale >= s: - break - e = ( - e[0], - e[1], - (e[2] - e[0] + s - 1) // s + e[0], - (e[3] - e[1] + s - 1) // s + e[1], - ) - self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) - scale = s - - self.tile = [(d, e, o, a)] - self.decoderconfig = (scale, 0) - - box = (0, 0, original_size[0] / scale, original_size[1] / scale) - return (self.mode, box) - - def load_djpeg(self): - - # ALTERNATIVE: handle JPEGs via the IJG command line utilities - - f, path = tempfile.mkstemp() - os.close(f) - if os.path.exists(self.filename): - subprocess.check_call(["djpeg", "-outfile", path, self.filename]) - else: - raise ValueError("Invalid Filename") - - try: - with Image.open(path) as _im: - _im.load() - self.im = _im.im - finally: - try: - os.unlink(path) - except OSError: - pass - - self.mode = self.im.mode - self._size = self.im.size - - self.tile = [] - - def _getexif(self): - return _getexif(self) - - def _getmp(self): - return _getmp(self) - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - - for segment, content in self.applist: - if segment == "APP1": - marker, xmp_tags = content.rsplit(b"\x00", 1) - if marker == b"http://ns.adobe.com/xap/1.0/": - return self._getxmp(xmp_tags) - return {} - - -def _getexif(self): - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - -def _getmp(self): - # Extract MP information. This method was inspired by the "highly - # experimental" _getexif version that's been in use for years now, - # itself based on the ImageFileDirectory class in the TIFF plugin. - - # The MP record essentially consists of a TIFF file embedded in a JPEG - # application marker. - try: - data = self.info["mp"] - except KeyError: - return None - file_contents = io.BytesIO(data) - head = file_contents.read(8) - endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<" - # process dictionary - try: - info = TiffImagePlugin.ImageFileDirectory_v2(head) - file_contents.seek(info.next) - info.load(file_contents) - mp = dict(info) - except Exception as e: - raise SyntaxError("malformed MP Index (unreadable directory)") from e - # it's an error not to have a number of images - try: - quant = mp[0xB001] - except KeyError as e: - raise SyntaxError("malformed MP Index (no number of images)") from e - # get MP entries - mpentries = [] - try: - rawmpentries = mp[0xB002] - for entrynum in range(0, quant): - unpackedentry = struct.unpack_from( - f"{endianness}LLLHH", rawmpentries, entrynum * 16 - ) - labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") - mpentry = dict(zip(labels, unpackedentry)) - mpentryattr = { - "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), - "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), - "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), - "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, - "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, - "MPType": mpentry["Attribute"] & 0x00FFFFFF, - } - if mpentryattr["ImageDataFormat"] == 0: - mpentryattr["ImageDataFormat"] = "JPEG" - else: - raise SyntaxError("unsupported picture format in MPO") - mptypemap = { - 0x000000: "Undefined", - 0x010001: "Large Thumbnail (VGA Equivalent)", - 0x010002: "Large Thumbnail (Full HD Equivalent)", - 0x020001: "Multi-Frame Image (Panorama)", - 0x020002: "Multi-Frame Image: (Disparity)", - 0x020003: "Multi-Frame Image: (Multi-Angle)", - 0x030000: "Baseline MP Primary Image", - } - mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") - mpentry["Attribute"] = mpentryattr - mpentries.append(mpentry) - mp[0xB002] = mpentries - except KeyError as e: - raise SyntaxError("malformed MP Index (bad MP Entry)") from e - # Next we should try and parse the individual image unique ID list; - # we don't because I've never seen this actually used in a real MPO - # file and so can't test it. - return mp - - -# -------------------------------------------------------------------- -# stuff to save JPEG files - -RAWMODE = { - "1": "L", - "L": "L", - "RGB": "RGB", - "RGBX": "RGB", - "CMYK": "CMYK;I", # assume adobe conventions - "YCbCr": "YCbCr", -} - -# fmt: off -zigzag_index = ( - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63, -) - -samplings = { - (1, 1, 1, 1, 1, 1): 0, - (2, 1, 1, 1, 1, 1): 1, - (2, 2, 1, 1, 1, 1): 2, -} -# fmt: on - - -def convert_dict_qtables(qtables): - warnings.warn( - "convert_dict_qtables is deprecated and will be removed in Pillow 10" - "(2023-07-01). Conversion is no longer needed.", - DeprecationWarning, - ) - return qtables - - -def get_sampling(im): - # There's no subsampling when images have only 1 layer - # (grayscale images) or when they are CMYK (4 layers), - # so set subsampling to the default value. - # - # NOTE: currently Pillow can't encode JPEG to YCCK format. - # If YCCK support is added in the future, subsampling code will have - # to be updated (here and in JpegEncode.c) to deal with 4 layers. - if not hasattr(im, "layers") or im.layers in (1, 4): - return -1 - sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] - return samplings.get(sampling, -1) - - -def _save(im, fp, filename): - if im.width == 0 or im.height == 0: - raise ValueError("cannot write empty image as JPEG") - - try: - rawmode = RAWMODE[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as JPEG") from e - - info = im.encoderinfo - - dpi = [round(x) for x in info.get("dpi", (0, 0))] - - quality = info.get("quality", -1) - subsampling = info.get("subsampling", -1) - qtables = info.get("qtables") - - if quality == "keep": - quality = -1 - subsampling = "keep" - qtables = "keep" - elif quality in presets: - preset = presets[quality] - quality = -1 - subsampling = preset.get("subsampling", -1) - qtables = preset.get("quantization") - elif not isinstance(quality, int): - raise ValueError("Invalid quality setting") - else: - if subsampling in presets: - subsampling = presets[subsampling].get("subsampling", -1) - if isinstance(qtables, str) and qtables in presets: - qtables = presets[qtables].get("quantization") - - if subsampling == "4:4:4": - subsampling = 0 - elif subsampling == "4:2:2": - subsampling = 1 - elif subsampling == "4:2:0": - subsampling = 2 - elif subsampling == "4:1:1": - # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. - # Set 4:2:0 if someone is still using that value. - subsampling = 2 - elif subsampling == "keep": - if im.format != "JPEG": - raise ValueError("Cannot use 'keep' when original image is not a JPEG") - subsampling = get_sampling(im) - - def validate_qtables(qtables): - if qtables is None: - return qtables - if isinstance(qtables, str): - try: - lines = [ - int(num) - for line in qtables.splitlines() - for num in line.split("#", 1)[0].split() - ] - except ValueError as e: - raise ValueError("Invalid quantization table") from e - else: - qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] - if isinstance(qtables, (tuple, list, dict)): - if isinstance(qtables, dict): - qtables = [ - qtables[key] for key in range(len(qtables)) if key in qtables - ] - elif isinstance(qtables, tuple): - qtables = list(qtables) - if not (0 < len(qtables) < 5): - raise ValueError("None or too many quantization tables") - for idx, table in enumerate(qtables): - try: - if len(table) != 64: - raise TypeError - table = array.array("H", table) - except TypeError as e: - raise ValueError("Invalid quantization table") from e - else: - qtables[idx] = list(table) - return qtables - - if qtables == "keep": - if im.format != "JPEG": - raise ValueError("Cannot use 'keep' when original image is not a JPEG") - qtables = getattr(im, "quantization", None) - qtables = validate_qtables(qtables) - - extra = b"" - - icc_profile = info.get("icc_profile") - if icc_profile: - ICC_OVERHEAD_LEN = 14 - MAX_BYTES_IN_MARKER = 65533 - MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN - markers = [] - while icc_profile: - markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) - icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] - i = 1 - for marker in markers: - size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker)) - extra += ( - b"\xFF\xE2" - + size - + b"ICC_PROFILE\0" - + o8(i) - + o8(len(markers)) - + marker - ) - i += 1 - - # "progressive" is the official name, but older documentation - # says "progression" - # FIXME: issue a warning if the wrong form is used (post-1.1.7) - progressive = info.get("progressive", False) or info.get("progression", False) - - optimize = info.get("optimize", False) - - exif = info.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - - # get keyword arguments - im.encoderconfig = ( - quality, - progressive, - info.get("smooth", 0), - optimize, - info.get("streamtype", 0), - dpi[0], - dpi[1], - subsampling, - qtables, - extra, - exif, - ) - - # if we optimize, libjpeg needs a buffer big enough to hold the whole image - # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is - # channels*size, this is a value that's been used in a django patch. - # https://github.com/matthewwithanm/django-imagekit/issues/50 - bufsize = 0 - if optimize or progressive: - # CMYK can be bigger - if im.mode == "CMYK": - bufsize = 4 * im.size[0] * im.size[1] - # keep sets quality to -1, but the actual value may be high. - elif quality >= 95 or quality == -1: - bufsize = 2 * im.size[0] * im.size[1] - else: - bufsize = im.size[0] * im.size[1] - - # The EXIF info needs to be written as one block, + APP1, + one spare byte. - # Ensure that our buffer is big enough. Same with the icc_profile block. - bufsize = max(ImageFile.MAXBLOCK, bufsize, len(exif) + 5, len(extra) + 1) - - ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize) - - -def _save_cjpeg(im, fp, filename): - # ALTERNATIVE: handle JPEGs via the IJG command line utilities. - tempfile = im._dump() - subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) - try: - os.unlink(tempfile) - except OSError: - pass - - -## -# Factory for making JPEG and MPO instances -def jpeg_factory(fp=None, filename=None): - im = JpegImageFile(fp, filename) - try: - mpheader = im._getmp() - if mpheader[45057] > 1: - # It's actually an MPO - from .MpoImagePlugin import MpoImageFile - - # Don't reload everything, just convert it. - im = MpoImageFile.adopt(im, mpheader) - except (TypeError, IndexError): - # It is really a JPEG - pass - except SyntaxError: - warnings.warn( - "Image appears to be a malformed MPO file, it will be " - "interpreted as a base JPEG file" - ) - return im - - -# --------------------------------------------------------------------- -# Registry stuff - -Image.register_open(JpegImageFile.format, jpeg_factory, _accept) -Image.register_save(JpegImageFile.format, _save) - -Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) - -Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/venv/Lib/site-packages/PIL/JpegPresets.py b/venv/Lib/site-packages/PIL/JpegPresets.py deleted file mode 100644 index e5a5d17..0000000 --- a/venv/Lib/site-packages/PIL/JpegPresets.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -JPEG quality settings equivalent to the Photoshop settings. -Can be used when saving JPEG files. - -The following presets are available by default: -``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, -``low``, ``medium``, ``high``, ``maximum``. -More presets can be added to the :py:data:`presets` dict if needed. - -To apply the preset, specify:: - - quality="preset_name" - -To apply only the quantization table:: - - qtables="preset_name" - -To apply only the subsampling setting:: - - subsampling="preset_name" - -Example:: - - im.save("image_name.jpg", quality="web_high") - -Subsampling ------------ - -Subsampling is the practice of encoding images by implementing less resolution -for chroma information than for luma information. -(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) - -Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and -4:2:0. - -You can get the subsampling of a JPEG with the -:func:`.JpegImagePlugin.get_sampling` function. - -In JPEG compressed data a JPEG marker is used instead of an EXIF tag. -(ref.: https://www.exiv2.org/tags.html) - - -Quantization tables -------------------- - -They are values use by the DCT (Discrete cosine transform) to remove -*unnecessary* information from the image (the lossy part of the compression). -(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, -https://en.wikipedia.org/wiki/JPEG#Quantization) - -You can get the quantization tables of a JPEG with:: - - im.quantization - -This will return a dict with a number of lists. You can pass this dict -directly as the qtables argument when saving a JPEG. - -The quantization table format in presets is a list with sublists. These formats -are interchangeable. - -Libjpeg ref.: -https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html - -""" - -# fmt: off -presets = { - 'web_low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [20, 16, 25, 39, 50, 46, 62, 68, - 16, 18, 23, 38, 38, 53, 65, 68, - 25, 23, 31, 38, 53, 65, 68, 68, - 39, 38, 38, 53, 65, 68, 68, 68, - 50, 38, 53, 65, 68, 68, 68, 68, - 46, 53, 65, 68, 68, 68, 68, 68, - 62, 65, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68], - [21, 25, 32, 38, 54, 68, 68, 68, - 25, 28, 24, 38, 54, 68, 68, 68, - 32, 24, 32, 43, 66, 68, 68, 68, - 38, 38, 43, 53, 68, 68, 68, 68, - 54, 54, 66, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68] - ]}, - 'web_medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [16, 11, 11, 16, 23, 27, 31, 30, - 11, 12, 12, 15, 20, 23, 23, 30, - 11, 12, 13, 16, 23, 26, 35, 47, - 16, 15, 16, 23, 26, 37, 47, 64, - 23, 20, 23, 26, 39, 51, 64, 64, - 27, 23, 26, 37, 51, 64, 64, 64, - 31, 23, 35, 47, 64, 64, 64, 64, - 30, 30, 47, 64, 64, 64, 64, 64], - [17, 15, 17, 21, 20, 26, 38, 48, - 15, 19, 18, 17, 20, 26, 35, 43, - 17, 18, 20, 22, 26, 30, 46, 53, - 21, 17, 22, 28, 30, 39, 53, 64, - 20, 20, 26, 30, 39, 48, 64, 64, - 26, 26, 30, 39, 48, 63, 64, 64, - 38, 35, 46, 53, 64, 64, 64, 64, - 48, 43, 53, 64, 64, 64, 64, 64] - ]}, - 'web_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 14, 19, - 6, 6, 6, 11, 12, 15, 19, 28, - 9, 8, 10, 12, 16, 20, 27, 31, - 11, 10, 12, 15, 20, 27, 31, 31, - 12, 12, 14, 19, 27, 31, 31, 31, - 16, 12, 19, 28, 31, 31, 31, 31], - [7, 7, 13, 24, 26, 31, 31, 31, - 7, 12, 16, 21, 31, 31, 31, 31, - 13, 16, 17, 31, 31, 31, 31, 31, - 24, 21, 31, 31, 31, 31, 31, 31, - 26, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31] - ]}, - 'web_very_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 11, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 11, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'web_maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 2, 2, 3, - 1, 1, 1, 1, 2, 2, 3, 3, - 1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 2, 2, 3, 3, 3, 3], - [1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 1, 2, 3, 3, 3, 3, - 1, 1, 1, 3, 3, 3, 3, 3, - 2, 2, 3, 3, 3, 3, 3, 3, - 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3] - ]}, - 'low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [18, 14, 14, 21, 30, 35, 34, 17, - 14, 16, 16, 19, 26, 23, 12, 12, - 14, 16, 17, 21, 23, 12, 12, 12, - 21, 19, 21, 23, 12, 12, 12, 12, - 30, 26, 23, 12, 12, 12, 12, 12, - 35, 23, 12, 12, 12, 12, 12, 12, - 34, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [20, 19, 22, 27, 20, 20, 17, 17, - 19, 25, 23, 14, 14, 12, 12, 12, - 22, 23, 14, 14, 12, 12, 12, 12, - 27, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [12, 8, 8, 12, 17, 21, 24, 17, - 8, 9, 9, 11, 15, 19, 12, 12, - 8, 9, 10, 12, 19, 12, 12, 12, - 12, 11, 12, 21, 12, 12, 12, 12, - 17, 15, 19, 12, 12, 12, 12, 12, - 21, 19, 12, 12, 12, 12, 12, 12, - 24, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [13, 11, 13, 16, 20, 20, 17, 17, - 11, 14, 14, 14, 14, 12, 12, 12, - 13, 14, 14, 14, 12, 12, 12, 12, - 16, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 12, 12, - 6, 6, 6, 11, 12, 12, 12, 12, - 9, 8, 10, 12, 12, 12, 12, 12, - 11, 10, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 16, 12, 12, 12, 12, 12, 12, 12], - [7, 7, 13, 24, 20, 20, 17, 17, - 7, 12, 16, 14, 14, 12, 12, 12, - 13, 16, 14, 14, 12, 12, 12, 12, - 24, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 10, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 10, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, -} -# fmt: on diff --git a/venv/Lib/site-packages/PIL/McIdasImagePlugin.py b/venv/Lib/site-packages/PIL/McIdasImagePlugin.py deleted file mode 100644 index cd047fe..0000000 --- a/venv/Lib/site-packages/PIL/McIdasImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Basic McIdas support for PIL -# -# History: -# 1997-05-05 fl Created (8-bit images only) -# 2009-03-08 fl Added 16/32-bit support. -# -# Thanks to Richard Jones and Craig Swank for specs and samples. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -import struct - -from . import Image, ImageFile - - -def _accept(s): - return s[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" - - -## -# Image plugin for McIdas area images. - - -class McIdasImageFile(ImageFile.ImageFile): - - format = "MCIDAS" - format_description = "McIdas area file" - - def _open(self): - - # parse area file directory - s = self.fp.read(256) - if not _accept(s) or len(s) != 256: - raise SyntaxError("not an McIdas area file") - - self.area_descriptor_raw = s - self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) - - # get mode - if w[11] == 1: - mode = rawmode = "L" - elif w[11] == 2: - # FIXME: add memory map support - mode = "I" - rawmode = "I;16B" - elif w[11] == 4: - # FIXME: add memory map support - mode = "I" - rawmode = "I;32B" - else: - raise SyntaxError("unsupported McIdas format") - - self.mode = mode - self._size = w[10], w[9] - - offset = w[34] + w[15] - stride = w[15] + w[10] * w[11] * w[14] - - self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] - - -# -------------------------------------------------------------------- -# registry - -Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) - -# no default extension diff --git a/venv/Lib/site-packages/PIL/MicImagePlugin.py b/venv/Lib/site-packages/PIL/MicImagePlugin.py deleted file mode 100644 index 9248b1b..0000000 --- a/venv/Lib/site-packages/PIL/MicImagePlugin.py +++ /dev/null @@ -1,107 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Microsoft Image Composer support for PIL -# -# Notes: -# uses TiffImagePlugin.py to read the actual image streams -# -# History: -# 97-01-20 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - - -import olefile - -from . import Image, TiffImagePlugin - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for Microsoft's Image Composer file format. - - -class MicImageFile(TiffImagePlugin.TiffImageFile): - - format = "MIC" - format_description = "Microsoft Image Composer" - _close_exclusive_fp_after_loading = False - - def _open(self): - - # read the OLE directory and see if this is a likely - # to be a Microsoft Image Composer file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - raise SyntaxError("not an MIC file; invalid OLE file") from e - - # find ACI subfiles with Image members (maybe not the - # best way to identify MIC files, but what the... ;-) - - self.images = [] - for path in self.ole.listdir(): - if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image": - self.images.append(path) - - # if we didn't find any images, this is probably not - # an MIC file. - if not self.images: - raise SyntaxError("not an MIC file; no image entries") - - self.__fp = self.fp - self.frame = None - self._n_frames = len(self.images) - self.is_animated = self._n_frames > 1 - - if len(self.images) > 1: - self._category = Image.CONTAINER - - self.seek(0) - - def seek(self, frame): - if not self._seek_check(frame): - return - try: - filename = self.images[frame] - except IndexError as e: - raise EOFError("no such frame") from e - - self.fp = self.ole.openstream(filename) - - TiffImagePlugin.TiffImageFile._open(self) - - self.frame = frame - - def tell(self): - return self.frame - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -# -# -------------------------------------------------------------------- - -Image.register_open(MicImageFile.format, MicImageFile, _accept) - -Image.register_extension(MicImageFile.format, ".mic") diff --git a/venv/Lib/site-packages/PIL/MpegImagePlugin.py b/venv/Lib/site-packages/PIL/MpegImagePlugin.py deleted file mode 100644 index a358dfd..0000000 --- a/venv/Lib/site-packages/PIL/MpegImagePlugin.py +++ /dev/null @@ -1,83 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPEG file handling -# -# History: -# 95-09-09 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile -from ._binary import i8 - -# -# Bitstream parser - - -class BitStream: - def __init__(self, fp): - self.fp = fp - self.bits = 0 - self.bitbuffer = 0 - - def next(self): - return i8(self.fp.read(1)) - - def peek(self, bits): - while self.bits < bits: - c = self.next() - if c < 0: - self.bits = 0 - continue - self.bitbuffer = (self.bitbuffer << 8) + c - self.bits += 8 - return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 - - def skip(self, bits): - while self.bits < bits: - self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) - self.bits += 8 - self.bits = self.bits - bits - - def read(self, bits): - v = self.peek(bits) - self.bits = self.bits - bits - return v - - -## -# Image plugin for MPEG streams. This plugin can identify a stream, -# but it cannot read it. - - -class MpegImageFile(ImageFile.ImageFile): - - format = "MPEG" - format_description = "MPEG" - - def _open(self): - - s = BitStream(self.fp) - - if s.read(32) != 0x1B3: - raise SyntaxError("not an MPEG file") - - self.mode = "RGB" - self._size = s.read(12), s.read(12) - - -# -------------------------------------------------------------------- -# Registry stuff - -Image.register_open(MpegImageFile.format, MpegImageFile) - -Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) - -Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/venv/Lib/site-packages/PIL/MpoImagePlugin.py b/venv/Lib/site-packages/PIL/MpoImagePlugin.py deleted file mode 100644 index 88c1bfc..0000000 --- a/venv/Lib/site-packages/PIL/MpoImagePlugin.py +++ /dev/null @@ -1,137 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPO file handling -# -# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the -# Camera & Imaging Products Association) -# -# The multi-picture object combines multiple JPEG images (with a modified EXIF -# data format) into a single file. While it can theoretically be used much like -# a GIF animation, it is commonly used to represent 3D photographs and is (as -# of this writing) the most commonly used format by 3D cameras. -# -# History: -# 2014-03-13 Feneric Created -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile, JpegImagePlugin -from ._binary import i16be as i16 - -# def _accept(prefix): -# return JpegImagePlugin._accept(prefix) - - -def _save(im, fp, filename): - # Note that we can only save the current frame at present - return JpegImagePlugin._save(im, fp, filename) - - -## -# Image plugin for MPO images. - - -class MpoImageFile(JpegImagePlugin.JpegImageFile): - - format = "MPO" - format_description = "MPO (CIPA DC-007)" - _close_exclusive_fp_after_loading = False - - def _open(self): - self.fp.seek(0) # prep the fp in order to pass the JPEG test - JpegImagePlugin.JpegImageFile._open(self) - self._after_jpeg_open() - - def _after_jpeg_open(self, mpheader=None): - self._initial_size = self.size - self.mpinfo = mpheader if mpheader is not None else self._getmp() - self.n_frames = self.mpinfo[0xB001] - self.__mpoffsets = [ - mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] - ] - self.__mpoffsets[0] = 0 - # Note that the following assertion will only be invalid if something - # gets broken within JpegImagePlugin. - assert self.n_frames == len(self.__mpoffsets) - del self.info["mpoffset"] # no longer needed - self.is_animated = self.n_frames > 1 - self.__fp = self.fp # FIXME: hack - self.__fp.seek(self.__mpoffsets[0]) # get ready to read first frame - self.__frame = 0 - self.offset = 0 - # for now we can only handle reading and individual frame extraction - self.readonly = 1 - - def load_seek(self, pos): - self.__fp.seek(pos) - - def seek(self, frame): - if not self._seek_check(frame): - return - self.fp = self.__fp - self.offset = self.__mpoffsets[frame] - - self.fp.seek(self.offset + 2) # skip SOI marker - segment = self.fp.read(2) - if not segment: - raise ValueError("No data found for frame") - self._size = self._initial_size - if i16(segment) == 0xFFE1: # APP1 - n = i16(self.fp.read(2)) - 2 - self.info["exif"] = ImageFile._safe_read(self.fp, n) - - mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"] - if mptype.startswith("Large Thumbnail"): - exif = self.getexif().get_ifd(0x8769) - if 40962 in exif and 40963 in exif: - self._size = (exif[40962], exif[40963]) - elif "exif" in self.info: - del self.info["exif"] - - self.tile = [("jpeg", (0, 0) + self.size, self.offset, (self.mode, ""))] - self.__frame = frame - - def tell(self): - return self.__frame - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - @staticmethod - def adopt(jpeg_instance, mpheader=None): - """ - Transform the instance of JpegImageFile into - an instance of MpoImageFile. - After the call, the JpegImageFile is extended - to be an MpoImageFile. - - This is essentially useful when opening a JPEG - file that reveals itself as an MPO, to avoid - double call to _open. - """ - jpeg_instance.__class__ = MpoImageFile - jpeg_instance._after_jpeg_open(mpheader) - return jpeg_instance - - -# --------------------------------------------------------------------- -# Registry stuff - -# Note that since MPO shares a factory with JPEG, we do not need to do a -# separate registration for it here. -# Image.register_open(MpoImageFile.format, -# JpegImagePlugin.jpeg_factory, _accept) -Image.register_save(MpoImageFile.format, _save) - -Image.register_extension(MpoImageFile.format, ".mpo") - -Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/venv/Lib/site-packages/PIL/MspImagePlugin.py b/venv/Lib/site-packages/PIL/MspImagePlugin.py deleted file mode 100644 index c4d7ddb..0000000 --- a/venv/Lib/site-packages/PIL/MspImagePlugin.py +++ /dev/null @@ -1,194 +0,0 @@ -# -# The Python Imaging Library. -# -# MSP file handling -# -# This is the format used by the Paint program in Windows 1 and 2. -# -# History: -# 95-09-05 fl Created -# 97-01-03 fl Read/write MSP images -# 17-02-21 es Fixed RLE interpretation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-97. -# Copyright (c) Eric Soroos 2017. -# -# See the README file for information on usage and redistribution. -# -# More info on this format: https://archive.org/details/gg243631 -# Page 313: -# Figure 205. Windows Paint Version 1: "DanM" Format -# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 -# -# See also: https://www.fileformat.info/format/mspaint/egff.htm - -import io -import struct - -from . import Image, ImageFile -from ._binary import i16le as i16 -from ._binary import o16le as o16 - -# -# read MSP files - - -def _accept(prefix): - return prefix[:4] in [b"DanM", b"LinS"] - - -## -# Image plugin for Windows MSP images. This plugin supports both -# uncompressed (Windows 1.0). - - -class MspImageFile(ImageFile.ImageFile): - - format = "MSP" - format_description = "Windows Paint" - - def _open(self): - - # Header - s = self.fp.read(32) - if not _accept(s): - raise SyntaxError("not an MSP file") - - # Header checksum - checksum = 0 - for i in range(0, 32, 2): - checksum = checksum ^ i16(s, i) - if checksum != 0: - raise SyntaxError("bad MSP checksum") - - self.mode = "1" - self._size = i16(s, 4), i16(s, 6) - - if s[:4] == b"DanM": - self.tile = [("raw", (0, 0) + self.size, 32, ("1", 0, 1))] - else: - self.tile = [("MSP", (0, 0) + self.size, 32, None)] - - -class MspDecoder(ImageFile.PyDecoder): - # The algo for the MSP decoder is from - # https://www.fileformat.info/format/mspaint/egff.htm - # cc-by-attribution -- That page references is taken from the - # Encyclopedia of Graphics File Formats and is licensed by - # O'Reilly under the Creative Common/Attribution license - # - # For RLE encoded files, the 32byte header is followed by a scan - # line map, encoded as one 16bit word of encoded byte length per - # line. - # - # NOTE: the encoded length of the line can be 0. This was not - # handled in the previous version of this encoder, and there's no - # mention of how to handle it in the documentation. From the few - # examples I've seen, I've assumed that it is a fill of the - # background color, in this case, white. - # - # - # Pseudocode of the decoder: - # Read a BYTE value as the RunType - # If the RunType value is zero - # Read next byte as the RunCount - # Read the next byte as the RunValue - # Write the RunValue byte RunCount times - # If the RunType value is non-zero - # Use this value as the RunCount - # Read and write the next RunCount bytes literally - # - # e.g.: - # 0x00 03 ff 05 00 01 02 03 04 - # would yield the bytes: - # 0xff ff ff 00 01 02 03 04 - # - # which are then interpreted as a bit packed mode '1' image - - _pulls_fd = True - - def decode(self, buffer): - - img = io.BytesIO() - blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) - try: - self.fd.seek(32) - rowmap = struct.unpack_from( - f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) - ) - except struct.error as e: - raise OSError("Truncated MSP file in row map") from e - - for x, rowlen in enumerate(rowmap): - try: - if rowlen == 0: - img.write(blank_line) - continue - row = self.fd.read(rowlen) - if len(row) != rowlen: - raise OSError( - "Truncated MSP file, expected %d bytes on row %s", (rowlen, x) - ) - idx = 0 - while idx < rowlen: - runtype = row[idx] - idx += 1 - if runtype == 0: - (runcount, runval) = struct.unpack_from("Bc", row, idx) - img.write(runval * runcount) - idx += 2 - else: - runcount = runtype - img.write(row[idx : idx + runcount]) - idx += runcount - - except struct.error as e: - raise OSError(f"Corrupted MSP file in row {x}") from e - - self.set_as_raw(img.getvalue(), ("1", 0, 1)) - - return -1, 0 - - -Image.register_decoder("MSP", MspDecoder) - - -# -# write MSP files (uncompressed only) - - -def _save(im, fp, filename): - - if im.mode != "1": - raise OSError(f"cannot write mode {im.mode} as MSP") - - # create MSP header - header = [0] * 16 - - header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 - header[2], header[3] = im.size - header[4], header[5] = 1, 1 - header[6], header[7] = 1, 1 - header[8], header[9] = im.size - - checksum = 0 - for h in header: - checksum = checksum ^ h - header[12] = checksum # FIXME: is this the right field? - - # header - for h in header: - fp.write(o16(h)) - - # image body - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 32, ("1", 0, 1))]) - - -# -# registry - -Image.register_open(MspImageFile.format, MspImageFile, _accept) -Image.register_save(MspImageFile.format, _save) - -Image.register_extension(MspImageFile.format, ".msp") diff --git a/venv/Lib/site-packages/PIL/PSDraw.py b/venv/Lib/site-packages/PIL/PSDraw.py deleted file mode 100644 index 743c35f..0000000 --- a/venv/Lib/site-packages/PIL/PSDraw.py +++ /dev/null @@ -1,235 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Simple PostScript graphics interface -# -# History: -# 1996-04-20 fl Created -# 1999-01-10 fl Added gsave/grestore to image method -# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) -# -# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import sys - -from . import EpsImagePlugin - -## -# Simple PostScript graphics interface. - - -class PSDraw: - """ - Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` or ``sys.stdout`` is assumed. - """ - - def __init__(self, fp=None): - if not fp: - try: - fp = sys.stdout.buffer - except AttributeError: - fp = sys.stdout - self.fp = fp - - def begin_document(self, id=None): - """Set up printing of a document. (Write PostScript DSC header.)""" - # FIXME: incomplete - self.fp.write( - b"%!PS-Adobe-3.0\n" - b"save\n" - b"/showpage { } def\n" - b"%%EndComments\n" - b"%%BeginDocument\n" - ) - # self.fp.write(ERROR_PS) # debugging! - self.fp.write(EDROFF_PS) - self.fp.write(VDI_PS) - self.fp.write(b"%%EndProlog\n") - self.isofont = {} - - def end_document(self): - """Ends printing. (Write PostScript DSC footer.)""" - self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") - if hasattr(self.fp, "flush"): - self.fp.flush() - - def setfont(self, font, size): - """ - Selects which font to use. - - :param font: A PostScript font name - :param size: Size in points. - """ - font = bytes(font, "UTF-8") - if font not in self.isofont: - # reencode font - self.fp.write(b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font, font)) - self.isofont[font] = 1 - # rough - self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font)) - - def line(self, xy0, xy1): - """ - Draws a line between the two points. Coordinates are given in - PostScript point coordinates (72 points per inch, (0, 0) is the lower - left corner of the page). - """ - self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) - - def rectangle(self, box): - """ - Draws a rectangle. - - :param box: A 4-tuple of integers whose order and function is currently - undocumented. - - Hint: the tuple is passed into this format string: - - .. code-block:: python - - %d %d M %d %d 0 Vr\n - """ - self.fp.write(b"%d %d M %d %d 0 Vr\n" % box) - - def text(self, xy, text): - """ - Draws text at the given position. You must use - :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. - """ - text = bytes(text, "UTF-8") - text = b"\\(".join(text.split(b"(")) - text = b"\\)".join(text.split(b")")) - xy += (text,) - self.fp.write(b"%d %d M (%s) S\n" % xy) - - def image(self, box, im, dpi=None): - """Draw a PIL image, centered in the given box.""" - # default resolution depends on mode - if not dpi: - if im.mode == "1": - dpi = 200 # fax - else: - dpi = 100 # greyscale - # image size (on paper) - x = im.size[0] * 72 / dpi - y = im.size[1] * 72 / dpi - # max allowed size - xmax = float(box[2] - box[0]) - ymax = float(box[3] - box[1]) - if x > xmax: - y = y * xmax / x - x = xmax - if y > ymax: - x = x * ymax / y - y = ymax - dx = (xmax - x) / 2 + box[0] - dy = (ymax - y) / 2 + box[1] - self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) - if (x, y) != im.size: - # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) - sx = x / im.size[0] - sy = y / im.size[1] - self.fp.write(b"%f %f scale\n" % (sx, sy)) - EpsImagePlugin._save(im, self.fp, None, 0) - self.fp.write(b"\ngrestore\n") - - -# -------------------------------------------------------------------- -# PostScript driver - -# -# EDROFF.PS -- PostScript driver for Edroff 2 -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - - -EDROFF_PS = b"""\ -/S { show } bind def -/P { moveto show } bind def -/M { moveto } bind def -/X { 0 rmoveto } bind def -/Y { 0 exch rmoveto } bind def -/E { findfont - dup maxlength dict begin - { - 1 index /FID ne { def } { pop pop } ifelse - } forall - /Encoding exch def - dup /FontName exch def - currentdict end definefont pop -} bind def -/F { findfont exch scalefont dup setfont - [ exch /setfont cvx ] cvx bind def -} bind def -""" - -# -# VDI.PS -- PostScript driver for VDI meta commands -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - -VDI_PS = b"""\ -/Vm { moveto } bind def -/Va { newpath arcn stroke } bind def -/Vl { moveto lineto stroke } bind def -/Vc { newpath 0 360 arc closepath } bind def -/Vr { exch dup 0 rlineto - exch dup neg 0 exch rlineto - exch neg 0 rlineto - 0 exch rlineto - 100 div setgray fill 0 setgray } bind def -/Tm matrix def -/Ve { Tm currentmatrix pop - translate scale newpath 0 0 .5 0 360 arc closepath - Tm setmatrix -} bind def -/Vf { currentgray exch setgray fill setgray } bind def -""" - -# -# ERROR.PS -- Error handler -# -# History: -# 89-11-21 fl: created (pslist 1.10) -# - -ERROR_PS = b"""\ -/landscape false def -/errorBUF 200 string def -/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def -errordict begin /handleerror { - initmatrix /Courier findfont 10 scalefont setfont - newpath 72 720 moveto $error begin /newerror false def - (PostScript Error) show errorNL errorNL - (Error: ) show - /errorname load errorBUF cvs show errorNL errorNL - (Command: ) show - /command load dup type /stringtype ne { errorBUF cvs } if show - errorNL errorNL - (VMstatus: ) show - vmstatus errorBUF cvs show ( bytes available, ) show - errorBUF cvs show ( bytes used at level ) show - errorBUF cvs show errorNL errorNL - (Operand stargck: ) show errorNL /ostargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall errorNL - (Execution stargck: ) show errorNL /estargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall - end showpage -} def end -""" diff --git a/venv/Lib/site-packages/PIL/PaletteFile.py b/venv/Lib/site-packages/PIL/PaletteFile.py deleted file mode 100644 index 6ccaa1f..0000000 --- a/venv/Lib/site-packages/PIL/PaletteFile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read simple, teragon-style palette files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -from ._binary import o8 - - -class PaletteFile: - """File handler for Teragon-style palette files.""" - - rawmode = "RGB" - - def __init__(self, fp): - - self.palette = [(i, i, i) for i in range(256)] - - while True: - - s = fp.readline() - - if not s: - break - if s[0:1] == b"#": - continue - if len(s) > 100: - raise SyntaxError("bad palette file") - - v = [int(x) for x in s.split()] - try: - [i, r, g, b] = v - except ValueError: - [i, r] = v - g = b = r - - if 0 <= i <= 255: - self.palette[i] = o8(r) + o8(g) + o8(b) - - self.palette = b"".join(self.palette) - - def getpalette(self): - - return self.palette, self.rawmode diff --git a/venv/Lib/site-packages/PIL/PalmImagePlugin.py b/venv/Lib/site-packages/PIL/PalmImagePlugin.py deleted file mode 100644 index 700f10e..0000000 --- a/venv/Lib/site-packages/PIL/PalmImagePlugin.py +++ /dev/null @@ -1,227 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# - -## -# Image plugin for Palm pixmap images (output only). -## - -from . import Image, ImageFile -from ._binary import o8 -from ._binary import o16be as o16b - -# fmt: off -_Palm8BitColormapValues = ( - (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), - (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), - (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), - (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), - (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), - (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), - (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), - (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), - (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), - (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), - (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), - (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), - (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), - (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), - (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), - (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), - (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), - (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), - (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), - (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), - (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), - (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), - (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), - (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), - (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), - (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), - (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), - (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), - (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), - (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), - (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), - (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), - (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), - (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), - (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), - (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), - (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), - (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), - (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), - (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), - (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), - (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), - (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), - (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), - (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), - (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), - (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), - (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), - (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), - (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), - (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), - (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), - (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), - (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), - (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), - (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), - (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), - (0, 128, 0), (0, 128, 128), (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)) -# fmt: on - - -# so build a prototype image to be used for palette resampling -def build_prototype_image(): - image = Image.new("L", (1, len(_Palm8BitColormapValues))) - image.putdata(list(range(len(_Palm8BitColormapValues)))) - palettedata = () - for colormapValue in _Palm8BitColormapValues: - palettedata += colormapValue - palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) - image.putpalette(palettedata) - return image - - -Palm8BitColormapImage = build_prototype_image() - -# OK, we now have in Palm8BitColormapImage, -# a "P"-mode image with the right palette -# -# -------------------------------------------------------------------- - -_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} - -_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} - - -# -# -------------------------------------------------------------------- - -## -# (Internal) Image save plugin for the Palm format. - - -def _save(im, fp, filename): - - if im.mode == "P": - - # we assume this is a color Palm image with the standard colormap, - # unless the "info" dict has a "custom-colormap" field - - rawmode = "P" - bpp = 8 - version = 1 - - elif im.mode == "L": - if im.encoderinfo.get("bpp") in (1, 2, 4): - # this is 8-bit grayscale, so we shift it to get the high-order bits, - # and invert it because - # Palm does greyscale from white (0) to black (1) - bpp = im.encoderinfo["bpp"] - im = im.point( - lambda x, shift=8 - bpp, maxval=(1 << bpp) - 1: maxval - (x >> shift) - ) - elif im.info.get("bpp") in (1, 2, 4): - # here we assume that even though the inherent mode is 8-bit grayscale, - # only the lower bpp bits are significant. - # We invert them to match the Palm. - bpp = im.info["bpp"] - im = im.point(lambda x, maxval=(1 << bpp) - 1: maxval - (x & maxval)) - else: - raise OSError(f"cannot write mode {im.mode} as Palm") - - # we ignore the palette here - im.mode = "P" - rawmode = "P;" + str(bpp) - version = 1 - - elif im.mode == "1": - - # monochrome -- write it inverted, as is the Palm standard - rawmode = "1;I" - bpp = 1 - version = 0 - - else: - - raise OSError(f"cannot write mode {im.mode} as Palm") - - # - # make sure image data is available - im.load() - - # write header - - cols = im.size[0] - rows = im.size[1] - - rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 - transparent_index = 0 - compression_type = _COMPRESSION_TYPES["none"] - - flags = 0 - if im.mode == "P" and "custom-colormap" in im.info: - flags = flags & _FLAGS["custom-colormap"] - colormapsize = 4 * 256 + 2 - colormapmode = im.palette.mode - colormap = im.getdata().getpalette() - else: - colormapsize = 0 - - if "offset" in im.info: - offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 - else: - offset = 0 - - fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) - fp.write(o8(bpp)) - fp.write(o8(version)) - fp.write(o16b(offset)) - fp.write(o8(transparent_index)) - fp.write(o8(compression_type)) - fp.write(o16b(0)) # reserved by Palm - - # now write colormap if necessary - - if colormapsize > 0: - fp.write(o16b(256)) - for i in range(256): - fp.write(o8(i)) - if colormapmode == "RGB": - fp.write( - o8(colormap[3 * i]) - + o8(colormap[3 * i + 1]) - + o8(colormap[3 * i + 2]) - ) - elif colormapmode == "RGBA": - fp.write( - o8(colormap[4 * i]) - + o8(colormap[4 * i + 1]) - + o8(colormap[4 * i + 2]) - ) - - # now convert data to raw form - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))]) - - if hasattr(fp, "flush"): - fp.flush() - - -# -# -------------------------------------------------------------------- - -Image.register_save("Palm", _save) - -Image.register_extension("Palm", ".palm") - -Image.register_mime("Palm", "image/palm") diff --git a/venv/Lib/site-packages/PIL/PcdImagePlugin.py b/venv/Lib/site-packages/PIL/PcdImagePlugin.py deleted file mode 100644 index 38caf5c..0000000 --- a/venv/Lib/site-packages/PIL/PcdImagePlugin.py +++ /dev/null @@ -1,63 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCD file handling -# -# History: -# 96-05-10 fl Created -# 96-05-27 fl Added draft mode (128x192, 256x384) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile - -## -# Image plugin for PhotoCD images. This plugin only reads the 768x512 -# image from the file; higher resolutions are encoded in a proprietary -# encoding. - - -class PcdImageFile(ImageFile.ImageFile): - - format = "PCD" - format_description = "Kodak PhotoCD" - - def _open(self): - - # rough - self.fp.seek(2048) - s = self.fp.read(2048) - - if s[:4] != b"PCD_": - raise SyntaxError("not a PCD file") - - orientation = s[1538] & 3 - self.tile_post_rotate = None - if orientation == 1: - self.tile_post_rotate = 90 - elif orientation == 3: - self.tile_post_rotate = -90 - - self.mode = "RGB" - self._size = 768, 512 # FIXME: not correct for rotated images! - self.tile = [("pcd", (0, 0) + self.size, 96 * 2048, None)] - - def load_end(self): - if self.tile_post_rotate: - # Handle rotated PCDs - self.im = self.im.rotate(self.tile_post_rotate) - self._size = self.im.size - - -# -# registry - -Image.register_open(PcdImageFile.format, PcdImageFile) - -Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/venv/Lib/site-packages/PIL/PcfFontFile.py b/venv/Lib/site-packages/PIL/PcfFontFile.py deleted file mode 100644 index 6a4eb22..0000000 --- a/venv/Lib/site-packages/PIL/PcfFontFile.py +++ /dev/null @@ -1,248 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library -# $Id$ -# -# portable compiled font file parser -# -# history: -# 1997-08-19 fl created -# 2003-09-13 fl fixed loading of unicode fonts -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import io - -from . import FontFile, Image -from ._binary import i8 -from ._binary import i16be as b16 -from ._binary import i16le as l16 -from ._binary import i32be as b32 -from ._binary import i32le as l32 - -# -------------------------------------------------------------------- -# declarations - -PCF_MAGIC = 0x70636601 # "\x01fcp" - -PCF_PROPERTIES = 1 << 0 -PCF_ACCELERATORS = 1 << 1 -PCF_METRICS = 1 << 2 -PCF_BITMAPS = 1 << 3 -PCF_INK_METRICS = 1 << 4 -PCF_BDF_ENCODINGS = 1 << 5 -PCF_SWIDTHS = 1 << 6 -PCF_GLYPH_NAMES = 1 << 7 -PCF_BDF_ACCELERATORS = 1 << 8 - -BYTES_PER_ROW = [ - lambda bits: ((bits + 7) >> 3), - lambda bits: ((bits + 15) >> 3) & ~1, - lambda bits: ((bits + 31) >> 3) & ~3, - lambda bits: ((bits + 63) >> 3) & ~7, -] - - -def sz(s, o): - return s[o : s.index(b"\0", o)] - - -class PcfFontFile(FontFile.FontFile): - """Font file plugin for the X11 PCF format.""" - - name = "name" - - def __init__(self, fp, charset_encoding="iso8859-1"): - - self.charset_encoding = charset_encoding - - magic = l32(fp.read(4)) - if magic != PCF_MAGIC: - raise SyntaxError("not a PCF file") - - super().__init__() - - count = l32(fp.read(4)) - self.toc = {} - for i in range(count): - type = l32(fp.read(4)) - self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) - - self.fp = fp - - self.info = self._load_properties() - - metrics = self._load_metrics() - bitmaps = self._load_bitmaps(metrics) - encoding = self._load_encoding() - - # - # create glyph structure - - for ch in range(256): - ix = encoding[ch] - if ix is not None: - x, y, l, r, w, a, d, f = metrics[ix] - glyph = (w, 0), (l, d - y, x + l, d), (0, 0, x, y), bitmaps[ix] - self.glyph[ch] = glyph - - def _getformat(self, tag): - - format, size, offset = self.toc[tag] - - fp = self.fp - fp.seek(offset) - - format = l32(fp.read(4)) - - if format & 4: - i16, i32 = b16, b32 - else: - i16, i32 = l16, l32 - - return fp, format, i16, i32 - - def _load_properties(self): - - # - # font properties - - properties = {} - - fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) - - nprops = i32(fp.read(4)) - - # read property description - p = [] - for i in range(nprops): - p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4)))) - if nprops & 3: - fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad - - data = fp.read(i32(fp.read(4))) - - for k, s, v in p: - k = sz(data, k) - if s: - v = sz(data, v) - properties[k] = v - - return properties - - def _load_metrics(self): - - # - # font metrics - - metrics = [] - - fp, format, i16, i32 = self._getformat(PCF_METRICS) - - append = metrics.append - - if (format & 0xFF00) == 0x100: - - # "compressed" metrics - for i in range(i16(fp.read(2))): - left = i8(fp.read(1)) - 128 - right = i8(fp.read(1)) - 128 - width = i8(fp.read(1)) - 128 - ascent = i8(fp.read(1)) - 128 - descent = i8(fp.read(1)) - 128 - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, 0)) - - else: - - # "jumbo" metrics - for i in range(i32(fp.read(4))): - left = i16(fp.read(2)) - right = i16(fp.read(2)) - width = i16(fp.read(2)) - ascent = i16(fp.read(2)) - descent = i16(fp.read(2)) - attributes = i16(fp.read(2)) - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, attributes)) - - return metrics - - def _load_bitmaps(self, metrics): - - # - # bitmap data - - bitmaps = [] - - fp, format, i16, i32 = self._getformat(PCF_BITMAPS) - - nbitmaps = i32(fp.read(4)) - - if nbitmaps != len(metrics): - raise OSError("Wrong number of bitmaps") - - offsets = [] - for i in range(nbitmaps): - offsets.append(i32(fp.read(4))) - - bitmapSizes = [] - for i in range(4): - bitmapSizes.append(i32(fp.read(4))) - - # byteorder = format & 4 # non-zero => MSB - bitorder = format & 8 # non-zero => MSB - padindex = format & 3 - - bitmapsize = bitmapSizes[padindex] - offsets.append(bitmapsize) - - data = fp.read(bitmapsize) - - pad = BYTES_PER_ROW[padindex] - mode = "1;R" - if bitorder: - mode = "1" - - for i in range(nbitmaps): - x, y, l, r, w, a, d, f = metrics[i] - b, e = offsets[i], offsets[i + 1] - bitmaps.append(Image.frombytes("1", (x, y), data[b:e], "raw", mode, pad(x))) - - return bitmaps - - def _load_encoding(self): - - # map character code to bitmap index - encoding = [None] * 256 - - fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) - - firstCol, lastCol = i16(fp.read(2)), i16(fp.read(2)) - firstRow, lastRow = i16(fp.read(2)), i16(fp.read(2)) - - i16(fp.read(2)) # default - - nencoding = (lastCol - firstCol + 1) * (lastRow - firstRow + 1) - - encodingOffsets = [i16(fp.read(2)) for _ in range(nencoding)] - - for i in range(firstCol, len(encoding)): - try: - encodingOffset = encodingOffsets[ - ord(bytearray([i]).decode(self.charset_encoding)) - ] - if encodingOffset != 0xFFFF: - encoding[i] = encodingOffset - except UnicodeDecodeError: - # character is not supported in selected encoding - pass - - return encoding diff --git a/venv/Lib/site-packages/PIL/PcxImagePlugin.py b/venv/Lib/site-packages/PIL/PcxImagePlugin.py deleted file mode 100644 index d2e166b..0000000 --- a/venv/Lib/site-packages/PIL/PcxImagePlugin.py +++ /dev/null @@ -1,218 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCX file handling -# -# This format was originally used by ZSoft's popular PaintBrush -# program for the IBM PC. It is also supported by many MS-DOS and -# Windows applications, including the Windows PaintBrush program in -# Windows 3. -# -# history: -# 1995-09-01 fl Created -# 1996-05-20 fl Fixed RGB support -# 1997-01-03 fl Fixed 2-bit and 4-bit support -# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) -# 1999-02-07 fl Added write support -# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust -# 2002-07-30 fl Seek from to current position, not beginning of file -# 2003-06-03 fl Extract DPI settings (info["dpi"]) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -import io -import logging - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -logger = logging.getLogger(__name__) - - -def _accept(prefix): - return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] - - -## -# Image plugin for Paintbrush images. - - -class PcxImageFile(ImageFile.ImageFile): - - format = "PCX" - format_description = "Paintbrush" - - def _open(self): - - # header - s = self.fp.read(128) - if not _accept(s): - raise SyntaxError("not a PCX file") - - # image - bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 - if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: - raise SyntaxError("bad PCX image size") - logger.debug("BBox: %s %s %s %s", *bbox) - - # format - version = s[1] - bits = s[3] - planes = s[65] - provided_stride = i16(s, 66) - logger.debug( - "PCX version %s, bits %s, planes %s, stride %s", - version, - bits, - planes, - provided_stride, - ) - - self.info["dpi"] = i16(s, 12), i16(s, 14) - - if bits == 1 and planes == 1: - mode = rawmode = "1" - - elif bits == 1 and planes in (2, 4): - mode = "P" - rawmode = "P;%dL" % planes - self.palette = ImagePalette.raw("RGB", s[16:64]) - - elif version == 5 and bits == 8 and planes == 1: - mode = rawmode = "L" - # FIXME: hey, this doesn't work with the incremental loader !!! - self.fp.seek(-769, io.SEEK_END) - s = self.fp.read(769) - if len(s) == 769 and s[0] == 12: - # check if the palette is linear greyscale - for i in range(256): - if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: - mode = rawmode = "P" - break - if mode == "P": - self.palette = ImagePalette.raw("RGB", s[1:]) - self.fp.seek(128) - - elif version == 5 and bits == 8 and planes == 3: - mode = "RGB" - rawmode = "RGB;L" - - else: - raise OSError("unknown PCX mode") - - self.mode = mode - self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - - # Don't trust the passed in stride. - # Calculate the approximate position for ourselves. - # CVE-2020-35653 - stride = (self._size[0] * bits + 7) // 8 - - # While the specification states that this must be even, - # not all images follow this - if provided_stride != stride: - stride += stride % 2 - - bbox = (0, 0) + self.size - logger.debug("size: %sx%s", *self.size) - - self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] - - -# -------------------------------------------------------------------- -# save PCX files - - -SAVE = { - # mode: (version, bits, planes, raw mode) - "1": (2, 1, 1, "1"), - "L": (5, 8, 1, "L"), - "P": (5, 8, 1, "P"), - "RGB": (5, 8, 3, "RGB;L"), -} - - -def _save(im, fp, filename): - - try: - version, bits, planes, rawmode = SAVE[im.mode] - except KeyError as e: - raise ValueError(f"Cannot save {im.mode} images as PCX") from e - - # bytes per plane - stride = (im.size[0] * bits + 7) // 8 - # stride should be even - stride += stride % 2 - # Stride needs to be kept in sync with the PcxEncode.c version. - # Ideally it should be passed in in the state, but the bytes value - # gets overwritten. - - logger.debug( - "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", - im.size[0], - bits, - stride, - ) - - # under windows, we could determine the current screen size with - # "Image.core.display_mode()[1]", but I think that's overkill... - - screen = im.size - - dpi = 100, 100 - - # PCX header - fp.write( - o8(10) - + o8(version) - + o8(1) - + o8(bits) - + o16(0) - + o16(0) - + o16(im.size[0] - 1) - + o16(im.size[1] - 1) - + o16(dpi[0]) - + o16(dpi[1]) - + b"\0" * 24 - + b"\xFF" * 24 - + b"\0" - + o8(planes) - + o16(stride) - + o16(1) - + o16(screen[0]) - + o16(screen[1]) - + b"\0" * 54 - ) - - assert fp.tell() == 128 - - ImageFile._save(im, fp, [("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))]) - - if im.mode == "P": - # colour palette - fp.write(o8(12)) - fp.write(im.im.getpalette("RGB", "RGB")) # 768 bytes - elif im.mode == "L": - # greyscale palette - fp.write(o8(12)) - for i in range(256): - fp.write(o8(i) * 3) - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PcxImageFile.format, PcxImageFile, _accept) -Image.register_save(PcxImageFile.format, _save) - -Image.register_extension(PcxImageFile.format, ".pcx") - -Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/venv/Lib/site-packages/PIL/PdfImagePlugin.py b/venv/Lib/site-packages/PIL/PdfImagePlugin.py deleted file mode 100644 index 544035c..0000000 --- a/venv/Lib/site-packages/PIL/PdfImagePlugin.py +++ /dev/null @@ -1,239 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PDF (Acrobat) file handling -# -# History: -# 1996-07-16 fl Created -# 1997-01-18 fl Fixed header -# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. -# 2004-02-24 fl Fixes for 1 and P images. -# -# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996-1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -# Image plugin for PDF images (output only). -## - -import io -import os -import time - -from . import Image, ImageFile, ImageSequence, PdfParser, __version__ - -# -# -------------------------------------------------------------------- - -# object ids: -# 1. catalogue -# 2. pages -# 3. image -# 4. page -# 5. page contents - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -## -# (Internal) Image save plugin for the PDF format. - - -def _save(im, fp, filename, save_all=False): - is_appending = im.encoderinfo.get("append", False) - if is_appending: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") - else: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") - - resolution = im.encoderinfo.get("resolution", 72.0) - - info = { - "title": None - if is_appending - else os.path.splitext(os.path.basename(filename))[0], - "author": None, - "subject": None, - "keywords": None, - "creator": None, - "producer": None, - "creationDate": None if is_appending else time.gmtime(), - "modDate": None if is_appending else time.gmtime(), - } - for k, default in info.items(): - v = im.encoderinfo.get(k) if k in im.encoderinfo else default - if v: - existing_pdf.info[k[0].upper() + k[1:]] = v - - # - # make sure image data is available - im.load() - - existing_pdf.start_writing() - existing_pdf.write_header() - existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") - - # - # pages - ims = [im] - if save_all: - append_images = im.encoderinfo.get("append_images", []) - for append_im in append_images: - append_im.encoderinfo = im.encoderinfo.copy() - ims.append(append_im) - numberOfPages = 0 - image_refs = [] - page_refs = [] - contents_refs = [] - for im in ims: - im_numberOfPages = 1 - if save_all: - try: - im_numberOfPages = im.n_frames - except AttributeError: - # Image format does not have n_frames. - # It is a single frame image - pass - numberOfPages += im_numberOfPages - for i in range(im_numberOfPages): - image_refs.append(existing_pdf.next_object_id(0)) - page_refs.append(existing_pdf.next_object_id(0)) - contents_refs.append(existing_pdf.next_object_id(0)) - existing_pdf.pages.append(page_refs[-1]) - - # - # catalog and list of pages - existing_pdf.write_catalog() - - pageNumber = 0 - for imSequence in ims: - im_pages = ImageSequence.Iterator(imSequence) if save_all else [imSequence] - for im in im_pages: - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode - # (packbits) or LZWDecode (tiff/lzw compression). Note that - # PDF 1.2 also supports Flatedecode (zip compression). - - bits = 8 - params = None - decode = None - - if im.mode == "1": - filter = "DCTDecode" - colorspace = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "L": - filter = "DCTDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - colorspace = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "P": - filter = "ASCIIHexDecode" - palette = im.getpalette() - colorspace = [ - PdfParser.PdfName("Indexed"), - PdfParser.PdfName("DeviceRGB"), - 255, - PdfParser.PdfBinary(palette), - ] - procset = "ImageI" # indexed color - elif im.mode == "RGB": - filter = "DCTDecode" - colorspace = PdfParser.PdfName("DeviceRGB") - procset = "ImageC" # color images - elif im.mode == "CMYK": - filter = "DCTDecode" - colorspace = PdfParser.PdfName("DeviceCMYK") - procset = "ImageC" # color images - decode = [1, 0, 1, 0, 1, 0, 1, 0] - else: - raise ValueError(f"cannot save mode {im.mode}") - - # - # image - - op = io.BytesIO() - - if filter == "ASCIIHexDecode": - ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)]) - elif filter == "DCTDecode": - Image.SAVE["JPEG"](im, op, filename) - elif filter == "FlateDecode": - ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)]) - elif filter == "RunLengthDecode": - ImageFile._save(im, op, [("packbits", (0, 0) + im.size, 0, im.mode)]) - else: - raise ValueError(f"unsupported PDF filter ({filter})") - - # - # Get image characteristics - - width, height = im.size - - existing_pdf.write_obj( - image_refs[pageNumber], - stream=op.getvalue(), - Type=PdfParser.PdfName("XObject"), - Subtype=PdfParser.PdfName("Image"), - Width=width, # * 72.0 / resolution, - Height=height, # * 72.0 / resolution, - Filter=PdfParser.PdfName(filter), - BitsPerComponent=bits, - Decode=decode, - DecodeParams=params, - ColorSpace=colorspace, - ) - - # - # page - - existing_pdf.write_page( - page_refs[pageNumber], - Resources=PdfParser.PdfDict( - ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], - XObject=PdfParser.PdfDict(image=image_refs[pageNumber]), - ), - MediaBox=[ - 0, - 0, - width * 72.0 / resolution, - height * 72.0 / resolution, - ], - Contents=contents_refs[pageNumber], - ) - - # - # page contents - - page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( - width * 72.0 / resolution, - height * 72.0 / resolution, - ) - - existing_pdf.write_obj(contents_refs[pageNumber], stream=page_contents) - - pageNumber += 1 - - # - # trailer - existing_pdf.write_xref_and_trailer() - if hasattr(fp, "flush"): - fp.flush() - existing_pdf.close() - - -# -# -------------------------------------------------------------------- - - -Image.register_save("PDF", _save) -Image.register_save_all("PDF", _save_all) - -Image.register_extension("PDF", ".pdf") - -Image.register_mime("PDF", "application/pdf") diff --git a/venv/Lib/site-packages/PIL/PdfParser.py b/venv/Lib/site-packages/PIL/PdfParser.py deleted file mode 100644 index 9aa0fd6..0000000 --- a/venv/Lib/site-packages/PIL/PdfParser.py +++ /dev/null @@ -1,998 +0,0 @@ -import calendar -import codecs -import collections -import mmap -import os -import re -import time -import zlib - - -# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set -# on page 656 -def encode_text(s): - return codecs.BOM_UTF16_BE + s.encode("utf_16_be") - - -PDFDocEncoding = { - 0x16: "\u0017", - 0x18: "\u02D8", - 0x19: "\u02C7", - 0x1A: "\u02C6", - 0x1B: "\u02D9", - 0x1C: "\u02DD", - 0x1D: "\u02DB", - 0x1E: "\u02DA", - 0x1F: "\u02DC", - 0x80: "\u2022", - 0x81: "\u2020", - 0x82: "\u2021", - 0x83: "\u2026", - 0x84: "\u2014", - 0x85: "\u2013", - 0x86: "\u0192", - 0x87: "\u2044", - 0x88: "\u2039", - 0x89: "\u203A", - 0x8A: "\u2212", - 0x8B: "\u2030", - 0x8C: "\u201E", - 0x8D: "\u201C", - 0x8E: "\u201D", - 0x8F: "\u2018", - 0x90: "\u2019", - 0x91: "\u201A", - 0x92: "\u2122", - 0x93: "\uFB01", - 0x94: "\uFB02", - 0x95: "\u0141", - 0x96: "\u0152", - 0x97: "\u0160", - 0x98: "\u0178", - 0x99: "\u017D", - 0x9A: "\u0131", - 0x9B: "\u0142", - 0x9C: "\u0153", - 0x9D: "\u0161", - 0x9E: "\u017E", - 0xA0: "\u20AC", -} - - -def decode_text(b): - if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: - return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") - else: - return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) - - -class PdfFormatError(RuntimeError): - """An error that probably indicates a syntactic or semantic error in the - PDF file structure""" - - pass - - -def check_format_condition(condition, error_message): - if not condition: - raise PdfFormatError(error_message) - - -class IndirectReference( - collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"]) -): - def __str__(self): - return "%s %s R" % self - - def __bytes__(self): - return self.__str__().encode("us-ascii") - - def __eq__(self, other): - return ( - other.__class__ is self.__class__ - and other.object_id == self.object_id - and other.generation == self.generation - ) - - def __ne__(self, other): - return not (self == other) - - def __hash__(self): - return hash((self.object_id, self.generation)) - - -class IndirectObjectDef(IndirectReference): - def __str__(self): - return "%s %s obj" % self - - -class XrefTable: - def __init__(self): - self.existing_entries = {} # object ID => (offset, generation) - self.new_entries = {} # object ID => (offset, generation) - self.deleted_entries = {0: 65536} # object ID => generation - self.reading_finished = False - - def __setitem__(self, key, value): - if self.reading_finished: - self.new_entries[key] = value - else: - self.existing_entries[key] = value - if key in self.deleted_entries: - del self.deleted_entries[key] - - def __getitem__(self, key): - try: - return self.new_entries[key] - except KeyError: - return self.existing_entries[key] - - def __delitem__(self, key): - if key in self.new_entries: - generation = self.new_entries[key][1] + 1 - del self.new_entries[key] - self.deleted_entries[key] = generation - elif key in self.existing_entries: - generation = self.existing_entries[key][1] + 1 - self.deleted_entries[key] = generation - elif key in self.deleted_entries: - generation = self.deleted_entries[key] - else: - raise IndexError( - "object ID " + str(key) + " cannot be deleted because it doesn't exist" - ) - - def __contains__(self, key): - return key in self.existing_entries or key in self.new_entries - - def __len__(self): - return len( - set(self.existing_entries.keys()) - | set(self.new_entries.keys()) - | set(self.deleted_entries.keys()) - ) - - def keys(self): - return ( - set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) - ) | set(self.new_entries.keys()) - - def write(self, f): - keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) - deleted_keys = sorted(set(self.deleted_entries.keys())) - startxref = f.tell() - f.write(b"xref\n") - while keys: - # find a contiguous sequence of object IDs - prev = None - for index, key in enumerate(keys): - if prev is None or prev + 1 == key: - prev = key - else: - contiguous_keys = keys[:index] - keys = keys[index:] - break - else: - contiguous_keys = keys - keys = None - f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) - for object_id in contiguous_keys: - if object_id in self.new_entries: - f.write(b"%010d %05d n \n" % self.new_entries[object_id]) - else: - this_deleted_object_id = deleted_keys.pop(0) - check_format_condition( - object_id == this_deleted_object_id, - f"expected the next deleted object ID to be {object_id}, " - f"instead found {this_deleted_object_id}", - ) - try: - next_in_linked_list = deleted_keys[0] - except IndexError: - next_in_linked_list = 0 - f.write( - b"%010d %05d f \n" - % (next_in_linked_list, self.deleted_entries[object_id]) - ) - return startxref - - -class PdfName: - def __init__(self, name): - if isinstance(name, PdfName): - self.name = name.name - elif isinstance(name, bytes): - self.name = name - else: - self.name = name.encode("us-ascii") - - def name_as_str(self): - return self.name.decode("us-ascii") - - def __eq__(self, other): - return ( - isinstance(other, PdfName) and other.name == self.name - ) or other == self.name - - def __hash__(self): - return hash(self.name) - - def __repr__(self): - return f"PdfName({repr(self.name)})" - - @classmethod - def from_pdf_stream(cls, data): - return cls(PdfParser.interpret_name(data)) - - allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} - - def __bytes__(self): - result = bytearray(b"/") - for b in self.name: - if b in self.allowed_chars: - result.append(b) - else: - result.extend(b"#%02X" % b) - return bytes(result) - - -class PdfArray(list): - def __bytes__(self): - return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" - - -class PdfDict(collections.UserDict): - def __setattr__(self, key, value): - if key == "data": - collections.UserDict.__setattr__(self, key, value) - else: - self[key.encode("us-ascii")] = value - - def __getattr__(self, key): - try: - value = self[key.encode("us-ascii")] - except KeyError as e: - raise AttributeError(key) from e - if isinstance(value, bytes): - value = decode_text(value) - if key.endswith("Date"): - if value.startswith("D:"): - value = value[2:] - - relationship = "Z" - if len(value) > 17: - relationship = value[14] - offset = int(value[15:17]) * 60 - if len(value) > 20: - offset += int(value[18:20]) - - format = "%Y%m%d%H%M%S"[: len(value) - 2] - value = time.strptime(value[: len(format) + 2], format) - if relationship in ["+", "-"]: - offset *= 60 - if relationship == "+": - offset *= -1 - value = time.gmtime(calendar.timegm(value) + offset) - return value - - def __bytes__(self): - out = bytearray(b"<<") - for key, value in self.items(): - if value is None: - continue - value = pdf_repr(value) - out.extend(b"\n") - out.extend(bytes(PdfName(key))) - out.extend(b" ") - out.extend(value) - out.extend(b"\n>>") - return bytes(out) - - -class PdfBinary: - def __init__(self, data): - self.data = data - - def __bytes__(self): - return b"<%s>" % b"".join(b"%02X" % b for b in self.data) - - -class PdfStream: - def __init__(self, dictionary, buf): - self.dictionary = dictionary - self.buf = buf - - def decode(self): - try: - filter = self.dictionary.Filter - except AttributeError: - return self.buf - if filter == b"FlateDecode": - try: - expected_length = self.dictionary.DL - except AttributeError: - expected_length = self.dictionary.Length - return zlib.decompress(self.buf, bufsize=int(expected_length)) - else: - raise NotImplementedError( - f"stream filter {repr(self.dictionary.Filter)} unknown/unsupported" - ) - - -def pdf_repr(x): - if x is True: - return b"true" - elif x is False: - return b"false" - elif x is None: - return b"null" - elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): - return bytes(x) - elif isinstance(x, int): - return str(x).encode("us-ascii") - elif isinstance(x, float): - return str(x).encode("us-ascii") - elif isinstance(x, time.struct_time): - return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" - elif isinstance(x, dict): - return bytes(PdfDict(x)) - elif isinstance(x, list): - return bytes(PdfArray(x)) - elif isinstance(x, str): - return pdf_repr(encode_text(x)) - elif isinstance(x, bytes): - # XXX escape more chars? handle binary garbage - x = x.replace(b"\\", b"\\\\") - x = x.replace(b"(", b"\\(") - x = x.replace(b")", b"\\)") - return b"(" + x + b")" - else: - return bytes(x) - - -class PdfParser: - """Based on - https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf - Supports PDF up to 1.4 - """ - - def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): - if buf and f: - raise RuntimeError("specify buf or f or filename, but not both buf and f") - self.filename = filename - self.buf = buf - self.f = f - self.start_offset = start_offset - self.should_close_buf = False - self.should_close_file = False - if filename is not None and f is None: - self.f = f = open(filename, mode) - self.should_close_file = True - if f is not None: - self.buf = buf = self.get_buf_from_file(f) - self.should_close_buf = True - if not filename and hasattr(f, "name"): - self.filename = f.name - self.cached_objects = {} - if buf: - self.read_pdf_info() - else: - self.file_size_total = self.file_size_this = 0 - self.root = PdfDict() - self.root_ref = None - self.info = PdfDict() - self.info_ref = None - self.page_tree_root = {} - self.pages = [] - self.orig_pages = [] - self.pages_ref = None - self.last_xref_section_offset = None - self.trailer_dict = {} - self.xref_table = XrefTable() - self.xref_table.reading_finished = True - if f: - self.seek_end() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() - return False # do not suppress exceptions - - def start_writing(self): - self.close_buf() - self.seek_end() - - def close_buf(self): - try: - self.buf.close() - except AttributeError: - pass - self.buf = None - - def close(self): - if self.should_close_buf: - self.close_buf() - if self.f is not None and self.should_close_file: - self.f.close() - self.f = None - - def seek_end(self): - self.f.seek(0, os.SEEK_END) - - def write_header(self): - self.f.write(b"%PDF-1.4\n") - - def write_comment(self, s): - self.f.write(f"% {s}\n".encode()) - - def write_catalog(self): - self.del_root() - self.root_ref = self.next_object_id(self.f.tell()) - self.pages_ref = self.next_object_id(0) - self.rewrite_pages() - self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) - self.write_obj( - self.pages_ref, - Type=PdfName(b"Pages"), - Count=len(self.pages), - Kids=self.pages, - ) - return self.root_ref - - def rewrite_pages(self): - pages_tree_nodes_to_delete = [] - for i, page_ref in enumerate(self.orig_pages): - page_info = self.cached_objects[page_ref] - del self.xref_table[page_ref.object_id] - pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) - if page_ref not in self.pages: - # the page has been deleted - continue - # make dict keys into strings for passing to write_page - stringified_page_info = {} - for key, value in page_info.items(): - # key should be a PdfName - stringified_page_info[key.name_as_str()] = value - stringified_page_info["Parent"] = self.pages_ref - new_page_ref = self.write_page(None, **stringified_page_info) - for j, cur_page_ref in enumerate(self.pages): - if cur_page_ref == page_ref: - # replace the page reference with the new one - self.pages[j] = new_page_ref - # delete redundant Pages tree nodes from xref table - for pages_tree_node_ref in pages_tree_nodes_to_delete: - while pages_tree_node_ref: - pages_tree_node = self.cached_objects[pages_tree_node_ref] - if pages_tree_node_ref.object_id in self.xref_table: - del self.xref_table[pages_tree_node_ref.object_id] - pages_tree_node_ref = pages_tree_node.get(b"Parent", None) - self.orig_pages = [] - - def write_xref_and_trailer(self, new_root_ref=None): - if new_root_ref: - self.del_root() - self.root_ref = new_root_ref - if self.info: - self.info_ref = self.write_obj(None, self.info) - start_xref = self.xref_table.write(self.f) - num_entries = len(self.xref_table) - trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} - if self.last_xref_section_offset is not None: - trailer_dict[b"Prev"] = self.last_xref_section_offset - if self.info: - trailer_dict[b"Info"] = self.info_ref - self.last_xref_section_offset = start_xref - self.f.write( - b"trailer\n" - + bytes(PdfDict(trailer_dict)) - + b"\nstartxref\n%d\n%%%%EOF" % start_xref - ) - - def write_page(self, ref, *objs, **dict_obj): - if isinstance(ref, int): - ref = self.pages[ref] - if "Type" not in dict_obj: - dict_obj["Type"] = PdfName(b"Page") - if "Parent" not in dict_obj: - dict_obj["Parent"] = self.pages_ref - return self.write_obj(ref, *objs, **dict_obj) - - def write_obj(self, ref, *objs, **dict_obj): - f = self.f - if ref is None: - ref = self.next_object_id(f.tell()) - else: - self.xref_table[ref.object_id] = (f.tell(), ref.generation) - f.write(bytes(IndirectObjectDef(*ref))) - stream = dict_obj.pop("stream", None) - if stream is not None: - dict_obj["Length"] = len(stream) - if dict_obj: - f.write(pdf_repr(dict_obj)) - for obj in objs: - f.write(pdf_repr(obj)) - if stream is not None: - f.write(b"stream\n") - f.write(stream) - f.write(b"\nendstream\n") - f.write(b"endobj\n") - return ref - - def del_root(self): - if self.root_ref is None: - return - del self.xref_table[self.root_ref.object_id] - del self.xref_table[self.root[b"Pages"].object_id] - - @staticmethod - def get_buf_from_file(f): - if hasattr(f, "getbuffer"): - return f.getbuffer() - elif hasattr(f, "getvalue"): - return f.getvalue() - else: - try: - return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - except ValueError: # cannot mmap an empty file - return b"" - - def read_pdf_info(self): - self.file_size_total = len(self.buf) - self.file_size_this = self.file_size_total - self.start_offset - self.read_trailer() - self.root_ref = self.trailer_dict[b"Root"] - self.info_ref = self.trailer_dict.get(b"Info", None) - self.root = PdfDict(self.read_indirect(self.root_ref)) - if self.info_ref is None: - self.info = PdfDict() - else: - self.info = PdfDict(self.read_indirect(self.info_ref)) - check_format_condition(b"Type" in self.root, "/Type missing in Root") - check_format_condition( - self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" - ) - check_format_condition(b"Pages" in self.root, "/Pages missing in Root") - check_format_condition( - isinstance(self.root[b"Pages"], IndirectReference), - "/Pages in Root is not an indirect reference", - ) - self.pages_ref = self.root[b"Pages"] - self.page_tree_root = self.read_indirect(self.pages_ref) - self.pages = self.linearize_page_tree(self.page_tree_root) - # save the original list of page references - # in case the user modifies, adds or deletes some pages - # and we need to rewrite the pages and their list - self.orig_pages = self.pages[:] - - def next_object_id(self, offset=None): - try: - # TODO: support reuse of deleted objects - reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) - except ValueError: - reference = IndirectReference(1, 0) - if offset is not None: - self.xref_table[reference.object_id] = (offset, 0) - return reference - - delimiter = rb"[][()<>{}/%]" - delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" - whitespace = rb"[\000\011\012\014\015\040]" - whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" - whitespace_optional = whitespace + b"*" - whitespace_mandatory = whitespace + b"+" - # No "\012" aka "\n" or "\015" aka "\r": - whitespace_optional_no_nl = rb"[\000\011\014\040]*" - newline_only = rb"[\r\n]+" - newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl - re_trailer_end = re.compile( - whitespace_mandatory - + rb"trailer" - + whitespace_optional - + rb"\<\<(.*\>\>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional - + rb"$", - re.DOTALL, - ) - re_trailer_prev = re.compile( - whitespace_optional - + rb"trailer" - + whitespace_optional - + rb"\<\<(.*?\>\>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional, - re.DOTALL, - ) - - def read_trailer(self): - search_start_offset = len(self.buf) - 16384 - if search_start_offset < self.start_offset: - search_start_offset = self.start_offset - m = self.re_trailer_end.search(self.buf, search_start_offset) - check_format_condition(m, "trailer end not found") - # make sure we found the LAST trailer - last_match = m - while m: - last_match = m - m = self.re_trailer_end.search(self.buf, m.start() + 16) - if not m: - m = last_match - trailer_data = m.group(1) - self.last_xref_section_offset = int(m.group(2)) - self.trailer_dict = self.interpret_trailer(trailer_data) - self.xref_table = XrefTable() - self.read_xref_table(xref_section_offset=self.last_xref_section_offset) - if b"Prev" in self.trailer_dict: - self.read_prev_trailer(self.trailer_dict[b"Prev"]) - - def read_prev_trailer(self, xref_section_offset): - trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) - m = self.re_trailer_prev.search( - self.buf[trailer_offset : trailer_offset + 16384] - ) - check_format_condition(m, "previous trailer not found") - trailer_data = m.group(1) - check_format_condition( - int(m.group(2)) == xref_section_offset, - "xref section offset in previous trailer doesn't match what was expected", - ) - trailer_dict = self.interpret_trailer(trailer_data) - if b"Prev" in trailer_dict: - self.read_prev_trailer(trailer_dict[b"Prev"]) - - re_whitespace_optional = re.compile(whitespace_optional) - re_name = re.compile( - whitespace_optional - + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" - + delimiter_or_ws - + rb")" - ) - re_dict_start = re.compile(whitespace_optional + rb"\<\<") - re_dict_end = re.compile(whitespace_optional + rb"\>\>" + whitespace_optional) - - @classmethod - def interpret_trailer(cls, trailer_data): - trailer = {} - offset = 0 - while True: - m = cls.re_name.match(trailer_data, offset) - if not m: - m = cls.re_dict_end.match(trailer_data, offset) - check_format_condition( - m and m.end() == len(trailer_data), - "name not found in trailer, remaining data: " - + repr(trailer_data[offset:]), - ) - break - key = cls.interpret_name(m.group(1)) - value, offset = cls.get_value(trailer_data, m.end()) - trailer[key] = value - check_format_condition( - b"Size" in trailer and isinstance(trailer[b"Size"], int), - "/Size not in trailer or not an integer", - ) - check_format_condition( - b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), - "/Root not in trailer or not an indirect reference", - ) - return trailer - - re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") - - @classmethod - def interpret_name(cls, raw, as_text=False): - name = b"" - for m in cls.re_hashes_in_name.finditer(raw): - if m.group(3): - name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) - else: - name += m.group(1) - if as_text: - return name.decode("utf-8") - else: - return bytes(name) - - re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") - re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") - re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") - re_int = re.compile( - whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" - ) - re_real = re.compile( - whitespace_optional - + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" - + delimiter_or_ws - + rb")" - ) - re_array_start = re.compile(whitespace_optional + rb"\[") - re_array_end = re.compile(whitespace_optional + rb"]") - re_string_hex = re.compile( - whitespace_optional + rb"\<(" + whitespace_or_hex + rb"*)\>" - ) - re_string_lit = re.compile(whitespace_optional + rb"\(") - re_indirect_reference = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"R(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_start = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"obj(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_end = re.compile( - whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" - ) - re_comment = re.compile( - rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" - ) - re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") - re_stream_end = re.compile( - whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" - ) - - @classmethod - def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): - if max_nesting == 0: - return None, None - m = cls.re_comment.match(data, offset) - if m: - offset = m.end() - m = cls.re_indirect_def_start.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object definition: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object definition: generation must be non-negative", - ) - check_format_condition( - expect_indirect is None - or expect_indirect - == IndirectReference(int(m.group(1)), int(m.group(2))), - "indirect object definition different than expected", - ) - object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting - 1) - if offset is None: - return object, None - m = cls.re_indirect_def_end.match(data, offset) - check_format_condition(m, "indirect object definition end not found") - return object, m.end() - check_format_condition( - not expect_indirect, "indirect object definition not found" - ) - m = cls.re_indirect_reference.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object reference: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object reference: generation must be non-negative", - ) - return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() - m = cls.re_dict_start.match(data, offset) - if m: - offset = m.end() - result = {} - m = cls.re_dict_end.match(data, offset) - while not m: - key, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - if offset is None: - return result, None - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result[key] = value - if offset is None: - return result, None - m = cls.re_dict_end.match(data, offset) - offset = m.end() - m = cls.re_stream_start.match(data, offset) - if m: - try: - stream_len = int(result[b"Length"]) - except (TypeError, KeyError, ValueError) as e: - raise PdfFormatError( - "bad or missing Length in stream dict (%r)" - % result.get(b"Length", None) - ) from e - stream_data = data[m.end() : m.end() + stream_len] - m = cls.re_stream_end.match(data, m.end() + stream_len) - check_format_condition(m, "stream end not found") - offset = m.end() - result = PdfStream(PdfDict(result), stream_data) - else: - result = PdfDict(result) - return result, offset - m = cls.re_array_start.match(data, offset) - if m: - offset = m.end() - result = [] - m = cls.re_array_end.match(data, offset) - while not m: - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result.append(value) - if offset is None: - return result, None - m = cls.re_array_end.match(data, offset) - return result, m.end() - m = cls.re_null.match(data, offset) - if m: - return None, m.end() - m = cls.re_true.match(data, offset) - if m: - return True, m.end() - m = cls.re_false.match(data, offset) - if m: - return False, m.end() - m = cls.re_name.match(data, offset) - if m: - return PdfName(cls.interpret_name(m.group(1))), m.end() - m = cls.re_int.match(data, offset) - if m: - return int(m.group(1)), m.end() - m = cls.re_real.match(data, offset) - if m: - # XXX Decimal instead of float??? - return float(m.group(1)), m.end() - m = cls.re_string_hex.match(data, offset) - if m: - # filter out whitespace - hex_string = bytearray( - b for b in m.group(1) if b in b"0123456789abcdefABCDEF" - ) - if len(hex_string) % 2 == 1: - # append a 0 if the length is not even - yes, at the end - hex_string.append(ord(b"0")) - return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() - m = cls.re_string_lit.match(data, offset) - if m: - return cls.get_literal_string(data, m.end()) - # return None, offset # fallback (only for debugging) - raise PdfFormatError("unrecognized object: " + repr(data[offset : offset + 32])) - - re_lit_str_token = re.compile( - rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" - ) - escaped_chars = { - b"n": b"\n", - b"r": b"\r", - b"t": b"\t", - b"b": b"\b", - b"f": b"\f", - b"(": b"(", - b")": b")", - b"\\": b"\\", - ord(b"n"): b"\n", - ord(b"r"): b"\r", - ord(b"t"): b"\t", - ord(b"b"): b"\b", - ord(b"f"): b"\f", - ord(b"("): b"(", - ord(b")"): b")", - ord(b"\\"): b"\\", - } - - @classmethod - def get_literal_string(cls, data, offset): - nesting_depth = 0 - result = bytearray() - for m in cls.re_lit_str_token.finditer(data, offset): - result.extend(data[offset : m.start()]) - if m.group(1): - result.extend(cls.escaped_chars[m.group(1)[1]]) - elif m.group(2): - result.append(int(m.group(2)[1:], 8)) - elif m.group(3): - pass - elif m.group(5): - result.extend(b"\n") - elif m.group(6): - result.extend(b"(") - nesting_depth += 1 - elif m.group(7): - if nesting_depth == 0: - return bytes(result), m.end() - result.extend(b")") - nesting_depth -= 1 - offset = m.end() - raise PdfFormatError("unfinished literal string") - - re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) - re_xref_subsection_start = re.compile( - whitespace_optional - + rb"([0-9]+)" - + whitespace_mandatory - + rb"([0-9]+)" - + whitespace_optional - + newline_only - ) - re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") - - def read_xref_table(self, xref_section_offset): - subsection_found = False - m = self.re_xref_section_start.match( - self.buf, xref_section_offset + self.start_offset - ) - check_format_condition(m, "xref section start not found") - offset = m.end() - while True: - m = self.re_xref_subsection_start.match(self.buf, offset) - if not m: - check_format_condition( - subsection_found, "xref subsection start not found" - ) - break - subsection_found = True - offset = m.end() - first_object = int(m.group(1)) - num_objects = int(m.group(2)) - for i in range(first_object, first_object + num_objects): - m = self.re_xref_entry.match(self.buf, offset) - check_format_condition(m, "xref entry not found") - offset = m.end() - is_free = m.group(3) == b"f" - generation = int(m.group(2)) - if not is_free: - new_entry = (int(m.group(1)), generation) - check_format_condition( - i not in self.xref_table or self.xref_table[i] == new_entry, - "xref entry duplicated (and not identical)", - ) - self.xref_table[i] = new_entry - return offset - - def read_indirect(self, ref, max_nesting=-1): - offset, generation = self.xref_table[ref[0]] - check_format_condition( - generation == ref[1], - f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " - f"table, instead found generation {generation} at offset {offset}", - ) - value = self.get_value( - self.buf, - offset + self.start_offset, - expect_indirect=IndirectReference(*ref), - max_nesting=max_nesting, - )[0] - self.cached_objects[ref] = value - return value - - def linearize_page_tree(self, node=None): - if node is None: - node = self.page_tree_root - check_format_condition( - node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" - ) - pages = [] - for kid in node[b"Kids"]: - kid_object = self.read_indirect(kid) - if kid_object[b"Type"] == b"Page": - pages.append(kid) - else: - pages.extend(self.linearize_page_tree(node=kid_object)) - return pages diff --git a/venv/Lib/site-packages/PIL/PixarImagePlugin.py b/venv/Lib/site-packages/PIL/PixarImagePlugin.py deleted file mode 100644 index c4860b6..0000000 --- a/venv/Lib/site-packages/PIL/PixarImagePlugin.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIXAR raster support for PIL -# -# history: -# 97-01-29 fl Created -# -# notes: -# This is incomplete; it is based on a few samples created with -# Photoshop 2.5 and 3.0, and a summary description provided by -# Greg Coats . Hopefully, "L" and -# "RGBA" support will be added in future versions. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -from . import Image, ImageFile -from ._binary import i16le as i16 - -# -# helpers - - -def _accept(prefix): - return prefix[:4] == b"\200\350\000\000" - - -## -# Image plugin for PIXAR raster images. - - -class PixarImageFile(ImageFile.ImageFile): - - format = "PIXAR" - format_description = "PIXAR raster image" - - def _open(self): - - # assuming a 4-byte magic label - s = self.fp.read(4) - if not _accept(s): - raise SyntaxError("not a PIXAR file") - - # read rest of header - s = s + self.fp.read(508) - - self._size = i16(s, 418), i16(s, 416) - - # get channel/depth descriptions - mode = i16(s, 424), i16(s, 426) - - if mode == (14, 2): - self.mode = "RGB" - # FIXME: to be continued... - - # create tile descriptor (assuming "dumped") - self.tile = [("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1))] - - -# -# -------------------------------------------------------------------- - -Image.register_open(PixarImageFile.format, PixarImageFile, _accept) - -Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/venv/Lib/site-packages/PIL/PngImagePlugin.py b/venv/Lib/site-packages/PIL/PngImagePlugin.py deleted file mode 100644 index 53525e2..0000000 --- a/venv/Lib/site-packages/PIL/PngImagePlugin.py +++ /dev/null @@ -1,1432 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PNG support code -# -# See "PNG (Portable Network Graphics) Specification, version 1.0; -# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). -# -# history: -# 1996-05-06 fl Created (couldn't resist it) -# 1996-12-14 fl Upgraded, added read and verify support (0.2) -# 1996-12-15 fl Separate PNG stream parser -# 1996-12-29 fl Added write support, added getchunks -# 1996-12-30 fl Eliminated circular references in decoder (0.3) -# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) -# 2001-02-08 fl Added transparency support (from Zircon) (0.5) -# 2001-04-16 fl Don't close data source in "open" method (0.6) -# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) -# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) -# 2004-09-20 fl Added PngInfo chunk container -# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) -# 2008-08-13 fl Added tRNS support for RGB images -# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) -# 2009-03-08 fl Added zTXT support (from Lowell Alleman) -# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) -# -# Copyright (c) 1997-2009 by Secret Labs AB -# Copyright (c) 1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import itertools -import logging -import re -import struct -import warnings -import zlib -from enum import IntEnum - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._binary import o32be as o32 - -logger = logging.getLogger(__name__) - -is_cid = re.compile(rb"\w\w\w\w").match - - -_MAGIC = b"\211PNG\r\n\032\n" - - -_MODES = { - # supported bits/color combinations, and corresponding modes/rawmodes - # Greyscale - (1, 0): ("1", "1"), - (2, 0): ("L", "L;2"), - (4, 0): ("L", "L;4"), - (8, 0): ("L", "L"), - (16, 0): ("I", "I;16B"), - # Truecolour - (8, 2): ("RGB", "RGB"), - (16, 2): ("RGB", "RGB;16B"), - # Indexed-colour - (1, 3): ("P", "P;1"), - (2, 3): ("P", "P;2"), - (4, 3): ("P", "P;4"), - (8, 3): ("P", "P"), - # Greyscale with alpha - (8, 4): ("LA", "LA"), - (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available - # Truecolour with alpha - (8, 6): ("RGBA", "RGBA"), - (16, 6): ("RGBA", "RGBA;16B"), -} - - -_simple_palette = re.compile(b"^\xff*\x00\xff*$") - -MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK -""" -Maximum decompressed size for a iTXt or zTXt chunk. -Eliminates decompression bombs where compressed chunks can expand 1000x. -See :ref:`Text in PNG File Format`. -""" -MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK -""" -Set the maximum total text chunk size. -See :ref:`Text in PNG File Format`. -""" - - -# APNG frame disposal modes -class Disposal(IntEnum): - OP_NONE = 0 - """ - No disposal is done on this frame before rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_BACKGROUND = 1 - """ - This frame’s modified region is cleared to fully transparent black before rendering - the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_PREVIOUS = 2 - """ - This frame’s modified region is reverted to the previous frame’s contents before - rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - - -# APNG frame blend modes -class Blend(IntEnum): - OP_SOURCE = 0 - """ - All color components of this frame, including alpha, overwrite the previous output - image contents. - See :ref:`Saving APNG sequences`. - """ - OP_OVER = 1 - """ - This frame should be alpha composited with the previous output image contents. - See :ref:`Saving APNG sequences`. - """ - - -def __getattr__(name): - deprecated = "deprecated and will be removed in Pillow 10 (2023-07-01). " - for enum, prefix in {Disposal: "APNG_DISPOSE_", Blend: "APNG_BLEND_"}.items(): - if name.startswith(prefix): - name = name[len(prefix) :] - if name in enum.__members__: - warnings.warn( - prefix - + name - + " is " - + deprecated - + "Use " - + enum.__name__ - + "." - + name - + " instead.", - DeprecationWarning, - stacklevel=2, - ) - return enum[name] - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") - - -def _safe_zlib_decompress(s): - dobj = zlib.decompressobj() - plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) - if dobj.unconsumed_tail: - raise ValueError("Decompressed Data Too Large") - return plaintext - - -def _crc32(data, seed=0): - return zlib.crc32(data, seed) & 0xFFFFFFFF - - -# -------------------------------------------------------------------- -# Support classes. Suitable for PNG and related formats like MNG etc. - - -class ChunkStream: - def __init__(self, fp): - - self.fp = fp - self.queue = [] - - def read(self): - """Fetch a new chunk. Returns header information.""" - cid = None - - if self.queue: - cid, pos, length = self.queue.pop() - self.fp.seek(pos) - else: - s = self.fp.read(8) - cid = s[4:] - pos = self.fp.tell() - length = i32(s) - - if not is_cid(cid): - if not ImageFile.LOAD_TRUNCATED_IMAGES: - raise SyntaxError(f"broken PNG file (chunk {repr(cid)})") - - return cid, pos, length - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - self.queue = self.crc = self.fp = None - - def push(self, cid, pos, length): - - self.queue.append((cid, pos, length)) - - def call(self, cid, pos, length): - """Call the appropriate chunk handler""" - - logger.debug("STREAM %r %s %s", cid, pos, length) - return getattr(self, "chunk_" + cid.decode("ascii"))(pos, length) - - def crc(self, cid, data): - """Read and verify checksum""" - - # Skip CRC checks for ancillary chunks if allowed to load truncated - # images - # 5th byte of first char is 1 [specs, section 5.4] - if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): - self.crc_skip(cid, data) - return - - try: - crc1 = _crc32(data, _crc32(cid)) - crc2 = i32(self.fp.read(4)) - if crc1 != crc2: - raise SyntaxError( - f"broken PNG file (bad header checksum in {repr(cid)})" - ) - except struct.error as e: - raise SyntaxError( - f"broken PNG file (incomplete checksum in {repr(cid)})" - ) from e - - def crc_skip(self, cid, data): - """Read checksum. Used if the C module is not present""" - - self.fp.read(4) - - def verify(self, endchunk=b"IEND"): - - # Simple approach; just calculate checksum for all remaining - # blocks. Must be called directly after open. - - cids = [] - - while True: - try: - cid, pos, length = self.read() - except struct.error as e: - raise OSError("truncated PNG file") from e - - if cid == endchunk: - break - self.crc(cid, ImageFile._safe_read(self.fp, length)) - cids.append(cid) - - return cids - - -class iTXt(str): - """ - Subclass of string to allow iTXt chunks to look like strings while - keeping their extra information - - """ - - @staticmethod - def __new__(cls, text, lang=None, tkey=None): - """ - :param cls: the class to use when creating the instance - :param text: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - """ - - self = str.__new__(cls, text) - self.lang = lang - self.tkey = tkey - return self - - -class PngInfo: - """ - PNG chunk container (for use with save(pnginfo=)) - - """ - - def __init__(self): - self.chunks = [] - - def add(self, cid, data, after_idat=False): - """Appends an arbitrary chunk. Use with caution. - - :param cid: a byte string, 4 bytes long. - :param data: a byte string of the encoded data - :param after_idat: for use with private chunks. Whether the chunk - should be written after IDAT - - """ - - chunk = [cid, data] - if after_idat: - chunk.append(True) - self.chunks.append(tuple(chunk)) - - def add_itxt(self, key, value, lang="", tkey="", zip=False): - """Appends an iTXt chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - :param zip: compression flag - - """ - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - if not isinstance(value, bytes): - value = value.encode("utf-8", "strict") - if not isinstance(lang, bytes): - lang = lang.encode("utf-8", "strict") - if not isinstance(tkey, bytes): - tkey = tkey.encode("utf-8", "strict") - - if zip: - self.add( - b"iTXt", - key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), - ) - else: - self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) - - def add_text(self, key, value, zip=False): - """Appends a text chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key, text or an - :py:class:`PIL.PngImagePlugin.iTXt` instance - :param zip: compression flag - - """ - if isinstance(value, iTXt): - return self.add_itxt(key, value, value.lang, value.tkey, zip=zip) - - # The tEXt chunk stores latin-1 text - if not isinstance(value, bytes): - try: - value = value.encode("latin-1", "strict") - except UnicodeError: - return self.add_itxt(key, value, zip=zip) - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - - if zip: - self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) - else: - self.add(b"tEXt", key + b"\0" + value) - - -# -------------------------------------------------------------------- -# PNG image stream (IHDR/IEND) - - -class PngStream(ChunkStream): - def __init__(self, fp): - super().__init__(fp) - - # local copies of Image attributes - self.im_info = {} - self.im_text = {} - self.im_size = (0, 0) - self.im_mode = None - self.im_tile = None - self.im_palette = None - self.im_custom_mimetype = None - self.im_n_frames = None - self._seq_num = None - self.rewind_state = None - - self.text_memory = 0 - - def check_text_memory(self, chunklen): - self.text_memory += chunklen - if self.text_memory > MAX_TEXT_MEMORY: - raise ValueError( - "Too much memory used in text chunks: " - f"{self.text_memory}>MAX_TEXT_MEMORY" - ) - - def save_rewind(self): - self.rewind_state = { - "info": self.im_info.copy(), - "tile": self.im_tile, - "seq_num": self._seq_num, - } - - def rewind(self): - self.im_info = self.rewind_state["info"] - self.im_tile = self.rewind_state["tile"] - self._seq_num = self.rewind_state["seq_num"] - - def chunk_iCCP(self, pos, length): - - # ICC profile - s = ImageFile._safe_read(self.fp, length) - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - i = s.find(b"\0") - logger.debug("iCCP profile name %r", s[:i]) - logger.debug("Compression method %s", s[i]) - comp_method = s[i] - if comp_method != 0: - raise SyntaxError(f"Unknown compression method {comp_method} in iCCP chunk") - try: - icc_profile = _safe_zlib_decompress(s[i + 2 :]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - icc_profile = None - else: - raise - except zlib.error: - icc_profile = None # FIXME - self.im_info["icc_profile"] = icc_profile - return s - - def chunk_IHDR(self, pos, length): - - # image header - s = ImageFile._safe_read(self.fp, length) - self.im_size = i32(s, 0), i32(s, 4) - try: - self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] - except Exception: - pass - if s[12]: - self.im_info["interlace"] = 1 - if s[11]: - raise SyntaxError("unknown filter category") - return s - - def chunk_IDAT(self, pos, length): - - # image data - if "bbox" in self.im_info: - tile = [("zip", self.im_info["bbox"], pos, self.im_rawmode)] - else: - if self.im_n_frames is not None: - self.im_info["default_image"] = True - tile = [("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] - self.im_tile = tile - self.im_idat = length - raise EOFError - - def chunk_IEND(self, pos, length): - - # end of PNG image - raise EOFError - - def chunk_PLTE(self, pos, length): - - # palette - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - self.im_palette = "RGB", s - return s - - def chunk_tRNS(self, pos, length): - - # transparency - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - if _simple_palette.match(s): - # tRNS contains only one full-transparent entry, - # other entries are full opaque - i = s.find(b"\0") - if i >= 0: - self.im_info["transparency"] = i - else: - # otherwise, we have a byte string with one alpha value - # for each palette entry - self.im_info["transparency"] = s - elif self.im_mode in ("1", "L", "I"): - self.im_info["transparency"] = i16(s) - elif self.im_mode == "RGB": - self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) - return s - - def chunk_gAMA(self, pos, length): - # gamma setting - s = ImageFile._safe_read(self.fp, length) - self.im_info["gamma"] = i32(s) / 100000.0 - return s - - def chunk_cHRM(self, pos, length): - # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 - # WP x,y, Red x,y, Green x,y Blue x,y - - s = ImageFile._safe_read(self.fp, length) - raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) - self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) - return s - - def chunk_sRGB(self, pos, length): - # srgb rendering intent, 1 byte - # 0 perceptual - # 1 relative colorimetric - # 2 saturation - # 3 absolute colorimetric - - s = ImageFile._safe_read(self.fp, length) - self.im_info["srgb"] = s[0] - return s - - def chunk_pHYs(self, pos, length): - - # pixels per unit - s = ImageFile._safe_read(self.fp, length) - px, py = i32(s, 0), i32(s, 4) - unit = s[8] - if unit == 1: # meter - dpi = px * 0.0254, py * 0.0254 - self.im_info["dpi"] = dpi - elif unit == 0: - self.im_info["aspect"] = px, py - return s - - def chunk_tEXt(self, pos, length): - - # text - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - # fallback for broken tEXt tags - k = s - v = b"" - if k: - k = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k] = v if k == "exif" else v_str - self.im_text[k] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_zTXt(self, pos, length): - - # compressed text - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - k = s - v = b"" - if v: - comp_method = v[0] - else: - comp_method = 0 - if comp_method != 0: - raise SyntaxError(f"Unknown compression method {comp_method} in zTXt chunk") - try: - v = _safe_zlib_decompress(v[1:]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - v = b"" - else: - raise - except zlib.error: - v = b"" - - if k: - k = k.decode("latin-1", "strict") - v = v.decode("latin-1", "replace") - - self.im_info[k] = self.im_text[k] = v - self.check_text_memory(len(v)) - - return s - - def chunk_iTXt(self, pos, length): - - # international text - r = s = ImageFile._safe_read(self.fp, length) - try: - k, r = r.split(b"\0", 1) - except ValueError: - return s - if len(r) < 2: - return s - cf, cm, r = r[0], r[1], r[2:] - try: - lang, tk, v = r.split(b"\0", 2) - except ValueError: - return s - if cf != 0: - if cm == 0: - try: - v = _safe_zlib_decompress(v) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - else: - raise - except zlib.error: - return s - else: - return s - try: - k = k.decode("latin-1", "strict") - lang = lang.decode("utf-8", "strict") - tk = tk.decode("utf-8", "strict") - v = v.decode("utf-8", "strict") - except UnicodeError: - return s - - self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) - self.check_text_memory(len(v)) - - return s - - def chunk_eXIf(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - self.im_info["exif"] = b"Exif\x00\x00" + s - return s - - # APNG chunks - def chunk_acTL(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - if self.im_n_frames is not None: - self.im_n_frames = None - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - n_frames = i32(s) - if n_frames == 0 or n_frames > 0x80000000: - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - self.im_n_frames = n_frames - self.im_info["loop"] = i32(s, 4) - self.im_custom_mimetype = "image/apng" - return s - - def chunk_fcTL(self, pos, length): - s = ImageFile._safe_read(self.fp, length) - seq = i32(s) - if (self._seq_num is None and seq != 0) or ( - self._seq_num is not None and self._seq_num != seq - 1 - ): - raise SyntaxError("APNG contains frame sequence errors") - self._seq_num = seq - width, height = i32(s, 4), i32(s, 8) - px, py = i32(s, 12), i32(s, 16) - im_w, im_h = self.im_size - if px + width > im_w or py + height > im_h: - raise SyntaxError("APNG contains invalid frames") - self.im_info["bbox"] = (px, py, px + width, py + height) - delay_num, delay_den = i16(s, 20), i16(s, 22) - if delay_den == 0: - delay_den = 100 - self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 - self.im_info["disposal"] = s[24] - self.im_info["blend"] = s[25] - return s - - def chunk_fdAT(self, pos, length): - s = ImageFile._safe_read(self.fp, 4) - seq = i32(s) - if self._seq_num != seq - 1: - raise SyntaxError("APNG contains frame sequence errors") - self._seq_num = seq - return self.chunk_IDAT(pos + 4, length - 4) - - -# -------------------------------------------------------------------- -# PNG reader - - -def _accept(prefix): - return prefix[:8] == _MAGIC - - -## -# Image plugin for PNG images. - - -class PngImageFile(ImageFile.ImageFile): - - format = "PNG" - format_description = "Portable network graphics" - - def _open(self): - - if not _accept(self.fp.read(8)): - raise SyntaxError("not a PNG file") - self.__fp = self.fp - self.__frame = 0 - - # - # Parse headers up to the first IDAT or fDAT chunk - - self.private_chunks = [] - self.png = PngStream(self.fp) - - while True: - - # - # get next chunk - - cid, pos, length = self.png.read() - - try: - s = self.png.call(cid, pos, length) - except EOFError: - break - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s)) - - self.png.crc(cid, s) - - # - # Copy relevant attributes from the PngStream. An alternative - # would be to let the PngStream class modify these attributes - # directly, but that introduces circular references which are - # difficult to break if things go wrong in the decoder... - # (believe me, I've tried ;-) - - self.mode = self.png.im_mode - self._size = self.png.im_size - self.info = self.png.im_info - self._text = None - self.tile = self.png.im_tile - self.custom_mimetype = self.png.im_custom_mimetype - self.n_frames = self.png.im_n_frames or 1 - self.default_image = self.info.get("default_image", False) - - if self.png.im_palette: - rawmode, data = self.png.im_palette - self.palette = ImagePalette.raw(rawmode, data) - - if cid == b"fdAT": - self.__prepare_idat = length - 4 - else: - self.__prepare_idat = length # used by load_prepare() - - if self.png.im_n_frames is not None: - self._close_exclusive_fp_after_loading = False - self.png.save_rewind() - self.__rewind_idat = self.__prepare_idat - self.__rewind = self.__fp.tell() - if self.default_image: - # IDAT chunk contains default image and not first animation frame - self.n_frames += 1 - self._seek(0) - self.is_animated = self.n_frames > 1 - - @property - def text(self): - # experimental - if self._text is None: - # iTxt, tEXt and zTXt chunks may appear at the end of the file - # So load the file to ensure that they are read - if self.is_animated: - frame = self.__frame - # for APNG, seek to the final frame before loading - self.seek(self.n_frames - 1) - self.load() - if self.is_animated: - self.seek(frame) - return self._text - - def verify(self): - """Verify PNG file""" - - if self.fp is None: - raise RuntimeError("verify must be called directly after open") - - # back up to beginning of IDAT block - self.fp.seek(self.tile[0][2] - 8) - - self.png.verify() - self.png.close() - - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def seek(self, frame): - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0, True) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - raise EOFError("no more images in APNG file") from e - - def _seek(self, frame, rewind=False): - if frame == 0: - if rewind: - self.__fp.seek(self.__rewind) - self.png.rewind() - self.__prepare_idat = self.__rewind_idat - self.im = None - if self.pyaccess: - self.pyaccess = None - self.info = self.png.im_info - self.tile = self.png.im_tile - self.fp = self.__fp - self._prev_im = None - self.dispose = None - self.default_image = self.info.get("default_image", False) - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - self.__frame = 0 - else: - if frame != self.__frame + 1: - raise ValueError(f"cannot seek to frame {frame}") - - # ensure previous frame was loaded - self.load() - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - self._prev_im = self.im.copy() - - self.fp = self.__fp - - # advance to the next frame - if self.__prepare_idat: - ImageFile._safe_read(self.fp, self.__prepare_idat) - self.__prepare_idat = 0 - frame_start = False - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - raise EOFError("No more images in APNG file") - if cid == b"fcTL": - if frame_start: - # there must be at least one fdAT chunk between fcTL chunks - raise SyntaxError("APNG missing frame data") - frame_start = True - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - if frame_start: - self.__prepare_idat = length - break - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - ImageFile._safe_read(self.fp, length) - - self.__frame = frame - self.tile = self.png.im_tile - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - - if not self.tile: - raise EOFError - - # setup frame disposal (actual disposal done when needed in the next _seek()) - if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose_op = Disposal.OP_BACKGROUND - - if self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose = self._prev_im.copy() - self.dispose = self._crop(self.dispose, self.dispose_extent) - elif self.dispose_op == Disposal.OP_BACKGROUND: - self.dispose = Image.core.fill(self.mode, self.size) - self.dispose = self._crop(self.dispose, self.dispose_extent) - else: - self.dispose = None - - def tell(self): - return self.__frame - - def load_prepare(self): - """internal: prepare to read PNG file""" - - if self.info.get("interlace"): - self.decoderconfig = self.decoderconfig + (1,) - - self.__idat = self.__prepare_idat # used by load_read() - ImageFile.ImageFile.load_prepare(self) - - def load_read(self, read_bytes): - """internal: read more image data""" - - while self.__idat == 0: - # end of chunk, skip forward to next one - - self.fp.read(4) # CRC - - cid, pos, length = self.png.read() - - if cid not in [b"IDAT", b"DDAT", b"fdAT"]: - self.png.push(cid, pos, length) - return b"" - - if cid == b"fdAT": - try: - self.png.call(cid, pos, length) - except EOFError: - pass - self.__idat = length - 4 # sequence_num has already been read - else: - self.__idat = length # empty chunks are allowed - - # read more data from this chunk - if read_bytes <= 0: - read_bytes = self.__idat - else: - read_bytes = min(read_bytes, self.__idat) - - self.__idat = self.__idat - read_bytes - - return self.fp.read(read_bytes) - - def load_end(self): - """internal: finished reading image data""" - if self.__idat != 0: - self.fp.read(self.__idat) - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - break - elif cid == b"fcTL" and self.is_animated: - # start of the next frame, stop reading - self.__prepare_idat = 0 - self.png.push(cid, pos, length) - break - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s, True)) - self._text = self.png.im_text - if not self.is_animated: - self.png.close() - self.png = None - else: - if self._prev_im and self.blend_op == Blend.OP_OVER: - updated = self._crop(self.im, self.dispose_extent) - self._prev_im.paste( - updated, self.dispose_extent, updated.convert("RGBA") - ) - self.im = self._prev_im - if self.pyaccess: - self.pyaccess = None - - def _getexif(self): - if "exif" not in self.info: - self.load() - if "exif" not in self.info and "Raw profile type exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def getexif(self): - if "exif" not in self.info: - self.load() - - return super().getexif() - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - return ( - self._getxmp(self.info["XML:com.adobe.xmp"]) - if "XML:com.adobe.xmp" in self.info - else {} - ) - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -# -------------------------------------------------------------------- -# PNG writer - -_OUTMODES = { - # supported PIL modes, and corresponding rawmodes/bits/color combinations - "1": ("1", b"\x01\x00"), - "L;1": ("L;1", b"\x01\x00"), - "L;2": ("L;2", b"\x02\x00"), - "L;4": ("L;4", b"\x04\x00"), - "L": ("L", b"\x08\x00"), - "LA": ("LA", b"\x08\x04"), - "I": ("I;16B", b"\x10\x00"), - "I;16": ("I;16B", b"\x10\x00"), - "P;1": ("P;1", b"\x01\x03"), - "P;2": ("P;2", b"\x02\x03"), - "P;4": ("P;4", b"\x04\x03"), - "P": ("P", b"\x08\x03"), - "RGB": ("RGB", b"\x08\x02"), - "RGBA": ("RGBA", b"\x08\x06"), -} - - -def putchunk(fp, cid, *data): - """Write a PNG chunk (including CRC field)""" - - data = b"".join(data) - - fp.write(o32(len(data)) + cid) - fp.write(data) - crc = _crc32(data, _crc32(cid)) - fp.write(o32(crc)) - - -class _idat: - # wrap output from the encoder in IDAT chunks - - def __init__(self, fp, chunk): - self.fp = fp - self.chunk = chunk - - def write(self, data): - self.chunk(self.fp, b"IDAT", data) - - -class _fdat: - # wrap encoder output in fdAT chunks - - def __init__(self, fp, chunk, seq_num): - self.fp = fp - self.chunk = chunk - self.seq_num = seq_num - - def write(self, data): - self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) - self.seq_num += 1 - - -def _write_multiple_frames(im, fp, chunk, rawmode): - default_image = im.encoderinfo.get("default_image", im.info.get("default_image")) - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) - disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) - blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) - - if default_image: - chain = itertools.chain(im.encoderinfo.get("append_images", [])) - else: - chain = itertools.chain([im], im.encoderinfo.get("append_images", [])) - - im_frames = [] - frame_count = 0 - for im_seq in chain: - for im_frame in ImageSequence.Iterator(im_seq): - im_frame = im_frame.copy() - if im_frame.mode != im.mode: - if im.mode == "P": - im_frame = im_frame.convert(im.mode, palette=im.palette) - else: - im_frame = im_frame.convert(im.mode) - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - if isinstance(blend, (list, tuple)): - encoderinfo["blend"] = blend[frame_count] - frame_count += 1 - - if im_frames: - previous = im_frames[-1] - prev_disposal = previous["encoderinfo"].get("disposal") - prev_blend = previous["encoderinfo"].get("blend") - if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: - prev_disposal = Disposal.OP_BACKGROUND - - if prev_disposal == Disposal.OP_BACKGROUND: - base_im = previous["im"] - dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) - bbox = previous["bbox"] - if bbox: - dispose = dispose.crop(bbox) - else: - bbox = (0, 0) + im.size - base_im.paste(dispose, bbox) - elif prev_disposal == Disposal.OP_PREVIOUS: - base_im = im_frames[-2]["im"] - else: - base_im = previous["im"] - delta = ImageChops.subtract_modulo( - im_frame.convert("RGB"), base_im.convert("RGB") - ) - bbox = delta.getbbox() - if ( - not bbox - and prev_disposal == encoderinfo.get("disposal") - and prev_blend == encoderinfo.get("blend") - ): - if isinstance(duration, (list, tuple)): - previous["encoderinfo"]["duration"] += encoderinfo["duration"] - continue - else: - bbox = None - im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) - - # animation control - chunk( - fp, - b"acTL", - o32(len(im_frames)), # 0: num_frames - o32(loop), # 4: num_plays - ) - - # default image IDAT (if it exists) - if default_image: - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - seq_num = 0 - for frame, frame_data in enumerate(im_frames): - im_frame = frame_data["im"] - if not frame_data["bbox"]: - bbox = (0, 0) + im_frame.size - else: - bbox = frame_data["bbox"] - im_frame = im_frame.crop(bbox) - size = im_frame.size - encoderinfo = frame_data["encoderinfo"] - frame_duration = int(round(encoderinfo.get("duration", duration))) - frame_disposal = encoderinfo.get("disposal", disposal) - frame_blend = encoderinfo.get("blend", blend) - # frame control - chunk( - fp, - b"fcTL", - o32(seq_num), # sequence_number - o32(size[0]), # width - o32(size[1]), # height - o32(bbox[0]), # x_offset - o32(bbox[1]), # y_offset - o16(frame_duration), # delay_numerator - o16(1000), # delay_denominator - o8(frame_disposal), # dispose_op - o8(frame_blend), # blend_op - ) - seq_num += 1 - # frame data - if frame == 0 and not default_image: - # first frame must be in IDAT chunks for backwards compatibility - ImageFile._save( - im_frame, - _idat(fp, chunk), - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - else: - fdat_chunks = _fdat(fp, chunk, seq_num) - ImageFile._save( - im_frame, - fdat_chunks, - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - seq_num = fdat_chunks.seq_num - - -def _save_all(im, fp, filename): - _save(im, fp, filename, save_all=True) - - -def _save(im, fp, filename, chunk=putchunk, save_all=False): - # save an image to disk (called by the save method) - - mode = im.mode - - if mode == "P": - - # - # attempt to minimize storage requirements for palette images - if "bits" in im.encoderinfo: - # number of bits specified by user - colors = min(1 << im.encoderinfo["bits"], 256) - else: - # check palette contents - if im.palette: - colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) - else: - colors = 256 - - if colors <= 16: - if colors <= 2: - bits = 1 - elif colors <= 4: - bits = 2 - else: - bits = 4 - mode = f"{mode};{bits}" - - # encoder options - im.encoderconfig = ( - im.encoderinfo.get("optimize", False), - im.encoderinfo.get("compress_level", -1), - im.encoderinfo.get("compress_type", -1), - im.encoderinfo.get("dictionary", b""), - ) - - # get the corresponding PNG mode - try: - rawmode, mode = _OUTMODES[mode] - except KeyError as e: - raise OSError(f"cannot write mode {mode} as PNG") from e - - # - # write minimal PNG file - - fp.write(_MAGIC) - - chunk( - fp, - b"IHDR", - o32(im.size[0]), # 0: size - o32(im.size[1]), - mode, # 8: depth/type - b"\0", # 10: compression - b"\0", # 11: filter category - b"\0", # 12: interlace flag - ) - - chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] - - icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - # ICC profile - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - name = b"ICC Profile" - data = name + b"\0\0" + zlib.compress(icc) - chunk(fp, b"iCCP", data) - - # You must either have sRGB or iCCP. - # Disallow sRGB chunks when an iCCP-chunk has been emitted. - chunks.remove(b"sRGB") - - info = im.encoderinfo.get("pnginfo") - if info: - chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - elif cid in chunks_multiple_allowed: - chunk(fp, cid, data) - elif cid[1:2].islower(): - # Private chunk - after_idat = info_chunk[2:3] - if not after_idat: - chunk(fp, cid, data) - - if im.mode == "P": - palette_byte_number = colors * 3 - palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] - while len(palette_bytes) < palette_byte_number: - palette_bytes += b"\0" - chunk(fp, b"PLTE", palette_bytes) - - transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) - - if transparency or transparency == 0: - if im.mode == "P": - # limit to actual palette size - alpha_bytes = colors - if isinstance(transparency, bytes): - chunk(fp, b"tRNS", transparency[:alpha_bytes]) - else: - transparency = max(0, min(255, transparency)) - alpha = b"\xFF" * transparency + b"\0" - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - elif im.mode in ("1", "L", "I"): - transparency = max(0, min(65535, transparency)) - chunk(fp, b"tRNS", o16(transparency)) - elif im.mode == "RGB": - red, green, blue = transparency - chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) - else: - if "transparency" in im.encoderinfo: - # don't bother with transparency if it's an RGBA - # and it's in the info dict. It's probably just stale. - raise OSError("cannot use transparency for this mode") - else: - if im.mode == "P" and im.im.getpalettemode() == "RGBA": - alpha = im.im.getpalette("RGBA", "A") - alpha_bytes = colors - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - - dpi = im.encoderinfo.get("dpi") - if dpi: - chunk( - fp, - b"pHYs", - o32(int(dpi[0] / 0.0254 + 0.5)), - o32(int(dpi[1] / 0.0254 + 0.5)), - b"\x01", - ) - - if info: - chunks = [b"bKGD", b"hIST"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - - exif = im.encoderinfo.get("exif", im.info.get("exif")) - if exif: - if isinstance(exif, Image.Exif): - exif = exif.tobytes(8) - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - chunk(fp, b"eXIf", exif) - - if save_all: - _write_multiple_frames(im, fp, chunk, rawmode) - else: - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - if info: - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid[1:2].islower(): - # Private chunk - after_idat = info_chunk[2:3] - if after_idat: - chunk(fp, cid, data) - - chunk(fp, b"IEND", b"") - - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- -# PNG chunk converter - - -def getchunks(im, **params): - """Return a list of PNG chunks representing this image.""" - - class collector: - data = [] - - def write(self, data): - pass - - def append(self, chunk): - self.data.append(chunk) - - def append(fp, cid, *data): - data = b"".join(data) - crc = o32(_crc32(data, _crc32(cid))) - fp.append((cid, data, crc)) - - fp = collector() - - try: - im.encoderinfo = params - _save(im, fp, None, append) - finally: - del im.encoderinfo - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(PngImageFile.format, PngImageFile, _accept) -Image.register_save(PngImageFile.format, _save) -Image.register_save_all(PngImageFile.format, _save_all) - -Image.register_extensions(PngImageFile.format, [".png", ".apng"]) - -Image.register_mime(PngImageFile.format, "image/png") diff --git a/venv/Lib/site-packages/PIL/PpmImagePlugin.py b/venv/Lib/site-packages/PIL/PpmImagePlugin.py deleted file mode 100644 index b760e22..0000000 --- a/venv/Lib/site-packages/PIL/PpmImagePlugin.py +++ /dev/null @@ -1,199 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PPM support for PIL -# -# History: -# 96-03-24 fl Created -# 98-03-06 fl Write RGBA images (as RGB, that is) -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" - -MODES = { - # standard - b"P4": "1", - b"P5": "L", - b"P6": "RGB", - # extensions - b"P0CMYK": "CMYK", - # PIL extensions (for test purposes only) - b"PyP": "P", - b"PyRGBA": "RGBA", - b"PyCMYK": "CMYK", -} - - -def _accept(prefix): - return prefix[0:1] == b"P" and prefix[1] in b"0456y" - - -## -# Image plugin for PBM, PGM, and PPM images. - - -class PpmImageFile(ImageFile.ImageFile): - - format = "PPM" - format_description = "Pbmplus image" - - def _read_magic(self): - magic = b"" - # read until whitespace or longest available magic number - for _ in range(6): - c = self.fp.read(1) - if not c or c in b_whitespace: - break - magic += c - return magic - - def _read_token(self): - token = b"" - while len(token) <= 10: # read until next whitespace or limit of 10 characters - c = self.fp.read(1) - if not c: - break - elif c in b_whitespace: # token ended - if not token: - # skip whitespace at start - continue - break - elif c == b"#": - # ignores rest of the line; stops at CR, LF or EOF - while self.fp.read(1) not in b"\r\n": - pass - continue - token += c - if not token: - # Token was not even 1 byte - raise ValueError("Reached EOF while reading header") - elif len(token) > 10: - raise ValueError(f"Token too long in file header: {token}") - return token - - def _open(self): - magic_number = self._read_magic() - try: - mode = MODES[magic_number] - except KeyError: - raise SyntaxError("not a PPM file") - - self.custom_mimetype = { - b"P4": "image/x-portable-bitmap", - b"P5": "image/x-portable-graymap", - b"P6": "image/x-portable-pixmap", - }.get(magic_number) - - if mode == "1": - self.mode = "1" - rawmode = "1;I" - else: - self.mode = rawmode = mode - - decoder_name = "raw" - for ix in range(3): - token = int(self._read_token()) - if ix == 0: # token is the x size - xsize = token - elif ix == 1: # token is the y size - ysize = token - if mode == "1": - break - elif ix == 2: # token is maxval - maxval = token - if maxval > 255 and mode == "L": - self.mode = "I" - - # If maxval matches a bit depth, use the raw decoder directly - if maxval == 65535 and mode == "L": - rawmode = "I;16B" - elif maxval != 255: - decoder_name = "ppm" - args = (rawmode, 0, 1) if decoder_name == "raw" else (rawmode, maxval) - - self._size = xsize, ysize - self.tile = [(decoder_name, (0, 0, xsize, ysize), self.fp.tell(), args)] - - -class PpmDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - data = bytearray() - maxval = min(self.args[-1], 65535) - in_byte_count = 1 if maxval < 256 else 2 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - while len(data) < self.state.xsize * self.state.ysize * bands * out_byte_count: - pixels = self.fd.read(in_byte_count * bands) - if len(pixels) < in_byte_count * bands: - # eof - break - for b in range(bands): - value = ( - pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) - ) - value = min(out_max, round(value / maxval * out_max)) - data += o32(value) if self.mode == "I" else o8(value) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), (rawmode, 0, 1)) - return -1, 0 - - -# -# -------------------------------------------------------------------- - - -def _save(im, fp, filename): - if im.mode == "1": - rawmode, head = "1;I", b"P4" - elif im.mode == "L": - rawmode, head = "L", b"P5" - elif im.mode == "I": - rawmode, head = "I;16B", b"P5" - elif im.mode in ("RGB", "RGBA"): - rawmode, head = "RGB", b"P6" - else: - raise OSError(f"cannot write mode {im.mode} as PPM") - fp.write(head + b"\n%d %d\n" % im.size) - if head == b"P6": - fp.write(b"255\n") - elif head == b"P5": - if rawmode == "L": - fp.write(b"255\n") - else: - fp.write(b"65535\n") - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) - - # ALTERNATIVE: save via builtin debug function - # im._dump(filename) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(PpmImageFile.format, PpmImageFile, _accept) -Image.register_save(PpmImageFile.format, _save) - -Image.register_decoder("ppm", PpmDecoder) - -Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm"]) - -Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/venv/Lib/site-packages/PIL/PsdImagePlugin.py b/venv/Lib/site-packages/PIL/PsdImagePlugin.py deleted file mode 100644 index 2832195..0000000 --- a/venv/Lib/site-packages/PIL/PsdImagePlugin.py +++ /dev/null @@ -1,311 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Adobe PSD 2.5/3.0 file handling -# -# History: -# 1995-09-01 fl Created -# 1997-01-03 fl Read most PSD images -# 1997-01-18 fl Fixed P and CMYK support -# 2001-10-21 fl Added seek/tell support (for layers) -# -# Copyright (c) 1997-2001 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import io - -from . import Image, ImageFile, ImagePalette -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import si16be as si16 - -MODES = { - # (photoshop mode, bits) -> (pil mode, required channels) - (0, 1): ("1", 1), - (0, 8): ("L", 1), - (1, 8): ("L", 1), - (2, 8): ("P", 1), - (3, 8): ("RGB", 3), - (4, 8): ("CMYK", 4), - (7, 8): ("L", 1), # FIXME: multilayer - (8, 8): ("L", 1), # duotone - (9, 8): ("LAB", 3), -} - - -# --------------------------------------------------------------------. -# read PSD images - - -def _accept(prefix): - return prefix[:4] == b"8BPS" - - -## -# Image plugin for Photoshop images. - - -class PsdImageFile(ImageFile.ImageFile): - - format = "PSD" - format_description = "Adobe Photoshop" - _close_exclusive_fp_after_loading = False - - def _open(self): - - read = self.fp.read - - # - # header - - s = read(26) - if not _accept(s) or i16(s, 4) != 1: - raise SyntaxError("not a PSD file") - - psd_bits = i16(s, 22) - psd_channels = i16(s, 12) - psd_mode = i16(s, 24) - - mode, channels = MODES[(psd_mode, psd_bits)] - - if channels > psd_channels: - raise OSError("not enough channels") - - self.mode = mode - self._size = i32(s, 18), i32(s, 14) - - # - # color mode data - - size = i32(read(4)) - if size: - data = read(size) - if mode == "P" and size == 768: - self.palette = ImagePalette.raw("RGB;L", data) - - # - # image resources - - self.resources = [] - - size = i32(read(4)) - if size: - # load resources - end = self.fp.tell() + size - while self.fp.tell() < end: - read(4) # signature - id = i16(read(2)) - name = read(i8(read(1))) - if not (len(name) & 1): - read(1) # padding - data = read(i32(read(4))) - if len(data) & 1: - read(1) # padding - self.resources.append((id, name, data)) - if id == 1039: # ICC profile - self.info["icc_profile"] = data - - # - # layer and mask information - - self.layers = [] - - size = i32(read(4)) - if size: - end = self.fp.tell() + size - size = i32(read(4)) - if size: - _layer_data = io.BytesIO(ImageFile._safe_read(self.fp, size)) - self.layers = _layerinfo(_layer_data, size) - self.fp.seek(end) - self.n_frames = len(self.layers) - self.is_animated = self.n_frames > 1 - - # - # image descriptor - - self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) - - # keep the file open - self.__fp = self.fp - self.frame = 1 - self._min_frame = 1 - - def seek(self, layer): - if not self._seek_check(layer): - return - - # seek to given layer (1..max) - try: - name, mode, bbox, tile = self.layers[layer - 1] - self.mode = mode - self.tile = tile - self.frame = layer - self.fp = self.__fp - return name, bbox - except IndexError as e: - raise EOFError("no such layer") from e - - def tell(self): - # return layer number (0=image, 1..max=layers) - return self.frame - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -def _layerinfo(fp, ct_bytes): - # read layerinfo block - layers = [] - - def read(size): - return ImageFile._safe_read(fp, size) - - ct = si16(read(2)) - - # sanity check - if ct_bytes < (abs(ct) * 20): - raise SyntaxError("Layer block too short for number of layers requested") - - for i in range(abs(ct)): - - # bounding box - y0 = i32(read(4)) - x0 = i32(read(4)) - y1 = i32(read(4)) - x1 = i32(read(4)) - - # image info - mode = [] - ct_types = i16(read(2)) - types = list(range(ct_types)) - if len(types) > 4: - continue - - for i in types: - type = i16(read(2)) - - if type == 65535: - m = "A" - else: - m = "RGBA"[type] - - mode.append(m) - read(4) # size - - # figure out the image mode - mode.sort() - if mode == ["R"]: - mode = "L" - elif mode == ["B", "G", "R"]: - mode = "RGB" - elif mode == ["A", "B", "G", "R"]: - mode = "RGBA" - else: - mode = None # unknown - - # skip over blend flags and extra information - read(12) # filler - name = "" - size = i32(read(4)) # length of the extra data field - if size: - data_end = fp.tell() + size - - length = i32(read(4)) - if length: - fp.seek(length - 16, io.SEEK_CUR) - - length = i32(read(4)) - if length: - fp.seek(length, io.SEEK_CUR) - - length = i8(read(1)) - if length: - # Don't know the proper encoding, - # Latin-1 should be a good guess - name = read(length).decode("latin-1", "replace") - - fp.seek(data_end) - layers.append((name, mode, (x0, y0, x1, y1))) - - # get tiles - i = 0 - for name, mode, bbox in layers: - tile = [] - for m in mode: - t = _maketile(fp, m, bbox, 1) - if t: - tile.extend(t) - layers[i] = name, mode, bbox, tile - i += 1 - - return layers - - -def _maketile(file, mode, bbox, channels): - - tile = None - read = file.read - - compression = i16(read(2)) - - xsize = bbox[2] - bbox[0] - ysize = bbox[3] - bbox[1] - - offset = file.tell() - - if compression == 0: - # - # raw compression - tile = [] - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tile.append(("raw", bbox, offset, layer)) - offset = offset + xsize * ysize - - elif compression == 1: - # - # packbits compression - i = 0 - tile = [] - bytecount = read(channels * ysize * 2) - offset = file.tell() - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tile.append(("packbits", bbox, offset, layer)) - for y in range(ysize): - offset = offset + i16(bytecount, i) - i += 2 - - file.seek(offset) - - if offset & 1: - read(1) # padding - - return tile - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PsdImageFile.format, PsdImageFile, _accept) - -Image.register_extension(PsdImageFile.format, ".psd") - -Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/venv/Lib/site-packages/PIL/PyAccess.py b/venv/Lib/site-packages/PIL/PyAccess.py deleted file mode 100644 index eeaa0cc..0000000 --- a/venv/Lib/site-packages/PIL/PyAccess.py +++ /dev/null @@ -1,353 +0,0 @@ -# -# The Python Imaging Library -# Pillow fork -# -# Python implementation of the PixelAccess Object -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# Copyright (c) 2013 Eric Soroos -# -# See the README file for information on usage and redistribution -# - -# Notes: -# -# * Implements the pixel access object following Access. -# * Does not implement the line functions, as they don't appear to be used -# * Taking only the tuple form, which is used from python. -# * Fill.c uses the integer form, but it's still going to use the old -# Access.c implementation. -# - -import logging -import sys - -try: - from cffi import FFI - - defs = """ - struct Pixel_RGBA { - unsigned char r,g,b,a; - }; - struct Pixel_I16 { - unsigned char l,r; - }; - """ - ffi = FFI() - ffi.cdef(defs) -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import deferred_error - - FFI = ffi = deferred_error(ex) - -logger = logging.getLogger(__name__) - - -class PyAccess: - def __init__(self, img, readonly=False): - vals = dict(img.im.unsafe_ptrs) - self.readonly = readonly - self.image8 = ffi.cast("unsigned char **", vals["image8"]) - self.image32 = ffi.cast("int **", vals["image32"]) - self.image = ffi.cast("unsigned char **", vals["image"]) - self.xsize, self.ysize = img.im.size - self._img = img - - # Keep pointer to im object to prevent dereferencing. - self._im = img.im - if self._im.mode == "P": - self._palette = img.palette - - # Debugging is polluting test traces, only useful here - # when hacking on PyAccess - # logger.debug("%s", vals) - self._post_init() - - def _post_init(self): - pass - - def __setitem__(self, xy, color): - """ - Modifies the pixel at x,y. The color is given as a single - numerical value for single band images, and a tuple for - multi-band images - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param color: The pixel value. - """ - if self.readonly: - raise ValueError("Attempt to putpixel a read only image") - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - - if ( - self._im.mode == "P" - and isinstance(color, (list, tuple)) - and len(color) in [3, 4] - ): - # RGB or RGBA value for a P image - color = self._palette.getcolor(color, self._img) - - return self.set_pixel(x, y, color) - - def __getitem__(self, xy): - """ - Returns the pixel at x,y. The pixel is returned as a single - value for single band images or a tuple for multiple band - images - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: a pixel value for single band images, a tuple of - pixel values for multiband images. - """ - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - return self.get_pixel(x, y) - - putpixel = __setitem__ - getpixel = __getitem__ - - def check_xy(self, xy): - (x, y) = xy - if not (0 <= x < self.xsize and 0 <= y < self.ysize): - raise ValueError("pixel location out of range") - return xy - - -class _PyAccess32_2(PyAccess): - """PA, LA, stored in first and last bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return (pixel.r, pixel.a) - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.a = min(color[1], 255) - - -class _PyAccess32_3(PyAccess): - """RGB and friends, stored in the first three bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return (pixel.r, pixel.g, pixel.b) - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.g = min(color[1], 255) - pixel.b = min(color[2], 255) - pixel.a = 255 - - -class _PyAccess32_4(PyAccess): - """RGBA etc, all 4 bytes of a 32 bit word""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return (pixel.r, pixel.g, pixel.b, pixel.a) - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - # tuple - pixel.r = min(color[0], 255) - pixel.g = min(color[1], 255) - pixel.b = min(color[2], 255) - pixel.a = min(color[3], 255) - - -class _PyAccess8(PyAccess): - """1, L, P, 8 bit images stored as uint8""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image8 - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # integer - self.pixels[y][x] = min(color, 255) - except TypeError: - # tuple - self.pixels[y][x] = min(color[0], 255) - - -class _PyAccessI16_N(PyAccess): - """I;16 access, native bitendian without conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("unsigned short **", self.image) - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # integer - self.pixels[y][x] = min(color, 65535) - except TypeError: - # tuple - self.pixels[y][x] = min(color[0], 65535) - - -class _PyAccessI16_L(PyAccess): - """I;16L access, with conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_I16 **", self.image) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.l + pixel.r * 256 - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - try: - color = min(color, 65535) - except TypeError: - color = min(color[0], 65535) - - pixel.l = color & 0xFF # noqa: E741 - pixel.r = color >> 8 - - -class _PyAccessI16_B(PyAccess): - """I;16B access, with conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("struct Pixel_I16 **", self.image) - - def get_pixel(self, x, y): - pixel = self.pixels[y][x] - return pixel.l * 256 + pixel.r - - def set_pixel(self, x, y, color): - pixel = self.pixels[y][x] - try: - color = min(color, 65535) - except Exception: - color = min(color[0], 65535) - - pixel.l = color >> 8 # noqa: E741 - pixel.r = color & 0xFF - - -class _PyAccessI32_N(PyAccess): - """Signed Int32 access, native endian""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image32 - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - self.pixels[y][x] = color - - -class _PyAccessI32_Swap(PyAccess): - """I;32L/B access, with byteswapping conversion""" - - def _post_init(self, *args, **kwargs): - self.pixels = self.image32 - - def reverse(self, i): - orig = ffi.new("int *", i) - chars = ffi.cast("unsigned char *", orig) - chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], chars[1], chars[0] - return ffi.cast("int *", chars)[0] - - def get_pixel(self, x, y): - return self.reverse(self.pixels[y][x]) - - def set_pixel(self, x, y, color): - self.pixels[y][x] = self.reverse(color) - - -class _PyAccessF(PyAccess): - """32 bit float access""" - - def _post_init(self, *args, **kwargs): - self.pixels = ffi.cast("float **", self.image32) - - def get_pixel(self, x, y): - return self.pixels[y][x] - - def set_pixel(self, x, y, color): - try: - # not a tuple - self.pixels[y][x] = color - except TypeError: - # tuple - self.pixels[y][x] = color[0] - - -mode_map = { - "1": _PyAccess8, - "L": _PyAccess8, - "P": _PyAccess8, - "LA": _PyAccess32_2, - "La": _PyAccess32_2, - "PA": _PyAccess32_2, - "RGB": _PyAccess32_3, - "LAB": _PyAccess32_3, - "HSV": _PyAccess32_3, - "YCbCr": _PyAccess32_3, - "RGBA": _PyAccess32_4, - "RGBa": _PyAccess32_4, - "RGBX": _PyAccess32_4, - "CMYK": _PyAccess32_4, - "F": _PyAccessF, - "I": _PyAccessI32_N, -} - -if sys.byteorder == "little": - mode_map["I;16"] = _PyAccessI16_N - mode_map["I;16L"] = _PyAccessI16_N - mode_map["I;16B"] = _PyAccessI16_B - - mode_map["I;32L"] = _PyAccessI32_N - mode_map["I;32B"] = _PyAccessI32_Swap -else: - mode_map["I;16"] = _PyAccessI16_L - mode_map["I;16L"] = _PyAccessI16_L - mode_map["I;16B"] = _PyAccessI16_N - - mode_map["I;32L"] = _PyAccessI32_Swap - mode_map["I;32B"] = _PyAccessI32_N - - -def new(img, readonly=False): - access_type = mode_map.get(img.mode, None) - if not access_type: - logger.debug("PyAccess Not Implemented: %s", img.mode) - return None - return access_type(img, readonly) diff --git a/venv/Lib/site-packages/PIL/SgiImagePlugin.py b/venv/Lib/site-packages/PIL/SgiImagePlugin.py deleted file mode 100644 index 5f1ef6e..0000000 --- a/venv/Lib/site-packages/PIL/SgiImagePlugin.py +++ /dev/null @@ -1,230 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# SGI image file handling -# -# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. -# -# -# -# History: -# 2017-22-07 mb Add RLE decompression -# 2016-16-10 mb Add save method without compression -# 1995-09-10 fl Created -# -# Copyright (c) 2016 by Mickael Bonfill. -# Copyright (c) 2008 by Karsten Hiddemann. -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1995 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -import os -import struct - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 - - -def _accept(prefix): - return len(prefix) >= 2 and i16(prefix) == 474 - - -MODES = { - (1, 1, 1): "L", - (1, 2, 1): "L", - (2, 1, 1): "L;16B", - (2, 2, 1): "L;16B", - (1, 3, 3): "RGB", - (2, 3, 3): "RGB;16B", - (1, 3, 4): "RGBA", - (2, 3, 4): "RGBA;16B", -} - - -## -# Image plugin for SGI images. -class SgiImageFile(ImageFile.ImageFile): - - format = "SGI" - format_description = "SGI Image File Format" - - def _open(self): - - # HEAD - headlen = 512 - s = self.fp.read(headlen) - - if not _accept(s): - raise ValueError("Not an SGI image file") - - # compression : verbatim or RLE - compression = s[2] - - # bpc : 1 or 2 bytes (8bits or 16bits) - bpc = s[3] - - # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) - dimension = i16(s, 4) - - # xsize : width - xsize = i16(s, 6) - - # ysize : height - ysize = i16(s, 8) - - # zsize : channels count - zsize = i16(s, 10) - - # layout - layout = bpc, dimension, zsize - - # determine mode from bits/zsize - rawmode = "" - try: - rawmode = MODES[layout] - except KeyError: - pass - - if rawmode == "": - raise ValueError("Unsupported SGI image mode") - - self._size = xsize, ysize - self.mode = rawmode.split(";")[0] - if self.mode == "RGB": - self.custom_mimetype = "image/rgb" - - # orientation -1 : scanlines begins at the bottom-left corner - orientation = -1 - - # decoder info - if compression == 0: - pagesize = xsize * ysize * bpc - if bpc == 2: - self.tile = [ - ("SGI16", (0, 0) + self.size, headlen, (self.mode, 0, orientation)) - ] - else: - self.tile = [] - offset = headlen - for layer in self.mode: - self.tile.append( - ("raw", (0, 0) + self.size, offset, (layer, 0, orientation)) - ) - offset += pagesize - elif compression == 1: - self.tile = [ - ("sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc)) - ] - - -def _save(im, fp, filename): - if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "L": - raise ValueError("Unsupported SGI image mode") - - # Get the keyword arguments - info = im.encoderinfo - - # Byte-per-pixel precision, 1 = 8bits per pixel - bpc = info.get("bpc", 1) - - if bpc not in (1, 2): - raise ValueError("Unsupported number of bytes per pixel") - - # Flip the image, since the origin of SGI file is the bottom-left corner - orientation = -1 - # Define the file as SGI File Format - magicNumber = 474 - # Run-Length Encoding Compression - Unsupported at this time - rle = 0 - - # Number of dimensions (x,y,z) - dim = 3 - # X Dimension = width / Y Dimension = height - x, y = im.size - if im.mode == "L" and y == 1: - dim = 1 - elif im.mode == "L": - dim = 2 - # Z Dimension: Number of channels - z = len(im.mode) - - if dim == 1 or dim == 2: - z = 1 - - # assert we've got the right number of bands. - if len(im.getbands()) != z: - raise ValueError( - f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" - ) - - # Minimum Byte value - pinmin = 0 - # Maximum Byte value (255 = 8bits per pixel) - pinmax = 255 - # Image name (79 characters max, truncated below in write) - imgName = os.path.splitext(os.path.basename(filename))[0] - imgName = imgName.encode("ascii", "ignore") - # Standard representation of pixel in the file - colormap = 0 - fp.write(struct.pack(">h", magicNumber)) - fp.write(o8(rle)) - fp.write(o8(bpc)) - fp.write(struct.pack(">H", dim)) - fp.write(struct.pack(">H", x)) - fp.write(struct.pack(">H", y)) - fp.write(struct.pack(">H", z)) - fp.write(struct.pack(">l", pinmin)) - fp.write(struct.pack(">l", pinmax)) - fp.write(struct.pack("4s", b"")) # dummy - fp.write(struct.pack("79s", imgName)) # truncates to 79 chars - fp.write(struct.pack("s", b"")) # force null byte after imgname - fp.write(struct.pack(">l", colormap)) - fp.write(struct.pack("404s", b"")) # dummy - - rawmode = "L" - if bpc == 2: - rawmode = "L;16B" - - for channel in im.split(): - fp.write(channel.tobytes("raw", rawmode, 0, orientation)) - - if hasattr(fp, "flush"): - fp.flush() - - -class SGI16Decoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer): - rawmode, stride, orientation = self.args - pagesize = self.state.xsize * self.state.ysize - zsize = len(self.mode) - self.fd.seek(512) - - for band in range(zsize): - channel = Image.new("L", (self.state.xsize, self.state.ysize)) - channel.frombytes( - self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation - ) - self.im.putband(channel.im, band) - - return -1, 0 - - -# -# registry - - -Image.register_decoder("SGI16", SGI16Decoder) -Image.register_open(SgiImageFile.format, SgiImageFile, _accept) -Image.register_save(SgiImageFile.format, _save) -Image.register_mime(SgiImageFile.format, "image/sgi") - -Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) - -# End of file diff --git a/venv/Lib/site-packages/PIL/SpiderImagePlugin.py b/venv/Lib/site-packages/PIL/SpiderImagePlugin.py deleted file mode 100644 index 1a72f5c..0000000 --- a/venv/Lib/site-packages/PIL/SpiderImagePlugin.py +++ /dev/null @@ -1,322 +0,0 @@ -# -# The Python Imaging Library. -# -# SPIDER image file handling -# -# History: -# 2004-08-02 Created BB -# 2006-03-02 added save method -# 2006-03-13 added support for stack images -# -# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. -# Copyright (c) 2004 by William Baxter. -# Copyright (c) 2004 by Secret Labs AB. -# Copyright (c) 2004 by Fredrik Lundh. -# - -## -# Image plugin for the Spider image format. This format is is used -# by the SPIDER software, in processing image data from electron -# microscopy and tomography. -## - -# -# SpiderImagePlugin.py -# -# The Spider image format is used by SPIDER software, in processing -# image data from electron microscopy and tomography. -# -# Spider home page: -# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html -# -# Details about the Spider image format: -# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html -# -import os -import struct -import sys - -from PIL import Image, ImageFile - - -def isInt(f): - try: - i = int(f) - if f - i == 0: - return 1 - else: - return 0 - except (ValueError, OverflowError): - return 0 - - -iforms = [1, 3, -11, -12, -21, -22] - - -# There is no magic number to identify Spider files, so just check a -# series of header locations to see if they have reasonable values. -# Returns no. of bytes in the header, if it is a valid Spider header, -# otherwise returns 0 - - -def isSpiderHeader(t): - h = (99,) + t # add 1 value so can use spider header index start=1 - # header values 1,2,5,12,13,22,23 should be integers - for i in [1, 2, 5, 12, 13, 22, 23]: - if not isInt(h[i]): - return 0 - # check iform - iform = int(h[5]) - if iform not in iforms: - return 0 - # check other header values - labrec = int(h[13]) # no. records in file header - labbyt = int(h[22]) # total no. of bytes in header - lenbyt = int(h[23]) # record length in bytes - if labbyt != (labrec * lenbyt): - return 0 - # looks like a valid header - return labbyt - - -def isSpiderImage(filename): - with open(filename, "rb") as fp: - f = fp.read(92) # read 23 * 4 bytes - t = struct.unpack(">23f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - t = struct.unpack("<23f", f) # little-endian - hdrlen = isSpiderHeader(t) - return hdrlen - - -class SpiderImageFile(ImageFile.ImageFile): - - format = "SPIDER" - format_description = "Spider 2D image" - _close_exclusive_fp_after_loading = False - - def _open(self): - # check header - n = 27 * 4 # read 27 float values - f = self.fp.read(n) - - try: - self.bigendian = 1 - t = struct.unpack(">27f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - self.bigendian = 0 - t = struct.unpack("<27f", f) # little-endian - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - raise SyntaxError("not a valid Spider file") - except struct.error as e: - raise SyntaxError("not a valid Spider file") from e - - h = (99,) + t # add 1 value : spider header index starts at 1 - iform = int(h[5]) - if iform != 1: - raise SyntaxError("not a Spider 2D image") - - self._size = int(h[12]), int(h[2]) # size in pixels (width, height) - self.istack = int(h[24]) - self.imgnumber = int(h[27]) - - if self.istack == 0 and self.imgnumber == 0: - # stk=0, img=0: a regular 2D image - offset = hdrlen - self._nimages = 1 - elif self.istack > 0 and self.imgnumber == 0: - # stk>0, img=0: Opening the stack for the first time - self.imgbytes = int(h[12]) * int(h[2]) * 4 - self.hdrlen = hdrlen - self._nimages = int(h[26]) - # Point to the first image in the stack - offset = hdrlen * 2 - self.imgnumber = 1 - elif self.istack == 0 and self.imgnumber > 0: - # stk=0, img>0: an image within the stack - offset = hdrlen + self.stkoffset - self.istack = 2 # So Image knows it's still a stack - else: - raise SyntaxError("inconsistent stack header values") - - if self.bigendian: - self.rawmode = "F;32BF" - else: - self.rawmode = "F;32F" - self.mode = "F" - - self.tile = [("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] - self.__fp = self.fp # FIXME: hack - - @property - def n_frames(self): - return self._nimages - - @property - def is_animated(self): - return self._nimages > 1 - - # 1st image index is zero (although SPIDER imgnumber starts at 1) - def tell(self): - if self.imgnumber < 1: - return 0 - else: - return self.imgnumber - 1 - - def seek(self, frame): - if self.istack == 0: - raise EOFError("attempt to seek in a non-stack file") - if not self._seek_check(frame): - return - self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) - self.fp = self.__fp - self.fp.seek(self.stkoffset) - self._open() - - # returns a byte image after rescaling to 0..255 - def convert2byte(self, depth=255): - (minimum, maximum) = self.getextrema() - m = 1 - if maximum != minimum: - m = depth / (maximum - minimum) - b = -m * minimum - return self.point(lambda i, m=m, b=b: i * m + b).convert("L") - - # returns a ImageTk.PhotoImage object, after rescaling to 0..255 - def tkPhotoImage(self): - from PIL import ImageTk - - return ImageTk.PhotoImage(self.convert2byte(), palette=256) - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -# -------------------------------------------------------------------- -# Image series - -# given a list of filenames, return a list of images -def loadImageSeries(filelist=None): - """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" - if filelist is None or len(filelist) < 1: - return - - imglist = [] - for img in filelist: - if not os.path.exists(img): - print(f"unable to find {img}") - continue - try: - with Image.open(img) as im: - im = im.convert2byte() - except Exception: - if not isSpiderImage(img): - print(img + " is not a Spider image file") - continue - im.info["filename"] = img - imglist.append(im) - return imglist - - -# -------------------------------------------------------------------- -# For saving images in Spider format - - -def makeSpiderHeader(im): - nsam, nrow = im.size - lenbyt = nsam * 4 # There are labrec records in the header - labrec = int(1024 / lenbyt) - if 1024 % lenbyt != 0: - labrec += 1 - labbyt = labrec * lenbyt - nvalues = int(labbyt / 4) - if nvalues < 23: - return [] - - hdr = [] - for i in range(nvalues): - hdr.append(0.0) - - # NB these are Fortran indices - hdr[1] = 1.0 # nslice (=1 for an image) - hdr[2] = float(nrow) # number of rows per slice - hdr[3] = float(nrow) # number of records in the image - hdr[5] = 1.0 # iform for 2D image - hdr[12] = float(nsam) # number of pixels per line - hdr[13] = float(labrec) # number of records in file header - hdr[22] = float(labbyt) # total number of bytes in header - hdr[23] = float(lenbyt) # record length in bytes - - # adjust for Fortran indexing - hdr = hdr[1:] - hdr.append(0.0) - # pack binary data into a string - return [struct.pack("f", v) for v in hdr] - - -def _save(im, fp, filename): - if im.mode[0] != "F": - im = im.convert("F") - - hdr = makeSpiderHeader(im) - if len(hdr) < 256: - raise OSError("Error creating Spider header") - - # write the SPIDER header - fp.writelines(hdr) - - rawmode = "F;32NF" # 32-bit native floating point - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) - - -def _save_spider(im, fp, filename): - # get the filename extension and register it with Image - ext = os.path.splitext(filename)[1] - Image.register_extension(SpiderImageFile.format, ext) - _save(im, fp, filename) - - -# -------------------------------------------------------------------- - - -Image.register_open(SpiderImageFile.format, SpiderImageFile) -Image.register_save(SpiderImageFile.format, _save_spider) - -if __name__ == "__main__": - - if len(sys.argv) < 2: - print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") - sys.exit() - - filename = sys.argv[1] - if not isSpiderImage(filename): - print("input image must be in Spider format") - sys.exit() - - with Image.open(filename) as im: - print("image: " + str(im)) - print("format: " + str(im.format)) - print("size: " + str(im.size)) - print("mode: " + str(im.mode)) - print("max, min: ", end=" ") - print(im.getextrema()) - - if len(sys.argv) > 2: - outfile = sys.argv[2] - - # perform some image operation - im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - print( - f"saving a flipped version of {os.path.basename(filename)} " - f"as {outfile} " - ) - im.save(outfile, SpiderImageFile.format) diff --git a/venv/Lib/site-packages/PIL/SunImagePlugin.py b/venv/Lib/site-packages/PIL/SunImagePlugin.py deleted file mode 100644 index c03759a..0000000 --- a/venv/Lib/site-packages/PIL/SunImagePlugin.py +++ /dev/null @@ -1,136 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Sun image file handling -# -# History: -# 1995-09-10 fl Created -# 1996-05-28 fl Fixed 32-bit alignment -# 1998-12-29 fl Import ImagePalette module -# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995-1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -from . import Image, ImageFile, ImagePalette -from ._binary import i32be as i32 - - -def _accept(prefix): - return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 - - -## -# Image plugin for Sun raster files. - - -class SunImageFile(ImageFile.ImageFile): - - format = "SUN" - format_description = "Sun Raster File" - - def _open(self): - - # The Sun Raster file header is 32 bytes in length - # and has the following format: - - # typedef struct _SunRaster - # { - # DWORD MagicNumber; /* Magic (identification) number */ - # DWORD Width; /* Width of image in pixels */ - # DWORD Height; /* Height of image in pixels */ - # DWORD Depth; /* Number of bits per pixel */ - # DWORD Length; /* Size of image data in bytes */ - # DWORD Type; /* Type of raster file */ - # DWORD ColorMapType; /* Type of color map */ - # DWORD ColorMapLength; /* Size of the color map in bytes */ - # } SUNRASTER; - - # HEAD - s = self.fp.read(32) - if not _accept(s): - raise SyntaxError("not an SUN raster file") - - offset = 32 - - self._size = i32(s, 4), i32(s, 8) - - depth = i32(s, 12) - # data_length = i32(s, 16) # unreliable, ignore. - file_type = i32(s, 20) - palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary - palette_length = i32(s, 28) - - if depth == 1: - self.mode, rawmode = "1", "1;I" - elif depth == 4: - self.mode, rawmode = "L", "L;4" - elif depth == 8: - self.mode = rawmode = "L" - elif depth == 24: - if file_type == 3: - self.mode, rawmode = "RGB", "RGB" - else: - self.mode, rawmode = "RGB", "BGR" - elif depth == 32: - if file_type == 3: - self.mode, rawmode = "RGB", "RGBX" - else: - self.mode, rawmode = "RGB", "BGRX" - else: - raise SyntaxError("Unsupported Mode/Bit Depth") - - if palette_length: - if palette_length > 1024: - raise SyntaxError("Unsupported Color Palette Length") - - if palette_type != 1: - raise SyntaxError("Unsupported Palette Type") - - offset = offset + palette_length - self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) - if self.mode == "L": - self.mode = "P" - rawmode = rawmode.replace("L", "P") - - # 16 bit boundaries on stride - stride = ((self.size[0] * depth + 15) // 16) * 2 - - # file type: Type is the version (or flavor) of the bitmap - # file. The following values are typically found in the Type - # field: - # 0000h Old - # 0001h Standard - # 0002h Byte-encoded - # 0003h RGB format - # 0004h TIFF format - # 0005h IFF format - # FFFFh Experimental - - # Old and standard are the same, except for the length tag. - # byte-encoded is run-length-encoded - # RGB looks similar to standard, but RGB byte order - # TIFF and IFF mean that they were converted from T/IFF - # Experimental means that it's something else. - # (https://www.fileformat.info/format/sunraster/egff.htm) - - if file_type in (0, 1, 3, 4, 5): - self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride))] - elif file_type == 2: - self.tile = [("sun_rle", (0, 0) + self.size, offset, rawmode)] - else: - raise SyntaxError("Unsupported Sun Raster file type") - - -# -# registry - - -Image.register_open(SunImageFile.format, SunImageFile, _accept) - -Image.register_extension(SunImageFile.format, ".ras") diff --git a/venv/Lib/site-packages/PIL/TarIO.py b/venv/Lib/site-packages/PIL/TarIO.py deleted file mode 100644 index d108362..0000000 --- a/venv/Lib/site-packages/PIL/TarIO.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# read files from within a tar file -# -# History: -# 95-06-18 fl Created -# 96-05-28 fl Open files in binary mode -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-96. -# -# See the README file for information on usage and redistribution. -# - -import io - -from . import ContainerIO - - -class TarIO(ContainerIO.ContainerIO): - """A file object that provides read access to a given member of a TAR file.""" - - def __init__(self, tarfile, file): - """ - Create file object. - - :param tarfile: Name of TAR file. - :param file: Name of member file. - """ - self.fh = open(tarfile, "rb") - - while True: - - s = self.fh.read(512) - if len(s) != 512: - raise OSError("unexpected end of tar file") - - name = s[:100].decode("utf-8") - i = name.find("\0") - if i == 0: - raise OSError("cannot find subfile") - if i > 0: - name = name[:i] - - size = int(s[124:135], 8) - - if file == name: - break - - self.fh.seek((size + 511) & (~511), io.SEEK_CUR) - - # Open region - super().__init__(self.fh, self.fh.tell(), size) - - # Context manager support - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - self.fh.close() diff --git a/venv/Lib/site-packages/PIL/TgaImagePlugin.py b/venv/Lib/site-packages/PIL/TgaImagePlugin.py deleted file mode 100644 index 59b89e9..0000000 --- a/venv/Lib/site-packages/PIL/TgaImagePlugin.py +++ /dev/null @@ -1,253 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TGA file handling -# -# History: -# 95-09-01 fl created (reads 24-bit files only) -# 97-01-04 fl support more TGA versions, including compressed images -# 98-07-04 fl fixed orientation and alpha layer bugs -# 98-09-11 fl fixed orientation for runlength decoder -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# - - -import warnings - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -# -# -------------------------------------------------------------------- -# Read RGA file - - -MODES = { - # map imagetype/depth to rawmode - (1, 8): "P", - (3, 1): "1", - (3, 8): "L", - (3, 16): "LA", - (2, 16): "BGR;5", - (2, 24): "BGR", - (2, 32): "BGRA", -} - - -## -# Image plugin for Targa files. - - -class TgaImageFile(ImageFile.ImageFile): - - format = "TGA" - format_description = "Targa" - - def _open(self): - - # process header - s = self.fp.read(18) - - id_len = s[0] - - colormaptype = s[1] - imagetype = s[2] - - depth = s[16] - - flags = s[17] - - self._size = i16(s, 12), i16(s, 14) - - # validate header fields - if ( - colormaptype not in (0, 1) - or self.size[0] <= 0 - or self.size[1] <= 0 - or depth not in (1, 8, 16, 24, 32) - ): - raise SyntaxError("not a TGA file") - - # image mode - if imagetype in (3, 11): - self.mode = "L" - if depth == 1: - self.mode = "1" # ??? - elif depth == 16: - self.mode = "LA" - elif imagetype in (1, 9): - self.mode = "P" - elif imagetype in (2, 10): - self.mode = "RGB" - if depth == 32: - self.mode = "RGBA" - else: - raise SyntaxError("unknown TGA mode") - - # orientation - orientation = flags & 0x30 - self._flip_horizontally = orientation in [0x10, 0x30] - if orientation in [0x20, 0x30]: - orientation = 1 - elif orientation in [0, 0x10]: - orientation = -1 - else: - raise SyntaxError("unknown TGA orientation") - - self.info["orientation"] = orientation - - if imagetype & 8: - self.info["compression"] = "tga_rle" - - if id_len: - self.info["id_section"] = self.fp.read(id_len) - - if colormaptype: - # read palette - start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] - if mapdepth == 16: - self.palette = ImagePalette.raw( - "BGR;15", b"\0" * 2 * start + self.fp.read(2 * size) - ) - elif mapdepth == 24: - self.palette = ImagePalette.raw( - "BGR", b"\0" * 3 * start + self.fp.read(3 * size) - ) - elif mapdepth == 32: - self.palette = ImagePalette.raw( - "BGRA", b"\0" * 4 * start + self.fp.read(4 * size) - ) - - # setup tile descriptor - try: - rawmode = MODES[(imagetype & 7, depth)] - if imagetype & 8: - # compressed - self.tile = [ - ( - "tga_rle", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, orientation, depth), - ) - ] - else: - self.tile = [ - ( - "raw", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, 0, orientation), - ) - ] - except KeyError: - pass # cannot decode - - def load_end(self): - if self._flip_horizontally: - self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -# -# -------------------------------------------------------------------- -# Write TGA file - - -SAVE = { - "1": ("1", 1, 0, 3), - "L": ("L", 8, 0, 3), - "LA": ("LA", 16, 0, 3), - "P": ("P", 8, 1, 1), - "RGB": ("BGR", 24, 0, 2), - "RGBA": ("BGRA", 32, 0, 2), -} - - -def _save(im, fp, filename): - - try: - rawmode, bits, colormaptype, imagetype = SAVE[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as TGA") from e - - if "rle" in im.encoderinfo: - rle = im.encoderinfo["rle"] - else: - compression = im.encoderinfo.get("compression", im.info.get("compression")) - rle = compression == "tga_rle" - if rle: - imagetype += 8 - - id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) - id_len = len(id_section) - if id_len > 255: - id_len = 255 - id_section = id_section[:255] - warnings.warn("id_section has been trimmed to 255 characters") - - if colormaptype: - colormapfirst, colormaplength, colormapentry = 0, 256, 24 - else: - colormapfirst, colormaplength, colormapentry = 0, 0, 0 - - if im.mode in ("LA", "RGBA"): - flags = 8 - else: - flags = 0 - - orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) - if orientation > 0: - flags = flags | 0x20 - - fp.write( - o8(id_len) - + o8(colormaptype) - + o8(imagetype) - + o16(colormapfirst) - + o16(colormaplength) - + o8(colormapentry) - + o16(0) - + o16(0) - + o16(im.size[0]) - + o16(im.size[1]) - + o8(bits) - + o8(flags) - ) - - if id_section: - fp.write(id_section) - - if colormaptype: - fp.write(im.im.getpalette("RGB", "BGR")) - - if rle: - ImageFile._save( - im, fp, [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))] - ) - else: - ImageFile._save( - im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))] - ) - - # write targa version 2 footer - fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(TgaImageFile.format, TgaImageFile) -Image.register_save(TgaImageFile.format, _save) - -Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) - -Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/venv/Lib/site-packages/PIL/TiffImagePlugin.py b/venv/Lib/site-packages/PIL/TiffImagePlugin.py deleted file mode 100644 index e96f584..0000000 --- a/venv/Lib/site-packages/PIL/TiffImagePlugin.py +++ /dev/null @@ -1,2112 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF file handling -# -# TIFF is a flexible, if somewhat aged, image file format originally -# defined by Aldus. Although TIFF supports a wide variety of pixel -# layouts and compression methods, the name doesn't really stand for -# "thousands of incompatible file formats," it just feels that way. -# -# To read TIFF data from a stream, the stream must be seekable. For -# progressive decoding, make sure to use TIFF files where the tag -# directory is placed first in the file. -# -# History: -# 1995-09-01 fl Created -# 1996-05-04 fl Handle JPEGTABLES tag -# 1996-05-18 fl Fixed COLORMAP support -# 1997-01-05 fl Fixed PREDICTOR support -# 1997-08-27 fl Added support for rational tags (from Perry Stoll) -# 1998-01-10 fl Fixed seek/tell (from Jan Blom) -# 1998-07-15 fl Use private names for internal variables -# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) -# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) -# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) -# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) -# 2001-12-18 fl Added workaround for broken Matrox library -# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) -# 2003-05-19 fl Check FILLORDER tag -# 2003-09-26 fl Added RGBa support -# 2004-02-24 fl Added DPI support; fixed rational write support -# 2005-02-07 fl Added workaround for broken Corel Draw 10 files -# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) -# -# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -import io -import itertools -import logging -import math -import os -import struct -import warnings -from collections.abc import MutableMapping -from fractions import Fraction -from numbers import Number, Rational - -from . import Image, ImageFile, ImageOps, ImagePalette, TiffTags -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from .TiffTags import TYPES - -logger = logging.getLogger(__name__) - -# Set these to true to force use of libtiff for reading or writing. -READ_LIBTIFF = False -WRITE_LIBTIFF = False -IFD_LEGACY_API = True -STRIP_SIZE = 65536 - -II = b"II" # little-endian (Intel style) -MM = b"MM" # big-endian (Motorola style) - -# -# -------------------------------------------------------------------- -# Read TIFF files - -# a few tag names, just to make the code below a bit more readable -IMAGEWIDTH = 256 -IMAGELENGTH = 257 -BITSPERSAMPLE = 258 -COMPRESSION = 259 -PHOTOMETRIC_INTERPRETATION = 262 -FILLORDER = 266 -IMAGEDESCRIPTION = 270 -STRIPOFFSETS = 273 -SAMPLESPERPIXEL = 277 -ROWSPERSTRIP = 278 -STRIPBYTECOUNTS = 279 -X_RESOLUTION = 282 -Y_RESOLUTION = 283 -PLANAR_CONFIGURATION = 284 -RESOLUTION_UNIT = 296 -TRANSFERFUNCTION = 301 -SOFTWARE = 305 -DATE_TIME = 306 -ARTIST = 315 -PREDICTOR = 317 -COLORMAP = 320 -TILEWIDTH = 322 -TILELENGTH = 323 -TILEOFFSETS = 324 -TILEBYTECOUNTS = 325 -SUBIFD = 330 -EXTRASAMPLES = 338 -SAMPLEFORMAT = 339 -JPEGTABLES = 347 -YCBCRSUBSAMPLING = 530 -REFERENCEBLACKWHITE = 532 -COPYRIGHT = 33432 -IPTC_NAA_CHUNK = 33723 # newsphoto properties -PHOTOSHOP_CHUNK = 34377 # photoshop properties -ICCPROFILE = 34675 -EXIFIFD = 34665 -XMP = 700 -JPEGQUALITY = 65537 # pseudo-tag by libtiff - -# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java -IMAGEJ_META_DATA_BYTE_COUNTS = 50838 -IMAGEJ_META_DATA = 50839 - -COMPRESSION_INFO = { - # Compression => pil compression name - 1: "raw", - 2: "tiff_ccitt", - 3: "group3", - 4: "group4", - 5: "tiff_lzw", - 6: "tiff_jpeg", # obsolete - 7: "jpeg", - 8: "tiff_adobe_deflate", - 32771: "tiff_raw_16", # 16-bit padding - 32773: "packbits", - 32809: "tiff_thunderscan", - 32946: "tiff_deflate", - 34676: "tiff_sgilog", - 34677: "tiff_sgilog24", - 34925: "lzma", - 50000: "zstd", - 50001: "webp", -} - -COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} - -OPEN_INFO = { - # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, - # ExtraSamples) => mode, rawmode - (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (II, 1, (1,), 1, (1,), ()): ("1", "1"), - (MM, 1, (1,), 1, (1,), ()): ("1", "1"), - (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (II, 1, (1,), 1, (8,), ()): ("L", "L"), - (MM, 1, (1,), 1, (8,), ()): ("L", "L"), - (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), - (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), - (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), - (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), - (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), - (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), - (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), - (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), - (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), - (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), - (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), - (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (II, 3, (1,), 1, (8,), ()): ("P", "P"), - (MM, 3, (1,), 1, (8,), ()): ("P", "P"), - (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), - # JPEG compressed images handled by LibTiff and auto-converted to RGBX - # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel - (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), - (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), -} - -PREFIXES = [ - b"MM\x00\x2A", # Valid TIFF header with big-endian byte order - b"II\x2A\x00", # Valid TIFF header with little-endian byte order - b"MM\x2A\x00", # Invalid TIFF header, assume big-endian - b"II\x00\x2A", # Invalid TIFF header, assume little-endian - b"MM\x00\x2B", # BigTIFF with big-endian byte order - b"II\x2B\x00", # BigTIFF with little-endian byte order -] - - -def _accept(prefix): - return prefix[:4] in PREFIXES - - -def _limit_rational(val, max_val): - inv = abs(val) > 1 - n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) - return n_d[::-1] if inv else n_d - - -def _limit_signed_rational(val, max_val, min_val): - frac = Fraction(val) - n_d = frac.numerator, frac.denominator - - if min(n_d) < min_val: - n_d = _limit_rational(val, abs(min_val)) - - if max(n_d) > max_val: - val = Fraction(*n_d) - n_d = _limit_rational(val, max_val) - - return n_d - - -## -# Wrapper for TIFF IFDs. - -_load_dispatch = {} -_write_dispatch = {} - - -class IFDRational(Rational): - """Implements a rational class where 0/0 is a legal value to match - the in the wild use of exif rationals. - - e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used - """ - - """ If the denominator is 0, store this as a float('nan'), otherwise store - as a fractions.Fraction(). Delegate as appropriate - - """ - - __slots__ = ("_numerator", "_denominator", "_val") - - def __init__(self, value, denominator=1): - """ - :param value: either an integer numerator, a - float/rational/other number, or an IFDRational - :param denominator: Optional integer denominator - """ - if isinstance(value, IFDRational): - self._numerator = value.numerator - self._denominator = value.denominator - self._val = value._val - return - - if isinstance(value, Fraction): - self._numerator = value.numerator - self._denominator = value.denominator - else: - self._numerator = value - self._denominator = denominator - - if denominator == 0: - self._val = float("nan") - elif denominator == 1: - self._val = Fraction(value) - else: - self._val = Fraction(value, denominator) - - @property - def numerator(a): - return a._numerator - - @property - def denominator(a): - return a._denominator - - def limit_rational(self, max_denominator): - """ - - :param max_denominator: Integer, the maximum denominator value - :returns: Tuple of (numerator, denominator) - """ - - if self.denominator == 0: - return (self.numerator, self.denominator) - - f = self._val.limit_denominator(max_denominator) - return (f.numerator, f.denominator) - - def __repr__(self): - return str(float(self._val)) - - def __hash__(self): - return self._val.__hash__() - - def __eq__(self, other): - val = self._val - if isinstance(other, IFDRational): - other = other._val - if isinstance(other, float): - val = float(val) - return val == other - - def __getstate__(self): - return [self._val, self._numerator, self._denominator] - - def __setstate__(self, state): - IFDRational.__init__(self, 0) - _val, _numerator, _denominator = state - self._val = _val - self._numerator = _numerator - self._denominator = _denominator - - def _delegate(op): - def delegate(self, *args): - return getattr(self._val, op)(*args) - - return delegate - - """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', - 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', - 'mod','rmod', 'pow','rpow', 'pos', 'neg', - 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', - 'ceil', 'floor', 'round'] - print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) - """ - - __add__ = _delegate("__add__") - __radd__ = _delegate("__radd__") - __sub__ = _delegate("__sub__") - __rsub__ = _delegate("__rsub__") - __mul__ = _delegate("__mul__") - __rmul__ = _delegate("__rmul__") - __truediv__ = _delegate("__truediv__") - __rtruediv__ = _delegate("__rtruediv__") - __floordiv__ = _delegate("__floordiv__") - __rfloordiv__ = _delegate("__rfloordiv__") - __mod__ = _delegate("__mod__") - __rmod__ = _delegate("__rmod__") - __pow__ = _delegate("__pow__") - __rpow__ = _delegate("__rpow__") - __pos__ = _delegate("__pos__") - __neg__ = _delegate("__neg__") - __abs__ = _delegate("__abs__") - __trunc__ = _delegate("__trunc__") - __lt__ = _delegate("__lt__") - __gt__ = _delegate("__gt__") - __le__ = _delegate("__le__") - __ge__ = _delegate("__ge__") - __bool__ = _delegate("__bool__") - __ceil__ = _delegate("__ceil__") - __floor__ = _delegate("__floor__") - __round__ = _delegate("__round__") - - -class ImageFileDirectory_v2(MutableMapping): - """This class represents a TIFF tag directory. To speed things up, we - don't decode tags unless they're asked for. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v2() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - 'Some Data' - - Individual values are returned as the strings or numbers, sequences are - returned as tuples of the values. - - The tiff metadata type of each item is stored in a dictionary of - tag types in - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types - are read from a tiff file, guessed from the type added, or added - manually. - - Data Structures: - - * ``self.tagtype = {}`` - - * Key: numerical TIFF tag number - * Value: integer corresponding to the data type from - :py:data:`.TiffTags.TYPES` - - .. versionadded:: 3.0.0 - - 'Internal' data structures: - - * ``self._tags_v2 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data, as tuple for multiple values - - * ``self._tagdata = {}`` - - * Key: numerical TIFF tag number - * Value: undecoded byte string from file - - * ``self._tags_v1 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data in the v1 format - - Tags will be found in the private attributes ``self._tagdata``, and in - ``self._tags_v2`` once decoded. - - ``self.legacy_api`` is a value for internal use, and shouldn't be changed - from outside code. In cooperation with - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api`` - is true, then decoded tags will be populated into both ``_tags_v1`` and - ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF - save routine. Tags should be read from ``_tags_v1`` if - ``legacy_api == true``. - - """ - - def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None, group=None): - """Initialize an ImageFileDirectory. - - To construct an ImageFileDirectory from a real file, pass the 8-byte - magic header to the constructor. To only set the endianness, pass it - as the 'prefix' keyword argument. - - :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets - endianness. - :param prefix: Override the endianness of the file. - """ - if not _accept(ifh): - raise SyntaxError(f"not a TIFF file (header {repr(ifh)} not valid)") - self._prefix = prefix if prefix is not None else ifh[:2] - if self._prefix == MM: - self._endian = ">" - elif self._prefix == II: - self._endian = "<" - else: - raise SyntaxError("not a TIFF IFD") - self._bigtiff = ifh[2] == 43 - self.group = group - self.tagtype = {} - """ Dictionary of tag types """ - self.reset() - (self.next,) = ( - self._unpack("Q", ifh[8:]) if self._bigtiff else self._unpack("L", ifh[4:]) - ) - self._legacy_api = False - - prefix = property(lambda self: self._prefix) - offset = property(lambda self: self._offset) - legacy_api = property(lambda self: self._legacy_api) - - @legacy_api.setter - def legacy_api(self, value): - raise Exception("Not allowing setting of legacy api") - - def reset(self): - self._tags_v1 = {} # will remain empty if legacy_api is false - self._tags_v2 = {} # main tag storage - self._tagdata = {} - self.tagtype = {} # added 2008-06-05 by Florian Hoech - self._next = None - self._offset = None - - def __str__(self): - return str(dict(self)) - - def named(self): - """ - :returns: dict of name|key: value - - Returns the complete tag dictionary, with named tags where possible. - """ - return { - TiffTags.lookup(code, self.group).name: value - for code, value in self.items() - } - - def __len__(self): - return len(set(self._tagdata) | set(self._tags_v2)) - - def __getitem__(self, tag): - if tag not in self._tags_v2: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - self[tag] = handler(self, data, self.legacy_api) # check type - val = self._tags_v2[tag] - if self.legacy_api and not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - def __contains__(self, tag): - return tag in self._tags_v2 or tag in self._tagdata - - def __setitem__(self, tag, value): - self._setitem(tag, value, self.legacy_api) - - def _setitem(self, tag, value, legacy_api): - basetypes = (Number, bytes, str) - - info = TiffTags.lookup(tag, self.group) - values = [value] if isinstance(value, basetypes) else value - - if tag not in self.tagtype: - if info.type: - self.tagtype[tag] = info.type - else: - self.tagtype[tag] = TiffTags.UNDEFINED - if all(isinstance(v, IFDRational) for v in values): - self.tagtype[tag] = ( - TiffTags.RATIONAL - if all(v >= 0 for v in values) - else TiffTags.SIGNED_RATIONAL - ) - elif all(isinstance(v, int) for v in values): - if all(0 <= v < 2**16 for v in values): - self.tagtype[tag] = TiffTags.SHORT - elif all(-(2**15) < v < 2**15 for v in values): - self.tagtype[tag] = TiffTags.SIGNED_SHORT - else: - self.tagtype[tag] = ( - TiffTags.LONG - if all(v >= 0 for v in values) - else TiffTags.SIGNED_LONG - ) - elif all(isinstance(v, float) for v in values): - self.tagtype[tag] = TiffTags.DOUBLE - elif all(isinstance(v, str) for v in values): - self.tagtype[tag] = TiffTags.ASCII - elif all(isinstance(v, bytes) for v in values): - self.tagtype[tag] = TiffTags.BYTE - - if self.tagtype[tag] == TiffTags.UNDEFINED: - values = [ - v.encode("ascii", "replace") if isinstance(v, str) else v - for v in values - ] - elif self.tagtype[tag] == TiffTags.RATIONAL: - values = [float(v) if isinstance(v, int) else v for v in values] - - is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) - if not is_ifd: - values = tuple(info.cvt_enum(value) for value in values) - - dest = self._tags_v1 if legacy_api else self._tags_v2 - - # Three branches: - # Spec'd length == 1, Actual length 1, store as element - # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. - # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. - # Don't mess with the legacy api, since it's frozen. - if not is_ifd and ( - (info.length == 1) - or self.tagtype[tag] == TiffTags.BYTE - or (info.length is None and len(values) == 1 and not legacy_api) - ): - # Don't mess with the legacy api, since it's frozen. - if legacy_api and self.tagtype[tag] in [ - TiffTags.RATIONAL, - TiffTags.SIGNED_RATIONAL, - ]: # rationals - values = (values,) - try: - (dest[tag],) = values - except ValueError: - # We've got a builtin tag with 1 expected entry - warnings.warn( - f"Metadata Warning, tag {tag} had too many entries: " - f"{len(values)}, expected 1" - ) - dest[tag] = values[0] - - else: - # Spec'd length > 1 or undefined - # Unspec'd, and length > 1 - dest[tag] = values - - def __delitem__(self, tag): - self._tags_v2.pop(tag, None) - self._tags_v1.pop(tag, None) - self._tagdata.pop(tag, None) - - def __iter__(self): - return iter(set(self._tagdata) | set(self._tags_v2)) - - def _unpack(self, fmt, data): - return struct.unpack(self._endian + fmt, data) - - def _pack(self, fmt, *values): - return struct.pack(self._endian + fmt, *values) - - def _register_loader(idx, size): - def decorator(func): - from .TiffTags import TYPES - - if func.__name__.startswith("load_"): - TYPES[idx] = func.__name__[5:].replace("_", " ") - _load_dispatch[idx] = size, func # noqa: F821 - return func - - return decorator - - def _register_writer(idx): - def decorator(func): - _write_dispatch[idx] = func # noqa: F821 - return func - - return decorator - - def _register_basic(idx_fmt_name): - from .TiffTags import TYPES - - idx, fmt, name = idx_fmt_name - TYPES[idx] = name - size = struct.calcsize("=" + fmt) - _load_dispatch[idx] = ( # noqa: F821 - size, - lambda self, data, legacy_api=True: ( - self._unpack(f"{len(data) // size}{fmt}", data) - ), - ) - _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 - b"".join(self._pack(fmt, value) for value in values) - ) - - list( - map( - _register_basic, - [ - (TiffTags.SHORT, "H", "short"), - (TiffTags.LONG, "L", "long"), - (TiffTags.SIGNED_BYTE, "b", "signed byte"), - (TiffTags.SIGNED_SHORT, "h", "signed short"), - (TiffTags.SIGNED_LONG, "l", "signed long"), - (TiffTags.FLOAT, "f", "float"), - (TiffTags.DOUBLE, "d", "double"), - (TiffTags.IFD, "L", "long"), - (TiffTags.LONG8, "Q", "long8"), - ], - ) - ) - - @_register_loader(1, 1) # Basic type, except for the legacy API. - def load_byte(self, data, legacy_api=True): - return data - - @_register_writer(1) # Basic type, except for the legacy API. - def write_byte(self, data): - return data - - @_register_loader(2, 1) - def load_string(self, data, legacy_api=True): - if data.endswith(b"\0"): - data = data[:-1] - return data.decode("latin-1", "replace") - - @_register_writer(2) - def write_string(self, value): - # remerge of https://github.com/python-pillow/Pillow/pull/1416 - return b"" + value.encode("ascii", "replace") + b"\0" - - @_register_loader(5, 8) - def load_rational(self, data, legacy_api=True): - vals = self._unpack(f"{len(data) // 4}L", data) - - def combine(a, b): - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(5) - def write_rational(self, *values): - return b"".join( - self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values - ) - - @_register_loader(7, 1) - def load_undefined(self, data, legacy_api=True): - return data - - @_register_writer(7) - def write_undefined(self, value): - return value - - @_register_loader(10, 8) - def load_signed_rational(self, data, legacy_api=True): - vals = self._unpack(f"{len(data) // 4}l", data) - - def combine(a, b): - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(10) - def write_signed_rational(self, *values): - return b"".join( - self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31))) - for frac in values - ) - - def _ensure_read(self, fp, size): - ret = fp.read(size) - if len(ret) != size: - raise OSError( - "Corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(ret)}. " - ) - return ret - - def load(self, fp): - - self.reset() - self._offset = fp.tell() - - try: - tag_count = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("H", self._ensure_read(fp, 2)) - )[0] - for i in range(tag_count): - tag, typ, count, data = ( - self._unpack("HHQ8s", self._ensure_read(fp, 20)) - if self._bigtiff - else self._unpack("HHL4s", self._ensure_read(fp, 12)) - ) - - tagname = TiffTags.lookup(tag, self.group).name - typname = TYPES.get(typ, "unknown") - msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" - - try: - unit_size, handler = self._load_dispatch[typ] - except KeyError: - logger.debug(msg + f" - unsupported type {typ}") - continue # ignore unsupported type - size = count * unit_size - if size > (8 if self._bigtiff else 4): - here = fp.tell() - (offset,) = self._unpack("Q" if self._bigtiff else "L", data) - msg += f" Tag Location: {here} - Data Location: {offset}" - fp.seek(offset) - data = ImageFile._safe_read(fp, size) - fp.seek(here) - else: - data = data[:size] - - if len(data) != size: - warnings.warn( - "Possibly corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(data)}." - f" Skipping tag {tag}" - ) - logger.debug(msg) - continue - - if not data: - logger.debug(msg) - continue - - self._tagdata[tag] = data - self.tagtype[tag] = typ - - msg += " - value: " + ( - "" % size if size > 32 else repr(data) - ) - logger.debug(msg) - - (self.next,) = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("L", self._ensure_read(fp, 4)) - ) - except OSError as msg: - warnings.warn(str(msg)) - return - - def tobytes(self, offset=0): - # FIXME What about tagdata? - result = self._pack("H", len(self._tags_v2)) - - entries = [] - offset = offset + len(result) + len(self._tags_v2) * 12 + 4 - stripoffsets = None - - # pass 1: convert tags to binary format - # always write tags in ascending order - for tag, value in sorted(self._tags_v2.items()): - if tag == STRIPOFFSETS: - stripoffsets = len(entries) - typ = self.tagtype.get(tag) - logger.debug(f"Tag {tag}, Type: {typ}, Value: {repr(value)}") - is_ifd = typ == TiffTags.LONG and isinstance(value, dict) - if is_ifd: - if self._endian == "<": - ifh = b"II\x2A\x00\x08\x00\x00\x00" - else: - ifh = b"MM\x00\x2A\x00\x00\x00\x08" - ifd = ImageFileDirectory_v2(ifh, group=tag) - values = self._tags_v2[tag] - for ifd_tag, ifd_value in values.items(): - ifd[ifd_tag] = ifd_value - data = ifd.tobytes(offset) - else: - values = value if isinstance(value, tuple) else (value,) - data = self._write_dispatch[typ](self, *values) - - tagname = TiffTags.lookup(tag, self.group).name - typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") - msg = f"save: {tagname} ({tag}) - type: {typname} ({typ})" - msg += " - value: " + ( - "" % len(data) if len(data) >= 16 else str(values) - ) - logger.debug(msg) - - # count is sum of lengths for string and arbitrary data - if is_ifd: - count = 1 - elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: - count = len(data) - else: - count = len(values) - # figure out if data fits into the entry - if len(data) <= 4: - entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) - else: - entries.append((tag, typ, count, self._pack("L", offset), data)) - offset += (len(data) + 1) // 2 * 2 # pad to word - - # update strip offset data to point beyond auxiliary data - if stripoffsets is not None: - tag, typ, count, value, data = entries[stripoffsets] - if data: - raise NotImplementedError("multistrip support not yet implemented") - value = self._pack("L", self._unpack("L", value)[0] + offset) - entries[stripoffsets] = tag, typ, count, value, data - - # pass 2: write entries to file - for tag, typ, count, value, data in entries: - logger.debug(f"{tag} {typ} {count} {repr(value)} {repr(data)}") - result += self._pack("HHL4s", tag, typ, count, value) - - # -- overwrite here for multi-page -- - result += b"\0\0\0\0" # end of entries - - # pass 3: write auxiliary data to file - for tag, typ, count, value, data in entries: - result += data - if len(data) & 1: - result += b"\0" - - return result - - def save(self, fp): - - if fp.tell() == 0: # skip TIFF header on subsequent pages - # tiff header -- PIL always starts the first IFD at offset 8 - fp.write(self._prefix + self._pack("HL", 42, 8)) - - offset = fp.tell() - result = self.tobytes(offset) - fp.write(result) - return offset + len(result) - - -ImageFileDirectory_v2._load_dispatch = _load_dispatch -ImageFileDirectory_v2._write_dispatch = _write_dispatch -for idx, name in TYPES.items(): - name = name.replace(" ", "_") - setattr(ImageFileDirectory_v2, "load_" + name, _load_dispatch[idx][1]) - setattr(ImageFileDirectory_v2, "write_" + name, _write_dispatch[idx]) -del _load_dispatch, _write_dispatch, idx, name - - -# Legacy ImageFileDirectory support. -class ImageFileDirectory_v1(ImageFileDirectory_v2): - """This class represents the **legacy** interface to a TIFF tag directory. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v1() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - ('Some Data',) - - Also contains a dictionary of tag types as read from the tiff image file, - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. - - Values are returned as a tuple. - - .. deprecated:: 3.0.0 - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._legacy_api = True - - tags = property(lambda self: self._tags_v1) - tagdata = property(lambda self: self._tagdata) - - # defined in ImageFileDirectory_v2 - tagtype: dict - """Dictionary of tag types""" - - @classmethod - def from_v2(cls, original): - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - - """ - - ifd = cls(prefix=original.prefix) - ifd._tagdata = original._tagdata - ifd.tagtype = original.tagtype - ifd.next = original.next # an indicator for multipage tiffs - return ifd - - def to_v2(self): - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - - """ - - ifd = ImageFileDirectory_v2(prefix=self.prefix) - ifd._tagdata = dict(self._tagdata) - ifd.tagtype = dict(self.tagtype) - ifd._tags_v2 = dict(self._tags_v2) - return ifd - - def __contains__(self, tag): - return tag in self._tags_v1 or tag in self._tagdata - - def __len__(self): - return len(set(self._tagdata) | set(self._tags_v1)) - - def __iter__(self): - return iter(set(self._tagdata) | set(self._tags_v1)) - - def __setitem__(self, tag, value): - for legacy_api in (False, True): - self._setitem(tag, value, legacy_api) - - def __getitem__(self, tag): - if tag not in self._tags_v1: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - for legacy in (False, True): - self._setitem(tag, handler(self, data, legacy), legacy) - val = self._tags_v1[tag] - if not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - -# undone -- switch this pointer when IFD_LEGACY_API == False -ImageFileDirectory = ImageFileDirectory_v1 - - -## -# Image plugin for TIFF files. - - -class TiffImageFile(ImageFile.ImageFile): - - format = "TIFF" - format_description = "Adobe TIFF" - _close_exclusive_fp_after_loading = False - - def __init__(self, fp=None, filename=None): - self.tag_v2 = None - """ Image file directory (tag dictionary) """ - - self.tag = None - """ Legacy tag entries """ - - super().__init__(fp, filename) - - def _open(self): - """Open the first image in a TIFF file""" - - # Header - ifh = self.fp.read(8) - if ifh[2] == 43: - ifh += self.fp.read(8) - - self.tag_v2 = ImageFileDirectory_v2(ifh) - - # legacy IFD entries will be filled in later - self.ifd = None - - # setup frame pointers - self.__first = self.__next = self.tag_v2.next - self.__frame = -1 - self.__fp = self.fp - self._frame_pos = [] - self._n_frames = None - - logger.debug("*** TiffImageFile._open ***") - logger.debug(f"- __first: {self.__first}") - logger.debug(f"- ifh: {repr(ifh)}") # Use repr to avoid str(bytes) - - # and load the first frame - self._seek(0) - - @property - def n_frames(self): - if self._n_frames is None: - current = self.tell() - self._seek(len(self._frame_pos)) - while self._n_frames is None: - self._seek(self.tell() + 1) - self.seek(current) - return self._n_frames - - def seek(self, frame): - """Select a given frame as current image""" - if not self._seek_check(frame): - return - self._seek(frame) - # Create a new core image object on second and - # subsequent frames in the image. Image may be - # different size/mode. - Image._decompression_bomb_check(self.size) - self.im = Image.core.new(self.mode, self.size) - - def _seek(self, frame): - self.fp = self.__fp - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - while len(self._frame_pos) <= frame: - if not self.__next: - raise EOFError("no more images in TIFF file") - logger.debug( - f"Seeking to frame {frame}, on frame {self.__frame}, " - f"__next {self.__next}, location: {self.fp.tell()}" - ) - self.fp.seek(self.__next) - self._frame_pos.append(self.__next) - logger.debug("Loading tags, location: %s" % self.fp.tell()) - self.tag_v2.load(self.fp) - if self.tag_v2.next in self._frame_pos: - # This IFD has already been processed - # Declare this to be the end of the image - self.__next = 0 - else: - self.__next = self.tag_v2.next - if self.__next == 0: - self._n_frames = frame + 1 - if len(self._frame_pos) == 1: - self.is_animated = self.__next != 0 - self.__frame += 1 - self.fp.seek(self._frame_pos[frame]) - self.tag_v2.load(self.fp) - # fill the legacy tag/ifd entries - self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) - self.__frame = frame - self._setup() - - def tell(self): - """Return the current frame number""" - return self.__frame - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - return self._getxmp(self.tag_v2[700]) if 700 in self.tag_v2 else {} - - def get_photoshop_blocks(self): - """ - Returns a dictionary of Photoshop "Image Resource Blocks". - The keys are the image resource ID. For more information, see - https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 - - :returns: Photoshop "Image Resource Blocks" in a dictionary. - """ - blocks = {} - val = self.tag_v2.get(0x8649) - if val: - while val[:4] == b"8BIM": - id = i16(val[4:6]) - n = math.ceil((val[6] + 1) / 2) * 2 - size = i32(val[6 + n : 10 + n]) - data = val[10 + n : 10 + n + size] - blocks[id] = {"data": data} - - val = val[math.ceil((10 + n + size) / 2) * 2 :] - return blocks - - def load(self): - if self.tile and self.use_load_libtiff: - return self._load_libtiff() - return super().load() - - def load_end(self): - if self._tile_orientation: - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(self._tile_orientation) - if method is not None: - self.im = self.im.transpose(method) - self._size = self.im.size - - # allow closing if we're on the first frame, there's no next - # This is the ImageFile.load path only, libtiff specific below. - if not self.is_animated: - self._close_exclusive_fp_after_loading = True - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - # load IFD data from fp before it is closed - exif = self.getexif() - for key in TiffTags.TAGS_V2_GROUPS.keys(): - if key not in exif: - continue - exif.get_ifd(key) - - def _load_libtiff(self): - """Overload method triggered when we detect a compressed tiff - Calls out to libtiff""" - - Image.Image.load(self) - - self.load_prepare() - - if not len(self.tile) == 1: - raise OSError("Not exactly one tile") - - # (self._compression, (extents tuple), - # 0, (rawmode, self._compression, fp)) - extents = self.tile[0][1] - args = list(self.tile[0][3]) - - # To be nice on memory footprint, if there's a - # file descriptor, use that instead of reading - # into a string in python. - # libtiff closes the file descriptor, so pass in a dup. - try: - fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno()) - # flush the file descriptor, prevents error on pypy 2.4+ - # should also eliminate the need for fp.tell - # in _seek - if hasattr(self.fp, "flush"): - self.fp.flush() - except OSError: - # io.BytesIO have a fileno, but returns an OSError if - # it doesn't use a file descriptor. - fp = False - - if fp: - args[2] = fp - - decoder = Image._getdecoder( - self.mode, "libtiff", tuple(args), self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - except ValueError as e: - raise OSError("Couldn't set the image") from e - - close_self_fp = self._exclusive_fp and not self.is_animated - if hasattr(self.fp, "getvalue"): - # We've got a stringio like thing passed in. Yay for all in memory. - # The decoder needs the entire file in one shot, so there's not - # a lot we can do here other than give it the entire file. - # unless we could do something like get the address of the - # underlying string for stringio. - # - # Rearranging for supporting byteio items, since they have a fileno - # that returns an OSError if there's no underlying fp. Easier to - # deal with here by reordering. - logger.debug("have getvalue. just sending in a string from getvalue") - n, err = decoder.decode(self.fp.getvalue()) - elif fp: - # we've got a actual file on disk, pass in the fp. - logger.debug("have fileno, calling fileno version of the decoder.") - if not close_self_fp: - self.fp.seek(0) - # 4 bytes, otherwise the trace might error out - n, err = decoder.decode(b"fpfp") - else: - # we have something else. - logger.debug("don't have fileno or getvalue. just reading") - self.fp.seek(0) - # UNDONE -- so much for that buffer size thing. - n, err = decoder.decode(self.fp.read()) - - if fp: - try: - os.close(fp) - except OSError: - pass - - self.tile = [] - self.readonly = 0 - - self.load_end() - - # libtiff closed the fp in a, we need to close self.fp, if possible - if close_self_fp: - self.fp.close() - self.fp = None # might be shared - - if err < 0: - raise OSError(err) - - return Image.Image.load(self) - - def _setup(self): - """Setup this image object based on current tags""" - - if 0xBC01 in self.tag_v2: - raise OSError("Windows Media Photo files not yet supported") - - # extract relevant tags - self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] - self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) - - # photometric is a required tag, but not everyone is reading - # the specification - photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) - - # old style jpeg compression images most certainly are YCbCr - if self._compression == "tiff_jpeg": - photo = 6 - - fillorder = self.tag_v2.get(FILLORDER, 1) - - logger.debug("*** Summary ***") - logger.debug(f"- compression: {self._compression}") - logger.debug(f"- photometric_interpretation: {photo}") - logger.debug(f"- planar_configuration: {self._planar_configuration}") - logger.debug(f"- fill_order: {fillorder}") - logger.debug(f"- YCbCr subsampling: {self.tag.get(530)}") - - # size - xsize = int(self.tag_v2.get(IMAGEWIDTH)) - ysize = int(self.tag_v2.get(IMAGELENGTH)) - self._size = xsize, ysize - - logger.debug(f"- size: {self.size}") - - sampleFormat = self.tag_v2.get(SAMPLEFORMAT, (1,)) - if len(sampleFormat) > 1 and max(sampleFormat) == min(sampleFormat) == 1: - # SAMPLEFORMAT is properly per band, so an RGB image will - # be (1,1,1). But, we don't support per band pixel types, - # and anything more than one band is a uint8. So, just - # take the first element. Revisit this if adding support - # for more exotic images. - sampleFormat = (1,) - - bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) - extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) - if photo in (2, 6, 8): # RGB, YCbCr, LAB - bps_count = 3 - elif photo == 5: # CMYK - bps_count = 4 - else: - bps_count = 1 - bps_count += len(extra_tuple) - bps_actual_count = len(bps_tuple) - if bps_count < bps_actual_count: - # If a file has more values in bps_tuple than expected, - # remove the excess. - bps_tuple = bps_tuple[:bps_count] - elif bps_count > bps_actual_count and bps_actual_count == 1: - # If a file has only one value in bps_tuple, when it should have more, - # presume it is the same number of bits for all of the samples. - bps_tuple = bps_tuple * bps_count - - samplesPerPixel = self.tag_v2.get( - SAMPLESPERPIXEL, - 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, - ) - if len(bps_tuple) != samplesPerPixel: - raise SyntaxError("unknown data organization") - - # mode: check photometric interpretation and bits per pixel - key = ( - self.tag_v2.prefix, - photo, - sampleFormat, - fillorder, - bps_tuple, - extra_tuple, - ) - logger.debug(f"format key: {key}") - try: - self.mode, rawmode = OPEN_INFO[key] - except KeyError as e: - logger.debug("- unsupported format") - raise SyntaxError("unknown pixel mode") from e - - logger.debug(f"- raw mode: {rawmode}") - logger.debug(f"- pil mode: {self.mode}") - - self.info["compression"] = self._compression - - xres = self.tag_v2.get(X_RESOLUTION, 1) - yres = self.tag_v2.get(Y_RESOLUTION, 1) - - if xres and yres: - resunit = self.tag_v2.get(RESOLUTION_UNIT) - if resunit == 2: # dots per inch - self.info["dpi"] = (xres, yres) - elif resunit == 3: # dots per centimeter. convert to dpi - self.info["dpi"] = (xres * 2.54, yres * 2.54) - elif resunit is None: # used to default to 1, but now 2) - self.info["dpi"] = (xres, yres) - # For backward compatibility, - # we also preserve the old behavior - self.info["resolution"] = xres, yres - else: # No absolute unit of measurement - self.info["resolution"] = xres, yres - - # build tile descriptors - x = y = layer = 0 - self.tile = [] - self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" - if self.use_load_libtiff: - # Decoder expects entire file as one tile. - # There's a buffer size limit in load (64k) - # so large g4 images will fail if we use that - # function. - # - # Setup the one tile for the whole image, then - # use the _load_libtiff function. - - # libtiff handles the fillmode for us, so 1;IR should - # actually be 1;I. Including the R double reverses the - # bits, so stripes of the image are reversed. See - # https://github.com/python-pillow/Pillow/issues/279 - if fillorder == 2: - # Replace fillorder with fillorder=1 - key = key[:3] + (1,) + key[4:] - logger.debug(f"format key: {key}") - # this should always work, since all the - # fillorder==2 modes have a corresponding - # fillorder=1 mode - self.mode, rawmode = OPEN_INFO[key] - # libtiff always returns the bytes in native order. - # we're expecting image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if rawmode == "I;16": - rawmode = "I;16N" - if ";16B" in rawmode: - rawmode = rawmode.replace(";16B", ";16N") - if ";16L" in rawmode: - rawmode = rawmode.replace(";16L", ";16N") - - # YCbCr images with new jpeg compression with pixels in one plane - # unpacked straight into RGB values - if ( - photo == 6 - and self._compression == "jpeg" - and self._planar_configuration == 1 - ): - rawmode = "RGB" - - # Offset in the tile tuple is 0, we go from 0,0 to - # w,h, and we only do this once -- eds - a = (rawmode, self._compression, False, self.tag_v2.offset) - self.tile.append(("libtiff", (0, 0, xsize, ysize), 0, a)) - - elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: - # striped image - if STRIPOFFSETS in self.tag_v2: - offsets = self.tag_v2[STRIPOFFSETS] - h = self.tag_v2.get(ROWSPERSTRIP, ysize) - w = self.size[0] - else: - # tiled image - offsets = self.tag_v2[TILEOFFSETS] - w = self.tag_v2.get(322) - h = self.tag_v2.get(323) - - for offset in offsets: - if x + w > xsize: - stride = w * sum(bps_tuple) / 8 # bytes per line - else: - stride = 0 - - tile_rawmode = rawmode - if self._planar_configuration == 2: - # each band on it's own layer - tile_rawmode = rawmode[layer] - # adjust stride width accordingly - stride /= bps_count - - a = (tile_rawmode, int(stride), 1) - self.tile.append( - ( - self._compression, - (x, y, min(x + w, xsize), min(y + h, ysize)), - offset, - a, - ) - ) - x = x + w - if x >= self.size[0]: - x, y = 0, y + h - if y >= self.size[1]: - x = y = 0 - layer += 1 - else: - logger.debug("- unsupported data organization") - raise SyntaxError("unknown data organization") - - # Fix up info. - if ICCPROFILE in self.tag_v2: - self.info["icc_profile"] = self.tag_v2[ICCPROFILE] - - # fixup palette descriptor - - if self.mode in ["P", "PA"]: - palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] - self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) - - self._tile_orientation = self.tag_v2.get(0x0112) - - def _close__fp(self): - try: - if self.__fp != self.fp: - self.__fp.close() - except AttributeError: - pass - finally: - self.__fp = None - - -# -# -------------------------------------------------------------------- -# Write TIFF files - -# little endian is default except for image modes with -# explicit big endian byte-order - -SAVE_INFO = { - # mode => rawmode, byteorder, photometrics, - # sampleformat, bitspersample, extra - "1": ("1", II, 1, 1, (1,), None), - "L": ("L", II, 1, 1, (8,), None), - "LA": ("LA", II, 1, 1, (8, 8), 2), - "P": ("P", II, 3, 1, (8,), None), - "PA": ("PA", II, 3, 1, (8, 8), 2), - "I": ("I;32S", II, 1, 2, (32,), None), - "I;16": ("I;16", II, 1, 1, (16,), None), - "I;16S": ("I;16S", II, 1, 2, (16,), None), - "F": ("F;32F", II, 1, 3, (32,), None), - "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), - "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), - "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), - "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), - "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), - "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), - "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), - "I;16B": ("I;16B", MM, 1, 1, (16,), None), - "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), - "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), -} - - -def _save(im, fp, filename): - - try: - rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] - except KeyError as e: - raise OSError(f"cannot write mode {im.mode} as TIFF") from e - - ifd = ImageFileDirectory_v2(prefix=prefix) - - encoderinfo = im.encoderinfo - encoderconfig = im.encoderconfig - compression = encoderinfo.get("compression", im.info.get("compression")) - if compression is None: - compression = "raw" - elif compression == "tiff_jpeg": - # OJPEG is obsolete, so use new-style JPEG compression instead - compression = "jpeg" - elif compression == "tiff_deflate": - compression = "tiff_adobe_deflate" - - libtiff = WRITE_LIBTIFF or compression != "raw" - - # required for color libtiff images - ifd[PLANAR_CONFIGURATION] = 1 - - ifd[IMAGEWIDTH] = im.size[0] - ifd[IMAGELENGTH] = im.size[1] - - # write any arbitrary tags passed in as an ImageFileDirectory - if "tiffinfo" in encoderinfo: - info = encoderinfo["tiffinfo"] - elif "exif" in encoderinfo: - info = encoderinfo["exif"] - if isinstance(info, bytes): - exif = Image.Exif() - exif.load(info) - info = exif - else: - info = {} - logger.debug("Tiffinfo Keys: %s" % list(info)) - if isinstance(info, ImageFileDirectory_v1): - info = info.to_v2() - for key in info: - if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS.keys(): - ifd[key] = info.get_ifd(key) - else: - ifd[key] = info.get(key) - try: - ifd.tagtype[key] = info.tagtype[key] - except Exception: - pass # might not be an IFD. Might not have populated type - - # additions written by Greg Couch, gregc@cgl.ucsf.edu - # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com - if hasattr(im, "tag_v2"): - # preserve tags from original TIFF image file - for key in ( - RESOLUTION_UNIT, - X_RESOLUTION, - Y_RESOLUTION, - IPTC_NAA_CHUNK, - PHOTOSHOP_CHUNK, - XMP, - ): - if key in im.tag_v2: - ifd[key] = im.tag_v2[key] - ifd.tagtype[key] = im.tag_v2.tagtype[key] - - # preserve ICC profile (should also work when saving other formats - # which support profiles as TIFF) -- 2008-06-06 Florian Hoech - icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - ifd[ICCPROFILE] = icc - - for key, name in [ - (IMAGEDESCRIPTION, "description"), - (X_RESOLUTION, "resolution"), - (Y_RESOLUTION, "resolution"), - (X_RESOLUTION, "x_resolution"), - (Y_RESOLUTION, "y_resolution"), - (RESOLUTION_UNIT, "resolution_unit"), - (SOFTWARE, "software"), - (DATE_TIME, "date_time"), - (ARTIST, "artist"), - (COPYRIGHT, "copyright"), - ]: - if name in encoderinfo: - ifd[key] = encoderinfo[name] - - dpi = encoderinfo.get("dpi") - if dpi: - ifd[RESOLUTION_UNIT] = 2 - ifd[X_RESOLUTION] = dpi[0] - ifd[Y_RESOLUTION] = dpi[1] - - if bits != (1,): - ifd[BITSPERSAMPLE] = bits - if len(bits) != 1: - ifd[SAMPLESPERPIXEL] = len(bits) - if extra is not None: - ifd[EXTRASAMPLES] = extra - if format != 1: - ifd[SAMPLEFORMAT] = format - - if PHOTOMETRIC_INTERPRETATION not in ifd: - ifd[PHOTOMETRIC_INTERPRETATION] = photo - elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: - if im.mode == "1": - inverted_im = im.copy() - px = inverted_im.load() - for y in range(inverted_im.height): - for x in range(inverted_im.width): - px[x, y] = 0 if px[x, y] == 255 else 255 - im = inverted_im - else: - im = ImageOps.invert(im) - - if im.mode in ["P", "PA"]: - lut = im.im.getpalette("RGB", "RGB;L") - ifd[COLORMAP] = tuple(v * 256 for v in lut) - # data orientation - stride = len(bits) * ((im.size[0] * bits[0] + 7) // 8) - # aim for given strip size (64 KB by default) when using libtiff writer - if libtiff: - rows_per_strip = 1 if stride == 0 else min(STRIP_SIZE // stride, im.size[1]) - # JPEG encoder expects multiple of 8 rows - if compression == "jpeg": - rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, im.size[1]) - else: - rows_per_strip = im.size[1] - if rows_per_strip == 0: - rows_per_strip = 1 - strip_byte_counts = 1 if stride == 0 else stride * rows_per_strip - strips_per_image = (im.size[1] + rows_per_strip - 1) // rows_per_strip - ifd[ROWSPERSTRIP] = rows_per_strip - if strip_byte_counts >= 2**16: - ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG - ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( - stride * im.size[1] - strip_byte_counts * (strips_per_image - 1), - ) - ifd[STRIPOFFSETS] = tuple( - range(0, strip_byte_counts * strips_per_image, strip_byte_counts) - ) # this is adjusted by IFD writer - # no compression by default: - ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) - - if im.mode == "YCbCr": - for tag, value in { - YCBCRSUBSAMPLING: (1, 1), - REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), - }.items(): - ifd.setdefault(tag, value) - - blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] - if libtiff: - if "quality" in encoderinfo: - quality = encoderinfo["quality"] - if not isinstance(quality, int) or quality < 0 or quality > 100: - raise ValueError("Invalid quality setting") - if compression != "jpeg": - raise ValueError( - "quality setting only supported for 'jpeg' compression" - ) - ifd[JPEGQUALITY] = quality - - logger.debug("Saving using libtiff encoder") - logger.debug("Items: %s" % sorted(ifd.items())) - _fp = 0 - if hasattr(fp, "fileno"): - try: - fp.seek(0) - _fp = os.dup(fp.fileno()) - except io.UnsupportedOperation: - pass - - # optional types for non core tags - types = {} - # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library - # based on the data in the strip. - # The other tags expect arrays with a certain length (fixed or depending on - # BITSPERSAMPLE, etc), passing arrays with a different length will result in - # segfaults. Block these tags until we add extra validation. - # SUBIFD may also cause a segfault. - blocklist += [ - REFERENCEBLACKWHITE, - STRIPBYTECOUNTS, - STRIPOFFSETS, - TRANSFERFUNCTION, - SUBIFD, - ] - - atts = {} - # bits per sample is a single short in the tiff directory, not a list. - atts[BITSPERSAMPLE] = bits[0] - # Merge the ones that we have with (optional) more bits from - # the original file, e.g x,y resolution so that we can - # save(load('')) == original file. - legacy_ifd = {} - if hasattr(im, "tag"): - legacy_ifd = im.tag.to_v2() - - # SAMPLEFORMAT is determined by the image format and should not be copied - # from legacy_ifd. - supplied_tags = {**getattr(im, "tag_v2", {}), **legacy_ifd} - if SAMPLEFORMAT in supplied_tags: - del supplied_tags[SAMPLEFORMAT] - - for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): - # Libtiff can only process certain core items without adding - # them to the custom dictionary. - # Custom items are supported for int, float, unicode, string and byte - # values. Other types and tuples require a tagtype. - if tag not in TiffTags.LIBTIFF_CORE: - if not Image.core.libtiff_support_custom_tags: - continue - - if tag in ifd.tagtype: - types[tag] = ifd.tagtype[tag] - elif not (isinstance(value, (int, float, str, bytes))): - continue - else: - type = TiffTags.lookup(tag).type - if type: - types[tag] = type - if tag not in atts and tag not in blocklist: - if isinstance(value, str): - atts[tag] = value.encode("ascii", "replace") + b"\0" - elif isinstance(value, IFDRational): - atts[tag] = float(value) - else: - atts[tag] = value - - if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: - atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] - - logger.debug("Converted items: %s" % sorted(atts.items())) - - # libtiff always expects the bytes in native order. - # we're storing image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if im.mode in ("I;16B", "I;16"): - rawmode = "I;16N" - - # Pass tags as sorted list so that the tags are set in a fixed order. - # This is required by libtiff for some tags. For example, the JPEGQUALITY - # pseudo tag requires that the COMPRESS tag was already set. - tags = list(atts.items()) - tags.sort() - a = (rawmode, compression, _fp, filename, tags, types) - e = Image._getencoder(im.mode, "libtiff", a, encoderconfig) - e.setimage(im.im, (0, 0) + im.size) - while True: - # undone, change to self.decodermaxblock: - l, s, d = e.encode(16 * 1024) - if not _fp: - fp.write(d) - if s: - break - if s < 0: - raise OSError(f"encoder error {s} when writing image file") - - else: - for tag in blocklist: - del ifd[tag] - offset = ifd.save(fp) - - ImageFile._save( - im, fp, [("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))] - ) - - # -- helper for multi-page save -- - if "_debug_multipage" in encoderinfo: - # just to access o32 and o16 (using correct byte order) - im._debug_multipage = ifd - - -class AppendingTiffWriter: - fieldSizes = [ - 0, # None - 1, # byte - 1, # ascii - 2, # short - 4, # long - 8, # rational - 1, # sbyte - 1, # undefined - 2, # sshort - 4, # slong - 8, # srational - 4, # float - 8, # double - ] - - # StripOffsets = 273 - # FreeOffsets = 288 - # TileOffsets = 324 - # JPEGQTables = 519 - # JPEGDCTables = 520 - # JPEGACTables = 521 - Tags = {273, 288, 324, 519, 520, 521} - - def __init__(self, fn, new=False): - if hasattr(fn, "read"): - self.f = fn - self.close_fp = False - else: - self.name = fn - self.close_fp = True - try: - self.f = open(fn, "w+b" if new else "r+b") - except OSError: - self.f = open(fn, "w+b") - self.beginning = self.f.tell() - self.setup() - - def setup(self): - # Reset everything. - self.f.seek(self.beginning, os.SEEK_SET) - - self.whereToWriteNewIFDOffset = None - self.offsetOfNewPage = 0 - - self.IIMM = IIMM = self.f.read(4) - if not IIMM: - # empty file - first page - self.isFirst = True - return - - self.isFirst = False - if IIMM == b"II\x2a\x00": - self.setEndian("<") - elif IIMM == b"MM\x00\x2a": - self.setEndian(">") - else: - raise RuntimeError("Invalid TIFF file header") - - self.skipIFDs() - self.goToEnd() - - def finalize(self): - if self.isFirst: - return - - # fix offsets - self.f.seek(self.offsetOfNewPage) - - IIMM = self.f.read(4) - if not IIMM: - # raise RuntimeError("nothing written into new page") - # Make it easy to finish a frame without committing to a new one. - return - - if IIMM != self.IIMM: - raise RuntimeError("IIMM of new page doesn't match IIMM of first page") - - IFDoffset = self.readLong() - IFDoffset += self.offsetOfNewPage - self.f.seek(self.whereToWriteNewIFDOffset) - self.writeLong(IFDoffset) - self.f.seek(IFDoffset) - self.fixIFD() - - def newFrame(self): - # Call this to finish a frame. - self.finalize() - self.setup() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - if self.close_fp: - self.close() - return False - - def tell(self): - return self.f.tell() - self.offsetOfNewPage - - def seek(self, offset, whence=io.SEEK_SET): - if whence == os.SEEK_SET: - offset += self.offsetOfNewPage - - self.f.seek(offset, whence) - return self.tell() - - def goToEnd(self): - self.f.seek(0, os.SEEK_END) - pos = self.f.tell() - - # pad to 16 byte boundary - padBytes = 16 - pos % 16 - if 0 < padBytes < 16: - self.f.write(bytes(padBytes)) - self.offsetOfNewPage = self.f.tell() - - def setEndian(self, endian): - self.endian = endian - self.longFmt = self.endian + "L" - self.shortFmt = self.endian + "H" - self.tagFormat = self.endian + "HHL" - - def skipIFDs(self): - while True: - IFDoffset = self.readLong() - if IFDoffset == 0: - self.whereToWriteNewIFDOffset = self.f.tell() - 4 - break - - self.f.seek(IFDoffset) - numTags = self.readShort() - self.f.seek(numTags * 12, os.SEEK_CUR) - - def write(self, data): - return self.f.write(data) - - def readShort(self): - (value,) = struct.unpack(self.shortFmt, self.f.read(2)) - return value - - def readLong(self): - (value,) = struct.unpack(self.longFmt, self.f.read(4)) - return value - - def rewriteLastShortToLong(self, value): - self.f.seek(-2, os.SEEK_CUR) - bytesWritten = self.f.write(struct.pack(self.longFmt, value)) - if bytesWritten is not None and bytesWritten != 4: - raise RuntimeError(f"wrote only {bytesWritten} bytes but wanted 4") - - def rewriteLastShort(self, value): - self.f.seek(-2, os.SEEK_CUR) - bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) - if bytesWritten is not None and bytesWritten != 2: - raise RuntimeError(f"wrote only {bytesWritten} bytes but wanted 2") - - def rewriteLastLong(self, value): - self.f.seek(-4, os.SEEK_CUR) - bytesWritten = self.f.write(struct.pack(self.longFmt, value)) - if bytesWritten is not None and bytesWritten != 4: - raise RuntimeError(f"wrote only {bytesWritten} bytes but wanted 4") - - def writeShort(self, value): - bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) - if bytesWritten is not None and bytesWritten != 2: - raise RuntimeError(f"wrote only {bytesWritten} bytes but wanted 2") - - def writeLong(self, value): - bytesWritten = self.f.write(struct.pack(self.longFmt, value)) - if bytesWritten is not None and bytesWritten != 4: - raise RuntimeError(f"wrote only {bytesWritten} bytes but wanted 4") - - def close(self): - self.finalize() - self.f.close() - - def fixIFD(self): - numTags = self.readShort() - - for i in range(numTags): - tag, fieldType, count = struct.unpack(self.tagFormat, self.f.read(8)) - - fieldSize = self.fieldSizes[fieldType] - totalSize = fieldSize * count - isLocal = totalSize <= 4 - if not isLocal: - offset = self.readLong() - offset += self.offsetOfNewPage - self.rewriteLastLong(offset) - - if tag in self.Tags: - curPos = self.f.tell() - - if isLocal: - self.fixOffsets( - count, isShort=(fieldSize == 2), isLong=(fieldSize == 4) - ) - self.f.seek(curPos + 4) - else: - self.f.seek(offset) - self.fixOffsets( - count, isShort=(fieldSize == 2), isLong=(fieldSize == 4) - ) - self.f.seek(curPos) - - offset = curPos = None - - elif isLocal: - # skip the locally stored value that is not an offset - self.f.seek(4, os.SEEK_CUR) - - def fixOffsets(self, count, isShort=False, isLong=False): - if not isShort and not isLong: - raise RuntimeError("offset is neither short nor long") - - for i in range(count): - offset = self.readShort() if isShort else self.readLong() - offset += self.offsetOfNewPage - if isShort and offset >= 65536: - # offset is now too large - we must convert shorts to longs - if count != 1: - raise RuntimeError("not implemented") # XXX TODO - - # simple case - the offset is just one and therefore it is - # local (not referenced with another offset) - self.rewriteLastShortToLong(offset) - self.f.seek(-10, os.SEEK_CUR) - self.writeShort(TiffTags.LONG) # rewrite the type to LONG - self.f.seek(8, os.SEEK_CUR) - elif isShort: - self.rewriteLastShort(offset) - else: - self.rewriteLastLong(offset) - - -def _save_all(im, fp, filename): - encoderinfo = im.encoderinfo.copy() - encoderconfig = im.encoderconfig - append_images = list(encoderinfo.get("append_images", [])) - if not hasattr(im, "n_frames") and not append_images: - return _save(im, fp, filename) - - cur_idx = im.tell() - try: - with AppendingTiffWriter(fp) as tf: - for ims in [im] + append_images: - ims.encoderinfo = encoderinfo - ims.encoderconfig = encoderconfig - if not hasattr(ims, "n_frames"): - nfr = 1 - else: - nfr = ims.n_frames - - for idx in range(nfr): - ims.seek(idx) - ims.load() - _save(ims, tf, filename) - tf.newFrame() - finally: - im.seek(cur_idx) - - -# -# -------------------------------------------------------------------- -# Register - -Image.register_open(TiffImageFile.format, TiffImageFile, _accept) -Image.register_save(TiffImageFile.format, _save) -Image.register_save_all(TiffImageFile.format, _save_all) - -Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) - -Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/venv/Lib/site-packages/PIL/TiffTags.py b/venv/Lib/site-packages/PIL/TiffTags.py deleted file mode 100644 index b37c8cf..0000000 --- a/venv/Lib/site-packages/PIL/TiffTags.py +++ /dev/null @@ -1,522 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF tags -# -# This module provides clear-text names for various well-known -# TIFF tags. the TIFF codec works just fine without it. -# -# Copyright (c) Secret Labs AB 1999. -# -# See the README file for information on usage and redistribution. -# - -## -# This module provides constants and clear-text names for various -# well-known TIFF tags. -## - -from collections import namedtuple - - -class TagInfo(namedtuple("_TagInfo", "value name type length enum")): - __slots__ = [] - - def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): - return super().__new__(cls, value, name, type, length, enum or {}) - - def cvt_enum(self, value): - # Using get will call hash(value), which can be expensive - # for some types (e.g. Fraction). Since self.enum is rarely - # used, it's usually better to test it first. - return self.enum.get(value, value) if self.enum else value - - -def lookup(tag, group=None): - """ - :param tag: Integer tag number - :returns: Taginfo namedtuple, From the TAGS_V2 info if possible, - otherwise just populating the value and name from TAGS. - If the tag is not recognized, "unknown" is returned for the name - - """ - - if group is not None: - info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None - else: - info = TAGS_V2.get(tag) - return info or TagInfo(tag, TAGS.get(tag, "unknown")) - - -## -# Map tag numbers to tag info. -# -# id: (Name, Type, Length, enum_values) -# -# The length here differs from the length in the tiff spec. For -# numbers, the tiff spec is for the number of fields returned. We -# agree here. For string-like types, the tiff spec uses the length of -# field in bytes. In Pillow, we are using the number of expected -# fields, in general 1 for string-like types. - - -BYTE = 1 -ASCII = 2 -SHORT = 3 -LONG = 4 -RATIONAL = 5 -SIGNED_BYTE = 6 -UNDEFINED = 7 -SIGNED_SHORT = 8 -SIGNED_LONG = 9 -SIGNED_RATIONAL = 10 -FLOAT = 11 -DOUBLE = 12 -IFD = 13 -LONG8 = 16 - -TAGS_V2 = { - 254: ("NewSubfileType", LONG, 1), - 255: ("SubfileType", SHORT, 1), - 256: ("ImageWidth", LONG, 1), - 257: ("ImageLength", LONG, 1), - 258: ("BitsPerSample", SHORT, 0), - 259: ( - "Compression", - SHORT, - 1, - { - "Uncompressed": 1, - "CCITT 1d": 2, - "Group 3 Fax": 3, - "Group 4 Fax": 4, - "LZW": 5, - "JPEG": 6, - "PackBits": 32773, - }, - ), - 262: ( - "PhotometricInterpretation", - SHORT, - 1, - { - "WhiteIsZero": 0, - "BlackIsZero": 1, - "RGB": 2, - "RGB Palette": 3, - "Transparency Mask": 4, - "CMYK": 5, - "YCbCr": 6, - "CieLAB": 8, - "CFA": 32803, # TIFF/EP, Adobe DNG - "LinearRaw": 32892, # Adobe DNG - }, - ), - 263: ("Threshholding", SHORT, 1), - 264: ("CellWidth", SHORT, 1), - 265: ("CellLength", SHORT, 1), - 266: ("FillOrder", SHORT, 1), - 269: ("DocumentName", ASCII, 1), - 270: ("ImageDescription", ASCII, 1), - 271: ("Make", ASCII, 1), - 272: ("Model", ASCII, 1), - 273: ("StripOffsets", LONG, 0), - 274: ("Orientation", SHORT, 1), - 277: ("SamplesPerPixel", SHORT, 1), - 278: ("RowsPerStrip", LONG, 1), - 279: ("StripByteCounts", LONG, 0), - 280: ("MinSampleValue", SHORT, 0), - 281: ("MaxSampleValue", SHORT, 0), - 282: ("XResolution", RATIONAL, 1), - 283: ("YResolution", RATIONAL, 1), - 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), - 285: ("PageName", ASCII, 1), - 286: ("XPosition", RATIONAL, 1), - 287: ("YPosition", RATIONAL, 1), - 288: ("FreeOffsets", LONG, 1), - 289: ("FreeByteCounts", LONG, 1), - 290: ("GrayResponseUnit", SHORT, 1), - 291: ("GrayResponseCurve", SHORT, 0), - 292: ("T4Options", LONG, 1), - 293: ("T6Options", LONG, 1), - 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), - 297: ("PageNumber", SHORT, 2), - 301: ("TransferFunction", SHORT, 0), - 305: ("Software", ASCII, 1), - 306: ("DateTime", ASCII, 1), - 315: ("Artist", ASCII, 1), - 316: ("HostComputer", ASCII, 1), - 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), - 318: ("WhitePoint", RATIONAL, 2), - 319: ("PrimaryChromaticities", RATIONAL, 6), - 320: ("ColorMap", SHORT, 0), - 321: ("HalftoneHints", SHORT, 2), - 322: ("TileWidth", LONG, 1), - 323: ("TileLength", LONG, 1), - 324: ("TileOffsets", LONG, 0), - 325: ("TileByteCounts", LONG, 0), - 332: ("InkSet", SHORT, 1), - 333: ("InkNames", ASCII, 1), - 334: ("NumberOfInks", SHORT, 1), - 336: ("DotRange", SHORT, 0), - 337: ("TargetPrinter", ASCII, 1), - 338: ("ExtraSamples", SHORT, 0), - 339: ("SampleFormat", SHORT, 0), - 340: ("SMinSampleValue", DOUBLE, 0), - 341: ("SMaxSampleValue", DOUBLE, 0), - 342: ("TransferRange", SHORT, 6), - 347: ("JPEGTables", UNDEFINED, 1), - # obsolete JPEG tags - 512: ("JPEGProc", SHORT, 1), - 513: ("JPEGInterchangeFormat", LONG, 1), - 514: ("JPEGInterchangeFormatLength", LONG, 1), - 515: ("JPEGRestartInterval", SHORT, 1), - 517: ("JPEGLosslessPredictors", SHORT, 0), - 518: ("JPEGPointTransforms", SHORT, 0), - 519: ("JPEGQTables", LONG, 0), - 520: ("JPEGDCTables", LONG, 0), - 521: ("JPEGACTables", LONG, 0), - 529: ("YCbCrCoefficients", RATIONAL, 3), - 530: ("YCbCrSubSampling", SHORT, 2), - 531: ("YCbCrPositioning", SHORT, 1), - 532: ("ReferenceBlackWhite", RATIONAL, 6), - 700: ("XMP", BYTE, 0), - 33432: ("Copyright", ASCII, 1), - 33723: ("IptcNaaInfo", UNDEFINED, 1), - 34377: ("PhotoshopInfo", BYTE, 0), - # FIXME add more tags here - 34665: ("ExifIFD", LONG, 1), - 34675: ("ICCProfile", UNDEFINED, 1), - 34853: ("GPSInfoIFD", LONG, 1), - 36864: ("ExifVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - # MPInfo - 45056: ("MPFVersion", UNDEFINED, 1), - 45057: ("NumberOfImages", LONG, 1), - 45058: ("MPEntry", UNDEFINED, 1), - 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check - 45060: ("TotalFrames", LONG, 1), - 45313: ("MPIndividualNum", LONG, 1), - 45569: ("PanOrientation", LONG, 1), - 45570: ("PanOverlap_H", RATIONAL, 1), - 45571: ("PanOverlap_V", RATIONAL, 1), - 45572: ("BaseViewpointNum", LONG, 1), - 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), - 45574: ("BaselineLength", RATIONAL, 1), - 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), - 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), - 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), - 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), - 45579: ("YawAngle", SIGNED_RATIONAL, 1), - 45580: ("PitchAngle", SIGNED_RATIONAL, 1), - 45581: ("RollAngle", SIGNED_RATIONAL, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), - 50780: ("BestQualityScale", RATIONAL, 1), - 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one - 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 -} -TAGS_V2_GROUPS = { - # ExifIFD - 34665: { - 36864: ("ExifVersion", UNDEFINED, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - }, - # GPSInfoIFD - 34853: {}, - # InteroperabilityIFD - 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, -} - -# Legacy Tags structure -# these tags aren't included above, but were in the previous versions -TAGS = { - 347: "JPEGTables", - 700: "XMP", - # Additional Exif Info - 32932: "Wang Annotation", - 33434: "ExposureTime", - 33437: "FNumber", - 33445: "MD FileTag", - 33446: "MD ScalePixel", - 33447: "MD ColorTable", - 33448: "MD LabName", - 33449: "MD SampleInfo", - 33450: "MD PrepDate", - 33451: "MD PrepTime", - 33452: "MD FileUnits", - 33550: "ModelPixelScaleTag", - 33723: "IptcNaaInfo", - 33918: "INGR Packet Data Tag", - 33919: "INGR Flag Registers", - 33920: "IrasB Transformation Matrix", - 33922: "ModelTiepointTag", - 34264: "ModelTransformationTag", - 34377: "PhotoshopInfo", - 34735: "GeoKeyDirectoryTag", - 34736: "GeoDoubleParamsTag", - 34737: "GeoAsciiParamsTag", - 34850: "ExposureProgram", - 34852: "SpectralSensitivity", - 34855: "ISOSpeedRatings", - 34856: "OECF", - 34864: "SensitivityType", - 34865: "StandardOutputSensitivity", - 34866: "RecommendedExposureIndex", - 34867: "ISOSpeed", - 34868: "ISOSpeedLatitudeyyy", - 34869: "ISOSpeedLatitudezzz", - 34908: "HylaFAX FaxRecvParams", - 34909: "HylaFAX FaxSubAddress", - 34910: "HylaFAX FaxRecvTime", - 36864: "ExifVersion", - 36867: "DateTimeOriginal", - 36868: "DateTImeDigitized", - 37121: "ComponentsConfiguration", - 37122: "CompressedBitsPerPixel", - 37724: "ImageSourceData", - 37377: "ShutterSpeedValue", - 37378: "ApertureValue", - 37379: "BrightnessValue", - 37380: "ExposureBiasValue", - 37381: "MaxApertureValue", - 37382: "SubjectDistance", - 37383: "MeteringMode", - 37384: "LightSource", - 37385: "Flash", - 37386: "FocalLength", - 37396: "SubjectArea", - 37500: "MakerNote", - 37510: "UserComment", - 37520: "SubSec", - 37521: "SubSecTimeOriginal", - 37522: "SubsecTimeDigitized", - 40960: "FlashPixVersion", - 40961: "ColorSpace", - 40962: "PixelXDimension", - 40963: "PixelYDimension", - 40964: "RelatedSoundFile", - 40965: "InteroperabilityIFD", - 41483: "FlashEnergy", - 41484: "SpatialFrequencyResponse", - 41486: "FocalPlaneXResolution", - 41487: "FocalPlaneYResolution", - 41488: "FocalPlaneResolutionUnit", - 41492: "SubjectLocation", - 41493: "ExposureIndex", - 41495: "SensingMethod", - 41728: "FileSource", - 41729: "SceneType", - 41730: "CFAPattern", - 41985: "CustomRendered", - 41986: "ExposureMode", - 41987: "WhiteBalance", - 41988: "DigitalZoomRatio", - 41989: "FocalLengthIn35mmFilm", - 41990: "SceneCaptureType", - 41991: "GainControl", - 41992: "Contrast", - 41993: "Saturation", - 41994: "Sharpness", - 41995: "DeviceSettingDescription", - 41996: "SubjectDistanceRange", - 42016: "ImageUniqueID", - 42032: "CameraOwnerName", - 42033: "BodySerialNumber", - 42034: "LensSpecification", - 42035: "LensMake", - 42036: "LensModel", - 42037: "LensSerialNumber", - 42112: "GDAL_METADATA", - 42113: "GDAL_NODATA", - 42240: "Gamma", - 50215: "Oce Scanjob Description", - 50216: "Oce Application Selector", - 50217: "Oce Identification Number", - 50218: "Oce ImageLogic Characteristics", - # Adobe DNG - 50706: "DNGVersion", - 50707: "DNGBackwardVersion", - 50708: "UniqueCameraModel", - 50709: "LocalizedCameraModel", - 50710: "CFAPlaneColor", - 50711: "CFALayout", - 50712: "LinearizationTable", - 50713: "BlackLevelRepeatDim", - 50714: "BlackLevel", - 50715: "BlackLevelDeltaH", - 50716: "BlackLevelDeltaV", - 50717: "WhiteLevel", - 50718: "DefaultScale", - 50719: "DefaultCropOrigin", - 50720: "DefaultCropSize", - 50721: "ColorMatrix1", - 50722: "ColorMatrix2", - 50723: "CameraCalibration1", - 50724: "CameraCalibration2", - 50725: "ReductionMatrix1", - 50726: "ReductionMatrix2", - 50727: "AnalogBalance", - 50728: "AsShotNeutral", - 50729: "AsShotWhiteXY", - 50730: "BaselineExposure", - 50731: "BaselineNoise", - 50732: "BaselineSharpness", - 50733: "BayerGreenSplit", - 50734: "LinearResponseLimit", - 50735: "CameraSerialNumber", - 50736: "LensInfo", - 50737: "ChromaBlurRadius", - 50738: "AntiAliasStrength", - 50740: "DNGPrivateData", - 50778: "CalibrationIlluminant1", - 50779: "CalibrationIlluminant2", - 50784: "Alias Layer Metadata", -} - - -def _populate(): - for k, v in TAGS_V2.items(): - # Populate legacy structure. - TAGS[k] = v[0] - if len(v) == 4: - for sk, sv in v[3].items(): - TAGS[(k, sv)] = sk - - TAGS_V2[k] = TagInfo(k, *v) - - for group, tags in TAGS_V2_GROUPS.items(): - for k, v in tags.items(): - tags[k] = TagInfo(k, *v) - - -_populate() -## -# Map type numbers to type names -- defined in ImageFileDirectory. - -TYPES = {} - -# was: -# TYPES = { -# 1: "byte", -# 2: "ascii", -# 3: "short", -# 4: "long", -# 5: "rational", -# 6: "signed byte", -# 7: "undefined", -# 8: "signed short", -# 9: "signed long", -# 10: "signed rational", -# 11: "float", -# 12: "double", -# } - -# -# These tags are handled by default in libtiff, without -# adding to the custom dictionary. From tif_dir.c, searching for -# case TIFFTAG in the _TIFFVSetField function: -# Line: item. -# 148: case TIFFTAG_SUBFILETYPE: -# 151: case TIFFTAG_IMAGEWIDTH: -# 154: case TIFFTAG_IMAGELENGTH: -# 157: case TIFFTAG_BITSPERSAMPLE: -# 181: case TIFFTAG_COMPRESSION: -# 202: case TIFFTAG_PHOTOMETRIC: -# 205: case TIFFTAG_THRESHHOLDING: -# 208: case TIFFTAG_FILLORDER: -# 214: case TIFFTAG_ORIENTATION: -# 221: case TIFFTAG_SAMPLESPERPIXEL: -# 228: case TIFFTAG_ROWSPERSTRIP: -# 238: case TIFFTAG_MINSAMPLEVALUE: -# 241: case TIFFTAG_MAXSAMPLEVALUE: -# 244: case TIFFTAG_SMINSAMPLEVALUE: -# 247: case TIFFTAG_SMAXSAMPLEVALUE: -# 250: case TIFFTAG_XRESOLUTION: -# 256: case TIFFTAG_YRESOLUTION: -# 262: case TIFFTAG_PLANARCONFIG: -# 268: case TIFFTAG_XPOSITION: -# 271: case TIFFTAG_YPOSITION: -# 274: case TIFFTAG_RESOLUTIONUNIT: -# 280: case TIFFTAG_PAGENUMBER: -# 284: case TIFFTAG_HALFTONEHINTS: -# 288: case TIFFTAG_COLORMAP: -# 294: case TIFFTAG_EXTRASAMPLES: -# 298: case TIFFTAG_MATTEING: -# 305: case TIFFTAG_TILEWIDTH: -# 316: case TIFFTAG_TILELENGTH: -# 327: case TIFFTAG_TILEDEPTH: -# 333: case TIFFTAG_DATATYPE: -# 344: case TIFFTAG_SAMPLEFORMAT: -# 361: case TIFFTAG_IMAGEDEPTH: -# 364: case TIFFTAG_SUBIFD: -# 376: case TIFFTAG_YCBCRPOSITIONING: -# 379: case TIFFTAG_YCBCRSUBSAMPLING: -# 383: case TIFFTAG_TRANSFERFUNCTION: -# 389: case TIFFTAG_REFERENCEBLACKWHITE: -# 393: case TIFFTAG_INKNAMES: - -# Following pseudo-tags are also handled by default in libtiff: -# TIFFTAG_JPEGQUALITY 65537 - -# some of these are not in our TAGS_V2 dict and were included from tiff.h - -# This list also exists in encode.c -LIBTIFF_CORE = { - 255, - 256, - 257, - 258, - 259, - 262, - 263, - 266, - 274, - 277, - 278, - 280, - 281, - 340, - 341, - 282, - 283, - 284, - 286, - 287, - 296, - 297, - 321, - 320, - 338, - 32995, - 322, - 323, - 32998, - 32996, - 339, - 32997, - 330, - 531, - 530, - 301, - 532, - 333, - # as above - 269, # this has been in our tests forever, and works - 65537, -} - -LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes -LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff -LIBTIFF_CORE.remove(323) # Tiled images -LIBTIFF_CORE.remove(333) # Ink Names either - -# Note to advanced users: There may be combinations of these -# parameters and values that when added properly, will work and -# produce valid tiff images that may work in your application. -# It is safe to add and remove tags from this set from Pillow's point -# of view so long as you test against libtiff. diff --git a/venv/Lib/site-packages/PIL/WalImageFile.py b/venv/Lib/site-packages/PIL/WalImageFile.py deleted file mode 100644 index 0dc695a..0000000 --- a/venv/Lib/site-packages/PIL/WalImageFile.py +++ /dev/null @@ -1,124 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# WAL file handling -# -# History: -# 2003-04-23 fl created -# -# Copyright (c) 2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -This reader is based on the specification available from: -https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml -and has been tested with a few sample files found using google. - -.. note:: - This format cannot be automatically recognized, so the reader - is not registered for use with :py:func:`PIL.Image.open()`. - To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. -""" - -from . import Image, ImageFile -from ._binary import i32le as i32 - - -class WalImageFile(ImageFile.ImageFile): - - format = "WAL" - format_description = "Quake2 Texture" - - def _open(self): - self.mode = "P" - - # read header fields - header = self.fp.read(32 + 24 + 32 + 12) - self._size = i32(header, 32), i32(header, 36) - Image._decompression_bomb_check(self.size) - - # load pixel data - offset = i32(header, 40) - self.fp.seek(offset) - - # strings are null-terminated - self.info["name"] = header[:32].split(b"\0", 1)[0] - next_name = header[56 : 56 + 32].split(b"\0", 1)[0] - if next_name: - self.info["next_name"] = next_name - - def load(self): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self.size[0] * self.size[1])) - self.putpalette(quake2palette) - return Image.Image.load(self) - - -def open(filename): - """ - Load texture from a Quake2 WAL texture file. - - By default, a Quake2 standard palette is attached to the texture. - To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. - - :param filename: WAL file name, or an opened file handle. - :returns: An image instance. - """ - return WalImageFile(filename) - - -quake2palette = ( - # default palette taken from piffo 0.93 by Hans Häggström - b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" - b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" - b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" - b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" - b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" - b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" - b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" - b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" - b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" - b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" - b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" - b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" - b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" - b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" - b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" - b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" - b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" - b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" - b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" - b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" - b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" - b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" - b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" - b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" - b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" - b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" - b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" - b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" - b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" - b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" - b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" - b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" - b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" - b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" - b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" - b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" - b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" - b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" - b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" - b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" - b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" - b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" - b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" - b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" - b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" - b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" - b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" - b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" -) diff --git a/venv/Lib/site-packages/PIL/WebPImagePlugin.py b/venv/Lib/site-packages/PIL/WebPImagePlugin.py deleted file mode 100644 index 7dd3f52..0000000 --- a/venv/Lib/site-packages/PIL/WebPImagePlugin.py +++ /dev/null @@ -1,353 +0,0 @@ -from io import BytesIO - -from . import Image, ImageFile - -try: - from . import _webp - - SUPPORTED = True -except ImportError: - SUPPORTED = False - - -_VALID_WEBP_MODES = {"RGBX": True, "RGBA": True, "RGB": True} - -_VALID_WEBP_LEGACY_MODES = {"RGB": True, "RGBA": True} - -_VP8_MODES_BY_IDENTIFIER = { - b"VP8 ": "RGB", - b"VP8X": "RGBA", - b"VP8L": "RGBA", # lossless -} - - -def _accept(prefix): - is_riff_file_format = prefix[:4] == b"RIFF" - is_webp_file = prefix[8:12] == b"WEBP" - is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER - - if is_riff_file_format and is_webp_file and is_valid_vp8_mode: - if not SUPPORTED: - return ( - "image file could not be identified because WEBP support not installed" - ) - return True - - -class WebPImageFile(ImageFile.ImageFile): - - format = "WEBP" - format_description = "WebP image" - __loaded = 0 - __logical_frame = 0 - - def _open(self): - if not _webp.HAVE_WEBPANIM: - # Legacy mode - data, width, height, self.mode, icc_profile, exif = _webp.WebPDecode( - self.fp.read() - ) - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - self._size = width, height - self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] - self.n_frames = 1 - self.is_animated = False - return - - # Use the newer AnimDecoder API to parse the (possibly) animated file, - # and access muxed chunks like ICC/EXIF/XMP. - self._decoder = _webp.WebPAnimDecoder(self.fp.read()) - - # Get info from decoder - width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() - self._size = width, height - self.info["loop"] = loop_count - bg_a, bg_r, bg_g, bg_b = ( - (bgcolor >> 24) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - bgcolor & 0xFF, - ) - self.info["background"] = (bg_r, bg_g, bg_b, bg_a) - self.n_frames = frame_count - self.is_animated = self.n_frames > 1 - self.mode = "RGB" if mode == "RGBX" else mode - self.rawmode = mode - self.tile = [] - - # Attempt to read ICC / EXIF / XMP chunks from file - icc_profile = self._decoder.get_chunk("ICCP") - exif = self._decoder.get_chunk("EXIF") - xmp = self._decoder.get_chunk("XMP ") - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - if xmp: - self.info["xmp"] = xmp - - # Initialize seek state - self._reset(reset=False) - - def _getexif(self): - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def seek(self, frame): - if not self._seek_check(frame): - return - - # Set logical frame to requested position - self.__logical_frame = frame - - def _reset(self, reset=True): - if reset: - self._decoder.reset() - self.__physical_frame = 0 - self.__loaded = -1 - self.__timestamp = 0 - - def _get_next(self): - # Get next frame - ret = self._decoder.get_next() - self.__physical_frame += 1 - - # Check if an error occurred - if ret is None: - self._reset() # Reset just to be safe - self.seek(0) - raise EOFError("failed to decode next frame in WebP file") - - # Compute duration - data, timestamp = ret - duration = timestamp - self.__timestamp - self.__timestamp = timestamp - - # libwebp gives frame end, adjust to start of frame - timestamp -= duration - return data, timestamp, duration - - def _seek(self, frame): - if self.__physical_frame == frame: - return # Nothing to do - if frame < self.__physical_frame: - self._reset() # Rewind to beginning - while self.__physical_frame < frame: - self._get_next() # Advance to the requested frame - - def load(self): - if _webp.HAVE_WEBPANIM: - if self.__loaded != self.__logical_frame: - self._seek(self.__logical_frame) - - # We need to load the image data for this frame - data, timestamp, duration = self._get_next() - self.info["timestamp"] = timestamp - self.info["duration"] = duration - self.__loaded = self.__logical_frame - - # Set tile - if self.fp and self._exclusive_fp: - self.fp.close() - self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] - - return super().load() - - def tell(self): - if not _webp.HAVE_WEBPANIM: - return super().tell() - - return self.__logical_frame - - -def _save_all(im, fp, filename): - encoderinfo = im.encoderinfo.copy() - append_images = list(encoderinfo.get("append_images", [])) - - # If total frame count is 1, then save using the legacy API, which - # will preserve non-alpha modes - total = 0 - for ims in [im] + append_images: - total += getattr(ims, "n_frames", 1) - if total == 1: - _save(im, fp, filename) - return - - background = (0, 0, 0, 0) - if "background" in encoderinfo: - background = encoderinfo["background"] - elif "background" in im.info: - background = im.info["background"] - if isinstance(background, int): - # GifImagePlugin stores a global color table index in - # info["background"]. So it must be converted to an RGBA value - palette = im.getpalette() - if palette: - r, g, b = palette[background * 3 : (background + 1) * 3] - background = (r, g, b, 255) - else: - background = (background, background, background, 255) - - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", 0) - minimize_size = im.encoderinfo.get("minimize_size", False) - kmin = im.encoderinfo.get("kmin", None) - kmax = im.encoderinfo.get("kmax", None) - allow_mixed = im.encoderinfo.get("allow_mixed", False) - verbose = False - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - method = im.encoderinfo.get("method", 0) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - if allow_mixed: - lossless = False - - # Sensible keyframe defaults are from gif2webp.c script - if kmin is None: - kmin = 9 if lossless else 3 - if kmax is None: - kmax = 17 if lossless else 5 - - # Validate background color - if ( - not isinstance(background, (list, tuple)) - or len(background) != 4 - or not all(v >= 0 and v < 256 for v in background) - ): - raise OSError( - "Background color is not an RGBA tuple clamped to (0-255): %s" - % str(background) - ) - - # Convert to packed uint - bg_r, bg_g, bg_b, bg_a = background - background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) - - # Setup the WebP animation encoder - enc = _webp.WebPAnimEncoder( - im.size[0], - im.size[1], - background, - loop, - minimize_size, - kmin, - kmax, - allow_mixed, - verbose, - ) - - # Add each frame - frame_idx = 0 - timestamp = 0 - cur_idx = im.tell() - try: - for ims in [im] + append_images: - # Get # of frames in this image - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - ims.load() - - # Make sure image mode is supported - frame = ims - rawmode = ims.mode - if ims.mode not in _VALID_WEBP_MODES: - alpha = ( - "A" in ims.mode - or "a" in ims.mode - or (ims.mode == "P" and "A" in ims.im.getpalettemode()) - ) - rawmode = "RGBA" if alpha else "RGB" - frame = ims.convert(rawmode) - - if rawmode == "RGB": - # For faster conversion, use RGBX - rawmode = "RGBX" - - # Append the frame to the animation encoder - enc.add( - frame.tobytes("raw", rawmode), - timestamp, - frame.size[0], - frame.size[1], - rawmode, - lossless, - quality, - method, - ) - - # Update timestamp and frame index - if isinstance(duration, (list, tuple)): - timestamp += duration[frame_idx] - else: - timestamp += duration - frame_idx += 1 - - finally: - im.seek(cur_idx) - - # Force encoder to flush frames - enc.add(None, timestamp, 0, 0, "", lossless, quality, 0) - - # Get the final output from the encoder - data = enc.assemble(icc_profile, exif, xmp) - if data is None: - raise OSError("cannot write file as WebP (encoder returned None)") - - fp.write(data) - - -def _save(im, fp, filename): - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - method = im.encoderinfo.get("method", 4) - - if im.mode not in _VALID_WEBP_LEGACY_MODES: - alpha = ( - "A" in im.mode - or "a" in im.mode - or (im.mode == "P" and "transparency" in im.info) - ) - im = im.convert("RGBA" if alpha else "RGB") - - data = _webp.WebPEncode( - im.tobytes(), - im.size[0], - im.size[1], - lossless, - float(quality), - im.mode, - icc_profile, - method, - exif, - xmp, - ) - if data is None: - raise OSError("cannot write file as WebP (encoder returned None)") - - fp.write(data) - - -Image.register_open(WebPImageFile.format, WebPImageFile, _accept) -if SUPPORTED: - Image.register_save(WebPImageFile.format, _save) - if _webp.HAVE_WEBPANIM: - Image.register_save_all(WebPImageFile.format, _save_all) - Image.register_extension(WebPImageFile.format, ".webp") - Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/venv/Lib/site-packages/PIL/WmfImagePlugin.py b/venv/Lib/site-packages/PIL/WmfImagePlugin.py deleted file mode 100644 index 2f54cde..0000000 --- a/venv/Lib/site-packages/PIL/WmfImagePlugin.py +++ /dev/null @@ -1,177 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WMF stub codec -# -# history: -# 1996-12-14 fl Created -# 2004-02-22 fl Turned into a stub driver -# 2004-02-23 fl Added EMF support -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -# WMF/EMF reference documentation: -# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf -# http://wvware.sourceforge.net/caolan/index.html -# http://wvware.sourceforge.net/caolan/ora-wmf.html - -from . import Image, ImageFile -from ._binary import i16le as word -from ._binary import si16le as short -from ._binary import si32le as _long - -_handler = None - - -def register_handler(handler): - """ - Install application-specific WMF image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -if hasattr(Image.core, "drawwmf"): - # install default handler (windows only) - - class WmfHandler: - def open(self, im): - im.mode = "RGB" - self.bbox = im.info["wmf_bbox"] - - def load(self, im): - im.fp.seek(0) # rewind - return Image.frombytes( - "RGB", - im.size, - Image.core.drawwmf(im.fp.read(), im.size, self.bbox), - "raw", - "BGR", - (im.size[0] * 3 + 3) & -4, - -1, - ) - - register_handler(WmfHandler()) - -# -# -------------------------------------------------------------------- -# Read WMF file - - -def _accept(prefix): - return ( - prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" - ) - - -## -# Image plugin for Windows metafiles. - - -class WmfStubImageFile(ImageFile.StubImageFile): - - format = "WMF" - format_description = "Windows Metafile" - - def _open(self): - self._inch = None - - # check placable header - s = self.fp.read(80) - - if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": - - # placeable windows metafile - - # get units per inch - self._inch = word(s, 14) - - # get bounding box - x0 = short(s, 6) - y0 = short(s, 8) - x1 = short(s, 10) - y1 = short(s, 12) - - # normalize size to 72 dots per inch - self.info["dpi"] = 72 - size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - # sanity check (standard metafile header) - if s[22:26] != b"\x01\x00\t\x00": - raise SyntaxError("Unsupported WMF file format") - - elif s[:4] == b"\x01\x00\x00\x00" and s[40:44] == b" EMF": - # enhanced metafile - - # get bounding box - x0 = _long(s, 8) - y0 = _long(s, 12) - x1 = _long(s, 16) - y1 = _long(s, 20) - - # get frame (in 0.01 millimeter units) - frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) - - size = x1 - x0, y1 - y0 - - # calculate dots per inch from bbox and frame - xdpi = 2540.0 * (x1 - y0) / (frame[2] - frame[0]) - ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1]) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - if xdpi == ydpi: - self.info["dpi"] = xdpi - else: - self.info["dpi"] = xdpi, ydpi - - else: - raise SyntaxError("Unsupported file format") - - self.mode = "RGB" - self._size = size - - loader = self._load() - if loader: - loader.open(self) - - def _load(self): - return _handler - - def load(self, dpi=None): - if dpi is not None and self._inch is not None: - self.info["dpi"] = dpi - x0, y0, x1, y1 = self.info["wmf_bbox"] - self._size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - return super().load() - - -def _save(im, fp, filename): - if _handler is None or not hasattr(_handler, "save"): - raise OSError("WMF save handler not installed") - _handler.save(im, fp, filename) - - -# -# -------------------------------------------------------------------- -# Registry stuff - - -Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) -Image.register_save(WmfStubImageFile.format, _save) - -Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/venv/Lib/site-packages/PIL/XVThumbImagePlugin.py b/venv/Lib/site-packages/PIL/XVThumbImagePlugin.py deleted file mode 100644 index 4efedb7..0000000 --- a/venv/Lib/site-packages/PIL/XVThumbImagePlugin.py +++ /dev/null @@ -1,78 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XV Thumbnail file handler by Charles E. "Gene" Cash -# (gcash@magicnet.net) -# -# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, -# available from ftp://ftp.cis.upenn.edu/pub/xv/ -# -# history: -# 98-08-15 cec created (b/w only) -# 98-12-09 cec added color palette -# 98-12-28 fl added to PIL (with only a few very minor modifications) -# -# To do: -# FIXME: make save work (this requires quantization support) -# - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -_MAGIC = b"P7 332" - -# standard color palette for thumbnails (RGB332) -PALETTE = b"" -for r in range(8): - for g in range(8): - for b in range(4): - PALETTE = PALETTE + ( - o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) - ) - - -def _accept(prefix): - return prefix[:6] == _MAGIC - - -## -# Image plugin for XV thumbnail images. - - -class XVThumbImageFile(ImageFile.ImageFile): - - format = "XVThumb" - format_description = "XV thumbnail image" - - def _open(self): - - # check magic - if not _accept(self.fp.read(6)): - raise SyntaxError("not an XV thumbnail file") - - # Skip to beginning of next line - self.fp.readline() - - # skip info comments - while True: - s = self.fp.readline() - if not s: - raise SyntaxError("Unexpected EOF reading XV thumbnail file") - if s[0] != 35: # ie. when not a comment: '#' - break - - # parse header line (already read) - s = s.strip().split() - - self.mode = "P" - self._size = int(s[0]), int(s[1]) - - self.palette = ImagePalette.raw("RGB", PALETTE) - - self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))] - - -# -------------------------------------------------------------------- - -Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/venv/Lib/site-packages/PIL/XbmImagePlugin.py b/venv/Lib/site-packages/PIL/XbmImagePlugin.py deleted file mode 100644 index 15379ce..0000000 --- a/venv/Lib/site-packages/PIL/XbmImagePlugin.py +++ /dev/null @@ -1,95 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XBM File handling -# -# History: -# 1995-09-08 fl Created -# 1996-11-01 fl Added save support -# 1997-07-07 fl Made header parser more tolerant -# 1997-07-22 fl Fixed yet another parser bug -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) -# 2004-02-24 fl Allow some whitespace before first #define -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -import re - -from . import Image, ImageFile - -# XBM header -xbm_head = re.compile( - rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" - b"(?P" - b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" - b")?" - b"[\\000-\\377]*_bits\\[\\]" -) - - -def _accept(prefix): - return prefix.lstrip()[:7] == b"#define" - - -## -# Image plugin for X11 bitmaps. - - -class XbmImageFile(ImageFile.ImageFile): - - format = "XBM" - format_description = "X11 Bitmap" - - def _open(self): - - m = xbm_head.match(self.fp.read(512)) - - if not m: - raise SyntaxError("not a XBM file") - - xsize = int(m.group("width")) - ysize = int(m.group("height")) - - if m.group("hotspot"): - self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) - - self.mode = "1" - self._size = xsize, ysize - - self.tile = [("xbm", (0, 0) + self.size, m.end(), None)] - - -def _save(im, fp, filename): - - if im.mode != "1": - raise OSError(f"cannot write mode {im.mode} as XBM") - - fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) - fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) - - hotspot = im.encoderinfo.get("hotspot") - if hotspot: - fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) - fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) - - fp.write(b"static char im_bits[] = {\n") - - ImageFile._save(im, fp, [("xbm", (0, 0) + im.size, 0, None)]) - - fp.write(b"};\n") - - -Image.register_open(XbmImageFile.format, XbmImageFile, _accept) -Image.register_save(XbmImageFile.format, _save) - -Image.register_extension(XbmImageFile.format, ".xbm") - -Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/venv/Lib/site-packages/PIL/XpmImagePlugin.py b/venv/Lib/site-packages/PIL/XpmImagePlugin.py deleted file mode 100644 index ebd65ba..0000000 --- a/venv/Lib/site-packages/PIL/XpmImagePlugin.py +++ /dev/null @@ -1,130 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XPM File handling -# -# History: -# 1996-12-29 fl Created -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# - - -import re - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -# XPM header -xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') - - -def _accept(prefix): - return prefix[:9] == b"/* XPM */" - - -## -# Image plugin for X11 pixel maps. - - -class XpmImageFile(ImageFile.ImageFile): - - format = "XPM" - format_description = "X11 Pixel Map" - - def _open(self): - - if not _accept(self.fp.read(9)): - raise SyntaxError("not an XPM file") - - # skip forward to next string - while True: - s = self.fp.readline() - if not s: - raise SyntaxError("broken XPM file") - m = xpm_head.match(s) - if m: - break - - self._size = int(m.group(1)), int(m.group(2)) - - pal = int(m.group(3)) - bpp = int(m.group(4)) - - if pal > 256 or bpp != 1: - raise ValueError("cannot read this XPM file") - - # - # load palette description - - palette = [b"\0\0\0"] * 256 - - for i in range(pal): - - s = self.fp.readline() - if s[-2:] == b"\r\n": - s = s[:-2] - elif s[-1:] in b"\r\n": - s = s[:-1] - - c = s[1] - s = s[2:-2].split() - - for i in range(0, len(s), 2): - - if s[i] == b"c": - - # process colour key - rgb = s[i + 1] - if rgb == b"None": - self.info["transparency"] = c - elif rgb[0:1] == b"#": - # FIXME: handle colour names (see ImagePalette.py) - rgb = int(rgb[1:], 16) - palette[c] = ( - o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) - ) - else: - # unknown colour - raise ValueError("cannot read this XPM file") - break - - else: - - # missing colour key - raise ValueError("cannot read this XPM file") - - self.mode = "P" - self.palette = ImagePalette.raw("RGB", b"".join(palette)) - - self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1))] - - def load_read(self, bytes): - - # - # load all image data in one chunk - - xsize, ysize = self.size - - s = [None] * ysize - - for i in range(ysize): - s[i] = self.fp.readline()[1 : xsize + 1].ljust(xsize) - - return b"".join(s) - - -# -# Registry - - -Image.register_open(XpmImageFile.format, XpmImageFile, _accept) - -Image.register_extension(XpmImageFile.format, ".xpm") - -Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/venv/Lib/site-packages/PIL/__init__.py b/venv/Lib/site-packages/PIL/__init__.py deleted file mode 100644 index e65b155..0000000 --- a/venv/Lib/site-packages/PIL/__init__.py +++ /dev/null @@ -1,80 +0,0 @@ -"""Pillow (Fork of the Python Imaging Library) - -Pillow is the friendly PIL fork by Alex Clark and Contributors. - https://github.com/python-pillow/Pillow/ - -Pillow is forked from PIL 1.1.7. - -PIL is the Python Imaging Library by Fredrik Lundh and Contributors. -Copyright (c) 1999 by Secret Labs AB. - -Use PIL.__version__ for this Pillow version. - -;-) -""" - -from . import _version - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -__version__ = _version.__version__ -del _version - - -_plugins = [ - "BlpImagePlugin", - "BmpImagePlugin", - "BufrStubImagePlugin", - "CurImagePlugin", - "DcxImagePlugin", - "DdsImagePlugin", - "EpsImagePlugin", - "FitsImagePlugin", - "FitsStubImagePlugin", - "FliImagePlugin", - "FpxImagePlugin", - "FtexImagePlugin", - "GbrImagePlugin", - "GifImagePlugin", - "GribStubImagePlugin", - "Hdf5StubImagePlugin", - "IcnsImagePlugin", - "IcoImagePlugin", - "ImImagePlugin", - "ImtImagePlugin", - "IptcImagePlugin", - "JpegImagePlugin", - "Jpeg2KImagePlugin", - "McIdasImagePlugin", - "MicImagePlugin", - "MpegImagePlugin", - "MpoImagePlugin", - "MspImagePlugin", - "PalmImagePlugin", - "PcdImagePlugin", - "PcxImagePlugin", - "PdfImagePlugin", - "PixarImagePlugin", - "PngImagePlugin", - "PpmImagePlugin", - "PsdImagePlugin", - "SgiImagePlugin", - "SpiderImagePlugin", - "SunImagePlugin", - "TgaImagePlugin", - "TiffImagePlugin", - "WebPImagePlugin", - "WmfImagePlugin", - "XbmImagePlugin", - "XpmImagePlugin", - "XVThumbImagePlugin", -] - - -class UnidentifiedImageError(OSError): - """ - Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. - """ - - pass diff --git a/venv/Lib/site-packages/PIL/__main__.py b/venv/Lib/site-packages/PIL/__main__.py deleted file mode 100644 index a05323f..0000000 --- a/venv/Lib/site-packages/PIL/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .features import pilinfo - -pilinfo() diff --git a/venv/Lib/site-packages/PIL/_binary.py b/venv/Lib/site-packages/PIL/_binary.py deleted file mode 100644 index a74ee9e..0000000 --- a/venv/Lib/site-packages/PIL/_binary.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Binary input/output support routines. -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1995-2003 by Fredrik Lundh -# Copyright (c) 2012 by Brian Crowell -# -# See the README file for information on usage and redistribution. -# - - -"""Binary input/output support routines.""" - - -from struct import pack, unpack_from - - -def i8(c): - return c if c.__class__ is int else c[0] - - -def o8(i): - return bytes((i & 255,)) - - -# Input, le = little endian, be = big endian -def i16le(c, o=0): - """ - Converts a 2-bytes (16 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from("h", c, o)[0] - - -def i32le(c, o=0): - """ - Converts a 4-bytes (32 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from("H", c, o)[0] - - -def i32be(c, o=0): - return unpack_from(">I", c, o)[0] - - -# Output, le = little endian, be = big endian -def o16le(i): - return pack("H", i) - - -def o32be(i): - return pack(">I", i) diff --git a/venv/Lib/site-packages/PIL/_imaging.cp39-win_amd64.pyd b/venv/Lib/site-packages/PIL/_imaging.cp39-win_amd64.pyd deleted file mode 100644 index 627da43022ceee67c3ea0cf78cc0e053a94b4d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202048 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 z 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 z z2PsYvmfzfGJ;}`G|A&yd`SY|NS7_bB+L^0f)6`*66LUT+=)fuKq9;`qZg)QSoa&oo>hnYgAVIm8Fu`Mu z!hca80mttQa`Q#C-T^*Rt0(-tA<*{MYWzW}K2Ey0bo)8=p*BFI(t*FKRhFsD87k!=E#L>K}P>Ub zb6xB^K`?>+>3ux+gB#kV;?~6Xb8CoD=B%+En-I*7j~`1B=3!R!wnS@#p;~`-FOUq# zdbtQok~%lQ8>{8F&@608*t)JN#eM@6UGG+qWwx$}w-1~104zxAYzicu>*`ju7-Tg5 zhv)cYrwbGrxQ+ap6qHBMFBZ-q_g{H6 zh2#gw*Q`@Vtaeeb^(1Nm-wNNq5y6Vae7q>w)Qj&!c5y@j6s(;)!~3=_*{NG|fVVj? zd|HS+V;$iPq~ps`)3k`aBN{ z;&A76?xAy;qj$lBPfA2JZ>r1OlTBRS!v>4cgpZ zw`zgG3ZEXi|NTW#(<>^A$>~E%!=hN!)W;i#q@**yg0pv+5<+s=wYP>_(Ne6fFy{d? z{7sAlJ!ezr&LO#;;hWtVe3XC>%EEKyIH8;$Zo-;iy2m!40#Yyn=M(p}(Sm5V)ebM_ zbL`A24!NZvO9g(vgE?t%R_X-Xu6-=RkF`u`Me?@ov{t0o4vWr9wBo;KvUdMoNnH{* zE)|Ic0GWB-_?rigpXnU9nLJF27KGVJ2D#to)ok!n2NSh^BI6Vl>fAZV2Dv+Tf;H|f z`7a3Z$r8Gr*EmtqsA3p+6LznAPrFb5xY?(j!>)UxKkQ2m1Kaf42&PT(=zo~;Ek)?b zIfs(YN?8R6e`hjunFh3;BY4AjHDD>{0M7O9t-cGieTS%!dgM&&k1E@=-IIUv98};p z0$bd9TA9d|WwGe(iPp;mFb=HUl@j-$JmU<`Wq1SQ{_*gsd5r7Lr~%>Qx4gW)hx+rr zr96XXw|iioKLE^=+2SBx#aK2@NzVPo-oYT6AvdRznsineV+eX^*Z#_kx<;ce(uW=A zQ774^>=ODIEQ@g55;f(UUiIM(OKf)goO{~|6cd(h=0Meuw%#6|yj?*4v#b@*S}VF1uUkyU z;jZPWAXzPMBjvw9a$xnv_!cT@P1%b-!BN%o)aLa;0?t;jtf*T8*dIx<4?km8x3%I= zsqC$Jb@IOnC50ExUg~X(1$MQ)j1G7Od{lGrOGWF=T2V9sx9Tf10lCFpxt2G~=rk3K zZ7KW&I3pd0SvS>~XVES7JTuO{h%e1lh_u$}Zr8k5v{VYt>P$2hKTL*E8|zT^d;3rI zPFCGfNWEyAIt{%o;#Un5kryC#6{N}~I{=Mm;1zf7E0xAVBB_1TOG74R%b!1r+<4&G zbl31D#EB-;wkEw8y*kl)iP@UBx%W#D^H^B~iaER)R(8lfErWi6VxxP9vO4;{WTc7f zSr4%1@bS30-lz%qis^<}_KoJ!+6MO(Y^?@zp)A5;*BXXP>gQ;LuaVEtr$xL$vsd_@ z=bV=soE<3w8qnmb>kHVKbncS;6n9n{Ab`tW)FjF09M{eX+e;1!0%BWoYqDd%C3&5* z*uCksK@feGd;1p#kWIwV8%bej4kojIe3UOud|zq2%yuL(|$hi+t7aA!i+k z5T@-l?iWo$C>dZ8ulLZ#9d6RlzfI2L>VXP&A)Yyik8hV^n_C$hd{pKBZMw58@M84(MC+xJ zcR8Q>8-kM1b&MzfN;Jps;D@i})h8HSIn@l+s&k?}G2Gxh$yE+FOH zS%>s*blTjuIJ$z{A4Is#HkJ0BU^}s+;U~wMzC%XT`LSN-w|XROOdE^Mv%UiVzk zUju5$P920+D4FFv37nLBab|J;5ToKn!q?90JnvOtJ+N9DlGTBfbJz~B-ybK54^0Dn zqHM;It6m_<4_3qKTQDVC{uNy#!&#J3u|`;nQn4;@fAUwge-(_$bJAxlrWqEdI}vk{ z6j}^Pys&(A)_rUEGL3n9-hpQR1hHRKK0<$C=HFLm8}ftiAa;$U54RYG9J&V6GStq_ zEzM3W?K@7|eGhIP*t|JMfU)AcvbO}Iw;BZp6a2h8Si%|;>?t_58=;>m9k-t4+Qul1@wAs_TFY*F(*Y1@oj;nsnNC z2z-$2z~fr3SoAHq&1@5>)^Z)r{_LE=?hRl}5%{JIaxW(ZrVMjMEW|dlDs2*A3b<4V zbfl`NApt%}UD4sLFLs?kY7%$E1|{K@CE*-$e>;NOuvx2Za2jUOfAvg(xf#;H^DVfS zBE3$LD8RP#n&9_2QpvYxv0tF0#i}x#bQV>_vU5gG%$_qR7QHdidZj0wJnv>Dg@JhE zjZR1M9)d5Jx8}W50n~HY>LYF}N=RCDzfG>h6Hmib)Dut7gPxVWY}zWh+D{;~dO(Mw zYj$V3#~urCiXaL?mXKtvoH17-t5@267v!=X1!9tZ4VaX;FL_DYF*va?N!=z%s=A~7 zl;3%Uq^di{Px@DqoEZyAfx|JM-K&)Q7i;pflTYvyZ#Tu7N%6G??u{me8`hIg^~+pE z3cX@anS6%d(HKd9icPBu)j+&#PG+{OzTCuEn;G9bi<}8)YULF%sQ$gymCtqsg2X;V^qJ#uir{TXuGutBE;`wgr1qV0S{;Lv$rEV2rD9z2t4e|O{;4Pk3zmsll7(<1MFj0&j~ zpAQ4TdZe;%e3FR=o%-@jJXAZcyafw|ctyeq#WFvi#?lkexKhJ7zX-jwpZEa2-cmieX8vAbn7@B6tI zBYYjj*~5$`z#VGxHoEdJ$|Ap2Cyi3ftK~?FeajOTkNH4kTGwATy7yC5>fncvx%gzf z4}b0f$DP5KX3H;eSG+bD-3pZJd4cnO-cBZzKCg4Zl7j`iwZq5Pr!t!}l25}i*<2!jq{~XgpAuhl(I3-jXa8kJ5{oB!nlfuc~ zQSS4knVSe)TH*fZGIMtSrG#U?6mxAy zu!Cs&6Sm5P@O5i52JOzH&8I8TDmj~k;9W>$pn{^W&m`5;^wF1Jc%;@H&25f5#Vjh0A==jy{X@AO3j}PCF?DU1_P?%Im6Ws+6N1_VQo5H;__%7_*UMh7xKwvYkO3j}iioaRLW` z>9?E61A||Gee@%d7tSLBNC;vLIc9U-g{d#MZ@ELb*u8tG={We8mW^rAqgAf!*o7|0F*&$}W`UZK*#81yzQP5iX%atY_i!QEY znB{vA#dhd<{rI)folH3+gm{HC{#hIh zjWz^bLt;UVv!Bw2?0d|uafb|&o^4GsiT zi+C}p;PE&;I#VKYq_lJ>FF5eJxTFq+Sq1%CY*xcY_80gq#K+#@lvt&e?q10&8upn& zy5lK&hgVb!=esKTI)yxfA%vboM=GTRbgxxM3>ZkNB5AmLsXFUSsgm33=3}VqM(Q%c z3-OoKOm@aOepT72Xwr^$&g0gH&1fSSv= zL!xkr`-t=u9kN;;S0MP1109d#=htBIk@zc1J%uoKTwF(S?8Q;;ZhS|n*TxCfb2Mmh z2FB05ghuE`)a6=6w(P8aG{OGUwBL8JF;2X&U!Q;`f2P4fRa(L^cX>})vovvAT*IhWEt<14z%ek zo=xsIXc}_K8tER?h`vs)YUeSUUQLO$ay3_$vgHk0Dbd~5(l_~~`Ai zc~PI93=8-}NKJTtc7%XONo;xp>8$rDa#NX_F?+3*F*R*`=fL;iq5_>voWojqgWD3q2ZW`8o#g zxX-JRBYw5|&gZcq*5;YXI)@c$5JAB^ebC9ymn9=w#oyK&aMA~aN4~h#B_pm}EDd#|o z0;Z0nV#uxt(gDOILs9+9^k}Mt)pMRQfQKn0v@@QNGxh@M7TO$=i`EmY3#92VFq}z7 z9$M`E0^&WNfY=;c3JqrE^MGV4=`rSTmI*`@J=7AT3M5k*RLDIqsSNo*G? z@z1&5%+VBL=8CwRD&2Ga23860xvo$9OR;eHl-pSHxmfbe}|)L*59d8j^>2YF(?loWB-&$$U?I}(&DmnJaKb&sM>g%pZy>OF$Yzf8uh(`Q zG{p|&i-~mo;Zwy5vr{A2Mt2`PtU!x3!|ob(l==FN;;$DS`8C*IS|GiC!^O+n@H>$h zn0$nNDBH@Dvc1xfM0T|kAt`|FR=eU2(ffe4^ddcZY#SK1Kvbpg0H|oK1Wr%pknr%b zdNYC{(LM1wY2Ed%!D+J)%m*^3deZv>b)dxQM)cRlyZ0U@v#?bE4SBM+TOVg92BN#T z(!(>y8A<0oE+B5?_URz^>y+^%NIZy{?2T>%X};e906Az_5*!}R-v@=PL$_|JM87L zOB57(L8m*UvUK?*sN1`xEo-@)YOUN)b!)8j_o&$T*uB?FT05^P<_m+~@m)b)u~v3Z zv{nQocDiGT-RTB|g)wUq#^W7{YUo)afO9rC6?GS0BZ^?Aw1Q5lePRn|1~+ov1a&p7 z(fHw}|1z^ZcT7hkmUoTu=pk$Ad=|AwbH5Nbven@ei{|o0L^-VlFBD>7HDRBYSLzpG zDDkAl1yrF>6!Z)V?$(US&sC0UeWEM*kV@0fRN34v@jRU?NJjbSqBVH^z(SJGtrZJS zb-KBDiZiQur}4qZ`L1fwo@b;^iWOB2J||!owDmLNCJ^>M_pe6@_gp&Gyr`}%*L-6l zyC7inn}yX;r`54xulD=?jU24OOXj3Quuy~C$Cb(C=XZH!YPz$N1MYo=JWhI+4>7hl zvcLH$26+ZBnK@oGSWni2PO+)e@jOKGAQgKYL57fIT-V@l;)W??LC>oM0N*VJz`2Y| zbLEk}Iuqr4@skhJv6AL9DSU?tYx|IvqJ+Xeu_-POA28MvDD3#y!W}r&lGHuxI;pTqwu{#Wup!vDFrbQ)W8QLLo9E?6=#9!noO&AV|B%hsd( zB;>AP;Z}UeApI0cDIxcfqLc_J@F@!k+?I`y`?CnhLj5T8d7)|ov(eY zdnqY)=DJ|tXn>dp&$mt}0?)YNhyfe|;m0tYRAF8$dvWNLw+WSxZW$p&G%+JOTC1$&JHpyyvKC?`P+}jY-6Paa; zdDg-nHs)pT>%JR^3Ardb=4Gv;e*RgjLXbm@XTCpRc;59^WDPBzam$0lb)p&l%ffAb z`+di?%HMD27m9H83L5os)fgK|Nj?C}{RNY7hW7qwY~ES{{Q&P(UmExx`f|~`vAvdN zRSQh?VeXihB}>y?RBe}rQ_kD6XRblZ3gP@ZCQ=tbMqjbgOBk3|=PdiFLq;Q_NcPS< z+1pE#+3N=7$Imy@592_Gs4P6zL$bvJuG9KM*wLPY%bQE^+-voE;x{@$Bc!j`_phr$0tnkRN z6%LND!qkGMF8f$a6gRv;=t$!+;J> zq~9)W`3pxQbaJb;GN4Em_#hqz0;{SBdJ`h!bd~2=Qo7icl40Cmgb~YvHKkXogQuKXG&_gixfraaD#taVaW-s1^w7LhlUze(_}tcBS-wobPSh?OQPVt?N$e!N z#0EJW*&rONOZwl}m{O!vxtG&Zb51CC0IVy8A$hf*hD|3MN_hb^5qywgaHg1$jy2hg zGEul|ATh?X53yFh*2q4eehBokR`$WNTPsKYO3(%qF0{uj{M8_$X0RH6#T4uqJON~= zVB#+f^OUL(He49tF;*dTxUj~g);OsPp(+=Kj5}lTbDaosDY)*42Fc))S%nG2epW%! zJ-LZCg6A}H#n)QtdnsntswQM&UjS|^V&|6VF#?jjXf2%%Q=&T+qB+TI>mV)ns)p?C zHM+jYbQ93TS~(3{uxE?ujkRJ*skL(AVP}g*q9LM2uBw^f#7-!mU_BN)AyhZ+D=pPY z$71VmN>z6{oAr5t-{L-4h*)>>Cneo*=ZX_*C>#guFUmhkPYSmrPLSKiw*{T< zz9C%Fx2>uCf2=FemG}`i@RntUCDN<$&qx%)=L=)?U;{6fOn0N|z*7&%oid~R$Xe;4 zk-R)FX27;{T^M8KQ{WG~%|M(~O^qDcl)2wT%j7`!wswEz-ukV%&&q*(z;5NSae*Q@w23% z`2LxljOO8q+L;y2Wie~T zv{S8>c)5?hI1i1KNa=w2T#2K^@;VSUI2k}&=?0NVYh`M35M3l+b<8j4!DJ01t1-8l z#4SzTx*J*72>iNC)u;RSb43NSBa_T!aJrqnlxyyt%|jb=FvHQ#rk(n0wT(~{>D9Rw zBtz}^^g6*ZU(86fcoR|w)QK}1XLbfN%zt5Brkn*8N?E`yajWfnq=;(R#wMdN`j>gp zq?2<#0uq)pAxsF5CTS4+M&a(7x%1)socqmyW|MYf&Id42;2~@y`s)pzj^$%?xhccB zTJ3iUw%M}%RDpmaPUl=chDub>c8pD%kUwAr=gir%G=)qX?od+(QZWq<{%c(zv?)fJ z>+@wKF72ct!$y0>$evT2-8C@VTKO?Uw9>c{Wwp+Smu{nTg1`)Th;G;02`S(GOnvR>vzkv?jD3vcg$KxsIqM3bnM#{LrSI!)TU$x3yxDw)s4|j&1X=wiYo8+i!wq}t?^Id?nOhaibM6?!Lt|vXk?@& zQO%{bEYYNMsG<6hweo}7FSeX&kGtlQLCq)9BEG`Q{*@XFJ^U}PB5CxPy2j{7O&G3$ z5eUi6AQDVkdI9c%|BtnDy)a@r_}OXKUejLEd`u&I1Tc9|wut{gHGP*+`L|R#ld1W2 zr%8{Uon+*cJbaf|Ku*`z$GLE z(RrAi*G+q~ofkj6^A*oZ@W86a>4$Xs>JU)xCZw6raFB;<3ji=Qzx0jzpCP1FV z^!08pY6Zz8aNHoBZV;3G`^D6iF`helk?xfrZKQR}fB!H)?g!^636E0HieucrdT)lL zv|mqy31_(bctV|+JTsAriZl*&b5dbvZl6iwG%w{{F9pivET&c^mb=?cqUizYrft&C zO*o}$>u{?z->eBn4ojFT?xe$^~TGkkr5zMk)W?a6ryD)`(y z5>KO0)0+eroCCyEk{8yY?hBv*(|;Bi{EK6C zWV%7b>E5DNz&|<+C*+|-!WoiYkb-M{nGvM__$YsQ*~s5ScI9GzQiXH*?;bGcbt{~y z!l> z1bZXSU1DD{^;L;(oyvNrNWCb~@?QTWpKQOR@LIIqu|bjFH2#0ySdgL?QFuf>a@+2s!di{lb%iDGJq&0r}c1zU3+!Niockw zEw%ACr^M~dKS#PYrc%-ahl=-GLiJ|r%G0mk>HK-|fitWL+nkq@IN5Ib8<*+vmHBM0 zC%wP4&bq(bJ=Hy&JFWY)Bk%;=vf6H9ffoE2N_Y}Z48p`wt5vJtU$0YPI0mlQi@lVA z>$S=x{@wLjrXrtOukU|sR>J?dUb|J!N&mg|`pAGHpSfO_3@Gwh>-GBL5{31eRH{e( z`q%3fRc3V-t=9=&idnD6nTiBh2x{K6(yUV9Qx8mKe#z>+VrtPlN{*uYc;0~!)@s;Z zjoN{~BaD~ao-<_d(9DVWaAUymg1c;*S#x*GRs(#mZIti9-8Dt-1e5_4EpruHUO8+y6G3{{Ps1{yrdA&5{-T54q2> z8iBiB!tPUrm!a;j3(p>DFBfTl&`)&#Ne|ui6m<=7BeRP42CMfPv>pBTV2|;@reIQD2 zfsTGA>74qZ0b$qwFQoGa5V>N~`GZ|*+-jTfIi$1cz5fmA9L(2w+}7`Bz&nD{IjOVG z-Qe_tOizQ;X%2cOhq3Q9sGS6nk>Pzrc89P)JcKVsxZP7s>Pd@#|4U7Biw>$<@Umo> zJt?y~_T}e+WiW6*Tl{<336vOHwXgF{9}N7lra{chHo9*$0h_hzzaP(V2Js9H`Ekmg z-Cb3Z7=r^QH26;_riyV#*sJ%M&St}YF*^4H6wF21&TFg!dYomt)mzGHQg}c^{qmOR z{4S3%@GnWO7y_tNVSw zehtNB;k4@pB{sVck_Zi$MRd#)#IwHhI?DuqBj5W^x|5w5V)@VN`E#VrOw7J; z?l-MAIZthW*=ifjuN{5OTI%wp*3Kqh9*orvZML}XkArCx>P@@G?Cl%M@mc3voL&+z zXw*XP5vn{&1_7>QKzWW&$K)u#AFth%KWJCKhC5HIy;s0gVCf(8U_0^VM~PaomQg)A z$ZC^19L0O?PPhglJ`!a~gMaf)!Kuq?yOCvM?~ONyyloVmlOOl&4D=rx+$pHNrQSM@ zUtb&QO=Q8x9+rvXIAn~!m|qzPF3@$M*rS6L3Q9QU+2mh~5(f3_4Yt$S>4vNoc>BXy zBidnFyz3}r(kuK3e4W^-uIQ1ZMGx%G-U_!z8fm&1Y`!Vs?4$S2$8K_Xtuzh7f&e)4+rY+xO_fG|kcng9?a!NhuI6)vl#C6z86kZpN2|S8 zAiQ`JOD9dYKh@`B|9+oGs?SRrnti|%BUx?V@`exf4?Z!9j^n7LSK&nf!cOk!kU#VT1b!X$a!ic%Qba_#aI1=iC=x)d|TJ z0zEq66`(6%PjvQ%c;Q^{Ss;W_IJ!lRcvgN+ep7y0NoOxpfof%gnH;)VVt2l+xV~%^ zV`xyF`FM|M_zgkK7mt55Tw?V4Lf=Au(al~_bS~=tYHm&|@)Xz_Y%WjtDDqcx?>%1T zMO0DvzK8GB)V<#K3n(H|X8xs|SJ?9ANO9Le|6o6onR;k(TjdiPex`nho*(y~x9j;) z?|HMHANHPm^ej}Re21Pz!+3te&9<^hq@S5nuz3-GGiOPE2h4l>!1o_58~7f|6upZd z@y$-L1$c??-8tm1y-R(;!TPv}MgdntjGW9}>a2GA!YwoHKj@Er`_;UGHrLzV#4;OZ zhT{Wsb@>y+7(WCVG7)Hh$b*SMd$$M^KE8527w0ZP7`f{kDnciYr4z#cn|L=GB$$m@ z1foW4Y5di>r|kxHJzE>A?Ia3ymnavt8)Ao4W~g8XxrcU{QZo~(Y9F+Zuw%{()supm z`qA8@tR8~*XiqCwhXch(=ML^8+kp=J|JKeAx1J*Z*#t0pR_feXZLGASc}RD?F`<)h z&v4W0bgF6yFo`>V;@Wggto9q>)(OS(guVx-RRKpJc5bzEMQMaEilr5kv*m2V^)or( z;2Lx+uo_HXPMCJ8eU^Hvnvd$PA4`u*sCazextV!mok=63YbC~w50l(?LK@EydK;m) za>#cJy&HdwJ|P$sccyhbGtGAX6qiu)hL*K+mAQr8Z@=Rmj!ZzI7#_#TODPcrF%0a$ zix$4Atyp(%bh2jgimbTiLQ;9Qqe7ZN>Tv5HTIZT{E8L7;`8&I$Oy4l|98| zl;Cw04c|OjvSpMxlgt=r1WMSh1jPaMtktf5Uvrc;`?RL%Lq3=GRC9=l+n1H?t0~Y- zdrzs_Q>-=_1X(L5X{54Y!^}qWWh%0fw;QraY+OT)@l0&!K_UX>ww7Z*Wde=Q__6ApSgRem-(cZS?4Fetu2jj{?$u9 zYk*AX{-NG5&Bq!k4gOlUDcqGmf!+13r9Z_g7eia{#+A+tJ8#8(W5jqf+MQk#a-R28 zj|ck-j4!@i@^+B;p21zFwoZ>F<#Hp62d-^ybPq5k$?T%ws@b#W{v({9SHRt=nLHue=`ijKc1%`-kk@cK8P7Xt>QtszqE z6=;cB=ep3a69sZzsGb|2Sf4nDs?*Lg(_Y~Q7)NFy_iwK#=YEsJN$Z$*8>8RE?$xvU$5B%8{dJC$e3KZ+ zk%I;6_@Okx`QbSCVN;E1z%S#3td&>PQV8pqrJs|F8O7wFd&9skH0IW*4^7Z7+BZ^d z9>4|&@yz)C>%`X-c7JbuRur~f))4sOB*${{){K2)X-lQ^3-QD0HNzpy7EgIJ`b}>E zjYfFFv_xn_UasXrqZEbaq*jK78{OZ%EF5YLu4=mZRzSSb2k}EBJJZKvsmTR92zrTo zw@IlZCGXPeJ0@iuDS1aRbCgn#h0NL^DAQU-IMc@?S_MQt8p!IKsErLLMBp#BvqneW zdTs$f(~D`xYmG0g6(fhZ$Mcok$`YqTgKdI~(Pas+r_P7sG@)r>ctsehB~!uCcL9Ws zoiaSj0q)O9>^Mx{-C#u(JE$2CV`2Y8Rj zEb870^NXlTlr32o^e@6|8B!7WpjT`SnkwIavFGV@6>dXHvX}O`4W^>~uwN}B)bu#b zOr4pD>$*%SO#n1;6K22fxl>*QEV8@B1PF{WK=?9gT+JXQ50)yEqN^NvupDPnVEYJc zZC0xrG%2z&;=ZQA%styxPZcT0`YAh1ifofc`Y9VtN)0Ka{FFbCV)nCy?!~C@8in0G zSR?euF%TX;KTW~1+>U}OgCP>403p)c58=3g@$Pr8qxMyi$h2=NtI{8EQi-ycRbrK& zIF`hevtBBJi2X#l8i!bJd>*7*$GypN|F)343nJ~#_%YHh)LBcquE49Sp8|IT|0UAP z(Zg%|dsqeW=-=CKpk`;Y>2dY+SzaeVeD{~&&?@N`ihKNkL9FSs#0;>AAN|u|sgo{3 z-{bc;Wcs_&J(*hRZAf>DD9Q!=jqZ26(*B(yd7zu~v5%4(;@AG_tt&vGkuCg@H?ld5 ztmd=qFN=M%EP2P$&=OrjE;9o2{2Ii~&L9vNla*C%qP|CTa&dNklX1SP~C z=crK{(5S0SMccJ|oJy!Y{92CLI%ZvN)Kt=)qjt~7=Mpr^*`6D9x+zK9H}K#=dyrbq zAl>8Bh3F~tj7yuL+^8>`q8oFgF5m$fPx8k4+^B$;?9=-E@eMsahKzm~KsRR^s+b$~ z^H=BvWWjI=*v(APz4e&`cE@}?GtV%8u5^T+ahpH?{v6Q!gH)yoFlf==oZ_1`pO`;O z%#He%DYo7nrK*lBYv7qX{p*w|)W86e1Ky$k1K`~`X0PNe=ha-;;GlS z1Hxd1!N}{ny6YkoDQVw(=XvHnPxjK?Zn=tP>J!2Nr0n(Xi6qDn5?sB;L*?tb40yGS zYP|ADs1)ZU9^Vl46|RfIQJ8IdR`{q0|LHmRTQj$VEbCn<>iHTIg!S%ubm!Awnv{V( z=!dsdEtgY;=8UCn%uHTXAUfHa(8Xzq+8e`G+i&4XfV;7mifEF@9B4{Ac|$}O(E-^_ee2r zSQ5@h&=*lpCv`O6f7yJ6Q=I0(5pH?rMx8|ho;->c^1c_q0L$Dyj+$FgQDO%|M>yd95+@ky5Co#cGzC9nWVKDcya$#Py8P;P0cexE%#^^N z9XaD`Zw)Ov(?C0>IUa&BTMe~uZRROe6UuGP;TmXdMfBFt!q=fnZql#bHoxoLTJvkf zKx3aI6oT3Dj=8a+89-sUZ-OH!aIG#idnX*6ZEo$k?HGxG`!c4n+KvSsVHmile5U&c ziAoqJIXxz8zt9jQon9~yJ?$n_mgeB?TpVc{o4-V6wB^yWhgBE+ z604;w>Fnz}+Fw#VxltSbEWiZ7`XQiiAdy};q@u)XJDD2YUa>qJV$c2v#>a~AI5`_! zfmPxfP!*nfp%tO%cAjIIg;rSV7nC&7RN$a{UQvs5wht>r@HJbu7D++gQZj=z4%xYl z{8-qqks7!RV>S)5Uc6YZEnx0OcMDd4I86e60IZ{ll={LNiHE%*$@@KGY=z^vN(x;wrgJu{q?M<0FzRIzrdom{uD&m#+$ zsr+Q_t`CY^F{*?B5&#fXs*|6*uMx%;nscyxUkIqjkpz5?PVTqk~X^kj`Y>X_M^@n z{L{&v8I!*aXhZ1-L0$h@3icJ+4Bi#`iu&V=zI|)VO76*xdYU?%Nj0&|{ApaTv+h}C zM$g_U$isl4xbXEI&QZf|6`OM_vpgSC8skfU>m0xmjaQ9Fy?TqvdMwc~rX4YhuCmFv@_toi)01;;vjc6mV(elY@;*dH=8#eX?Sy}|D}1e zXIGx95A{V8KQbp2+3_1_7dXX^N26SRylR6XN`@3f`&cSC9yp5-j`P0#AN0USj8}_k zfco?ckU9KkK%()P6&8o|HsT#uMhp5e;plZ+PbMg5^JEqTC38Kj1%ItDV={S!Q~ok# zz$v!-z2e(Jl#of8NPjnqRdyejw63B<$Z+Z->HQqzpRG;7xxI?D<(==#H&shD;mQ>o zxC9MMuD;G~*QeThbm)u60kiFj3peY|@4*vWj_koQlhWUV^YT4tCj&Rv3@vSnXprAF zX}aJuCF1@T!$YsYS4r;u2o0FWxnS5N^F!xLxlwiI(@pMnG!7c|&Az1~(=`QD`jcjC zqq~Y+vx)XTZYsGw3}0nLc!45l>L`ZV*3BA4f1jn#Fi_iKGSt&=>+j|aYY3?wZ|Y-z#tgDrmG?zrS!tTB%Sg~w~|_QVn5o{j^5qqh{b46 z6CLVT&=o6(q3S+94LHBq<#4+LHE{r;`*IVhdvXY(!Fs?MgZq+Xa<+6l_)HGDzvK-+ z9@(;E-T*C0L@Ro4yGlfj*b8fXsdeE4cd{A$ND}OmPTmH)_*>j$v zqLQiE;8~hOO*fOe*1%tKe$08q;9)F#OU}#%0d+gy9K>Ni=n>{f{RP6U{)uO9L{?z} z-4V3bzFd;d;iN-uZ!uo@IZW~6Q?sKVotz#0>qNA3{?JtPWh>oEE@Ru6-eFbuG~P>P z25tErsz|BVa5*rX4D(3UTx1H@h5fXMmqxfZ5+i=1K~p~?qKq1oF`|x)4)Ax2!Cx!A zTCFN@t3fFp{CaP0(1ax=&UJR=Qt`_g9bsp+Caxy*=QW+)^9W^JoeV0wj^Lt&bY7GZ zG8qKx?9Wir)yZ-I8#bBc%H(N89cdlmgf72*UyJK3j?1dmV1L7!jeK!j2zPMFiPEp6 z0xXk;>gSTg)Uev;nS*BLjzyJXx*lg#QgJ@PZ|-i7icHKk1peyN65VNmVaKsDu_H2m zc@)YjFC1X;;fP`udIUp~6+N_0(L<+6G?=5W=R*1xU>+yO29gi@URL}LtF40ti(ykk zW^&{z3^k216@1BjEtJgMv`aT=Hq%BjGtbQi4cf^ZuY)87W5dS2dQC%S_70iaH)L+w zZdBo^Y^5pLkeP?oKJkB3&PNT^yBjjM_lTroB6nC!^EC0o5kf+X5#sD7xI|yq$tJ2t zO$LmeXd;!J^NB(8dyNUxM%_M45Krk*%8c3S9{W8lA`cSrFEw{uf`8$X>bM zJL*XWwh#jtepmO1mm15(^ub`$tpsULfJ8A!nf59nQIS4d)0!GeU|S)N6(-2Y>M$>* zgoK4!ZSk_n0aHlYtoI;zcQsdGgg8pFW^OS-V}BcuuAX11=Bl^Y)g2s(QcE~EOw}o} ztO}dE2)#B+^uTk_Xyq>hkyf+vM+8q!GWoISpRJ|D2ZARwTmlTa6#3;^^V#{O#*qh- zAhD{Goo@|F1r8;g_lw3OFEyM`bLlP!G~&*dSag$>{s9Aby6x&tmRHjp@5x_UOfhR~ zNuHmfM*_svmkJv6|LQ?>+dzU0KydY?9vp}|%xb!Nf&qgEG!GPJgikVxc@Zvs#H%$% zfB07my8U2yOXMzg{wH>BodJPuT^DGmeiaaph_k5PWe~bPeYO!;JQS6DV$dA}wRQLk zZTh-Mt}rP(=@TXy%I@JWu@LdpyE&FEH~Sa+llg7D*Rl6=IX0XL5Ie-N-_h@O$KK`t zerVFo%~|ZFHZ_&?oesX`vDNvrUA=`}@Ln!jvB&n8eLufmxEV{YZ?3FDNb#^&%Mt>h z6(Lc;YClm1i7ePz8jH7Tbway9RV-#8T8+!i?}L>O>(@K{$a7tvDPNeo|0ccyUm7@IjwqvGQ3UQ4$@QvemguUXkCf`* z9k(*68%@AnF2K)~`M6-2bRIO0*U61Jm!nUz_w8{?x$r!_+zw0+MmHmDPFihe1}j!J z5je{e0odP8$VOz}_Time+nunPZ!=dyjJSjp^p-PW%g^h;vQXT^uKo- z%XhK8Tn!I)_5~2nV|WLoXM=HE5`@?~4N%tA$$fi7D|gwbFmv!zok_)w#vndPQ(nm@C+d^xPkn;@O7S-h_!yYLpG*T7asvvn?0gp8 z&6Oc%eKN2&nR_mo+mzV$UNW~K75H0n+dHX1F1hXfRN(#Ows(y&g{`qtYF%R6&Q##p zIA-G8dhKoR(MNmRTXyuLmLTin6d)j#T&`!^d)waf?2EVUOaxXZwz=DORIlCU#-pFK zltHWdhQ_NmQmMVI*TBKf(7A+x1EU1ly!|j14YdYh8LoDWu0)9mNf7!TiR7XjEDdQE zqSe;YdyJUttq1B6>LizRjYFj>;<%Vs)YWymnJ-C2c9hZh?d{S z`Bm|mP~+D(2#w>ilfI0F-ih>D7e8*svc*h+ZPk?$7O1qMA-z1foXn{y zbga6<#K>+37(4_hzRzgbs1CmKb=&e}JuR z54?)3%aHAX7xLRS9{U}edtde=w!aJ8YjX3_Tc^!h z$Tg=-`^c{B(>76QAzF4#M?*mRCSWzq*TM0eeQ4-|KJie`o_p;!oinKV+2J_vrqoXMGpN|<4Hp{`9{kl*jJryF&+ z%F9Nr_mM8?vK+V^!$JvbnwvvpBEoTxq#(`)bhITd5FM}%=sM+>=cexz8qM?Hu6Jpr zF-{?DaY^QZ->O;Tj@?Sc-V#Dp%|2?^Tw1bb_NcyiGD~tXEZh}G49ZVW?=#xBMCjML zyuv47>t@qR92I3(>)G6MKeFA6a|`&TB`w|3>H$wXH6pZ@kSnX>S|&~Kwj#>`Pm=Iy z#1P+bve*^zah00ED#7zoLxK#2$c>fx8_&wg2)g~HZH&(GFE0TBLmJRqCa-u?lWAXZ zU#GIX?^f*RHyOH)IHkcwviaMJ@Bp#XR~BXt{U(^*wT!^({2wSAT=*ZUgj{@k#jyGP zuEFP-`zRWO7ilxSUz_>ar4c(jys5+Xa%hp48kyD8}P>oMqamBm<`} zsq&{yW!xEAG@W@91@d=e>m^wr;!YAs8^Pga39{IjI2Eme2<}nY5?D2nveeuIdQZh5 zA5Ub2-%)xgTm~I7{MDh?98y*hfY90$6WWCVF)=zkAa2R8HPvXtQ^N&; z+o60;fQDvJaE4aF1IzG#5jMM7fa`61PN{q%h}O1>AZ^~wk1FS%e$QXW+c?Ni?`&h+ z;CRcYiJg=*CSAx@ejEHJ$Ika{zX*Od;h&bko!RyZZNDyTdv-WpV@KAUh5Uwb_QDcS zJwlvc_c~`#p8dLCH|*KNe%(>eJ{phNk(S3$(3B-oJ+(;G3?*CG_FuUvI(8JPw+gL| z(}4bD`kx-<2P0wNdlhj$Az6-qF zu{=ho4_o&gJR8XTF)<`YG}d-f6F$cPCjO>>BI9%YP=Yu@wl@`#f$=5A#>a7ZZ3*$0 z7^Ux;@y&hRcZa>X!@hgen>%5A+iOu5F}_#F#wWpOkPjX^&V=7l1+*u;jwf)H`N!|&zIFsl+xQA7Eb(OtExl5gtau$|K~k~TK@e1B zmUtbd<_YWJ8aDz1;6@tK>qV}-FB29Kh5UEQ`7yDozV7-vhc=Q$7g{e3KHtT1wvLCd zIbr|HVub0^j4syB_3FyppmSbJi8r@&w2KQO$9#e~62Bdrlbuf-ND4v@*CL1 zo{#H^qNfMQ2@!r9A2dWcP|b~zWaHzg{m3yFk=%|EfMuf0?B7nYWgw4u{rEBYOFAlvxTawdOrFfmX2f1ItrKLM@Z|J9*8? zWcQQ3*V^<8q**&Xr_gQccTv4rX<>mnLZ*FO?1D^DXC_B+qm zPrq%?nO@DaVI6pOhSJIm1_kf%SzOgVO@6V+J^8D6F3ml+@@!ZN(wliU>;%tivq|2D zbFDY>Y*-3%7G>4eOSv4CGHeAowb?S>UeD#s;@L15hN7T`1D&uGLAJkzE|>~)?Y1}Q&qJ&$zh%^3-DhJ-RlXTa(d zvWz`obxI~ASu+9Z52k^}#65Xi&Ja_j6<+0#WnSgbcLl+ZKo$<)$useNd_6YX(A-MHUPU+d%>_Ib&DYp6X~Jume#-*~93Qtw9!#Vc7P{V+K-QD~D#yEuGHGe<(r;ty$FwxB2E#Gy zfJP?($NUO8Ln3ygi_yyNC~UnvH?K2@Z!S7bxc!Wv!VsGnb}6`I%MU7G-0UG_z;&@^h)Y+U&>3)8sIPnmY^#oYC3S+)17i zG^O4~!TK;fKyF$-!=t9nsG4K)LHqa=t^sVaA9%Dy-JFib+e$U`&*Fjo}!6FA$fBkG{yb z47a}|g5>zu(gkjxfrC8YUeOgu%MXfiazi@R2xLV6PO;wL_oDQTg_(gnB)A1(CvrCs zoC4#i_VSFUlo7WZt_AV=Ei#PwEF7Nsx@w!KoNboOl-hX5sjT~K`Npt_JL^vbwBKY?D zkj9F2)*bNic-)I4=8}SnLVNRMzZ35RP9`GTI*YvTc#7=D0YDe`; zM!w!<ssVb_xSR4_dDck*T~mh$I90l5ZxUeRB8mtdOCn39Yu3PUc5%Q z*4e1Wp?)R(i^>|1-;u2~N9%I3HGsBWgYr5gMaR95+ulV;+J7I3do9JbH+R|uiTlfv zxHaILTq9?X(|>cw#qo=gw;LHRr+bpO-Ldf=D{psu$I9DdxZa4}truFqC|sV(gq9OEWX%c4 zA`vFKu#GU$70b9OjS1F1RiB!*Q}j`OYx!NvZ#BP5`K{u26~C2elFPZT7A|EDNwh#1 zqhPD!z(;{bQq_POQUhv84X7bCpoW@hq>|_I%rGHLjNf*EY$OH?$-Dy_2_O3Ql98^| z@T6-#iH+iA-#a{_0Mxgvzwe^S9AWm4JTvqInE9d4;xIdO`APh_j~Ed{AEPzQjdxM# zPX7Ol|9A8MxBS1C|7th?FNo)}mLp?7G0XPb@1tt0&q{rqX5lMqY}ZPi&NId^!!!2D z97bj^3GezruD8bOOW2{?lF^G_poT`zY zp}PzNdkz;ABr5D!f=~PcL@L?p@kDRCKwtmHwShvdFOp2p!gl5!(~vn`>7Y`a5L=vv z=sF^_rwySCO4z}6bbF{z2ce%v{(F1i1*6upee2L6j!jQzlxBC`@gQ9HBssQ$v^*u* z{$*@{x^Q~l2u+}X3|jeH$uAFc#F1+U*X=_GXz2`EGN{G6WB2%`lorRWi1P?@g0UDt zwo|_}UsKTb2^uq4%l87TWv?PdNDlQLxVL>Ucx-0UTC)r` z(MqphQerHz)=Irs4f#~^+A}86Znjd7fL-IhT^;vq?)tuf!R?OMa0{4KmvD%TZKb}h z0?~egtlOz0zpr7KdK*A0#P9hZ&W|sv|W5vNeRR!8)LuGOo4>XKgt` zK095(s?HAcx}M^*)3ZwK)X_7nl+2hpUGTF5fAn_*{rtX?QX^z;Gno%!)1gB$zbokT zmr0HL|E+nGMZk_gY&o*SB+y5qz$ZHw8k^kDbEpi1Q%F~vS-``^?I16tb;y+J*j zdRn>IqirA3x#_JuQ@vClI~|S;l?4Uzi|Cn6=#Ld(4=B&?8ydtKkSVXAuN5=) z4SfY*HD(CQy;9rn(UjH7?!lE61k95R%}HBojw5yU(<}y6?wf0gTIY$vfQB2p^SAN- z>-UTu&@aaFo*T{UFnOkG9@+AX;dCW8Kh6p;Eg__=)El(w_!qj0l=P^TdY;$RwKEHF zO0|=oUDa#PB&8rbeZ-#bpEEsn&Z3rPM#P*unrto!I7@-8*x@nTX(=7Ct9-jEX4hJ& zpHhv@pMA~&&nEotEI#u1g#>8Xi8=kC)YAUdKTa6q_;4b$utb>X1i!A>x}z@Q*^B&h z8ohI-XMO9AbISQz1>is|V!KKU3rO&Nt+jxI@Lm{2to|?#RD_#K&8j23^E}}_W4b~N zsp2}Db9*@b?abiGU0m<1tKA;@t*q|N#F}-U z@^ktD)F$EovY#%Xan7G_IpF!Y|CFIe|4G(FdXzkd9(_vid~o1-Lr9=U2caS#1bv7! zaBbRnBBG?@lcUehz;1Dr9C3j8m#L9@nWsh7}~n|C%tZJ|1Cu*-!|37PJixKupH3ND-+TNA*RuCJ_DOQLr_tH;#fWH)#Jj6ik|B z+n-3mYLu3zVB*E|6s+77{{NnW-N`B+L&3hSBtyZ>HBF<$Cr`m{Ab&gsGlZq}e!;*VL%(vB$CI!;($15zp=IwNVXaRX^40n~njWOT$C9qr zUy<>yWUKYt|2HHnzya@0xU5u6c9p!FOodN*>F z*NWz;)gGu7Vf1FgQS201f;KJF0eDVz0&SA51Y~JNo-8$EF*-(kesQ-ViaeZ|@^6ML z-7}W+!C&P`R`y?W2v$||^vE8iM_pD*AyB!+#n7XEDQlxdi%u%GT@i2iR-Tm$H6e*CG znEwgXsAxPjdILgXsF7r*yu@TU9EnZG%1lN}|y)@()+MD#+eqzKxT&8Bxo0?WZ=zAZ^oR_7TM%TCH=O_az!n;SXo^oC)O zuc%ru*yBoNR_6ePvXQZ3*BCL3d;b{AO%lU?tjFWiGOP3JL1vzw1xCrt=mbfunL<)G z{Z(QZ+SZ9Om>H%7F^OMe!q`xWJ`FlVn)$QBSZKGTu+>}$GAe;_;k3vN)JDXnRbCi4 zyo=)0isC?ajx{lfW{WTW>Yw=I$|ab0Zl6Kfli8nRrAiLS&Di96n1Yt7G{>y))(y|=j2@fL43mTcck`m-=t<(q*KJ>RPy zwf?Krtm$Z@Z1ikK6L5V06b-l*8o*Cg-0xRInte?^?oz=-xlEMfuQz8JlVnHayJ3X^ z_7Gm(63<=YM?4nIE%w~S8lAhycgsDu!tt6N{x{O?rH+Gel0)myRF zopcLRo;p&v=0f}@{Kg3F#u~fc*=*w?JVqZjt>@Zp^crdUU78IhI-$#DzOT99$cE6b znxAsP7biZN80e||>=d!je+g?yZBsWLuSS`N-TPh1bi;mL2QiD}^-go=L%fQ|+eoeC zcN@RY@p~)32z>Qh`F)As&6%RT+W4au^9MT%jcOQkLO)*BO7Qjgex1xWyaY~j{kT-K zwSK&spK3oo$WN6Ye~zC@Kc3+S{jU(t=lt_aPz+LUKZ%V&J*ul7)m4w`sz-Izqq@FO zo)H%)lfG>lVf(%7`8i&Ezj40X#P`_Mx)48e*Cigxnzq#S)dj6}nZy?9zvtCvs`OyO zfGGN;M=`Iy)+6vo%EVst>uZ&G7obwmTVJi8d=8cW|_q`4T3I5A5=A#~)j?S%Q3OMB4JShDtW zmFr)Dftmd2ub!#hTkH5&a{+LoHnaU}hV4>}AH^_N&~vZ8lF@2_jMMdEgbXLj!Kuk~ zcnzxQ?!l1atxP$8a)E%XI`|&(W(0SHB3V7lsC&kBEI*zy`G+x{3xQ7VvVNkq`L3Fq zpXDpmJ9K&ZjF-D#45Q~GT88%JkDPTp*?|6C_c|J0Y@5^HWr)AhPUsp4jO zVojPz;xgQ~}|oNk-r9D@DaYe(%{+$L!oZ{=|-p-QmPmEE6wg+h;+k^D?ZxjYg3gOi=RpS{L@`4MQxG`Ud8!(IT5;Pxsa&?H}x( zB7K{p$kUtF(?D=m=l$$19$FI$?fb!mKewuZ`7Jf}xcGFMBVD|iaDsj%;m;}8bYp(o z%%S<(k``YuS(V!#`QE7wd9Kxjtj^!kN40lvf*aASjxD?B7mmzNPx~eT zCa;;4j6J@(1x25m8r+{7&!4Oti|{5RR>I}PN@y9xCHE%WR&T6}j8CyizOimXA-h~j zXo-4=tT0yBuEJHfHW}+``Cfw#5X6)=;0T}BhgrXs6Km190lz%N)y^Yy-|7@osv)$j zd)My&{b=_)8D#+h7;Zd)0H$=IPs5=1co*L|SH17!C83VbRmaVn`aCz^XOlA8-JhH8 ziYZlh$NKw=clP%p3XPxs2kD3DzbHVk1X2jNxC!DlIDQ2P5%9Q`T1RGX7+Z-^k(>Xe z8iZMcGOYm_bp*DUm}+8LXlaf~W(lsWBYvpDV;qw;I>4`+0sbpgX2N>>rU!;-R;TVA8?j8eBfxR~!3D#q&S&!VrPbGP-Mgt(^)M-MBh+pF8Gg#pqq|oy2>)<;?l&{PNQ3wSpWf-IrL*2P zkyQwtG{Wt8>A8oe*3Zh^q9P(JSSXlVEdPT98J>?uamfWhq=VyQx)^?CUc}so3ofy7 zq1y}R$vq4SzphH=DvjtINL?@Q64J`y&dQvc%W*$@9wdRc_j~%jai)Gh=-y6rZSUgp zypBNXfkgVQndlD`Mv^t?fYp-926#7JrXkm+iiRXGiv=emlq+ zOJUnNMniGCJ_je){cKU(?~^@)E=omL`9L0D_(dUIuzbTLj$^WuIB8t4-P4W?B1Sx& z2n`sl*_T~LgRPfgg46xSBHQ1ucHFrC2j=kvLZ_?=`+Ks}txrC-hK6=$&-{~hc6Xv_ zcd}_uvZ>2$nvx84C5ex90zj6)YtLG+3l{>ul92DiuiVf><`&-XCow^()ggW(eoN*W z=k{KC4dG&jC)rYP?>bPxIJRGLyP)WKwiXFR5VSbYG*#Khge%JP|Lasww9@sfc|i8M zEDtj^mjNoLBl#rSy95fFwK05UTq&dV;e#^gK#_#{$K?_a+4Pu5jLBM`kf(jAbB ztAv!yi>Sm^Hv2eu1KD0>SLNT#Mow_a@~>T8PuauAVbsGH&+!xIZcfiV>ttX;}P7ZEyhac13S47h?Y0~k|!tCu?d+ZYzXv)7k% zOM>56lBuBxUi4sAmKZn=OxtcThIK^Fk?RhoN)=y8MDK0GIPvYV`*tK+2o?mtgWlnq zsR9WhieJslt-&QjA}FV@DSNy0MKpv-u3cZ4fY~K-;WY`Q=qd<88pr@N7SyWpm)zI_ z*V?GGnro_YCgSeQJ8ux#T~M3(h8{dBF;cWN*C3c)Q|nz*&4KT#{}_#Z9|UU1T(nVy zH<@0-y$$}wRSAD(b;4g=oA93<_0rv*iH~b>vRiXaZQD=iRqfa;@i}1i3n0_$%SU#^ zu3|=sk4<;Z1tUL5oQrMrH1nG`3fb)f&DJe4TkO|}Fu4ToWxDt{X#g_fXNWMEqbrlpf*bF21MPuThh0N>VPbpDIgS0`ox2z{Mi>w` zfGRh2yQV(O2m$%)aniQE>z7c1;D(LkOQ5gn1H9)&)W$rvu-aHOzCV1 z-B!o%7<;VO>d^VSP6BFHms%VDn-}o=yi(jfw-t;uH~gqIM~=^j(UGtH~8vW{M;LdR)#&dh}iPm}fYi zc02iZs?HV9s=xLBB0Ga)Fotgb^Xce!S2M!57>Hz{GQUN&iRSkX{#Qiog zbMnOPFXrHDkQDZU&}`~D;&g44Oq2Mv zwmbhmKgM5Z^zw>Z`BDI%NPwX$fLNK;Pxg}$Ec*x>>NhkJP7y})JX*Y4i{alLaG2%} z`RLtR!pyd7g$CLhY11H_De$b@3R-6izuSskJ8K-yIh5pf$xV;LJc4&d60x_eP51Kx z-uX3c6=dp7WAR4zht>HL<*o;oexV4zyOv-#{Sum>$__(g4=q2*N z&f3vcxu&G$$1-*mA`v=hi3Y{XO<(t9dhq#C-%EHmbbBbG9N?lRuk*|Nko9F|gZ0!~_XSf{e<>-wu*`sX29R1e`^9#(PY+ zOrYb(tPLM9pRp@ZIOA>JD-OUrr#cy`#lzf2b3r_<05jTU{wodsod)`ecIbmRE-cgT zUvpLRiWhEWqzQk)is0hE1?ljIxJE7^z(|D7E%)n6>O7~N@TCh@_;saqUT6EasK6t} zMR>a}SP{z9`<*vW=hRP`GPzKy((cTqN!hJE+;VH8Y0k{M%k{yg1=U8)bH&I~m>)wuR#v#)mTEa-ndh3Hn&$CUT0PxwUeP)M~O@lnb zu1z+|o4ltl^a;egFs6kKC2`p1=L0w;4B|WxOD!Gq^aWgeksy1G2Ki35 z7{m;sdPe5;8v}7Q2>J#vG>=kCuK&n9M0WOUH;_WPI1mf^z(?Vqw$Wh%$yU`gmjc=^ z|Hgp!MglZzHhjzhSMzzIS8WXB*Be-FaM?VCfa8cUqlfsOFwbdNuVedPK}` z$mpKTeO>_dI!Q5Gq!m51WNnZ= zrB<@085{m%1WvTh9!NaYsvYM6N7>JFkufGqm9Fu5BS(bYWP12ha97#Q>=~ z2)&qBp1JttJd0s*Xh z$)K9$rB)6+)ef|w%Fqf!B{EIJ`i_8MS>}DO!D+l=go2=}Nq84c#n=$`oL#L6L`3b&>0ovL`!JPJm^DJ$Rrx`;|F(Oqu2%j6( zrApUEBk!O+3mNdFsv(fO0xG7@-jLDb^%>W4h9m+r!e$f4Zxh88Z(Dj1DL*(Av;9AS z8_59^q#=mI^5t8rvNa7zW4m};+y>}?IyL)I7TlcdH|1z&K^In?P zD(X5^)yhmV343_2()$SdgYDHu?Mz%1+}`(O&b?m9d$Mu~FIAPmrJ?N~6YafSBoMq0 z|AwoXR`nf)!3rr6nloomr@@<9VRH?3SwZWE6NnT>QUCtTq84Ql<~YuuGCfu5Pq~Uz zWj;&p$o2$SKr>}z#OKYXSim}9&#J>)&=mAN$K03wH|pqIwn$;2`8r53K-xMs2B$n_2mS^jHrg_UB$Y`V9&%wNF{SX;K? zP}@7vB7bgibZ(fHJbA`GV+Dh?9LV+p z&dmFSo5zx0Be|Ajaj=K_QH;!RLd31?W$@dZv7K~cPg))G>4P|2rir=Y&_lCZsX3|= z`rU3mksTb}9mc*YqU~V9Br*>+%P_YLl9FU*=l~vA5OBh9l)2ul3Y^-Q8Nq3uUMLji zpE(cl6SwM2gemK_qlvA-xyUXB7_jcxtJ_@pNrv{B5FbBv{aHxF`kd4$_nHv&$E;^? zvge({z&Pi640fRM?!{~uW5t{Bhu|PG7p|3j-!FQRRLDMvXo`c$SzL;8cQccpsipwC zg&E>h5(YB&n7R&_elMjA8u8|q`199!C%WFs+CLLB-sOTmueNML+=up;DnSED|ME&s zn5?s!Z?n!?d#hueRlC{DG$Vv7-G@i-6}toF20|rvD~cIANdFYeEnw2F#I@?4LJ>L^ zHR)r?e&|ne6ZjBWKLM*F42kfX^UopH>}KlQp+#sH2#VO_5EaqMM@39l94{=QcYZ{g z(9I4mrm_m*dSY z2C;1(nhNMs<>o;iV0gm?ZMuB;*{_{hF!Urz@fk1U>EwXxx%l{oLZ{|R)GK$8alk71 z%#JM|)$ixN_w_Ri4meiHq;HWRxO1CMbi9=nZj%C?N#y*dd+4wiCw(5egW2H;sid4p zVq`+1?h{baVp1J1ZtRJIMo^#336q4e$^~I2Ac|p;9a~hfwmvzBSo&9+22;;;SvgeGy@9tvzxdR#Az8F8(%z`jhyr z2tg$VjyT?_Zqp^<20WJBkv%HhN_ul1-OH5+i#WLXRc}-gLZ+n8$c=GSt`5 zv^_C!82Q%U>3DMijGt~2%S_N^|CUW+l!2vzVdC-(3=(Z|0B!sW3Jg)PmX3-kQ-H=E zK)#vx#K16iz#2GyGPNqD@HTNt3Pz}bM3G!|W`@PxfhNgY88!SkS z^fWY$BoLMN9!c!Q>0?ilb!!~il^-bHs+tmqU9724%vm>?zOEb$Mb}ko8_j6HRK;r+ z2a$B7+Q|)v=sHr0xWz(aq*quQKQ>9-dMZha5{1n93`?%A&BqnqEIO`&aqp@U){-OJ zMhF7PAd*Wd&R!k&F5~cgj|;HbsizAQ1Bi5wfFaf< zqI=P`BnF;Igiw!eSKF9sd+(!UII%ZFG(JkLOGMFR?xu+O_66+D^CHxY)8e>fzPE5h zK$nPisS}zY)8PHKcR_J#ZD~R4$)cH4MVPq*kh@J7q%b1E@U?b}5nG}~p>EXUoV`B3 zEA#7_lUYh>%s>K5WBdKhwcN`MO_MMJg3t4Ox%iskzM!ojsqu zI=AN=s6fasNP{-LX~%5(hi6R2#qKg#mCLY9usS2!Tw8L$-HWZJs0m`)k_w1tFWV;% z5QI9#o&nD;rjac!Rz$&0iIfN|_4CFyo9^&um7Lm}gY#3{|D=MgYC_Q79J-ol@EqJ& zcXUHk8bh7NCoJ}mwcy3Nba9c?32JsWPETGm?tcNYbFX797(^A%LEW4P?nB9Ldg0Ya z;{JkSw+8-5=j?%__P}$duSW)+i9VEQ>L$RkAO#FGuh{HvJNmkW z0(K{wy*myFGp+E>#q=f+f!g1Gw)*CfwP_A>BXXXeb+G#d41GYvEY4Y&RK1#MX%;dz zC#qKGDhfLOj$n0KKh5gUdUks3`f?EQBboD6R;&1XiSYB7;9i4>scqJzjvC(e<$S8r zuP=3cdcwCX#6Q2Efn=8dTp}XjLWtgG`};EgDft!iASzTHx58(Rsn8Zwz}W5$t$7!d z%!-s7&V)7-}Z@;P2+E$D?ZBJ1I!w_qm}kz+h3HfUSPd*uzj z0y0R*RE{V}*@2Raqe!UKG)M%ynMcgD zgnSy5%VX16U76J}bVU7xk+Q)U?LA$5fpAF%nRA7Rp{`D>0X^-VP$F5#38f$@NpGMI zBUkO9zd5E2%NaB$$7Rg4K-Er+sJN+Knvk46$nQ`k_g%pmeaOdJ^$|s$cp=AKWPZp4 zEJnHGeW`LtJB?zyznm}DMefjdg4Bx9%HLP26bqC+c{KGFQiZTG7xU2IT~!wMt}4&2 z&}PZFBvII=aMD{@27gsV)Jwqu;Mp(nlQs)oeNG&v-cxg&*-S zT5TF-So~!ATLe`%2*|c7R|7Yd*FPG!D(jJs$Iem42MWo_DDTc+bBiGS_3%6RYsbH= zd^~%d^g+&ZnuYYt41zKSnVp2c2JZUycXHR(9T((yYh%kBL|xX!z}u)5x?qg6jt87I zcaT2ur+!w9`^%31M-b&q7;4)v)CY46b!&UTP%mQj3`0GS1jQq7IuUj{F@c@t z+|lt)Pd0IiA8^!oah%1>G_eM%KT!YM3yAdwF*+6tH-_! zD3GKB+rK32U0Uk9Ycb{sN4xEshA`}PJSql_D3n}7*3k4=>wCs&-#PJn)Y??VV9>tr zag7`cdigwNW!9$mlkBF$!TFy*zcD@SVnSfn!mek2eL0An`>9;-O8E5Ii&;YW^w~?z zugHVp(=YgY$ETk^eT+}PG~m$=eii|9&L8E|X~B?(4^xHu z{`s)!@o7oE&$37fjv^@_pv8Wwf-b_-BlQFvJCR1=*x}m= zH-gyn-3`+rh~f?X+c%8z>|!0bAwY)1+XsgAc3;4)>!eA%YQU~b>JZ1OlI|$G{wan< z^@gUW3D=(I^Pfosw7#8#AMy0X6oOedS7o$Kf*@y4%5g8mn1)rCy^9O*2Ru5Hs5tD; z&@4Pd+*@7>g%z*PS)+jnlqWDCR!2lKfOW^9Bjr4SUX+OgY|H0gs*p8Av0h9jf*ZoG z;o`ArxHi*1*{_qgHI-&7X@hJ7vHNH)z6V+luy{e}>* zDL^uxaicvhf<&H~=cYrx2FLFBJqBU)IE+CDbZx$yHAAd5@fZ*d%GJ*@L z6&{#CQuo{blNo2Zi4YX<@~<08pX23c^A!;fcni*puPo2j#%r!DUwyXiKa@G0S_UyZ zs-dv&rQr}WkLuE3hN)CmB{g8A^sRIx2Z~}cfp?go2Vw4#{!^qINZkR4=kG}<+6DZ) zVc#DW5U}4?i1S+|wkFTe2ge7a@DukxDkc}yBVHaGw>!A;U@ts<2nHXX-nC=*!LdKB zxCQZa_!P(Egz-wO)$G_qq`&BRSHj7kFEW)x_X8WR#p-sO_62OeM=1d(t#20M!0#j4y!7bdFR8;2ZlSwM+|QM zQRYS(VE-vlxmM^?oM;3X`+NBGg0X|;8KxYQ7clex^-;-mK|?U~mx`eu$ZSw~VeBT& zxA1YGS;?=<)ztDXE$3^M{%ja}IukJTy#Yi2_3sA^J#to;82X2}HI47X(9f?rZiQvX zRQPUCp$ZQ-9bd+Uf!@K;6a9$9JVU=k3yf%bBc??*lAWJ9v<4%h*Q`5U#Ibb09eODq zdV?!-W08V*x}tJUditl@{>H=}PtQ$e&TY~RaUq2n_5dutik1|ND^is!!dRJ^J1OG$ zlkHfBbw@Af#LE2hxy}elc)`QoqS!Q!Ae`9KaQydq$yhlDl6n3=+DGAvXb)0idisXB zfM#q}tZL1tT)#NRG`7Mi?8-d*_ivA+8wxX7emPepgKxef^hw#B^ll^^6F0q>Fy@i~ zmdFO(gvWLeE0#I2U`efxEQ%gU4#JyxsbXh!{?JQO#XS}4HN8g7YW9=%2~Dn&n4oGd>A|}a^#&;M3T@lW{-s8) z7@{z(mMO!U@v_!Ci)L%mzmuMm6CTXGPT4Fs`%S7JZTe{?ok7y(8*-Ax1w4$_=plPd zu<&>Mb#evPX0gK76VYJD>~L#{C{#wK&YLIZ?O#`++}1%>aDEg7_rna9(>`KA#c>_E zVnE`b>u(LT^TUB=|Ao5Lx>HNJJgP(|DYo@>3<3w5F)yBMr*;-4LyOC}lY#B*+b+Z~ zPHZz|?BHe}y9Ra2etgg|jrw%JTFc%KgQ>c(3;}H!0$v2K2h*Li_^ToKH3o$CB6Ioy zck#s>PoA$>9N1CKEe7SpAGH1JO6}Bhh4$W8qleqTs?WmlYD~J<5fbdt3#AA_`HGLhFuu`2^^M#$L{zVn;KmVRpFbm9&>}2VTZ-OOG3@GL{6LyoV57>nEQ+?R6fhVhRgt=5Tf~2m&m*6OPHBnx! zH&*6j{Jy)gznK<87XWIY2U-o+V1csnG8!}I9UL^0uOr6L+;Z9Sm3iTc8oIRcEQ)MR zro&jT4Tfc1Q*QfCgory%q}=Mn*bffGiGbjoNCh#Qgc9x28T*KcQ^Kd3g@5~%*rO|r zS7xdkLaQRxNMus^#Y>g_EwUG+XD%COU)P_en6fo6^$%s6V-KxfHP2rcDcQ=(ahT%x)1G3g7Coi<+(fMltr&6HOqhUr`}(}82Q{hdRmgCD}1QD&JRD1EzrU6 zJU<+n%R|XLX0GHw9rxQk8p$T>{Nl%nL8UH6i)lA`FkDZ8>cEiIl=Vyd=7mbByy#$w z$ul1q=`(FS9?^L*U3PXyNH~QaiLY0$cwOwgP-RkIsA`>LrqV3JNUvE3v4m?KY|lE{ z&51bxKuWWu4NPZCN1(dFdg|81DvJ1AM%D$4#DI~GCym++z@m6qp>Zq1F~Fzt{cL<**yoa`jtBukqdbFPIx~Y2?b3NrKy1cLU-1G2?U5oVM`jftL zUS)wh<6aknSZh-7Ab1&*ESlWwKh6cbd>?bB0&g0^Qxdmi-WQ8`Rnx#EHqni2q(*~T zZN%z50Lgp)``R-Lzzov$Zd0qN%zAN(&3aDf!Y@KdSLmGvm%1yrVIrsB5_@!v(-790Gn zJuP1|deEI~!Gb7Ik+}V76@A%1w3X_BH2OdxJv7p@{9Hw;B3ac+u5mpe|Azjd`^fX`Diz2=}_x(gNVRG3&!Cgt3JR(hYTLdM(If&?brd{ zIrL7v69(^uv3o=)1*)vFN3yA!C9H2x(IzG3|-R;vk%9rfC5ckYmb8 zCr`04025469=cQkCi;Oe5ddhwE~tS0$`~+?AqP_j{Lrx&Ze3iycCZ*`?QR7r)rOZG zU@!ss21AfcSJnsH;|FQJk*D@!bZzRXI$)G+A zT0M+OjA3hDKaG5Idfq-(L98=J&Z7dSfd}+Ep{%MLYtLeAlTt6igvccAK+?aKM{WTP zOoS77WaCeP%<87DU5cIbG#>GUTZ~wOD9CXq`{C;VJLZR|^2^zE3&m|FLVNu7Bs)IZ zuF$$})3D#J3vQzA#!5-vSi|O&wBr}-*VxxYimVMq=6TpWAEZ&j27n;Gwv`0e|5^bl zTq=f`Z;+V{fmvp4c!1Pc`*%&99-g_GM&Grg9l?iT;X3qX5=KAW=W?g*hFd5d6do-b z6n#g@FRERg>2^$|hq9f<%Jn)D6RF=uFup9XIu(h7``(P1tG7rCu-^!n^^{_s@FQTI z{uT+U@fiI`>W0POtNK9*^uw;@aBhSb695P)DWoFmsFvRc^S}`@7NnqY8|}?k^j!eC zJo770vqNY+Yr~UtCG+OFGJGA9dXzO~{u;|{f1v`-E)2N1dFB2uWeMiD3vWb!DSNP} zaXT1Wl@Dpee%-RT|IeD*Sby6U+<@M;42)VE7`B^L2~5fYE3?3`EHE{rAq=Lm5MRvhh z7k+IU`AI)j!Ur?=Z$xkMMe-VhysjXxN_jt09)<`Hs{Z?PHFEXUTBiBS6gZm<6(>WL z)l}vJWt7sm0im}$Mi}{78`Bie1 zrzxkT&M{mNM;s2H&01+)K%pyO8(x#vKo}o(rKvAKFhsB6J?2$1O&KK$13lZ`}$N zHFAgx!qJw=>!U^gX}~xHeG$rkd!R_^tk8)gUxizEj=eZapT+nB_hA<;`5;AzaD7%~ zUCcSF-0J)$1@%5%@6dbCY~r{gRG9`!&b-t0iy8cDoJ1Y)(rUibF1^?^XFpq zQL?aKFnJ1b6mm>IT-uUF+an;6529g)D|_BZAzWU6z`E>_1J)%ESd~Yt%Gdn5!8kE* z)I>(2%}Ly2QyUG#$1Yj4CqkR5j#uWpRv(V1-6E==Dukul3;+7s`f3?{4sGbdxxv&< z{Pnf5CB^2oXQ`d)LhHA~>Ua%gFbbgoz&f#=EydZD*i?K$v!|&G-vm&rlHb|Jb`lXYx*!-`RmFhbK&Bh>^@ zYSeMSgxuo>`3=OZdndpeRt{FjH^h?!AdP^OgKfj!oK21nVFY57&~7m$^k4+5-y7Z} z*qegE3>nfN?&nulp5?56-3qau0s_&KK&JxRST-<7W*>#MgLQmin$`>80|;Fx%cMS# z$l}NB82h{9lYC5QXB$Pt5Z%VFtmFInRhX&fF@ys~>#W!YKHvcvD0uj8#nRy6_6o^d zWP!qhhkGijcyL*1;z`TK;fhD)&cc*&#(C)qFIB}`!jD(FUaFc$zae6XZ*c>}*TmSd zI?n-j%y^>al8Ci&E{}i0j`MSk7Z|kooX()n{>9&OD9yuXo^Sf7P==#ER6fA}Ui{`; zzs=VE0JOTh{h=IZ%ggePEdQflRy1)1kg z#%9XjWN?yIx#vLKD!HT*wSgvY$z!(_woX>d*PMD=*y=3Tu&hrWwKl%j3<=2MmW#{` z{Ezcq!kfuJZ}pq?%qwcf{m6K-4||O$)&6}vUHFDo`EaKDWvxc1S%tv0gVsL}qOpDv zN!#4VHXO1xstI#X+wy4NUAn1ld8}{EmBF`sAb5 z#+Rwc#O&n%!@>OnEf6S$9&xNs^j}wmONmu^AmKll`EQii?*(-OPxbsTBQ`UYMnXS zB?jrDo$`Wdo2r!^s-w?;d9a)0(P7G;YKU;obm0G&?*3qhaoX8ngdKJHE1*H9_MrB{ z`*VAtPkRA}gcYt|46;9E=3_w|Y1YQTMCNDN3FAC1x2PzQw66DRU8#o877sYhUlLgz z1$bcz#4_*{um##10l#2&^N^yC5E5gOK^e?Xut|ByZ`;cJMy||n?aKUSuMD=oaG&90 zkb~|#Ith9HTNUQ8a=cZ}xwm1ObMdXmGtB|uW+)FPq-?#_JVFxBc&Y?g?WV};< zx%eKO3v}Z&!79=irJ_59D%q%~_vr9*AQzxk)HfqHQC$Uvv9PZ@DpnzhD@56pSUq zcIufa3FP>Q-JK2P_$IWzd*n>g`UwKXDg;XOlpqKSO1{w`D4cD*A7_%{_p5f96D7Wg z|5fpvxwtCPuimMbd{~tw71baxxDz{FuP{;D$HGJj92F+2O<|%wBWhmdABd-Cp5k^t zU&I{)27(`PgIXd)qBJ>Ayhtl(AZ0w41MJ7q$>|>AYaAGSURPSXn4A9EG z1C9DBbY)D$3dzT#eu3NV)aMIYjWlt0+~3QU84Ah*6Lp4|hCXi=jb6B>p{fZD8F-{Sv^J){w|;K= zvzd$7drfa%$@k`=Au&*L^VXoK7MlAhWpUBUcjx) zgo8_6Tg^s#jJu|$V+mJfb$o`k(?+b-Ms$tF5=+mw^brL-TWtR(!XuinqVfE^3e*+fveI)u$ zQFv~;^dWuD3x9>w>rCp_NbvRnRUGN@ovpr2L(&}%8LiF9!bCH2aAh+aP)d_XDFNO5B4R<`^k5jx7j8^_kGtF4Wv zu$t0sFE&a~!JjKgtR*B}=8byk4E6-@c-h56pK;y}=G@@7@e>|Q_TQMvhTxe=9d|yG zY?_CVwa+`42>>iwyjP_BgeD&wl>KHuQ{;}=DPK3Xv zLx-sxNR}kO7JQ;gm0R{|rQiPr@Y9T4PR+bZo!Or#h~V7Kx}ztK26UtwW_6MpiO|VS zY9dlXCpXc_d6g{>vJK0bVl%@dK&s{y71oKF@6-iT%8tiEmKaq-gQO(=-^&MFGYT09 z&p@GwBiC!`6(i~CE98Q=f|*ssO}r>eob(s?U0Ie)pB-*G6UWNc7&=`&%{q%uKqNo2 zX)$u`Stu8I`P`?Mor%8-;T|W?=;BoIy_{DXXUjuR?|m^HUKs5|g+9`aNkg=MWOwSu z(t@@rGoAngW<2c#*Lpg z`)O}xq=&a_4$Xk9bftR!w0C%Dr z$L;pP5p3P;&{J4(;ZuD2NN+>vbz&2A$miIqWNNHRCQD#nE75p8Z3_I?3K2K6EZovJ zAGyuY9TEToI>SUb*UF6ShNC^eT)w^EBl*f>W4 z^~fa?Y}2Tt6OMM&feG-LfIMJF2!)+LjmR6D6HW862b~?^00g&dl#o62knvkLKL#M! z{!FhSJWF*`Ikv zomcvAZu;VIdVY}|>gzsSL{0n_PThN$SB~-ijrdyIi;}S?*Y(Y&C>D~41~WG7y0&Pf zd+*`&`GtFrxJ|o=O%wO0c~10kg45KeOHbQ-B!ofCSB7VMOEw)HI)i?yNP60*gM^bw zU<7TPLKc2A+OwCt(F%u7G>JuRQJ88kkuLRYf9gnAgFkuia1?J6Hyq+J@<_txL?V*# zrVc&9G*~wa4cdMwa}cINbJ#Z44{;w#&r}rQ2COkX#+W|f_j}f%efEd<`F+vdsi7jK zCmDO_2B!h@Gfh!?t?}E8`{6TSnV6K>-n4IUHC0jQ0U9y$@&Rlc_8t!5xV4|j`395I z!{j`)ZjXxIR@gQjYTR{gDDAQa`N<(>k$2RI_5@Q?mY~QvUC-&gFlgKBBlaa3; z%@*g%=`CLeJYt8sx`&I-3V#(lu95E8p+wVT*8H7r(|$Mhha1lFcSg56A!8Xpy~p4L zyNaBU^Vm_FO3qo~$6Op5Vt-ioOrmLTBKGhN3vwL{I&lh}xN!;<4O7t>1 zPyZ}8_Q<-)CMQfrn0EPmzB9OH_0Zh9A0?Y`?r~sIxrma{$6j4WT!;e^5|XB(P&8nDAn8@(-+A^cSCQOyR; ztK(12mNdkA*G-x2Cl3#2!;U|fS>1PS*e}dlar!(3I!;E&=XOJ#jk1dpBVC0sd_57G zUU%2f?^q|8tG3fv!?u%iJB^Jd)wU}?Zb)jrS&KwCdrCr`*Qm@|B=<6rwE--# z90bznz0nNqXjbcS)Qqi*nF|MN@w;_6K`+r^*>R0ia_2{wCgtU=3pl5(0!17q9<{aM zJClLyCj{5rrhN0Zsc>*Q$_F3AlRyDvACrCwRg9CKJ>sN`-(apZiR%1?CE53-!%re% zjySRHH%v)~-!RYqwDt`LRp6YG>}k0Iu|M6wxNMfKv>hP==+^prW`^?3m73<*-J{K! z=dtEWO>;`jH3wLXHfN{LDGWADzP&Qj9#n0#J@Y))UYTi6iMjUZ^Z53PCbW0XG}9iX zN82;cR0)P_Pc!W)G1nfz5@xuyMShk6)5B2E;>b=Xh6ZZ>E6i#kn$sI@T5etSk?j{_ zwGcKl403RrcDfvd!buShaMf4$;~5d?yLfHfk8PN?JkPZXVTiRzZS8XF?H>L=#Q%Hw z4}Z}zSj3-a_;UpJ#j9$!@z6sI#M*8AaZxH?wW6QTue&|=hL!$rR#yAXNtc>FIO%C` zU|&dJAQmjlDC6n6@N6@nxON9rpLGhiQ+!5->cBY7Y zicOwaX7YqGp`gr^iDjlx2AV=M!6)eGmW%0=fy+gpp5KanU}u{93t(A05iA==!O}Db zSZb_VsMw!Ob9xjY2T++f7Ak9j%3`3hu85TdQ>GhpP^mfH!fm!-@g)^TG8YpF)BXo5 zy%D{m|A*M2b)ocSBXO8p?fBK)JN~2)0^pj!RX2duim!q{aY_R1uU95ewy?y8Ysvv^ zT{$Up2^O|c5R05{AoXd&2e&-KpSK06bzMC41EdQ9(wpWElJxic`Q*AEJFzFMbSKS@ z%J;L=rKS_;QW#WNK*%qu4{g1Lg|kE9ukt?0-a8yGEX?IjCDWuYEP~l8ETjN_5vJk^ zqgkPR7T3C&tP_JQlT1I>Z7@@_5(SR-O`e~eoh~;0!65D0NiKKPz1M+2K=R+xZsPc( zJ&W8M_WZJV`rJa%FjJ~DSHOuqVo)VpI^6EVSez3MZ5O`(s%cOR21xa-!&>CnQ>JJk zC{67ECy)#^6yydCO$}xuTt>gs=S&)FC}JAI=yu=a zY|0Y*YqX^h_Ijgz8lN3Bg?t)rhws5K@Nv_vDYWLq9=5jp2KW;}!#H7;s9I}9N1F{mfUU_mL*_~ zW7bPdGgK|N60FyN*6Yb*)~hO>zKHe8tt!)O3IGVlt`~SOv@=gT#8+Ky*6hh(RR(fv zHk0{zVr?L&~r9M&^3_n=*9qbt8cmNpgHrx3a~jofU3uIFJv~yPHW3g_}Dw38%sIZJCx|g zO5r?&?e>>kW{bCX0#WitGs(!+=tP85i&$P|fCx?v<%|Ef) zcIvIdwtsN^wA9L|GX1XyDrH=Y7Bo8kx5afk{)V6GCwfWPi8k3}Gy10v)?*xbx3zb@nu@xjbSeu+&mltvMWAC>%#n_RlqCmmU41!k=-!|J1TdZZif zAIzLf6_leFQ-kv^b^W^)wLGZcFz=`ymN>Cjt&JB_BGJCHOKCr?Q2bv1VIH>f0At*Y z=1Uf$68qx*d-2)I%_VM9R|3dSJJDw`P?fY1eSX(lsZoI#r8icUrv(JuJf~*^czkdxj%LP+ao)2?>aJDPxgip5+Xb} zer>7Im|Jl?fBK?*ZPgUf!Yb0kTCwx%w9>T24qeQnRz|@?wwmAIP}tZ!n+is8fOj9b zpzQ>?x2st8y@~YonByOD2VRv)tg%sElM7wK(m2s^4 zNA+boj|nO;*NFbBCa^omz1?Jdm3R!DAEq#3<5r^v_ zII|0xv^m|`Q`2h;V^5(*w(8#Ga%=o}c4~*Lnv*W2=R46m)}^O$y26BGzW_<7ApG|G z&<1r|b$x~j?`PP{sMnJ%9qFRcx^9s6GU#(5-tTj^#|W?#Sc7ptL0unXT~A{(o}gAE zU0lKFeoq49SxUJ<9!YtQpVZq^tc~~cuzYKJCD$3e)H2DAJ=#(R`Tct4gsWvrn{&_^$+zkZ{8$tjgXN2XM^SgpbnO7QBTmX%*d5iMPn%W*o*H2L#kXeva z^w^te6iFuK^P8T>knRhHRAPqI*Rm!U&gv^C4kZ{t=Fr9CdjElOy*CG8igg%nLH2!r;m>sLkH+bdFG!XKRR{%F=Nj6*YusqFCh&|P^v8Gg(7i^5R~z2$KJM5 z7x9q9oJcLE!^GaYe@?o%0_Jv^3l77VF@#Ag-z8?Wrj8Z`-8fvc_S&(+v6>1Lz-Z)G z5uvAtF1IqL&A3_xHC5|2$^`m`{5rA0qrDnw30bM(h*pXQX%YHtrU8(4v^a79UPUE& zFg>jr3+zmcIPXGZ0pcKRr@r+_zFErU8_l<9W=ea^tn|^JQ60b;=3AM6OO64KfijBd zBWhn=#z;Tk3JXAHCGCriD9==IZv+REwfPxO^8+i%}O zd3Lh1LK6EpjxwXyctnuh&!gciH;m&fuQi%H58aJIR#of z0$}D=&)inY=3QI!(+Vx?L?-cDW=r|op<9h)is1uIt*dB-Kp7VCQhX;b4cpPjVVM?F z!XMya8()g{+rFmjO>vZiB-jCSNK2yRTID4ay@hA6f~?bS;DQA%!wJ|%W&6Dl+4g5? zbvUw%xV?B;q^ZJrXc<+TmF&o^~YC&9E@?0hJGyk|AqrbDznVzDuRw!+nS& z4GKG9*gvH)Y5AUrZW@NNOJz?@AkQd(%s@scN@-w;Q9e-}%$^cB!sd!732qarUpJCP zAnS3W1hDQ>e7^(P^TeTza*4KK6Ah0BpExAW?`4Gm+|hs?pLoAeCLtHpy#Y^n8V-XE zu!G`h{JwxG6x-a$=fWeqvqjN|>HB1cy*N8h+^Cr>9ASeGDmcs2c~4hM6Ltkn;ngWW zR}G3VKE|aMf1$2K`fAOl4-5N>R&kI~VF&RJeo*sl_(46uboEnK6Dp2wQN;?Xzz-@R zm)G_Gu=g(TQB~LCf0CKV1P0GUqehL_sIiS5Y*EmH`<#9DUVE*z*IutJb+BxfO{ud)Jz*LGHvNni2FH~l46gPqlM*pT6X|cQ zKcZKepoP99RlqAP1M+ARCu+O{MF4DLotaD#Ms^VrDS2N6z`Hfaj_%Dv23))kxk?5u z@?ReOdTN$j#V~}dEEzDt%*$PLcb-Ud)%!#YB*yw~%b%P@j0VKB@W$*GkP=PbQlzM* zA}HRDvy!|#S--p$wAVywuhYDr^{UU3k&TKLMlFwFisxlBK2^HBlfGH&jzxO%abD*0 z?4>QyHSW|B9C9)}*UuuQ(Onrt(6Lii%x^j9mbL#1I>gVauE>mkKNpwkiX>JOTUsoN zPe$$f5%;E1@m|2!jNF&-EyOBwLO|_^yDzqc#1hta>yxr`>n1IV(9MyjNS;~J;yC>U zEiE>w7m*U7Kc2%YdY$B*m?=Z%SQw{oef8T zUeHq0hyTe55>_G@5wI-3(o{nsZxd_x?Fc}W4C8eXFT1w`oGu}K$&Ijk-QKUIJ(9|0Ji9ZacoPDBZwp2}}&@|jItq@1wC*KpkVcry1vVyR7xWq&ei@s%JBL1DP8?)!4?a?g7^u1?9e@3en@gfnt zb4=|t7@D*IDQ>G2=)iXZm_rX##@+YYW;zk|nypGYd9SccK|j7z%X^Z9NCp;n52j?C zP(|F?AdT@bkhkC~=jYC`&|bZk8nX9Q8L*2-*}!o*SO!eq8Z8NeUc~JRm>78cQZKn_ zlEeSQk^nXKE5I%KrI%98@m#9CRAUzC(vUArc08sh>sxZZEjXy>%%V8H)CBsbbZIO~eWr>toqNF7({z8BMh2(I4_4?Gd zn=~NSRVP72Yzd*sXA3faX5aRTMg-Ij*znf z|4=o>74&||^xljgfOW!Og}QOLtHL{IcgC#VI3G6ta3kMRBldVld??C@gc{%--N_z#M00dOSKaH1To4pVqL8h{s~3%rX~#3yNtu)W_>XzhP0)yTnimU}Wi30~C()Z5JS1PMkTW~x(U zIHtPUjp|N@#0rVHKnLY3Q*C8mKRn2m?ZchX+K#j4PLGPoy%T z*i3eKyNp8o$tai5F~0|7mo{RO3YyMy##E^=YPR%&m9Z=E3&p7=x%)JMP(Q88ok+8! zmkY&D8oFNa)5-%YzPxix_7WU|@t!gJ`_>j)TGnYXC9l$p$zS2RFKK8daA=4EEZ#-H zqspw8LnF2JbEO$wiFmrihKVfN6WehDwZ75*4DRz62h>Ml)hUj|>OE^d#OpN9`jq_B zg`kFGpY|kv7t)f?+fB*$MASIY7xkw!{P*!v>WiYXHs)@jgoz0F+G!FJeD;TBL!ymR9pdv7m$yMP3>(aCLVky@ULExo{A}_W~SmL;ATz5sRJ{e7D(^< zO1G)7z)ujA=sh;lPcoYh2B%l+2Ea>UNFw94m12Bg5DeU9%nnd32rw)>=^vp<`%?By z%>2)Y%JwWl(|g2K4PQC&CxNv8A>N=je3_QskElT$cNSLz08 zG2N*focT;o>IQ+^EK1#wRoyI3-4t_ElDa8rpBdekS2q#A!$ACN$KiRp7*AKddd(*! zet>qB6F<2jjj_?r5f1l&*nozeGs+@y=YP^sI7&;}eyrS4#D-Y^uwzvS2cPZXXaYaB zcXR8WYCmbl**(T;49~#Gwr`u!CWM{KTqfe$+!t97f_PI#XKPapz$9I^JqtlEE8k*F zSI-Fkj!6yyf7{4`1m4`O*9G#mPhloyM&CI_&}n({UVe$+!2XebB%&W#o~*U1IJahb zax&MNZOaZ;^RfCx!ho}Ou;~rHq*mx|Fw*>57N&?I<637(wN$E`ncd4^+uzV^8_R~v z^nOu{MJa|oQr&ogYovD&{=dsC1OY5*&kKo(hRTuyiLEKfL~inbMnEH zg$iKaDVE(~>jz{#mWt`ZvR6=uyi%#Y4ZmK}NEI@*>}O?f{ixjDNTxJ(aZt_BN$CRK zeL?T#WKr!1cs~;F_hCE`39#MPdYahXI{&P&ijd8-`gN^@W5KW@WrNt>P=lNy!V@lo zazXwzSeWK39_R!OD3J`u$rY+|wTlC{0k1ECoZczyBw==R1XR+DzSS9&0sJ?8yng;O zetwcWPZ9)Z)jarRmmroTI`z05H$lSUd)8MDX0cT#m=?;p{%iZpLE%aAQlMmKi0EruroF**xW&@KO& zd$tc+di{GpM$8(Wrx#2>Se|X4w_^?BtW3z5oWPg-?!WT5+$ZNF>I?hoB0%?CT7=jt z<7BLXRTHA?3U#!?!T&CD-`}Xs85MW0;3p^C)FkHQ%i~3Hxs5om>{#5x{F^)+@wRE@ zA}ZCe_XClIpOCk_ZK0+{c`@Aa8da6v-BR^5RW`(h`s6m+xF?a!>uOZZ@k=#RLKv7# z79)KvtBo|5;;*WrGZepn79}HMPP}eeq-WpGM@S#iZ@a3PCAnNw#T;()_Dfy@9}A|#iS-re81VE3A^`o)l6lp0y7#XbI}B}#k+D;+&MawcmqBCnsD4b2iT_o z3;fB98S2;&@HV9&tcQDLX$%+Dc-U!mWxyV~5;OVxCLQa)CoDdpYoUqS>qP(R9~~DD zX!jhx$+YTIyE5?$_>2j@g?bed!e-J9#N}+0m)_<2Z~+hcjk{4nOcgrurE&}qH&*0-a&p#3Wi z8)|*5`FaxhRtFY}c+qTJoHQ*EH1cBDv9dDmyjv~zu2gxzmM{S<2ppMC#MFCXIVf;3 z0b6q5)5U-=1uog42$v-TdP;p~dOv{m&Z01&COgfPT^lwm+Q}6r_G}6G622@{A+j)Y zF^Kij;$N24CZuK##%L>>a``9PCt2GllD)J1<0B976O|x<92$x4h3|Gy(vo~e=pL4< zKEeoPCf;)deD9;dGDf@)2kzJ@>904M(Klhhh}S}vHvgUG$?)H+k%5KFJwkPIpj6oW z_f#qvwX87#@@KO@8R540uW&%vEu(?!4vLW>Dt3d-iDAT{*lmM@zI~bn%ScI4fCQ6f z!7s35iJ$c3a+Xugi&Gpn6uz??M2v=WG{S;!sj3vNskgv_ew<|q)MO9i$08j;hcQVT#q`1?+Nfcd#|M%1 zcXjQkp!yIZv}lIiNl0z8<-xf7bUFA`tZ(?GI94QmtMVC!rCR4mGsiX)RoXf&Y3nbE zCRuevyttNddO9glCE+s@aVIdmD5&<3K*RpbI|SmPu%Z2?bo(ol8(z#OA~@{W>U*u4 zT+H;{0$m+Sq^}4CHV3)yrcc=#B{0M8M6`grM4G}6?sy9^}?)H`q z9J>*{i_i?S7QY@A1ldLi#f!;HXt%8%oq_#MJAqs!m z@X`;}>W8HAA*)hLw)b$ImTa2^73&wR;-@#s))H|gzg%?7F!deQDHwAYfd^dy^yv!v zb{Th06|xY?&5k!hU=u9L;Ae=W5ur&}xe1|jshX02V?p#b56Pt~ClN~KzN@Z8VzG>S z@-=yJ*q2yzCx3y_?~ra$S9ildXAjgi+xlQ$-FG6&!Bz;|S@Jw0AtBn~%NiK{>-g6@A1|rx-my*rMFWHRH)^{PQH41E4Z6=4~4@zz+aSI8Fhf+MMQ%xbB zlE;o{<_ogoGb`gUd5`TUTOd)zkHF#+#%33GY8{gqZS1OB&#{V$ccAze1+69~|56~U z1R9ozq?PI-I8GbouKfrMH=;$Dk<_N|23*7&RhRY*Gn$8SP^IJCO^l*wXi!;(*c$Yp!M8 zY?WXBwf_tHr6zVENa(cU=TlOpWfrnequ*eGd}bI|$?Ii6_I~7f)>I+miOE$i879Z( zG#Yd6q?Gk8f`=M}BmEoU<|hyv;fc|K*rXDU3MpkDf-JSI&K+=AItbO&-k-<(rUT!X z?JSloeQl@nfq4Ge>F;jpJr(=905Z+z~>p!eJoFw z6Nk;h+(%_d_;ByZTKVNmzRHqg=sXHncyZTr|VwLOif+!Hd#>$Yo2y zYHji%f@ExelBViaqPP%jgI?j_^d3O3p0*6X^lh zA_^zncdZ9}jXMD0+ivLr@mXYS89iW93o4INNY0}nTUigR`B~C0Gd~hvXwA=HDYfTE zG&J-;aEbMM5VHfMXP%%71%N=BsbX-zTWbd=b75--nLS2>8`W(tQ54=*92?C%<>$(W zvS(-N`OJ!?6O{Q8?O({6ksk|{vS>_hA39_M%h4BszNHT!uewgxxCmJoXahv=D(LXwaRMAx z@8nmwLZ9;a)DvBF*s3|#su?Jrq^EMN7abAWr?cYBqGfBvA(iPjIHWr3pQwzBVNn)? zBF-MFA#nw^P-GVN`w_L?_)#PIOh?8qg^M(`Bm*QiZl#hWbO2BkhI8hy&P15VP^a z#(;OHYQ<2-L61hH1M_G&KJ=%AXU`!`U^srYGkHak1PFQZALsp0oJjkRtrqaZ*2poj~}`8z{CmemonQ*?8K3O@- zD&yZGf0DdqJ>D)nZ@LIZ=C#6svXhVs|8WUzpwuP*d`4D^Zt=tKWn-)zBz~=T&6+3e zW3ew~#?j!knT}4@!WO{&f|oyNe?Nf7CO>x)uf@MX&=!R0WgtdFO};EEu!`k`;V@f% z50N(#pXJ}KRRe8pV|hZST9D`G`~o%u9BE+MWZw83|G)3Ke!jSE6C1nH84r2TwovN4 zhd=JQw6=(gvU?6$Dx0TwDDs6M8lp z<}zlJFH|V!T%3Gd=Q;1;fdb@BZvDBGo|nf3EL9ier3z3W=>kWpfF)8FI8y}!?SlMN z!SQy%aj62sF6gHVi0eG5{VZ@>Es>F@t`#0 z{4sxOt%tY@{8)qe$2>yV-4rMAo;mKv#QrU={<#(hzl*d=qQNc!tBD64P9rWxm|09J zas}3Ya8@8@5@DBBnJeIiAL=S1?0Qy_yhv9OVb`+?gM+Se?_ZT~R}I|1>NvaV`2DN; z*;PiHNUTf@bE5SKcD^8nFG%UP=SQ$GH79ST=A?7lBp$h5=HvT=(+HiO0D-Mj<8v08 zP6^Bf##73qe6cR)?nWt_>6RBFKL)Aw*SI2FsQPyrndjUi1iU}wE6&>w-WsX1p{xtC zVXF(WA*u_q;iwC;p{EPdFawHdnWA1(gpHP-Og+6cJtIPYe1B=dbMFFXuV_Kg$0f@qae|r}IBc{I}#Q zJ43LjC`ipM8vqfm@DtI}6?uJrw1`!8MEp``%eH_Qi`Qwol)Tj!1jPaa5R}~@>r7*Nz zX#7G1V8c_HgEtCN{K8caN;QW}KvvLGL<@A9GFL$6{ADBCm5rs3|7X zmqqP*lK^U#9!|nPg5lgFJ)=j`9a^O*a*xOACViCtjoMC9z1(SE3F3vT`Mk%ZGr1^> z8BRDo9FyUQ`k3FsFvCgs^#%dweCvY*TkBzMJZw2C)3B)1ew7#9`@i$5{T!dEH(CrA(eRU3xA)4)MC z+iJ?`%|NTaq#PZ?%j0!ZW0+uT_T>r`;JLa}k#2$T6tPPSo^%H+MIcEJz-pWl;9g>C z;L60Hh5tn8l7j2GeE;C+aw1RAIrc$wVgI$CXGbQ0LP+-O7nzLmWyW}>wUEog@G8#z z$gPvH{l56@9Hi~v^48g6LOl2jHothfl)<1}60!`$t2PU}{de5|W$OTA+)hInZQ!&Q zN4z_cDWW#N7XHfy@jrRY=D#Ax`!)ZSz6t+r)%=%Z3`|MwUf9;){* zI$xf;MO5~_TL#r!l(nB0m9c~b3?J=LIM8sQwmMN*pYizU5*YtoT~`h6YVzGSsCupF zkiYTaUQzi7XCEwThU?mXN=Y`qK9oK=QhXHZlfS)#VX-*;Kci1RSq8M9K6%y$GRz~c zPkt~Tx{BvtNkWI7`sBYe+vuYYp-*l-^+@WIm*MIAY4yo-X#?4z5ss0i;TEyto+F}9 zp7wrbelq&xjoUNx)2lvN@{7~0|Dis4tmMPa)+d*q0#oT#pFC2i6mIj0^vUmUp}9|? zPi~<*qE8MB7_>fl+qS*k^vRFwCq&cyl2xPi$xFFDY<)7SCTs_AJk9{;)I2imA^fbC zQ*EaWGs@p!Z|yLOHXA3uX|Fd%`67-vGscsXDM7k6Co7!pV6? zbRoEct(gEEBB71hvCM7KX}K$r%gJ4DlrLl*-9dx=4?EFyVooB~qhHN~CLA6E>f|)p$w5XnI?MB)Q%H>(T;hu!KuL z|60(uyrzKeoJ#qr3xmGqn*Q94m5z>eqWT1W6M&yDL1bkRJ-boC(F~lLeFJJt>T>nb zhdYpNc#C0GRqWwSe2Ah8uwm|YPMawJMy^Qd!+EDakmct}hRZm|R6sQ{ zQ`Y`V`q!;<86Le7kGB^0xP7`(-iG`Hdgq|3LoF72*h${jP`;2H7TUal$Vf#gMjVi-dDs z+X(6qEG$=Oec)$6oG*x#3o3TMNen;aJ4J!&s;eOA(3rD?NfrI)YW8F=ag9X(_&>=0 zfwX-eVz@JkjD4Snt4I_D&`Z_Crrbz?fkdHBzzT}K-Bi2TS==rlL#1CUj*>#sA`TBx zuM^?4*KYQeuhjX=oh;0H*oI3)ht#t zk7ugiN4DBq{jg5NBtjJeEB(msSU@ERSQ`-C)xY{g;w%f=2eP{@(EgJW^M_kP+&v2& z86t9sMfm*wXG=hWb5#lnKI!`ddb}_0%vXJllQ-+Ph^THp?dPvfeB<=vBfz;CoUapd zn5CFzRmkOasWEQv7$@8nzPgOCJbn_%i>DEy#P(Xuqt;PSb#4rQy2S}t{6aC?8O=70 z$R>R{A&+7U;ba^fCglvjpTJ|}Xap;i(xT6>_~vpTr=x}DpOEJ1@tENi#m3x99_KvH zOZ^~w1xL|Ua7f-e&WK~TV2g`NnHaSgub>+`hlL$8hbfL-eEc$fU|lOMX?^@uc!{FE1{8!B2|t3zq%yoy}C5$y{ybz?Fo3Ri-PKk!RF2c<}WiI zBrloeDG??_u2faHymu- z#4yZPrUslX7phD?Ji`iv6Rj2l>cZFfvLXp7yiluT01m*AL+C1s zB-O+o{7Dcg1akUx6S?pKz1a(G*ZD?i=cn57He?-}j8kE14g$V*WA-ij$t7Y$nJPj9 z>Yl%r&EhqQw@R6UCU=`|tib2gNlbYA((KIx*F(s;+*SL6DP-6DqKCc4QW}*;#In6CG%4)nh+kKL%zWZ^WHjhyTMKp) zIHOAD;oUPYpiaPtvr?T-7Lb|_jL6T0;?taD*ncnztN9m~yFB-*L-9Gmf?)7nm^z3ab&nBJUILQc%dp7e|)y@+g_B_?!B$Ea@ODwKH zVq~5pkr@L~*=Eeq(PEy1ezH-PP7Kq@uy5Opv0-lu0NMwDNWlYuUXK7L0TMQj9Qbq5 zzbO>6GcmjtJxr!EhvaheHVa?^ss-3AQ6B)Ehk?#Qp!4eOD^kz_GIi(iwKQ->GCA1e zV|%ipvr$%%{qwVFX^TV+V|KzOwJrku~u27f$8%N299XmnE2jiEe&=HJs z(u79G2h#w50YV;39^0Wg*v22MJ&y>sG|1(PbZrIGI8S3U86F)?IJiI9sX@-sHJIWb z+#}9!=b};3T?(t!Y54+$M=aEph~*Iw6!tB@or7AfNK=wq6Bx7w`y#u+t~QDCl8C1- zh$qKACU+bssMq7XN_?hmJQu+dKZAGMs2`1r{J%Lo%kI54N^T$+yB!3dZc>R{(1|56dL_Mw-Gf9&HP4F8Z%rf z?v}EorKb5tSU{a`Ssf|o`X=FM9WLlg-rY~e6)2ZqC z(D;M3KjK&-2=rbCftHYCiuDaF;)2nOQ?iD!(eRPDO~&!$;Fz>wVReH)tZG8p=jo)D z5PjY#%mLFyrD`FK@RakkE9;OhZF-l2n>@sZqn%u+k2>IxE{TP7?mCEgWH%yI z80Bt~-7Mr6e8?R2K$?gdUe;4RVb{+GCq!XgD&S#vHzh2SGINwC;#h6%?AZPIvs~ap zY7tvDoCPO)w6h|M5-Qr%Dce)Gb5dq2Eljx}M{>JPNmRy5>N{5NxC~r4?VOinG1nk(gd52i7epoj5ero{Xc%pQv~`td zM-a&U3CK;cCrKW+AWQu%RP62qS}*g)SWkr9()WC<`4XfRj*r}@U3o+C@qQuEG2!^7 zJIv?dlsVvc#JdlNX{7Z$a3BA#uy;+RV;9&S9~6Xr;!d7kPXOWPIX%J8?-X+wT){C@SMm zM0g_5Ps0jI)@vG)d%gW06GILt3>oNlZ@j=dWHZ0vB>u-RaR= zTsbrQM{jYXmVFG=8PcV;X_2-46bf~fiz+!>QPa*4TxQ2|SayLLTa4Z6tbJ#(O5$G1 zVD!Q&To(H<8-GE`!2z`wZ_VlKah+jDBH&wHbCKy?Ehk0!fvxS&qK*GzhxJ?bG4TQ5 zvM>beLo(UOnj2JOI4g4u5IAY&-m};@cBDQ?^HZ~$FW1cURC6M z)f`@hg7Boj(>^|ZRc>e}Kfuv<4o>-aJKx7DR6)ewhPq3{T3d~kG|$S&G{UHI9xrOO zZdTr^$ng}UExclgY&Y0_Sc{IF9_zpmy}rf_dfDjcb0kvm_yqPz%!e&L+%*BZw*8(( z=MQ3|WUwe17@EoncwY|=m!Xd-!8l)q;_#$@>|rwFV~DO<8xeD9NR7Cq<|{!jiD(lU{__dPOFnBo*00jtgO8Qu-Bm6<)>j!T zyVfy9GFF*o*T<=`;t+qRu^!jUSdTlbv5v6Ds?j}-@1K0U!upE!peOD==%5**HMuVb zhmR4wE@i-S5yBFw$!8`FFu}q{Q9-W{qMI`+79v*5EO*+otToWg=qH$EOJKHUS^KSu z-ut2;p3JK86An1&TcgM7Jos3zyVhoC!hk#(Ct^8^D;13s-7+;YiIr2WSKldCx1hb+ z%<*M~u|Z`aG(QvB;E2AHy`?dGrR*||rxuv~7d~nj4bO8cX%a4XvDaAaZPFHr6Xls3 zR_%)i_sZ75)GQH=5{1p=&EAOLys16G&F2x8yHKO~gWm1W%5~7&DXH|fQzmEV_$5n_ zQ?2S)9Uq@ZnalAytC_1~EzR#WJN`k@rJB~ftGFDeo6z!ogDguF70bK)mh-|MeurhA z9%DbvXJ%1TWItKPlOJBFYEdGEQRzn6Lbx3Z*)iYGa0j7wQO+n^o%?YoFY{1g-@3Rh%G^p+ zPI2ZI(cekVKI={Ljycav-4w@1>`PsjL>EYGNJ;8F=l$H3rtYjymSt|`ljWIPcif4I z$NGePkJZNho_4youK661t=4r3PAJN)SlHAm#y6Yh24|X+@eR$~%EyLfZe@IzW^O&v zCVAeUDJfE7nLE7cz(TXnjP=8MDs@lhq)Ci>yRbLLXnuhd!EuH*DV*yrFY%@P>_h z@Su+dZ%BSDSROCA%)FsmCfbS5Yvnmj@x?$7=#TBZ!N$y1V@;gFrVXNvK`5#>eJ$tO-zp%GmL;c|+?yuH4Vb^WIh&IJbd-w^Oxttl@GH zPweH_V?V(VEIMYJAMkFppBl_ldw8lS)6OhzBRU#Kw=^}1?GyrJnA{CY?he`C%(*p5aX zancbQeuyKzcIDO9X#`6bVxipSsGUe*1eKWmByoYeoVBAV3}p&Aab;J2?Zp%lz?yop zh{EG)&!W(uDJ-V2U#&Y{k)rj7N_gPX=t58G8E5xS4oj71cXDW^Fw@DwnZisb2W1K~ zoh;83W;$7xDNJ`V#UbbemGn5oTf)S-tv~tdcbBa#PQgz!Fhr!gcTixRIn5 za2+A%MuFRbxlK`u+mxIl2u!940e9`~+5NVL@}2B{TSNI;cE7EmjL7b{HI%{KplOYT z#lnK7HIRXPE-yV2Jd2}CoPdPvOS8WTgAkLBwz5qMBA9$NN8M2(ISwM;RiQ~ixB4E5 z02bhRaAVoTT;vpV3sIwCJkB&BWt)(qoI)iA_Y~v5tVuNNjqksXjz^nvuWd_*IfasH=!j9$lO=m`POVFsvnFA@cxs zGB}0^;*PuV{=?x;>}9N=-Nt4gFTC86n~OH&OI%XvbGlU=1fX`w5T zYBJzhW}>q>K$E|rNfwM;MSQnpM))eQlR$pU9QNz7S<)#K1K7&2nxXRI}S8 z!hw?n4ygDHG#X!T=J@mFWK1)p>>jC-(p8kUP%0hEni zbQ5f&xIhd20ZG=x`_TNxLi_`;nqQ5o78D7y9~iRq8JwiB-L;0!Nlg0=4ryWaam2eI zL^>f(=*9$yGmh4qT7j_W8{7gyQhSMt2kpzg1dq%NxJ2tW zc02cLxEN<_*E)))`F5D3MdDqeQ-j1(5o4lHfFi^v=x;LV@#;M&^nZLse5eY?Z|y?w z^&DQV^CG^THy4D6@Q;cPG#vjfHse8$T^@HTG-o##gngYx^bUF7x8mmfF!9SZ(TxrQ z;UeC~r)4J)QXezKu-Xywe!y`}8&msn8Q%qA?P0?h(Tol6KE%!Ft+dKZMz~&&l0go) z2FU;?T(G^;*IfNHBdZC7yz5a}%!_!}S9&GITR^PfE)JzDRz+CJ{cH~0u7rJhXYNGNIFUX&?>o&k?+<4R?B$Qe{=D=_&b@HVh89nS*HHkHKqt9QxE zK~j#qC zR&Wt)8^0U_{;EJKb5tr95D9+JpnC{2EyXsf%vOvx>BIq#mp&r&U zHulx-_AiTbfSfKMs-`vYn!lqVA!#h?OrmG~M_9l|%4!{z3p44@VKTf|vw zyd1olXZ~tN4JEG^7DgR*!io3w!vV3HOen~qa9_!d2mIe{9jL@7P@wz-PX34^89n9 zMEpF&4MH>+DS9wGr{Zjn8<2-6iUmgba%22rWBkiT)k5uww+JWxjmG#TM%5d}gl1y` zVE~2w`A-s^@$%9b`Sb6n_j|l*dc@@pXTe_HCw-52pBaS{xoCtJh~?9Bk~NnGhji$^_@My$6W^OI^I1C4eB}|_cN|4z4$Nq9*Td81Gu%NAnQX&T;xIf6afwm>5?*$uQQnNhol&)zkvSbkd6O}IkuhNvTH72%vXP=SX4$U{IAV;`))Qy9B+S{QvJ2AA2IKViS|eCzZ*@-yztJ-Bj0 z51wnd;1lDCb{&s-qG}P~#5iy0n|!oPdPF1GhH7>X1`fF7ZiYx}S3IxyISEIo&%-58U2pr`4d#>K@P9ExL4z zEUw)!E>dP_1SfJf#gZ2##TH#LgrYuME4AGhYm#hieY~r^f^~#}gFbC3xIfOE6g)ACJ zVEr$&WB{?Eq}G2~4E2)F;wWcmA`9$haYP;foVE;rnS$lh#Ke@+F9e?Yml0Kj@*VWKM}&%RdSsILx?37x#liRDlprkpG16}H|K|tWM^Q73`I91>{YLIh2xi% z8rQ5f#-G$m2Qupk+X}y5R#M!sjq%NfX9P>>HDWjmJ(4aeO%*+nE*gx3lRs75Xceb! z$(6gT`qyFKQX~2oItWpn^zfUSN6I-w7AvH@QsT9)c10+|VG9A=85Snk)rdq{Z^>u8 zN(Zl$Wgem&)EKKsQUtrezQcVYRM`)>eWDOu)d#EAm|*Pq_aJQ)d^TYn{iCcVVf69>>8NcUq^ej zhNF476D>gez*Xm2OZ2GIdx@3F8l7p6N!u$p*PdU!;5r!O! zStlS`($JYgvT}A`PiZJ3(vajz3dc>z*Ew5DLs~{^msUg?3d=LEa;K#sE3cj<5S8aI z+a&BnM4*9FxMXv~NCzlvJnSZV*IsZoM_o5%F!I#+x9mxp&?=KO;X{gKl8PJx!3oS# zu~8_Ei!k+K^^e4k{-}&e*u+T)kXl%}YNI7fAvg`Znrj$_l%MovuI1v4uh|#po-Y^3 zS-)6)uC6)1%&xhp9~Tyvxe!JgiI2AguEgcGz!g@=hFahPE_!E;z~!!&@rxi(i@XIK zCLtuPmHQh-TzZY7@iJKX6=29O?4@dzTx@`Ubl8=wKvm*ZH2y6F1ZYh^`5xCF@{qVP z6^`Qrz=WcYc&_jo{kcI}G^>?w$s3-bS~NSyLSt!8#JEfkE`OKH!l0yA?X(RPP zIw9rn@u#rpbp28JICrO8qtjB{P^7pO*66hqH_4gxWqV|LsIo~r)R!5i{(9=mdd%=x z#%q5Xj!R+fnOg3vJza}=laR7(fO93JE1$AHYJ)KYaH(bF@0DmUk1$|q*c_@xu zZ&-3CF&59fa#l`S2<1MJeeV|wt{f6P42~31`R*q_pA#CgC`5EZDJ5#RdjHu{x)D~% z_^3_Ee|<)lBCXCiH4@KX`Ks`j74b2-$r@@nPxlFF28KA1-$?A&Ws~_u6>6$iBCtns z{|~BHVuNGTouuh~goZ^?nB^ZO`QJWPch8Y3{Hw9t&cUqycuUtpPCC-gm}n_}MrBS# zY>rc&3Od%ynMJy;A{KC#ip$8&e+kAoW{rGKF@wogbd* z{8LiJ{(c6(3}OwBTPOK$i5G>rauS*q&eGS|iAukB}Fvd1otw&mUOmV{r_ootf4 zEZ|#OD=9>-L19)IFIwG>=4_SOl^}}h_NPSGxP*X}ZPh=B#LzFl5LP2S!Qt1trV&Qh z=nggc_q+ph?cyk}i5LO>#is9aS9MbIc#x1>=0i|S&krajGZMnYD3cu;@E&>BaW@{()$;UGdlmK^?Lr=KX$_!+z>)>WD}k4f(Uh|KSU76C{=`@cPZ}Q zt833l$p;~FO2__<5xGKSQp5F+$!V8EDAenEKddfu`&wt@$F6g?=c!iTt9P8`yUuk- zi8htXjJ-nC4CnFifU7-^XwFw}e?1h(7R?JG-}c)6AvJ?k=I^=MpBm1wEXGgC6HJcn z%y_qahw%cB=`#NMMKT`I_oqi5Vy3)Tq17oxuqV?f*u&f;zxouyd(#Nf)${uDWKix= z?`3&HS^yLMphaLds2+Rb6N2h&S*FtdEWN^u?8H66^cCB_D9}22$Z9}EG*)i%e88ol z^iKO3(V3o{x>Hh+yEAQOP;vHQO!=R<}BnkxVK z$GeR+OvXI4JGj5}gUEKuGjIyQNZ}NIeznoWLdxNVob@-{bYcyqB31|o3B*h?y}d%l z??>oi0Fy}R{3FIM0$`Bvi!X9w?=^`x9KP#{r(MhG6T6ID56vW^3{1<aT1ox2!wX3Jc}{-bOv)nT<|KKx}+Hh&o;py1>|wX$L7k>M{K!9z-S zXVBMCeZQE`7mdmik~Hh zQhP#RxZgFy&Ev2b*`U& z6>H@p+4V;dz)r5DI+8j6&220yRr29UvFGG*_*O?qDXVm8tpPjyGsQU|g0D6o_wnyL z5?jeab#q?)jy&V>eZJ>Dq;?w7u4*F}$%nE&lKh$6#G+CmBN00Kqg-3h()8cBqv@D# zB)PsuxSM{QKprxqp2(?0YUR^8Ii=wpkJ&Zx%3R}d4s5>kE*|Kw>o{X;$75om+w7<{ z?Z=2Hc>Fyg{~l#|t?TzZp9$l)x;xLh4z&*;CY_ga{6?Tt8j}32&Fo)xJQj#OC*fL8 zGsjTvpHdkKn57$2A+#viEls)=-fAy4{6y3%;n--GFws=bXW2tA!KD$biFlf!QwgcD z%x$<_O?P>R5!_g;;~VR8OmCf2a$Qb06@&)Am>O1>`H9Drc?rQsX7Q_BqR{rRkqgJJ z@koB!6_v3`&B?rVB!}G~Z%ww&o2{#OR#;;^l$*Tx37LjWP5*#;LsrJg?fsi(b<(H| zH4-2A_ids~Sfm?GzTdj9E2x6laDJ#e5W#0*s*ay4=7??(DHU@$HWhNYo!Y$GUTWRm z3MU7u5{fj750QhCbKuKx*$sI8CEhW`$KZ=(qnPlvU<{A%n3o?!s<6<<*Z)Ob}?^AAWyCHLiRKs z0y|9O8mPrw<09v-*2$!C{Vh(BZRFK94b5{zG&+iQCjHq5r<;zeY`%*5;! z^er-Gk3_4nKj0X1O(oMA&XR8#Q#W|2L{~yXtJjZevzzH#Ufrrew;;@F$w^Yf zP>n1Kc;{$h2rAA1X%0aevw$9?H3r-rEHtKhIixb3YrpaJMp!#n!#Ei%td?PX$7O>1 zaxD%Bc_p90pvi|qM)`JGP4bhEzOWDJ{xT1i|EcA?F}2*Pws75g=7&5Z>y(g)tXq%p zOOjYbLSZ+S3kWh!+l2q{j(9diy-at+x^=2X!DPbKJo_<41;rn(l-m0+>y zy|&2o20c()E63z;QpECP^JB6x3HpVjUm8}Ib0OV+f4Ow~@?i)aJ6}7?N}rc>^Zm>t zujxld4vv+#`CZcSg~Do@lbgSnF9#&6O5IdJ@@x7F-}8sn*NSDkAaJeH;dh+INSGGH zeHX(Fs_RLo{MWKsTvw_YrL1i*>55YH)yJuExh`)JiWRdvr76=GCKSHq=q(rkI#B-(>*-uW&l@TgEVC)~-1 zRwkdMU79=Be)W9o)qQ`EMqfYaWLy!lY6r?H@u2uyv^(3Es9e&YR`v+koRY6tf394%e#o(m2p!dR{_v;9v z75G6vX(!$PsZNz2n6t3F|$t(p4Sy*wsdJ>X~!AQWrvtFC4GHq`YCsh`Vz zK>bb_w`mPT{Us@7IQj^-d?~u?%-e^OwgP5ERTIE<%jL2OXex3+qR z-bB7o{hD5j+osckzEWgW-fpgWTi*T#ZbrOL0PgF&{u=zo5g-9LrhGyt9vs5CvZimz z?Kqujc&_PG%^m9`rAoM&oDvG=DQC7U?P@Z8d#az*;IkHfh|3y<1+$>KtSCJEdwz~S zKxfC7-WHd5qk)+u@Dz@Ebv|Q_?!o3E5)OuxlO9<{vdyOSK zbBrZjInj;Vr(N6CoJcz52r=& z3U%WeOy4gWg#(Pjt1xh1Q)(1W(ⅈ^Yd3xF-@csUUDnZ`_~|oXs4(8-=iB1)C*qC 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

>Sh$~5Mzu>6z@4w3R zJ#RfBtB52OfjUGFlH@z+Fi?k+RRjV#83GBoLPqO3nm}B?^FSaI1`$ZkY41n`;v{4} z(!&0KP~O@)kXrK7i}X>8>oT{!ez<)3)Z!mNEuVl|e&g2EGUCHh%m3n%{@2C7@+bt- z0ND|`gg8Q)NW7@+obpHNL*(7`jD)A2ca-+51A6sqxyKnW$U$nVUB$Fc}$U8@hL5BBL_4+;_?AzFB={m=EU74P**LgA0~ zum7ojeyB7lr+oGu@~Op0U%qA~F;Ts%ZOzI(XqEiHn$_(`6j(kgede!HUODRe)erXf zeym^p4=q-QQpCslm2(P?9D*~v?+l!eQolXw`c&3_V)nA1@ z`>5(y*Zxsc%g6eaxRhgk9xCMgeI?wFT)&#}{`%FKA6mca&!4CRka8Q;minG-P&-@G zqJ+)rb7W+XT8AIa!k2L}zKjIvtc_H*h4E9Iq4&DN$#AJ98(puN_E~b;zcIIq{pd0F zE_TkH5p{7!<*wE>M$1h+aW=yuT;?{z>hqK_lWQmBY4BzkJDKfrd;%w1Y~o~#O?^8q zMnZgmjwpKC{tFRefx`I?42SqH{!(_sbN-8Zr@YU9Q9ly@#js~fMEm@k?3g=V|Nqu4 z2MqT4JL^5MJ}<`iu_u3oJ?hiSUO6gSSzz~(wX&S!oE>tO2cyIXf)W06A02#_9Ri;t z?pc16{n5}NxuCc-a;$~kC|jQ#nZHk_mSyPkz|8z_v0Wy6Wp-Zv!D;#Pb-GEKuxy>K zET6DYtq19J??YV89|Uk8CD^`q2-u9pi=|WVyG_&Q@Ar}6Qy+D8Y3e#kduUI*egqxw zuoU*c4yeCQ{wM1X8T?}^Tsn(%da@n;jI+5$%-z!W*;)%~`mwjx{$>#U4BA@zn0`c@ zDltFIdf7)m8wb+QpSR<-sQU;S;m7oo7m@M)5{-tC(2t$lzw#x?>F;=a&vLflM!g+Q zdcT?5f*WcB&X(`&4Y&dF9m~+54Y>Cqqr?YUhGu`1>-7K|lrd(Ge`qvb`f_}3F`rydlEH8puYVaIBt zPIQr2Re(=+>n5Z1JG}L{?7G?aElYGQpQ%vhLSAd@YmVw?@4|6(Uh&8%O5a7P;!UyS zvNjrys*!z(Ek=qfzWClrVv8qvs1sX^j1X+@B({k9dh*X4kE$qPY$I)7)xUrj`=Pll zitOALzP{WR4U*ep1AW(y`GgDl7$K}ha$7t?aW1WaoLHW7%-1KDzhI{|IQFk?Fyf_u zrI)A{qvd{a%~0b~(~pa&D-MJe{^VD9P106OA0w$QcDfTgy=r54)E2e1Kg-1y@*E5| z(>vwZS<}Yn|p|B8(Hd^K`OU!7Ty| zMZ!0(Aos=QTnR8yiU%GHJtxgw49S4m+SK%mwVlOP+S_N-4mT~k<~;LmTw5YWh|cbu0$-s z>NF=6E-MkpQDQ}GW0?+5YCX6gS5?WD(RX0UU*6u=D;op92Z*w0#`>ck}U}=n8vEmppQv0Uc?zIE_BF@&t zV%yL@olh(u%7(TCPIW{BwG$8ek=d*MitW=!)q-}*^B-H#jw(m{pIgwXHTBpQv@-@# z&j+`lE&X8B)5L42DjyyF{59?$h@gE`?PtMfKenG8b?W)pe&(9@Z~r&!XYX$L*nW0Y z>1VLS_L1Aq)_f@YS?UP(vp2DEY5UnLa&b8O+0V2k>`3;rIlPr`Kbxg%eQZBt-T(ig z{p{wyfc>m~!{O{_htC(AGr9KJ&qhVGnUZ|5SXdqVnUgupHo4l_gtdHjsQv6OpZ~9d~=&K`R>``KTr|91Y9KKt3$BiPUSa>ov|pE(vWI}2=NMDYi=h<)(` zS;Qvt)PCYiIz26Bg$nw+9366V2r$+v7$UawxV^XH8eSF}?ok!+53I)-A*HFicI zqs7PdQOIT?sZ`V^Hc_^|wzu7FwET$ffcsAByfJJ5NJ^IYCnY`0NNsQmCtW?IRyLg^ zvy4SPfp$Af%a{R0VhGiFGRV^+PD7F!#R#vL+*Dqdr583qHEpVW=l?n%1vnxFl-9MhuK2BMM|@LVC0=H;G*YAMBXwH)OPFTW#HW zbVf^d6KvZ3_|QzV14jJLq4?k%fDdaA#fP;Tak6W|YL%o+>D@;Ak}w4txR7KitFU~Z z#P0kz#7I6;4;=i7fD+9Z$YpgANV||9j_qv+;snbMV`jM4!Lsihoskcwgzpa?`O&3> zqVxJmK|mcMQ?^ip-d+V0j@2a5MLrPbz%SF`{T90d-_pAR-}1WcISH}vNJ5>}So|fa z&T6QZB)Y-Z`bQF|k_^-7-P3wBZNk2;ANEq^$gQ?H)seL?VTYldA|n-9rW&c>uyT z0MA4hTRYx=0Eqvff%p#qk?GCt?Hp?-3No{4wsyk7HOAtFWERQ6*Gjwzd@rX&*3*E* zt&%IKQ6gAxEv>RMq30)vmEE7f%**@ppeJ4r#ncZ=A7r$aA}`tY5d<>-`d)8C+S5lIxn9Zhss(vEQ->I4G z!mi8w$5(WTTbGdKZe8YnyQF}UN;at1WfTPw_4z6@@veKpXTsHwup{S+1Fv_P=lk#> zh^h!_02ymb=~5nbkKkJ*xvkv7D?VfKbClJqIEkR%H50GyGp^WWT=BAcFPHBxLQdUO zox9%C#-5*NOKN)7@~o-n+#V=$cCB%9Y&Ds8>%6l~8qZ~C`KEZnXO&o~Xduc7=keFgU`K=D>`&Kw zvbCOD4|3jy*YDXEPAw=12OklcWktns**dPD*gG)2%sxvp#jWtzA! zt0NW05>bz6>;Ve$=7)XZ5RH%*y|l|zkw7Bj4eq|9Eb(4J!}!qNPIu!e~Q^3U#lX&K#fX zOp*P<=zq#)d#<;y_xzCSE9~lFva(5UGw1)2!kXMzKAEe2l76bkQka?0#yh8G{^b|^ zoS6S$`*uo(Wo}rX&GKqN&9YDyL;r|R8CWVPC@R#omw>?<%L-I1UGYVj4C#WTOW4aPOmLJk+R zFlrkIa|jj$!504<+Q_kXaRsPIJXyMuYUB)P=ieBvA(omJh^EW}E0}KJn4Bja?woCe zH*U-2GijrUC9h!qwEVA}E-#$U3-XxOK0|AL%)CZg;rS<|fnuJH$bVYO(`e$h zkgKsUmeiysvWu&G1DRU$HMW@gZGDnKa?XXF=F)0@y@?ksWriY^FW0L~jLgrBCKRc@ zuEbdK7?c%FUbQ`%ym4DJ*{~^^T+~&cT-281-<56CQpI1g(mRJoJu?FqW4D-eS=6d) zs9r;LQPWViTPWi@(6b`F&GH(C@b>{>k1@|Xm1~lBl|H~@;bDKG<9+W()O3G@lik!z zze-2d2J6P%RZ-7^5;diWPFATYK7K0H6t4h44d>rL=D{x>%&Lp{#zn;v{EDj;8sZ{a zMSrx^6gX|si>Q=cq|@z!JFRIvCiCTXCbzRLL>F9Yia*<7ET2*w+%|7hcP;hoaHndn zmO1rz$&1oA%d=kkMi-?;I;iT#>WyFj=b zaYu;cf-;$^t|VCJH(GwEug3=Kib)~Q_2V=6CpGowng5bD)Hb~c z{FX9PO_?R>fAVRRqSX|6Id|1Ysm32Wbf?$x&?`meBiUhyR%{L%nIlt&0-Pul% zOECA=((6RTn41lS49&>~&L{jF@e6dZS zpjRf!XjX0Sdp5;>CI#}Jv+`!{kYd=~0{Klm6}YP7>BF~Q@ILLo@*Dl_?Yi~;_QyHx zpV;4inA|LZ7|2utsrfG*D7jje96#2TnmU{;l}~`KF48xbnp=ObzAKBBrS5FwC(#Z{ z+`XNvnEH*3UtNnUR~=b1p`=)9;y1~D+9{P?>btVEg_HL?(kv2m&NMTBxJ}rVyZA() zdbzZ3EV+PE$N^sdGTkea)6dQaNO|kIsSI=cy52Mb)*bO<0IaxSnTZ45d4H%}BPS(P zS*gba_%U^=WaO=ga5h*uc98>;)_F>**k@Kx^Tum*hRXAB=kuAt=dI-Euu;3tG-}&T z^}OdrPn(%&%f?~n8>wkbNH9 z_JNrL$9qWI#IBMEd`iy{7N=p;v6WqBb$9`MT9IU-QPs405oo=G;5bG zvP%ncrH|=%zigL!jMl5<%6R;(Q+2t-HL#(hA)E;5o6XBwx5P(8f`2qx-ejP1uAf%( z)p}9%Hyf>@SP=qij(;0*Ks!9&E$r2Hcou(WxFsIXF*Wu%D^>iQtd9;xH@_kzkdM>T zG)Rzk9h@GShtqxQ;o$ju^0I;R*E0ZLV(JAeDeW8UozWfApVF@v8q2HLx!Tg zoM(qgiX-mC)pv(>^<5tx1!T7L`})e=pd;-PJN=w$hm$a@|30CX#Lf^N!lpVgGKzz= z_Kb_Aj``ky_GaP0W0=0g&O1!wvAZsQc+vz{Pf_39ITPSr_mnT8(SkWvpsv@^qMWw&#yA`6_3L;PS8nKIAQ$P$u5~6m#-dS?H{H?XsKd}_ z?9xH=eWB3jXB}M6wUe7}+8GS6QG*)T+oIPpU*jm5y5W)3MQ$`FtV}k~R_nFR1$9`Q z?nlf#pq}lwxy*F+8C_;#blDp(7t71U^edQLo*}ZpFMidw$z{aZ1C7Ex!{sEo#!0mA za*5Nd@ZsJqD0k**8uCDYGp~3X&dI0h?$-}wv*}lk)s+$(=u_>8#(Q18TWS-rdk=W! zU#vB>z)~ELRk-SxBHNqgPuHg=->vz3j%!Gi!z!<=9zlEcSlo`RO1)A!Wx!r~bjE90 z!!XWCD8x5-Ly}$pOsKQ+WeH&~3s?WhUVQGOaGA}C2C|D2@;HUvZnroxp#{rX1ZQ&D zAOCPDiEq**j*I%+=J@jllQ=OArOj*#_KfNO?J>Onk*{K z!@8mP`EO?o!nXnR?KF@>H{{#F=yw00`a<6aHGS8+plQe)Gu}+?#&6U1&Kzw+q?`L` zTkZ}++ueP%y#v~Y32+GAo^g>;Ya!|rWx`U&toV6v7HaMz?PIy2_y-j0vcUw-vjoq` zcz@Rjov68=&M^dR6keM;<_o+5iRaDt5Oh98Pk8Wf6Mo2i-8B8ro9~H(>K{VhmuvDS z_4nO^wSDBB{($7YC0?6P-fIp=-lyn;B2R==p;Blx<$^X-nnF`vPJOjkZna+MZ72?4 z(}^6-Q|~HYudU)cApJ1seUxds#%|{{Qode`ahw7y$EfOx|zjb@EMGGJfuSCAxPW$jm1l;e6WE)e<+xXD} z?sOjq>Mj%6mJ%@*{6>V^81`Q}CejSO51753^fqfOIlj=AZ?O!8tAArNnEyh$l><-8 z2FSDJYIj)usdv?~Qfjm$c}K~KMJ|z6< zshhU&U^f3=j%Dblp?Uw&PebRjJUTRV6~&r{&KtBy>fHX}R(pm_5mk|O?rp1FBgeAb znwj*JJ9{%e(`RcW3wS42g$;<fKllWHIwX8bDgM6zpZl$W^V{|L10mcu2P2$qUb=8dgv-s} zV19iUJY0-neQW85 znXyC5jMy_Zays(j8ri2wYQfDB6{im=D(Y>G_m>yhk`!AaW>F+YEjevN-MWeN<{V&Yj`kV zKg3iggw-ZF5q1QR)EjDT;t#&wcH56FhHBc|E@Fq#A_gh3G-*L@{G(d##f;lUZ*5bO z2zPyf_LB*;?7U4LkM$%Dl#y}O_{F;5#m@6b{?PcSY2cof*@wz`YYD@j7O=^tV<1B5W z-J*B)OXl1DrJt*a;mVQB(-dp2GK6;fZ#)ALpVR^F0;+!b+W}epiX6C(Q>*i!)zSSt z9RynHSp@N|J3Z}M41bEkBSY(-c&lC&qCA(<0a34Yql^@c_U8WeYjWuD@T0bt&EF4x2QC~~-?4gaFcTLIaC_wBx{JKN)?M-O;`I2e zqxPZ-v)=g!8@J5n(PGr%ygN}<%P`X1uZ?U_ntH1@-K1S0hY4||Z5POQSh7sDz^gVp zlx36IA@tQBBubkfj>bBe`a@{!KPWsh)RyvAK8>;19jZIoAaeFE`r&i`1q0`IDEaUG z;B)n$`VM``dD%i=R_crwejvuy6NJn{n#^!@?ISb4i<2D<$O(rsj?aeF>YyI{I-D@lA5XQ!=r4A(#(gUFQKK=b+QP@PAoK~ZNEMMz_{?Jqk8Y?D^#MQEorCF&-y?S@-eO91V_S6qFE!a!Zs0Nf!H5(R-i-l&s&3spKr_(@Go8YuB3aT9d3Rkcv=@O%r{qiOUPo z9G_1#*7yyYVtA25i3TktBlJ>IG{jQkY)g#$-jGz|qxf)C^ZI>*1h+mJTLUbQVg?Fr z;^=dT(Ds`T1h4P$mMygX9UmW3XbWkche`BMp>41NsLmY(!1FQK!7as@I>$;=70N z%h;gmee#;DGa+#<$@%89^@Yb$>@Z^O4eAp@AZrqp`7k zll}fFIR;m2SCQZ!jK!OrK+b@zfSHLlT=%u!r4yjxDI6pL+ShqYZ#QTKP3JuOg;#d_ zc7l@~+(eMOpVHQcLZVMiUZor1ckVqSzKG-yI3= zi;oWNUF~c1nNNbfF4?txIdA(gqOeq$;sWywY@sh208MWd_gcMhtnzA$IxA$XSnn{6 zesyk$-NuP1b_1>TF-BE!*rm0jdo6uCgj4({g+~@V@8+!mCN6vX^8Ea@wa;pA>$`)| zZS15$==LG)4Zp1%Sl{6nHzBZ#EujjJ1YGdp7so0B61Ha8(-aSd?OyVcVWu2~Lr|WF zg4_+-#l$@!ihIIZa*>I1f-o1=#lIRr@2B*(P1Aw@DX!-Qsa^th|4+_zPF{`AV20PQb9xgIkZ7 zfD+--GBLA8B<&$aAcuuvY!$v@EM6ngM6%DSIi2&Alh}m0X_n+LD#r`rZ+TtwuYud8 zhp~Zae?Z}ZC6}6) zx5U&Q?F;$MZBk@h!HMC`y5~z?gX^h;G>K2=c?2-bUZx1Qyro2?d$)yyZKg53t@n9? z(b&3dOOEUr39qEA3-4&Wo-hCs&9K4Dwugh?mImiN5)uF2duX+?&BT55_M&B`ght5q zf2~ViUTG0BBV9|)!IGaw>adnoPGNss%OjLT)d^C=2ToS*MQmSso^WP@cSI8eCFw&OSK4qG zRu7d{F?}%}ucXkJ@M!4+{BCVCCfFem%y~;`6GeN%hQFn>f|s!~O00&dR`D=aI@cWk zlsr7|7lw4MNo!lP3U~Rw!2rJmXjH=uHR?0hHyI|wQTSmZxC2o^ zW$s<&ZX9MlCXNJWXIu9+j>lD=I-$Mc&SH1t@eIjq%DUr)nY+(qSsIpkknx%7DX68f zjzEUS)0yu0tOx^4*(jl&k!kqnX9)G(yDHFlzTEvQm3k`SRvQPtb(J{%pDg8qyMciZ zZ+=a1_pVY)25pq>=I+H-V(}!Eu}N~X&AQ0@J~+Te_zI(J6?j)?&pe{0e&*C z{`g?lDBIK%p_-IeO8nG_#6C~RxTiDQ>Aa>kWe)P9+Q_Rqx=X`}ooPNi+qk*yZR3@; zJ;pV=Er>E?T(M@4apiNy6%?I*mnH=6pXJ5|5jUIoTf4`Uf8;N0%zB=G#$4S=4CaA? zxVLpzbeEB*#at5Xj`yi-?6z3qP8%m{{gBK3Rx%t2x1rZY51&jGT! z0p6@h#InWi%skpaWU5Jevvh}GI@wAQ>_aTct~WOWFZ(`$LD<#kqh{tC)XA;}^OG$Y z-NQy17|Fk2D*xKZY?Rs9ZIs#g9-~#k{}}YpriWvbi$qokPq8T9&aauAKN;MtkzyEAOUo zd6$`Ot4qeV`Xj+9ljl9w<2O5}l<@@@zZg;YHOe}e2KXqRTOO-y<4pT6MbobgulK|QyisOWPa!a4Ja5QM#!{0*(e$hE>drvD zhj5jRndn&(q+qlP%Ld1b@g>KTAM`U?#PmFH{)x-kYu&hyn2bA0#Q$S?9WfV1%RlND z!%l#L`kj^j{cy{3ZHa^`O!y|w?())RUc$;=N<2Yi`@w9IFv2$B9uHD3G4rwtvcqDP zNul5z*A-m0ahbGm6vtJFqL8y%TDZRxg%D0&2gjV{izOG9#FBFYnUfwPDxuDwT`ipp z?luL!RoSNGT-Xk= z43q|e;^HsxN{_D-34s1V9|AR&{W-F^IalzviDDrS0kaS<0UCB3gv32XLz#!^sBni0 zVFU~1OUtANbPut1Wp*rQ9JCHL3clG94HCcVyTXoVAcycfdXqFY^{q_D-FlYeqa+}r zLZTC{?T~4)Z0-dvUiAy2uR>ve5o^K3&hQ zETFn!cjyEG%GC_dGjFcg_~xi3Kjd8nX#J~6LY$dVZ_JKb!i``FA}U?^LfY# zo+M;#seLggGB(Ui?WTx{oWYMPamUr{68mAD5}<`QYo? z-d-ScHRfV3ZEno0|NVP{%Pq?^x`U58QZRe`KYn8@aXv-WbrnXUg^#GZQtQS|b5&iL z<(XMR;7P;RFk6NyU$mec1{bKlreyw=LVtA=;UZTNO~9L5tQ)(k!YcM`h2@DoTcxfj zRi+)5Wcuh|g)+T@P72p32WtUeX2h8`eO)XQ)e*d=WZqA7_=*s_Wu@%so5~ksY+5t5 zp_p17)?1A%C(61)MEpXCCBG7%)?Rob$eI|aEi zlTrr+xo2nsoDtMmWGrzB)!pN)E3wjrnKOPXByv}2hHmTSK3s02WH?#fEg2W+qfiqq z%ltuuuurCyNfft(P_no=H^X{TWin+_WkxSc-lM03Dd?Zu%oB!|e&;ixm*pn3K2=#wIwk3c~1#wZrEwE>TlUtEZP4b<@j| zQ%k#3g9l&nq70s)Wrp8HVE32-GjkjdCDziWr&x~N971s7v)8E(WNr5Gv>i%h^ML*! zczZ=Nl}Z0DDG{<4AerixiKe=tLPTK^%VIZfo69?8GFuf8@;>IDRZL)GrN)MY=TGxo zeO$oY%Mk{kvek&*_1^G?lM(zx&ciz(!4f7M6AwvO_cPp>orT$NV&_Y&+Hb5_d@)pS zF0J!&Im5mj7ERR+*C1mZ6bUqh^wRnZ{mB~x5p^J3eLc(DKTx3UHI`bRS$MjRx?8Af zi;d;A{@^|%@fe>6LVCRIV+~NYj*ZE#wnH!T*wgvyE564W!`Sf6NyC=iT1nduf6@c|`q``omqRgqu1KIAsq0eL=(CopizU)sf zaf6rVA^12dhi+avT>@Qs~Cegm%TseZG=C#}TTF;5i z`+vyYf)f+%FN#N#JZOSp@xe^jIO*HvlOpQYKT&WI$IdVqTAV z(lTGBXCbr;MbR5GRhJEJidR*xNo3u(kJk9P`OR#ay9K?KZDeS;eZ=OTtXwSUHOnuW zSl*RQ6Gkz8ePy=tMb#Zmw3TGr`O3T>r{XA*3s0QAEFaY>=odabxAatQp_?-D%qhC7 z^Cy|^nE?Vh*xT?0D>YGf)ADqCZli~LBlNIXruRBi#a2nu7|%tMf^Wqq(px&_ zcjSNim)8A@s3{X6EDx}LI~(n?Ex21jgM^i9?iT;Ca5j*UHu_NZeoS0w z-Zr}a-4fV%Vs@t|`z>fj^T-M~-$7v4dm5JNG| z3dbTeMnoISa}iqPEyb|GTl|)~p+r0E{fqsc&E_YCEcJO`V)EOr#)T^Uw$}`6mn=6+u1qH5tI^||oEy*eSNO0Egx~gAH+1!nZ09h` zbB|j_w#S%NQ?kbxQ&TeA_?yD{UM>p>S^`l*kzlW}_-5Fv9ypRao6v|nOhWf?N^@W# zeFL0Yct-b^xDWt}mMjZvMY(MmaQig#=q8+bK=3>sXNQTu70G!SqmHRtnD+@NdX5yU z_FFe}ikK|Cc23k&H+Qy~xDb2wYaB=+tamPXY!Y`YbRn9}nmXfCH z-Hw-yRuMpT5)KgpCGqfCRB+aM`Kmxz*7|My=J2O-S5&<~P(_MIy)V(Ac^zGijSGm^bkzOLj%W&ADMAR)M2)V;KGraJKVY zhG^yBM6)3&K>f2R52;HCkTVxW43S4=0`x%Uv|h=(W3=eRBKAw3Zp-sl`8%eY81i+Q zho6%^#G8aB=BUs@QM6D7@05^b=2&LMYVL3`JTXpR$1)xciWa`O5OmTij=W+spqD|V z?zecAiZUURVdH+iP5~zIkA;VZGNyxtOTBE@VlKD;FH1>qMpsbailW+#GYK=)l;D%Dil3eHQhxsn=_-Dt02M$ zy`oBw#3UInLU|d6;Nsg&LcVCKhRGXAawjWU!=h$pEq9GCTg%HfpUpOj{3%nq=owp$ z=>XswEda!205$WijqhbO+vxF2ku9j-Mj?_K#3w|^BD0JiTm2xmo0ck?kAU7KG;sg92PJunx3SRf`{~@c z8^66=C_ z4LXJ%pH?ykrYb-x2$j~WcPurvgp>s_ly6F)jyEy)g^`ILlmVo?Xc5~yc4P^Vg)*_I%w@D}p)qyoL`wxF{=2hwB2QgCrwEovmr|2ERUO6yZ+s*| zk(KByN!Cu}rAiN@h7P?E#>`;MShDrkLO0!POh%4ihr6cGrrWMh_or5 zj61!V%Wv1l8rvjBZVq3vVX~UWe1d@$*8&m z?z-I*YRgpJ?quB`Wdy2r;{4IlFSu0g#O|-au9CGCdY$aBBEdhAZ-XKcOIFeeVJkA- zG43DcSEy$O)=@&MEBZi@oAe-)zW6)N!r8{#X8D`RG6xavFMUAjC!V@4Pmsa}VDk?15zS(S(v>2Q6BF8MS#B82|-akh0~y2@)L48$Ym9P%(cfY{cChW_cEvH z7Q5#&vi^)W8ubRH$w1pN!Mz=#*9zLytKA4U(E8L8cEdC#+DdIe7VRohVqhZu1D1}P zMpA+`!K}Wx!f5?5Rimlf0&0(0Jrhh6KMm`NZTPg&;Wg+V=E+9^hAqep3h zJeDe~PyIT^6-Uq6FF`qC@=XDhh+?}W9WGDDQcr5+4SPEJa1}-f;K~qgwP_;rUHYMi zBjWB0+-NJH+Lk^3-oGC!l27Zu>uztzoT7WYA@gtgm(+mNusqu`tKQI4=xw|}6_$6H zo}-_puUzl6Hz7J7l%{zgdG&lv7`2)=@|>xjaC1v-&o$ z?^$LZ{%30JVr%clOjXSD)soDjlWgh!J3J?WS~0R4dVT~o|MMlVS)qTC7#8U2!v7}H z?G14@xRHmM<*1rjh6bLgY)APXX(PpV{Zc7DCS?^QYs<37PrqfXtNSEc(AI$nRVv6} zph2{uGMm|#*7!eG_^Uiaj#3-#rKpDyo% zYv!+ZRX6W*(fpO)gbPgTMn z1z%EExHG@BEq*1MzH*<-c4q!rm&bRx7nKqe42zY$C9)GvcUNxdIgNGIOf6)6kaWex zT`JsFR9)kZpT*M6Tu2NYkSRs0kzJdpS|U3(m>k>?^}5VnM^v3BtHh0T8cbf#R7&?D%l%?W%H_J;VVX`Y-xjb9cj^$ZsxJqubi9)d_O z%uyo+Qz)=e`StlCIBm$h%+56(Ptl(ti22}81B}CFk2WzsO1<)N&IC@MKQ_0q5ax0M zCwkhN%ZH(Gri^dcY6pI3Nm~bHEuEFOmLf3@{O@q`)eMoZ@OhI(Evnwi$yWm;Dksa6 z1sk}JkH=CA1L5j9@RGN=lWiCQpNUXz1`F|8vu}#bAokc630dP46Zry$f~aRYGSwGE zruqU{c?&Yt%SOw$c_(p4nX7TWx`IV}oR+2P2Fp@oJ5+5^b!|?T>L^LF#ggbKw((gF z4}+|!B6qNB-mPYE!-56QoWIz}4vxn?T-6?M*X~x+%b2q1WsQYYEy>nRM8bb6yNXrN zGJ~%hi{s#@0OJ9=B$F)T)h;-lm}MFA;^TRtPl#D2ZzZ0ZkvH*Lh>_Z0&$gd9*fU5- zu_co>UJ}D}m53+&5*a4iXrfWeI}Z#5AM)`KqCc5rO;R4BAiX6?;$-HosSLe4L2lXxmhfWcZK%(2rLtk$5KW6#EWED zW;6}4)tBwWj$a(yH*W_LQb}gtJQ?4*%x?WFMgX)Ahf>g_W;t-jFkuOi0T&S{1qHa2 zbaw)8ftFy#Qm#eXDC4@xE)QhHW+If>VcUPgJlFZxoZVArp2o}#BNtrsU+y@Vy+W6uazJ&7D{tW|Ha zI^N5j%S!*Dz*N1+KQSB1hGGHe`y=<3S(QTe`R_Y7`R)N zO|y+#I@$A*qY{Ks;U|eUDV9j<;5mXQC_G-v8!C-GkZA}fixR<&^L9r)+pNTE z?)Zz{F}}`Luv!&SZ`B*icgH-tr==$S0-G~)@^1_%k@d#U(-zv3q@$@~{RvZbPE8fH z@?7h;hM(>1w~R3!%kzSj$hhNgbobc3GFo~hCnv4eck#AVgUO>+LkcYmGs*_();r90WkU4JJxUX=3cFDbPB z-6XA)?xE7`?vC-ENj0NYHuc2BZnO%)ik(2cWF~%pV15*fx`W>}%DaSg`L3i_nfQmB zm~s$&D4?7&9*t1m@5s}X=_WOax9<^@FfSbja}!$-I>f8gvmr{jx;CG)7`5(bm{FWfs&UroE4^ShKB`fVZUZIOVqczQy9_L*=3#;cM($}5nY7_O`5>u>)%P8h=c|c83V|f=m#O5pzQ#3W{>r@NCVuoNZ zHU%waHid%D(PMrIC)^y_KtVY?oxRNP3u+o;go+&cd4zX$rJryi^g~F9o+0RmY*iZE z1L=peUN&UDc&5-#FGsoC^wa$W^U_ZqpBFdaJ{s;P5BYpjXv86pb9hgq-pdTYM!grf z(j7X9XNN~UP0xqmAKQ&o2eA_3ONTe%l9cxuDG_p_H0k|LP0Fj055lqwc+=hYmf)Yf zH8lQFSGN!L$!i5U8af33hU6d?J8pVp7jiKaPA=2*x+vrQOWMz-Rd)%^-P0CQcS)>U|h_ z<2$HTw!HDn04;QX`fm?7Hm$HSOZ2Ld#s#+xwKBca*Sz1wPIB_%62dSOZG}mb6A2Ke zf~K#bHoVkjWlewLma&B~3gZ(MudUdk+SA*8=j&>??>JeS!pZ2^nAAGPT7{k zk&yr@Ifi$AY{Mo^Y~UCB`@T5fxjd22@*mCm_(Aeyq~-3u_wi>Br#=S*A)yqF0`1Zq>fke*_en=1e9xXWlWB{}AdWXyj5J4y54)L+mRPW-Xfo>0 zl6`&?LJDsYUm|Y35*@&nFv%?8nYa9aG?3DXNXmlbkU&VVwPxXUfJ-_cmV&d46@+%C zcSuen0hfhbYr**LZG*B3!^zNCD`@!|MlR)qpb$H!p|KJTE8j(K59zOV>93BMfx}g| zTUjNy{HP;_kQVhN-YJ|{6+a%PdUjNWfL&KpRW|Jrcd&VF<}~h@R1RG#$`6`%f>%p zW!uu-C;>J8rM_lz<{Pfg8lT`;hw=E1ljqsbkL!P4D9<%AmLlpjoEzP92f zY59{J`7y)C5ZrnQ0k)LVuQ3G6zjRDtIZ^VcX@53;TwmuUYM9Qudwy(p*e$IWy0lgXY?R;Wga~1X2c-T5# zgzAe#WqPG0OwpH`SKeeZO#-PHunNICTGcI#BBhd$R>+y9Sr&8h12kQEYM zmJKI0JF`Gt>8*@Y=p7UhCTkan5Uf&%lKV=<9GFqpG|i+>`ulmZRGz)xX$zc z5TJPz!N$Z-O8m!7i$7Ega~6Ns@i&LRx%@4pj|`I6n{B(cV^iT{fXNB0b)nJPswKedAm>g(^fX>H&-4bonmU8$yOKp z9GKYb1N1YE@FswX196}KbIKkWY29tq`i)>oOsO`0*n?NK5)&9z?r=G0F%fxH>*Yqd zf@|X!5&gE^m{*JL-7t*uo&vXrXV8x?njAsJ{`|0;$9vimwLZ+nUU98nmkEl{SL>Aq z8g}+v==Sskr5P_59{UqQhBRZ#%bTzFZXPcUP{(dyKcY;ofgRb-M0S|5c#5W8v8g~@ zcxm_lSDW&({qAMwWZ2K|3m|KI+Z3o4PCJleWeymRX^NYjEa-R|1$1zh_*qyautZ={ zFT4x#sc;!BU$rl*xcnlQF?B;(z3hz6aU>)9Zx~?{tGW81K3GsXT%rc>T&reMtTL_)K$ZX zC3dqo(8v~r`l>|$t*JgA3n%Z<`nqhz$@K$(Q$kq;b95gb74MqVDVJQ;o3-vU)m@3k zCwxfO>#{rOtX~$Q+-JM*z>t%8*WYle=rw-U3}eM`wQlS7>_$(<%C1gy_;@;R=ic^$ z#w(lO8>i^=#b)BR3K!0Hotz=UCt(MbTPoLN67@_*G7_*-=peJj>1CWU_4c@_>I0cC zIgd^CritdqxX)q8-ER#OS{Lm}YISZDh6nS!D`N*u6SmCpDO6g*ukTm3b@ z-W_6+*_`pTr!(Fg+s3h--1-2os#T@NWFNbMsbS|n7~qtSFd7aYx>!DRFCSvNry|jD zAic{=h~o|;k@mr1hnvaz3YAX0V=RbZ)-(0G97*0*LS`(6wuUi{#arOfsLPe!<)iPt z&&V(n7+Cl~ta<(UG;b!q%A+^CKgn14{Bu7V{P`2?2TKll@SfL(z^5F2Q2=o#P#GE! ze5ZuCdV7!;AJW*vG)C@)?d)aBEX+CNg}Zq{Hn7zCbhi)xQ+sTcK51yx1=}!V{`>SF3Djf!}>0Kr1jDKmk^lW*hQe)Jy1G{lve>WU_ z4h`K6@R=BHFpe-huxk|yk6JGsV@i@%QO__vIeoo5;&gm{>VWB}viqUy)A`1)_0g9= zXNYOh{fU$T+8IIxOifAO$0yoT^QnGV2o7qhk|H+KAgvL39RLo;JAvX2S$gA34e_-;Awi zv>8MMUt`p@M?IuGZo~SO`O&FfAubz#K4JIyIO$tNTgNhAfp~;yXwEF>EUn#<32`=L z>Sw?pTfc|t6MCB=J^ifoRPaJrQA>iJ3Oy{4H^iD5mY%Pc1GmUFRgoL#CoDB1AblSr zO$M#9248sTP1Em;h#^3}@h!1)a1dK%32)DMhr zmtJlLm+9qUI#`j{!Kx42!OslYL2>^&q=OYv1}fmoBrbT{t*Zg$r!QSZga$33y{swXfAfHD1l93T?ak0#jxC~(!ALmY5Cee0kSTW+f->n(vc&3u zs4sE9!v|0Kl$5|nJZTRmu{Sk3<~ntO%v0jFVsP$kHdAw*Z>#O^>wx!V5cr?H%f_;? zL}CD`j9=af1R68Mi+GyYQMh$i`Saakc}~3RvH9Y1-W;Oa9=g41^DekBA1P9+65BmS z%V`V|b97@!{wb3WwVpr`09pIb0mf0Fm$yX6d-6rS!um9l?jG zc^v{$G#R;$%b5@8%Q-x4giUH}snfG?aJbR>5G8g~GXD>7C$Y04V1Qf?@*}2wvEc}! zMG{rMpI|n%nbbu5KNX z*zYx3CU8%TL8%|65h<7EaD4ySv9ix?v=m8QMtTYFuf#5x?cVB?n3ULk?S2T$GL{H? z>IGQ>vzG~Fp2zz`%)6k=D&w*By_;BDf?ayaY}NCUFF0H+#_wc3>`Je8HGED4m<03G z@;iHeeYLt!*jeM}f*Tc?5B3;S(q^z7_PQJPYP3kWq|FSYYE5RrN!~spfFWu+h?JAR zaCOYnm6PvalUfuMUfKODW0vs?=5?Y3)W>>0`3&T*K9ll8YIwi^gT*fB9qC+}?nm|)<-=66ozJ>yP|g8NT3?kwRplKfSR zJf{y4J=#`%8;mS$_>v%azWmb3lnv1z@Z40o8k0U7Fr{~S1Y3>AT52DtpWvEpChv;q z)hTN?Zoh2ujd}Mc_8r%72IF;F=&uw>J~^OLLih8ydCx{u^>d@CR!OPX=`N)2^{LcS zeuM&|Nq01LuY8L)B$QI`aLQg)fRjd2=5d)u7#Ds3g7YlOL}?HE#Xkk8n~xfkv`Ko{ z*A975#sg=<9-kt!#jNRHm1?3v4w<->9YC`>C39#HNyER+ehN$2T=SO{;DtByI&i=oUi#VPm$hr%j z!U2DuzoCK_X>jWAnGymij!9L~M|Biwh}M)A;8|Z$zr3Q}p`Bpa*`QkCPea z_r{7?={XME%Aeo5OX&GL8c@$9Iu0gwdW3r0J=v}ZX<{@eyT8uxrB`F(A)e$uF!y~w zuo9%pZY5>%M%vw3NIlT2=fXsLVXl6~``2fIk^07Cx`8_q?W5AW3d_@;ZO&XUf+qR} z+&qz6(G(Uq@`%RO*%1eKof(RxLheXXKT5P`<1(L8*@3*y%XF+T546YT{hA-Pyt0oo zR?Wn(ma#g!;(~Ea_YcOncHZGZ-60Qt%mWA6K{n0sqsdl5_xjYY1i>}d=TJUEAU(c8 z4nb&NLX=C5b(uv7S^bDFYQ$-Wd@U$nQ@VMmtdTLx;QHxn4s8C`PB&_d4)efL0%2)C z6?Skmh@+loGGqF`6juA7GWpnlVRsowWgD>lJIjvHk*rdQ{V?CxX?}pD&@cB`@=kX6 zyuUY__e)gIyszm63o%wNRxB(L>;QS|m9tc3E)YSr`8LgF>sjMii{w4Uy2cg=q{Nbj z3T~_Djvj8bR?|bXv-RbZvDNWk_XN3zjOSUxZ3L7-&R?>7Uz`QWnyvlK$RcRQXpPGF)_f!IY?Q-emnOh-?66`giRW|;1KZHRH1Y|RMpXnd+PuId|eFrJeK zbk=lvd{OCBp zV{{@O=j6u|X<{Jb(S|?d;|K?M6Pq|T;*P)pBYxtAKFhX5Bg=VxAj*Mg=>O%LXtsoN zb~8=YY(NalB+ng6ZK8J0T8Vf}L&UyQO|6fQx3x8`xZ$KA#y(qF6N{hRmY~Q5>jRqT zOTRN1AS>PyfN0@-x+cn(dOnd;TV(W7*n`MqD>7nSgc;mo_jz8QN_jG19eNJ-wtE}H zX7H<}jTf*!J$dio@1M)}>qQ6BW|^TEmhMln3fXG2bZLh4Q=8+ve+pRo`eqm1H=szw zn(o%TqV7AmiIk&KiBncpq#Q?)i2JhAqKLauAQdmwTD*MmKDeJ)W=L9$JAJoOp;VkdmBgM_9hCXH(rF_!b&7EvMh!7;Zi~n6#|jo<PVQ^OuRTLiURLb9X9*&sc*jz>eW>P1!T$fSwJ=n!v)1ui5qh$#QBtzFjxP==_ zQAIT6o8+eYRHOBJE;!CQH-pBVmr&4}y`>O3>V1iz!Z$^CT{SF`t+>sTc-6q~swh>r zFR`!Cxbri*#mkxSEsg%_+bbH`n$mL|OWqzz-t14_USap+AhRt4HCp~C^G=|V-UfPA zZmLf*T7^{-Lf7Ak^->{u3*L;kOtzbNLP~TKKbKm$CVnV4(!}?<7|?`hH&ibTCl`(7 z59ifI0rvL5jp1U6uZ@Y%4VzlcqPp7A0tyEXncm#Crrz+p4yvJ@V!A`hky|Vc3fYg9 z3CAr2YRZbYNfUR?vZOI7T;;^nKE#+7;sAl)2=QelsE%*r;Dz5-NPm;wfusQ0d4DC_ zb3&zpR1k*jZL9XjvD&%1uY*@vL{-SP*BcZ#8)?6{FJ&Wbn_Q}>J;}1YV^xnaTHCo8 zFheqt7~$A4W}Z#vxdxQ^7KK~^Dp70j8Xd4Rc$QKesip z+_XB=bjXahQM-8Ht2_S~N+>xQgJ- z)@*zXE$KyL>#Iq5&`=e8a~`W7QA%r~<-5f;KdO*S1GUU!!{nYz)wIc!mA?~w&!~IP zDt|`a^sLFeI^63jf3p!o`m_)pgHFxOlu|Q!nmOuburA*gCW6CCpC1kcp zR4J!rUuXVC95L8)W(Ap>vyZ5RUvH?6O0=Dx-se$YE0GLl65p+UdJlL}zPtRVE&M_o zxNUgWo577nO**(5LtJnV!Xvw|cr_ZWQO!(@7L(uLTj+57io4@TQgRFrr@r!@PG3xR z0c{MHjqNR{s}Q$1`_}ps-Cpc4p{0}DLhri3v$WV9GFCiG!Cw5G1sOKCzhZ0GS)CWBi(oSqwd=S z5%=GXjZC1zgqzFaK1tpeO->0=3BZmDzF}SeZ5h2$_lD)Ulr0`o=0yE8F^ncG<+0og z*<$ugn1ipC$317PThCSbpIDip`cYxouDRHsxwBjdY!r8H2}1Bpn5*BPI~EAfalitA zbWqEUFb-Y`g9G>p0>E(jT%XbM9KBGNhQq-<^T<#$jjptJCcJ=-rHQuv(eh21xn41Y z)`r8$gn*78A20ADL+HL=T2S&p)y_iF4z6BsVL3ZaX=%>#Y<6m8PNx;6o0jkAlExEOVsBxLAT@ll0%_*zYsr+@+bPmcBiJ$ur!ZH1TsWu) z8b3iRorkFoi|RSP`BySiO4+!*DcE&ulpdD1C3T6OVS5&_u(&fP=yAz( z5113rjbZg|8D{mjooUg(0_v~%f^Qg81Q9B2%vqgjo*)2_7wt-X-}7vFI;mTL>gsl< zyrXTHRexL0!tkX2wP}<{6lgSdy&fc_ii%W=9KF#r>Nc9?i~tjPa8tu4L^Kr2yPO65 z5(b@E$mB$Wo7s-vj2*r1EqQoc?!n05o;>=DDm1I7oem3;o?&Xtbw48Wl)2;64jjzh z-=5r-AQfI7JZz~>{AEfsf10T|R6v-~j9BW7<38JqjMP|)cL*+R&udjm39q6sd(SG>Rh%&M{Nb0t_); zx2m11R1+_V)7iA^!Z`Miuf0{(#$w~y9jKjKV?5@qnT;!Qlrje!(PObL!FH}Q9wW`r zw7Fc)nH^4&I$}%XCv$WZE?;|wbQSZZ&iJw6QyBXavYyfp`9Xf9bKm6^rT&N?iP_Zc zu}FE$B_;%o_p`(0iTk9+Qc~6%k9B1e^5X0;kssfdE9dpun3a|m71&Sh#&QiUEppq% z;#!Hq+fp|7E13VYE$l?_N#n7$+2P>ohEY7at8DHZPLMjrN@oh~+Z!fec}_>vbMpSf zBV@Ao@zrYG3wz?7p&0kHgRL4ALG>U#UT_OjKd+Gx2z$&D$&l4!VzP3OP?yG{<2N4x z7BaaxNQ7o5y%(!Xneb_Ia#KV}LQiWp{!iU$dwPZL0P_rjP;KajlN$8ljBQsp+owE4QF z;;_ICnSbR`Sdo>tdOinIO_|Tix3}?JiO{w$V1m_xXl@YvRC*aDICB9N`{(-|U-TnEtyV8UeBy!M(7djwilhXd7s zAHv{B5bTZ5ILvVD?HFf72dZR-Y*>!6N0ce~q>NH`0r%xj(vTH&FND{JtDg{pz&@Uv zC)SRAG0!5*MfM!<t?@KN_OZj?;9biG?M|&1JNvSBdTbSNZy=@Gs`zrh!bXa$ZNnZgp3;x`23T5^fRX?gj5)TRS1GqPE-= z^8fzMd1sO!Qrq3n?*2c!e3-oFJ@2_b=Q+=L&htFyIh*2p`^*>`e@cqI?7Bg8r2a&2 z!8f&Bl2r)5kZUV&v675GKuUB`ki|a%x*&%Y=l_mCnm(pree67Te=JaX6ETQpGwgc> zV(F^EwW#qz&^?ITa~{DA`__MEf|;JA5X=@4%%VdGW-A19y(O4My$NQ~6iYDE)Y4#) zYd{%j%{GJYJ}fK^xsQvEA~8sqE@#e1n&n+QlHF5fzX$yHg+K_xtBjGY7r7h~Bf z_~f#MqG8l*PS8%_EI{lu8otzjsg|waC#j{!m&8rgUG<4DcFu{%jpniZU60eVV`324 zX$~Eh{II!!Ct_}C)W=*POzu5ZzXx_RRm-M8EV3!W5(`5o48=HvSeV>prXBX!F{c?0 zPk6NzILumSb_j;x{%wS}{wo=pk)f^Xob8W@N1#Q0{NDMW>|^32(??6OE%i42JsRTJ zkq`aoYFT5fz`)`x``xmR9q+-R+TPZE%ObTp3+8@eo%v7bt{q<6A#*-9@suUSuzQzT zMwb&KxyTdD%A$QMM-S9yV|BJJbu+ge96G+q!Rhg>aDKEpIU=WHF#D6T#|<6!*k?-Z z>%JfHO{)&zJe;KpNV2J0mnu3;ffw5XEg9Yb##l1EnvfyG$m4?J*x42tHc`&~ou*ge zN<7)eMjMpuW2J%;2gsM#QoWSrJI((}fEk4E%8HlbdoP($7y*A0WX_^BmH%TJ>?}*Qtp3TnY5ABN(5Xn^ng>b6@5CG9|J(>icVL=yvuMM=8x6SQq*3@ITv{MbQ|1w#frmr)65x388 z<`&VAkwr%SYott88~G!vvY- zqlS0|MOn{AUZxU0B|W*7B!(DR>^liPp1D`4q)Hp4oy*Klj6^=T(E~*4CnpFpL!9O+ zEL=dN_}((7IYoEUS^jv6$>OzgwLklm?l$x0_IksM7P7v|62==_cU;~-V8)9Mh`ME3 zWhVb;exocqBnCF|y?OQiU*~iV^oH!#JdKq9OItc~e$C=vS%`e3yCzzQcejm1q&xh` zAg{yM^z}L%cADj&5XPY-Qg(Bp)ASbI$2}OJy#*D?v>~Cue)qeBK+vz0ubMswWwiMI zH2*`DC4mlk6Z4HKl)S`OU6^|LL)cCOhsr^4-b2c!TwM40aQW)#$GM|p;Q*}ZOAw{P z)IwGh#v}W?!!%`%PB*O;xos$Lz}-N#A$NDE{J@NR)jU(nm_mYJ1Ol4%`20zIm%1PT z@WhoRoSyGp9qVf$^-(L1?NUXyI;4C+BT6qjsu&+mos~rPV5L%V@#nWRyj{3w8!<(n zf39IiPR?dN=v12Ca?P7U{+!LhvJwv3<-i?ja4pEknl`9)&XNlM?f(86hhC9=4j0+i zMymZLwaMO($iHjgdlyq+i&3P(o=Dl0!n(6*-XJ;e8C7_=s!y-R!9ZC6p-A!Ng*W11pN^gluYV>hl+q;-hAuKz3wjBep|4`d+ zu=Rkt-%`WzpZKl%o6?=V3`i$~IRJV(qMnT@`A#NE_TkgC?kyP^gQE2u^bD?ztYW}R zw}7miLOJmHbZ628V-_Wu@d!|k)~}Px9>1Rk;L%Gyc?J{PI4jpIu1z}y#u``aN6>vi z3N*0=IMVOx9OlLaWQdiGY|5t(r)m3O(yYQ7wUZqS?$`PpJ(JbV*Fx4{*T5FHJy~%O z``sD+XpySf(+a||rMjEB8{d~*KQmOm!xr+uPzo8Z)xGX=7?X_TdHgwM&G*&g1F=rt zJSr!3Jy)AJKLX~|F%2eRhg0QiNuB+kFU#xPF$uGnC5#*_@wgZ(f%V2?1p`)fS$JB; z;6y_B?rLtC+dr5L6(8uBj2RN$beiYWU!W}5ch5B&fub`#`D_HsT3RZ{Pur9PUOOhg4OgV2pK%IQ8&@7pWSOT*&(yPkm~$a2Cvn|I%WoaOyJZ+0FP zKj_TK3qDI(IBsVNn9P-9IChHf&2{FBw}H9lM4o11a)i|!|A27(K%O(d(R_w=oh*K|6;+dD$Qdj}XS8nj7CW77~wRCi-~^i3C7MXkyCQ*rZ~}D|f4j zLBV8IKXl?}(V|#lN=af$B+M=)l!%0o{dGZyQCw}^o)}rz)t(qRd)dRk`qi%zqi4oj zbN1}myfbl61NpS*P&w7PSA~=ttgOz&)Oj%zycjC%8%ivdd_K7K4}9dL=WlkgNSS7j zoRrRZkK!n)Fj?>;D#=QW9uzB^QC)X6e<##k!QV-BqlHhG;-4V#sAy!@+DKx)M8lA} zP~xA2)2l~boQtRa#C*vTQa5Q_4L>hooU}vf{q=QRcXRcMH6sm0Bs=r#=hKP=v!c{L zvrjcP{+(8*+S!`cIZKRZb7n+fY`r4##561@H-*5IgNGbG975P!q`~fm+wX$=Qe(ku zwiS_{hes*J%wORiLNrWjG?1RZVRW|KA7qg6`x;JrD)c5B)P`=Ng6R$2ReI5e?lJ;w zmy$s{p`**v+qtOoiCv;R?7>nuLWOHt8=4ep$)m56PZC@c+a$VtQ>B8ISkLn8i!4Td)O6Y*u~aNk7yLBa{s zXFQ~Nc0q;?fkALhpKz+2!3H~?h2H&7veDs4FL3k*?|U|=!Mj00_ZD{JEX7yorOa`f zV+7pMnZb)JPY)h@@wP(-uZXm3DkGvTLYyJwB)P}Prbrz)GLSVBo1=+Y}WQA6o)Z3@4 z#a9n0-6BQcs5&2BLC1F?=|a!*NnW6cD?CsJ3;eJo({Cz*CE21O*wkYPHrXLS*6u8g zZSp5vZxCXexKhSQz0wSXI3~+RB&JQ#2$UpTjnWz;uoDc{7=4F<217MWJ9sYGQn1&O zQDJ-!8`}t6`bFHG={a@^S-oKzXoDK2JO$Hp>|--b%&`wOOx<(rh{L24@)4ceewF~+ z!LvEKlfwec8=-8>0VHAgM_%Jksh7xD7V{Frl{?ar$@X5U2`1@L+K0K^2L-bSrFKV! z%q7a-J-hth|t%3~1^tpMY#8vSsH6HA<_yWy%siMhEF15Lna1=p8oZ>}@W;WLQjy=&T6 zjP*=QibTXKB!y!#MvPU-?BZ%;=q4p@nHk)AT?U%k)`u3^2)k5w%Q`(}+$RN|oG3k< zd{@z*Rk7v?Z>_{t{+^7Y%@b~0{iV}97C?Sd^s74)GIH%(5CeRQQtdK6eL|^r-XTi0 zeQ$Rw)&7b;Z55O!qfY~z-C{a3ELb*Ny+S4ruK~A=9_@<5x8EX$C&9JS>qn7i9V)?H z2VzAIQKroTC~0NdrJ2&x%CufWaZjUm#bHXm*_LcYxo1$M73H2xsCxl{J{j+o66p$) z@UVZMCaW<8z${>LV-aEDrpyBNaf!OSP#DfBD@2_-Y%=4E+F{h0-M{_h#al~&3-~}{ zInHUig{hQy^mei%c`_=dUlMlbt3t7n_wtOnS5_6+SsP*lacI;sV7}4y8@{s4mTg+atuYpYL+5K4vJLDyW}9XSjI6}fb~c+<9=R!Mp=~nKrk?40 zwo!`m`A@5Y9*vgufsNM4z^)r z7&@nya=f3M7&ocOk>tZylV%~Ym zeQRu7WVHIaHzfV<5Psfpg6_>B)`O6n5QdcgN#b9e&uB>Kj9J*+S>suk1N$3W_e1f5 zfqlLW<(r*(50HTU5zSs53drfmwJd%r$LDM7L?!~U_z7kv%jVW&Cg2>Z z!-1`qjgVc+F+tR^GC@h(rIfZ{kibd9jjXGW}i!?ZI42i*^zgB+IK3&6Juo7Xb*Z0=KF%3bHfxA8V%89*HtWXNBJNH^PO&C6j?&#Vk!%cH zvMY<2*v#vpv&^){#TeUUuTm^;EvwzTzTW%UaltDjqG1MDlGqV)?|hK)hC7PX-1mSP z`By{kzlr^ix!Mofv%i4R!R$a+a*?J7;qwFdY7V<=IYez%2xsKJ zDr{9-J95f@@`MU@hGVJuBVk;){DZJF@`E&f;3_ccdp=ULqGH(jj8{7;Du&I@#^1&> z1fl;~!&upbjD#z)hXr~21#i)K3)XwBInI(GXQNtz!?NnHC7k1h#}M{;VK6r6_rhg_ z`*`6m67K7Tzd*R37skOMzQ^zenuO-nF&yE;hc%Gb>~Ih6Q`<~+7E z!zu4XN6qotUWm$x8jq8XqtR^Z3T_F8)`vorQK zUPlMk;Ms+~NF z9IS&n$O-dqDDp0Y<~{7TbmY=G!BYQ1F30b-fT@L8;zT9ZU>uL}ZEoEEKGsp8OHLPmTL*(Tyr++07088YsUtxMxS}PUpLAPSDqi$C6-v%Zg~@-p7uE=b3kgLAh;_ zWqX#~Tl3T}m){cIvpp7gHM+SohU4JY&VuN-S5$LBL(JE*{A$wnut#OqQ z{I_6X!0_!h!3O_cim{NfQ7lx}1+(sFGKYmkkpy>V-U^Wg47^%*`Xk?M+XXP>AL4(0 z|K-2jZuEpX$EwALV2lSC^8iV{y~RLhtp^zM7Qzn!2pP)fDwWnA6XH;Oued_87LKr| zpc_KmJcvbn<)G`XT@gzTIA_3~u05Lp=kd*kc!6N<4&@N7)g=05(!&}S@Yc)V z$J~pH8Tval^fu+&50-8a=T0kB%xB5eJ7wu*Wa3hG@U!=a&;C|=SwXOLy<|`* z7XRK>6qcfE_@mqU+7OHIX(L@ z$qnV$zGpKt(9$DAKF}v#Ww}*ukQG0QW@uUN8Cj9imAaSbAp^Jj%{`#vUU5q`2r_~_ zd<;r5p$gU-VuGCN1D%3L{@M|Ax9O()@w{^92cnlY>E`2mi=22lazKQfoRXOBpA?Mm zcc$-%CG33-I^@oAjtvoatJyAQ_!%7dMmVQY+Z77o5uJ-D-VM9HiB=&clDM7c5E+Kj;M=Se%dIZ69ItmOX80=W)D#+^NU|9J!9S z9_;jmea|C>krNMRL^~3sdhVP)3T;J8JgCl7AzhnH@Q1`Iiz58!TTJcDI_di6N(QGY7YHl)S{lPq!`1 zI=eI$niLAOI=8>eqJfwg(7gl5<{WG8j(mkkb;4=hNC@ygUHk)T=C;t~NAW}nQShBw zUsHi1YZFZc3wR2s2A(?*Y_O{=g)6oEU`{P#F$mv4xT7|u`A0iT8Gt79jvO_D6C(VK zOnsrs{W2aFBl+uI0T@gHM6|OkHz{JIoMYXfEK*v_f+olz)1_c?>Sn;Wy z=asLWda5q87#86A8l2Ghv&qA*m4>7I!wYtZRQbv=K@+g}RN*hX!(f052v!FT{<&L& zaw@-m>rNlY&_FM;f`KhTU8WFdtN(K_IjYN~+xm9%*1CLy&zpBPZ>`_YnWuc_*lF8* zuW}ciAC=jwH1+J@G97{7LK%03I$ImcW)|0<3fenO?@@S<9;u<@%_dG6xtNZlw}PiG zA^MXxd-zW}?W17%$4=8LynoK7SFkFz%ih##G!&Zr+9LuoYAY@oYNL%01>R}^wBwf6F`mID`5B?}f1h%Lz8+8GMG0(M=z zyREQ(;)6NC+p~~2bZmnx;B#zDPW)}B zZb%3RH%F)2#T|e+AB(TZwWZ^cXa&{#HiZJOex?pAFx@pRq7!$-k_C6rhdXQ^)c!Ko zL(_%3XvE>WaM+A>c(GY}vs$e7o|$g1nhN}MD|nAyn3(Qf(0JPsA8c?-0Nmpw>20#A za5n_n%NLlzn|@T<36ImP1H;m-ekBBj)L4fC&sF(02DvLNzTCWSHtR%2-moMaaYMER zuVe;)>TnH)tPWtv`Tn%A>2iXB4eTy$QPZa3j;AWnUc0DLl&U-PF0TDXf;DX{X2W=B ztX;&|9a?_pIUzS)PJnU@!_b3X9-7`=tqYz5?Qk49)1w@tIbh6uWZ=W)8kXJ2&|lSu zpyU8e657zT3JwuT@D*?M@xrsk7YVGdf5~_QnyapoMG_hedxc`5@)vb4ckc8lUIB{i ztZ`RIu{jU4D{(SPQ7n&b2PpZVs^Hm`E?w=Mv5n&Eia({~&)Jrlg8Q4wO#PAa*~NpV zU0=o0@O5`!aYr+TJ-gdj0~QxI(9XL4@`WRhmYsOJ=<`99*0SM6ij+sZ&Qc-|5ZT#} zK*42v^)mKKg^0@*XX<4_B>Int5iL4C@tPutH zeY~YlVt8)X`qMhYI4qUpQdrVqX@Q)*nA{_9+%ICUrg9Tw=Rd4FgDvUE{JsGg?b;Hzmaz^!V_sR;9)T zR@hynh}z)Rj!q|(9OGj(S{qK-$Z+CzRmjlf&0)Q;HJSrvhp)=Cz}Bz_?Mo+DNDl88 zOqeRc1Kbyy@;a(uiPNOqJUhfB_lWW2*=hN*5lV9NhrOZEm~*@mD!Wr$kaNea%<7m6 z?|Mrlr+)U6b6dJTj3mt&Q@jm&>-p~1?7F@%p@sEVftK9=%o$+h5vR;~hse9OQ%?Ob zg?^{dISTDksQAeu9+Y-5b(rkO=zb6~M;iBK5jT5hXJ5-igcD;xue&NR*p=9Q6#e0K zy!U!BuPBfsdQIN-vQanUf`71~GjQlzzGJixMNG4R2=l%gT5O^@<)U7=qnInoc}xoPyi3!JqXJ2O&AKn9A&>X@K)Nwoht%rqEVyJF^MLnD>d^uZ7;{&%$BT$ z<*epaMlC(;F-B>J#ygbXE(~Cp3`&UP$PQcP#-AAVvkV6Dnan#aI>kE%bmsH=HU({B z1tTLx8T{d1ra8w`g^GuXRk0oxbq;XbnxC6a!=QDlp8! zm20|fv>53L{s=0ZC5qg=*_6Whi-H`RtQJXxIqZ^7NmI<36Nv&&(&?ZW&T`zXspY>x z?>CEPW(=c!8#(mV<2?;qJzWEGuHQmrUH=tli5Um9B%~k10_`vC3J$?(7^^~~CXC#* z&@mR@A#C35c(IU}Tq`hEo_&s&Sb*q}IGsNjH}&n!iLjUwJNb-zDh)=M^R_rM#;lea@Ru9Sv)t@6+rnyjX6W-ixk_^X%ZF8 z{-Dsj}SpLSXonAgT zN9z8WntH z`Pd!3*hae>*@yqM*5|)lXR_HEEG}1P8UH5J>x(uy!#5pl3*NrCO!3rRJ0ekcTMkVF zI(0u~#FnaZu472O16fLU0wto8ynumb%+w4lvNCnM2EGiOX&69Q&r0enU3fd?I7{dM zfCoyeR%huwKUWaCg)D*Z3-s15nL#nh?(mZ7>lu7qWYXI2L-_u~9^cR6`{Ewo&*uBx zJ-(mA_j`MMFX8(?^!WZIzTe;D`}utTX^-z;=KBLZz7ONOI!8BH7-Pj3`L@JrUi7tT zgMG0&6e|8o^Pgt2rG4J;3z%MxyCVnQ8i&s@{0T88W4P&l4CjH7k#JCqY0}=cHh9|l z;O10*tFNVb%iKS0PMIOYM`%^~+Br`f=f)BoUH^#myZ0AAzu4%E%NcBHO2ddbYluOOy$ssdAbhrbQvwu$xF!mo5{9iPo%T=R0m;4u1<4O0dKA zf#q#;YT%TKY87LkyP{Ys)_`#h%7YmKbTLE>dhRwKLR5N&cK_N_nVU773Z`*a2 z<*9vJD5QhThP$=AbH_r63(-3&lLJ-u#zQ_&;j{ag7D{^X#98vR5KP{oZ3L75;)VQ~ zyih#G8h3+Q=&qv-)3(6+^7rS2XuNIoUvIE&WY1>TZhg=9VrM_<*qa=9j>qdK474iU zr~iG*cZM2={|!KMWMJ{Xm)wlrX05aIF+;Go23`gmMqB8iY|lV%^sK(Lc-j9IK-Vv#d3lx4OxIJCg}My&R z8;#d!+sjDuVo5-0^a$J(oeA>SovGnBt?dCxtgq%&{>_l2@tHl-PLQC}PtluvFL`kE z8a~2ZeC{p)Y4*!;8Z#oW;M~VNNE%Qhb_{F*l+~XN5swJU4)*tHSRM^5cL?Kf{+|J+ z!OT$ky=L0Y`xmyzMo(tcRG$7#lTM~1^yZ!{KhQIX&YR}X&vF#AR*E@k#|Ehm14+9< z46Fl`m#61T8r8#07&DC`umg)Ug<|YjE45Wkj@@9ox=dxFW z&Sg-a#5L#RQ2>&(X6^_KmP)sva|o(!;qo=J^TUBPvJY~{HA{ZyKR@Y5lmBQ-cB6O& z?X`|k;b-Ugbni3K;uxaw)ogA%QH;o5UgI3mm{k~K;FX{vrgU9TNk)BH(m%$m57C;f zY!Sz(+N}CxY8P?ls-}$?(~zvXUA%GmX-;kS{U)Y1-W1d-no}FhzSp$1`MJ4INp>?S zQUk-fCFg&VdXaJHjj$@?sf2LD*_iPltpT$Q}~<4D&!`aJ}p;cavS@RYaJ9naOP zczZ?#hS5#-o$4rpgE4SiD5F}CYf2yXQ!&Dlom`9DWJP*Evs?#GIokq1mtc2N;WxUT z4|p?M8lw`?%M&mXdM@*xPkYZ6?+Dew75 z@43r+{@Hu(^`0Ml&n%cN)$8}3x!$wDdlq`nf!=eF_Z;j!i@ayC_taiZc3=O6VuE;W>vj#$~rxx5POzA9P0)H-4{#sow zG{{8Nb~S1YJ3oh_wg22aUNw}R{Rn6*X>ZVdjhfKyB4e?Q=^RAa_4&p}+K&+aQ$XyAT8A2uL#W2)DN z19-dNn~@;o&$$x1Az7(}2>C1m?8uKOH!{LeBsp4&tjOpuXSEucK)ZXFB3YR_5Fm}| zqZKbtUp=J!Ey{c24$A*%ZtM2W{FHB@F>D8!@ z(c&SVEttbnXzEXQKFDJCH}?F`hv_*s*_Zo!bUmD(={Hu{&K;VFSSd{$UxfAQ)?WGq zxP_!Y9^XG;&P0~328k+xPfP9A?X`JU!ZM0&lo86P?MD*q^%U`>JjtF1BTtamc_L+- zI=ai}avlpab}&(64fjpZE`)X(v7{%|OPxvwkUn}*k3op7hy}c~CeIxtfQw@ahS^1$ zBZbb=shX-{21=SaZfyi@TpP`fCAeJk*6e!Bz9wj9DU;gHjWBc6Y-&oM(~hWlcZ>;J zm8{9;E_mcr8Tf_4_IH`I_;sOQ7iz}Jb81r(${8wu&Po0=jfx}(KLo4$5c_${tGV)R zcaNqr&mRlm0NyaYMm(C{K?DuAHsUigz9w^qaX$?23nSE<`PD_~PV={bM8~7-@N_Qn zms*+2KX95B)AAn8UGR|C-o+1j4K_QnLmIpm_VPd6;Epu2&bsi*?U8@O>SbS~AK1L}$I3oGZ!uJ_2K(R=4Um)4}-wu)i|JfjslAxpG zARSF!>gz~h6rc`keN%_uJ#vSmpFWKa*|GJWM%1~}HCx?y>#m@0U1u(%yh-~V;X!_8 z(_`^qU*0FTiHFC6zgB67r=IJy+e8LE=v$wu%}xeg!0{5w@ciUu={5cM@^|a=pJXmW zEQ2iRi07V!7O~e@!(QW$%=YL<+G}Wgi2bG6SDKBYx4ASV(i3H02fq&KWPP73R|xpG zHfJF{_Z}q@+m`;$S<)XfyQrH&YJ?4L!@h6SoqzGvx-VQjqwegOmX3(TQWw4R5o^FUTu;=W9CJ5PehURt{(XA5>r+EjL4PVh4Y^G0jC5OmOa&szxP9Fk zNuVRg&}ri$G;p^!^*7O232@!iyR!NEMJ{bPy^GB^PRa?YA&JTY!|&B5;#owkiGR%0 zG%ZX#Jd9eZbX!F|D^JApdSX0(Of(VJQo*<%7;7RH8(R$QubrmhM8wDMZc@I5gq&1AL~$NW!hwhs5I*>REEYiF}Vbp;eK@UE|G%_ym1O#E0lXMq@=r zM&rC?9Un^gkQz5P+ZvuFDholNe#^3RVHf*w7QUWq*`<~4hoDy1imjkxfPCy*yD|F8 za-MC8x3tIiUf|6Cv08Mm*zl~qr{^JyU(nFbGwN&a+TkpJCwJPdjiU-1NYq&uuPHnb zA61y$`5i(B3FUN7pw??hkfnOZ@-n)yrcgJGb&lX=xW16Lvy7Ju^kptz&Q>gvq|Vb! z`6rpzTpTT#Kvs5VKB@cJ7oUziAo!;X%_AA6XQ(HOYjm)kPGeYuAb*?#rnM zu^$8P@S#|c+S>_2-U80hGQk5Ls;T9cf=JTcNfoIw+=)<~!tuRlIZdQaH!r?7P$qKou+pXG5~gOw zm#?Zjr@J$?y*u;ryWO1$sJ=(YLB@A^$QrXp&WXKq{-j6F_ji(0T2C~CmZx6cact)a zyfr;{3l4p}_RY*z0%z$eCfZ)rv%DiOfwnF23*3l+_`k?y+<5G=Z+q<{i%22u#out6 z?gW4rPj#A~qw~)49mh`1bxj{J9C737xX#P*A%EH>L};Ew>Hb;WC^1MiBtylMx;D`i zI(U?!T=S=Hm@kF3?HER4{MH#PYr{+5>itUrw#Xe^KYTiHFUH0LAb@;3OU2k52uH@9Dw# zDdA_Nu&+%#tg%31_RDT|Ms^~30@jbMss7ya z7xAtoi`K?Y0k{Dea`1 zvY9`x9rxhw)2QlOTWXy-)w^uz(S4?LO5R{frNGZv*i}6W`?FUVO{S@TM`8VY6o#H$ z9gnxtts6JfMShY)->@y1hRftvX)GYVfuHI5Ydl|fRXoc+1@2o>b7csdaxpWbvs}@HKJ! z(QM3X%hyfajNfv0H04{TE)~02Vp?wn{X%B`nf6zs@jv$Eo*I9oLV2k|jD%rCaFPTv zLLDlL;a?s`bO$aMpTxrn<3Vgxg>lC=6s%T9CPk8$-1E}zF1Km^$}i^OwP;P(cCrqx zRVuSbB~<7%|Cx1wg;n;^r`5)1o$Q}FPUPbecsNn!7x|18%t^zbq^k(abh^~0J6q|R zymbGfbiCKe9-4eVvH9vN$d@FnEVzEZ%}ZA0Wt(o3%?XjLmax~7V{HxRQ*&H3kK&VR z_F6btHTCyuDz!zN7$n_kguR-yw39tFhUfw>+V9NkqiAvuKH4rRe}Qh2V=!l^#YjZr zv#OQt85#tT<f22C!qTzLD+s5OsA={I|1o)L_H_brSvHxp< z0t05ZU+y`1Sy*DE3^s1;+CkO3zeCkGDoL`>@`;3Ru;FLFLHJ4=Zo8K7r8d0!YQkT! z;qQNq@Rw}(#_@!8+Sd+#^C^m^-CuTWyB+&UqwF`I=mKXqmaC}LKSBbe`XAz4)$*ZJ z81*~nw15AMdOFzWMzd1r^1cNli%4W?M%M2|Gdh+q8IkKv(T?g1Pd*Q-q+Z%)$c~B1 zBmb4;?|jx2PRYm3efKoOAIY;G7|}kQf>(?v%Hmu0ht73D|A)@k`sDof6e5le6_V-YdFh5;^*gn2)RfdY zv98ir-iHmGV22---Mjem;Imla<}C*S{QJ zuh&n!`1|zhYv|<_I^cF?#Qh`Z+ZxPBd>|KS?gp+?Wnay4wbZ>7Z&;wll}aIRS66df zH(^f-#gZcjFY^;0tVZ*DhV(c&fMmhcbR}1Sm=?sNSIr={5XTF8&X~GD6(qXa$VgRONQHNR%$1a<|JBe*|qIc zVHCsLoTVJMfEgVSSXbvSUsvxWt}5*8UmKr$vTwRCaXlx3M;0&F!Efci=m!QmXjABD zv9mPX&X%P9c%}B&7xF01sm~)5CvFngwmVC&Kbe}JN4~vWN8u&%IJ!TdJ$!BAs^ZRaD$CTA zx`R@jrByB5s==z2GyV8wJ^)=?-i}9qgSAKtM;3P$*uK~(R_M{im{!C{>CCUD4NlWu znu*j8uccAmskwgRZjLE0_(8*$wM4EJQ3~%`UO_V8ozhvEA{w$?@aj(+=mgu(W%oW>xEtDE_SEO#7E{I=&s0iiT=#tcR_I;OqAC|g|_uBZaE0I#k z=^s5mS?30u`k9xJgSFJ&3DktH%IxdCLeD9Pmb^P zJMoiD6-v5uxT#{RmvpR>mXI{~WZirk7AmWH-k{%3n}F8rB9sa!oy1qm2ho|JQSPZR zaWZkAZF;UHMh>n`TwmPrYhpmIss_$q2$^56NF(!>5T(6w45bP0>BsX=E|^KhzE)5- zd-_n@4xKiwr)aW%Bh!$DYRJ!(b*|02QXnX@Aow{SY3$=Rb!ryLScJsd9Ma;=xAhnV z({x5-upt!?fPu^Do&j?i>4+F)6piZY5F5dw?xmRjwi)J?II(`7D3OM2=eAb!)hT@~ zaeYCmj!Tr`O%vC1HekTF22gVHxa!aGFg)q#3Qa<}XnO*9G5MXQhtq+dn}DzGCUe5o zxZjA+)e2qhRR#YMHdSp*y?dhOp3`)Jt(v*H$zY7(K6dO7n5$Y$4}te4%Yf|TM%4aF zpX}3hBag($NXLHaq!)v8ZQ5q|7Sk)Zwzmk9^aXbI5IvLnd7?lt!!p;+vF!5W#Nm__ z5hz1be`=};|FEVoHP1-)IA02LWeRXfEVlK`)U_l-9x_t~t7Et#+sjfnnJR-9+T@+r zr*sE)`V;1heQt|-pF-5B3iF7(^E`I)XQ|wiRa{Pw;!fi8sW8l{y|a*)(=W9zrcek? zMcoPfjc^eh=TsTKW-`d8u6+KSJR*m)*(e@iyj7 z8-q%C^aLC8yp5Sa3{JF_Yq^b?L=60pVji+FQ;3;qWA3&wfMsEWS|HQlRHKQsE2#^u zB=WS>WFpB|lB%(RVX3d%yjqO4C}Zc{nS*45^T1{?_s#>yIN9E!q8nE>@bGwm+C`V2 zmzSkqir>8@d0Fef1Yg2$Dens3T$-1$?H9jcwWv||N`^_Sp234?U76&_2JI%Y_mDPf{$;A~#S-3_|bCLsa zw2;{*a}FuXrmxMUpWQqC8?W?CkD*(nYrC!3`)lvtj>MlF1_7fcY}sF_N7#B?&BdyC zW9r8PMBiXQBY1~r*$Phd*r>C`L!2o#>Qu2&Cy9+x#v8nhH}uTNexTN8%AMtXuI%|4 zA>2x;*JfaXlr@tqcZ9|Uu&i^IPMaFol{&hS>)s$FTKzAE?O9(Z2gHWzzjKjkEVW-l z@u@!)K)P?u$&g=4?R1PpR-r!H9ZjGs?HR5_UecYW@%*)1Nt_Ucy|vnMB~!R<$Z#dK zWe@)Y4RD%&rwmI+O)X!~CD0~ZIngZc>v++E&d_y~+XbD1b`vyU} zjnej5&kM@ZX>zD4H9%>8L7HWDEyq_hm*AZ7iM9MknW9$^O1;#7Z&&9{VA(&A6^NZ^ zm-3gD3OS@roO(>DqG=c$4-B}w0~ACtf#8)*nwy9Cl}>q{fh7@pqRo(@#{H3Gx|%GLJXJ;oN-zD^Wawm{|x;}zG$}G_fig36mx_zR`YUm*UT%CtcSk6 zQRN4@U?#BszCB&$;8Hc#*g8kcq1idV?>v{J0g__VlJ|K0Ik=|UM!;K{6tEPPeqZm}rEjfA_ z#|sWgTFuKy3{hVYtahf-u-c?K(G9CHn+%X(rRLWll2+^Ag(K54FR#cjjbnJoNT_BL zzEod`q0vniTontv)kB^wyHfN*q5jzz@cR3k^Oqc>ASU0$AQOomyycb7yO9ID4G!t| zGQU4u%=*bsVg1rL6?0z?Cn^U;6JrbI8QAzyWaq8{Wf6*m-HwPmv8?(IKBI_vaPQzd%Bp;f(@zH|Dc{GCDUhK++pbQrqq>N z%`()uQuSE9#r1eOjU=8ZP7xzfz#^WhIaqn&Rz*{3W-7bZkkZL07kHmkcS$3P|E{^y z5hAZo)%B|9GOwO@w;1#cL;Bqh!^v-U?RnF;n|U*?6X(i*KpHzvRJ3~e=QL|5e(vBAa6i&|k?WPK@!P;t+R_mkAqpze+epu~{70*;R#)E2DHx#KO--L10f${O2 zwC$=twn~b5qOyWzbK&HlR7hL2(k)dr^B3^OEz_K<*-j{iHFwZ8zK4Up)qC(mJ1XhN z=&Z$E8*v`xrh1)6-$p_?fN*hIganEqLfVeAj(MmR#{r^YJSXxj5oJ`Hx)v8VkjGtJ zhIFegXV12fZ+pnMJ6!&kX&0#jQ#u|)Y^;_){QI5=^P^!!49up~>6^_!&Q=+=o$j7a za}Bh^hTPX`7rARp%c{GgzOA^qm={eB{9&wo?X*)odJ}fD z-5i`XGL5-7L@s*#e4d)>S`#ckFtyddFzT*NHLd)pO9zWR1ci$gg2KJ_#^C35S4UBZ zu47*^u9!L1d*u-K6`J)Sq81EJ`IzMW|VURDi;ti@I-9xI9EzSt->z}=W zDP&!WXcjdUH}SP@bmP;-MU28uc^&)j;({JdK z=HqcTM^l8tf@Rk+BfmnZHa@#}BAzYCq+S~Qa(C4aiMiX$tVb}!l7QCG=A?fTPSrZr zQfI{N?D(^JTC9lpcEys#CFwkUFHN3Z)OjwcI?qb|305oS+QQvUIR8+)w*9-;uKu<$ z;x27trcZ>1ObVJYQp$fNyU7;QT-ccU=^;5$uglRMIp~iWzS-#^lQ|BF$RYC+%YlNXMa32rKVX`-xOk8f`kwPzFe+K_g(?ViRdV3am=oF>^I0D=a>p}Xl&;zn#zh!- zIbf>@fnO6i0Fx$uQw;I5h$#AJ{BMOk3aBX_bXQTCnRZaYY+4ld;eE^ExBNtb&-Fg>E+Pyy1cTiKFGx zfp1e`5^QN*tdy@#T`s-E%vAMnpqXo+k?rbu+B)I7p6<*oy)>lK9<0(4>&8Da=jmTC z0*Q>dLrZtt3%59m9K{}jxnYQ|I1x-A1hfgMaVyE;%^D?wbG;yS{aaWDCI_^fC+SI= z2l*9mg54J84%~R-N>%3ZAjWH`7=qzICiU1uNA;aNR0-; zPFq8$fr9Evg2{p*jr$BO9jH97zG)h9HPv=ZCpwfI-L>bHP-1~uZaY7pY*yM(dCQE= z?s^!Y?UWJ>w6pmGdxh1Q{q5PMrC=8?Fbd+19v}$*jf0~AHz$YOcS6a*++JWQx)5#( zD)A8M%m3iS<%yILnJ7Odc0#zX27N1)Z2TS;p@V_7?#scz3y{Jul;bjHZ`juCjM%KD zY!X#mBU5V8;GiX?k>ofoKl43b%Mg@s@=XhUny}EYBK3UH(~OBn?-(fS5j9vg9eVdu z51>D36+LR{ZkTT+Gj$@z(Xh019&OdqaWXTuJ(%==6-zuecgHiytMTIo_{Rm_@VyoI z$hU$>ymSdggg|LW_mWfpyHa0q!AL}G&Pb~Q+T$S(L&1CkU7VaO~sm7nR&fhf@rAh zPrs(hW5u&YO=Z8FKsUqF8{3) zucss?jwLph_g6WF$}%C}7m_xRi5(2t4Z(A_(!QA<%?NTzb;M?Op$ec|6R2pCVZ(4G z!Zjkw5Mk9@#M5ck0E<#AQ*6>24nvG;H31PF@j&IZo~c-r8ciBQK#tF3Z@Pja%dUrn z#0ZE>(N%>Ww?yMqdIYZN^q9K~wye&wOv0In$1=fJlA^Q2IL;!c`6ia>{1THv{8CBh z`Qn#gniiW9M z!%OO$vTyx$uk3Tkp3WxTsaLjWceeX`XB$ac)9NpKnIrCtP^~FcXiA_qQ?aRXLhro! z(ixNwBDMAdy8fYK17>wdYvjl(r(}z$k(`J7d zUu3?$LA>+Zgd`EEg9Y zQlIr!okE>&T;GxaA*^__3PaB=W|9g)&qmTs5Cs9Ho;D2@_!S}I-a>;+NmMdPmr{GP zJ?InXNiX1`7FY^RwwXd_rcr}(F%vYj;qo?T-l_0r-SbV8%bVd8BGP}qr5Kjan=E2a z*B?-B5&L7AFxM~-OZ&~`#k6T z;NN(|{705QeVwLX*l)vgP0AnfrbT}k$@?rg3v->IQ&{MnyJ>noF#~S+4VEzHuAM$f z(bay%U#s`=<~>*MReFz@_X53NqW59u-IVi1y$><(1NHqRy$?dnI4SkSxNHu8u*BTg zidWURTn5nZUk<^ps2_pv5uopgf482hkTp=czQwSdCbcJkJG?yimchCP`D@iiOT1?f zH>!Aw4h}}NZqJR>w6n}7vvPspM~@5iBhYafS?y7&@4TR$!cjD0n`uNwR=WexvRU{V zaF6s+-k6ak1&w7TESw{Lk^5Q3yDvu*{=C48PE!F`5O}d}7RLN_=OP-Z%Zu-a^vYNb zkz;>%bK_b`4O-vM&EIVPBnsuDu46m-q9AQ6c6Un#p5U%+e9olXk(e2(vM zKILnK)4DCW9rtC5>H8@ORg7wh@8EpIVJnK@E?P-)j*!GQ=2J_+Ie$xGhhSlg>h~#C zd5!6N+WJpPkZwz#PfwBV(5I&;u#ND2dWu4?$Df{pjY)fC^S)0{z=aC!pZ;|)04YL< zkI;-uW!hqaH_%i=3|;o=hY_}?WzBjD-%(v~{tCgEr@i>L#r7cv+qtx~L_%iw=3#sO zatN+F|MpQ=G%*tGEw~t$Tu5&2>Dg)yNx$txTG=Q6tp(vspx`R}$oQ`eHnwZ}P>tfo1_4Vb zA20dTYC@re98NG{T9}yK)%vKm@83`@zC!5?vx#0XTmFum_{@rEF8&Q!sgX>%e^Y1e zgxt!&d7Y)BP~FcwQ0b2LH66|VJ97519sPT<0^JDU{d=XNC3wWU`UFP<`!* z$p*E9@wc-NkJ1)WoA;4*;NMoU9oIpB)3_SCf_E+a$m9kaKgwc&odq&U*U`=j!%mC9 zM5N8D)}kA{{(8=I_WURM!l}-y*nL+ZPP_$EoUe^%-#p7|L(IX?8s&x_6j3T>Dw15( zaH1#D`um(kRa^%kt6YrNjqdw% zxqJt|$9p+AXj_cv&JFs55DYh%%Olqf7Vs!Q@xY_d4G!cn&^LxC-LQw@tE*8kH@M9|HqBT z_-p~5m-QaM9sIWPJ9In-U3JKKFh6{nA32&I2vqF+klygn`Qgn8 zw4}@l|I|ucgK$|>+AUntid^&3F>OO(sYLR?+3{v3nhZvAN) zT<3y4|KVT2*qCp(uYaXJbLqq6|$mx(b2KB zBG#%BK^PC)ET>;c%O{*Axltdk_6M$W`v=+80XDN7{=oomReVKP{dyf~Ig~~Ry>&Z+ z1JH5Y;D(%LV(}!J#C6+FlQ}+=7@sQv^}QPR#3V@jBgG9SJOx_+gb~9;5;J${jwDGI zV~I&AU1KvLmYA|#3pz(XW^RkrNS&&iJ`#R3Scp~*81s$A1L_`F6} z0QSr5l<_FeRymlzHJE_H2wYmr>I`M@7e{^XMt!@ZzJpQUn=xNYFuszHI`6N`fpO8y zLMIm&fOEEGF{-uh!4X}Ct##gzo!xIU9F}JxvP+J=5I|3i6*#!LB z3*j4cpkBm!_ITHBNv~1g3X_7@aH2m~C;EjczlMQ|`qqetx<~y5MQMiS-Vk-LD0t2F zxZLaYFEjtRW8`FIaUN|`m)?|=Lwikz>oBy!a(&4Q2KJp7bMsGXwb<(jbER>jhQkewIW9pC!>}YSX|Ym6X4k z?gbOogP75KkCf1ZLbb;!va4=hgDT6oebiKzFV*-ytP@Y?rP5t|$0OeqZ}L*t+ea$Z z09G@E;{Ug$^QfmN!*>v@9A-no8gxBSypW&6?++96vVOzw9)36ROHUH)xnwrdQKVJdD$$Q<>+f_XFV(R5rlX)rhG{W9iz zGot?oBfiyDz88Y=)m``vXuG^1V4H3sz){5bA0YzlolFm}LNH@A#m4GP zn?k^WosuPgxDYif;1FnPg@u90pS-H&#*(MMb?P)UQ-IN|nh!JQJ$4 zp~R)RN~Ibjws1njGoeba!b|b$&W+JZ<; zeU++jCRHX>X+w!i2Ppw=p1FiNld2z6SwNA{Fuxs=uf|vQi?7*hB3BTZxD*LMTaoqD z_yiP0l>8<@+qE&?1^Jjr5Vt%}hrT27@jP2i%a`-e<<{w{1RcbZ2Ks5BYo8uP8}fe{ zJ_D3ul6PSJv@Ygb5%s;Sspd2vW9X3e!kjD8(PPS))fx7q5Vo#%(F@J?uN=4(1Sl*osI`9+9y8DUA(_j=T~ zD!vL}S^viZ7Ht)Mg5jbQB2seh2%J1CD8b_@Bd8L8CI%e-3=tQs8P`N&GUEY3vMMMN zOrHS3!77Qa41KQIZg@GdXz;fo!=PQ6@rNPCg}DgZzLqXW=|#*}H50n*&m%e;F>)FN zyi2OAS9maWG>_MCf*ZIb;(|SU+^}aW6}(p~66_gG$#9}b<9eBP83L@;q)4W7xybvC zb-8%-@#bI=EV`K2nK8I|4U*1;X_sdh^xqQ@^FAR`gZfo>nzrtMi8ltwSee?r|2392 z0~ok`GyWlWhmJK${Vhw>>KqG_$V_#ZFI5;E ztP&;+?r&nqcogDD#rSOu(FOhUUm<%if1COHT7r}MYk<+puKI2lC1b2VXAjf#a&f^zb(}r0D|DLu#L#~KPbtKoSMugVmr7UiGhd#(A&}@Pe;|sMh zQoq<34T`W^n-ED%DH3)~v0EY*_E=&9`=N;}`-w^Hhb9+KiXz~QCC)DnyMJbvRd=0g z#_9T!V9&;rfbf{&awv%j?-a_skRKRLK?6--JfBin-s83mTVo>7yBj1ZW$hvs4B zKGY)*HJJ>C=gWr$^qWobSD7eL-})-wThJV*xyZ~LkEr&br$S>(RD;)~`Mxy&YhYa@ z7@G^9#&9-{O)dR4+~5!Ui%b|eOW+Q$hq*fi?usT-`%>a6!-|oH{ zKgfo0bRQLUFw*)S^!7ghb6{;p2j{Dgw)H^8BM%gwp#|;k;lUj6$T_UkBfmYI$XA2G z4<4TtGyX%Z6b8{!TKL!TsJoS;*gyZ5HuLWT<|wG--_uNPyXZ04)cx0C^B)=WQOFSf zo@N@t@n46Ux^wOShh`#2`R{6Gk6GSLx|v(hR7=o76Elm#iBW^%D-h)Tx3-j)9ftbT zMw*BGXa&2!_mCeg+t2QgmGD_VyFWy7?EW4n7<3o^WWg-${$7;u=zjp6JuLWvz3Guz z$}|@L*V2ZDPh~PbLC5|NrWs#_V9tLIKk$Dr{cnOP+^aZVBSYEr7s+yahy}X0KBdmCyj0LQY1VmA_fCPH93~)0&VYCNOG{ zBd36aI&vk|Qh*$}4ETn>l0vGFBbPDgQ&Xs?p0>k>i_x~d_SUPnjM9VSr}BD*fsBk} zocTJqi_+un1#`NU9*3{EhsLAzh;|O$$_=)8*p8y)FoH#i5&y*q2Ry_#Tj(KDXBa6O;zSgjNV2pmtdLBR zZDHNlqVB;ozE`>P8z=w~Ko5OJeh*IlGwU$k!+t8Q!;k_4QBeJze^rcDafK%=<;pdu zNnTQ=y_h2H1&RyK8T8iMN%hom@++TxHDhf!G^lHxGxibGNyMpbc0 zik@nUAbN>bsUjjqL2*b*sV}6e=%Jg?^>#0ri4J=@(oFPq7#lIsFESH-!OtF>r-_ay zRRI&TA;A*$MDLJ)7V>1c|Fj?ZB5{U|jWONPJ z%Fp>|U|q~_Ut?a@27bTbH!qVH+cH`KMci z;(rAT4H?2uKoP66Xb>FAxR*0E_uIpA#D{pZN45xX4!%bTA*8wK>@k~t57~ir2wLeIU=D(8 z&&?+tss>kR z3&IA<0U10HUN$KMLQ{c-K{q^$Qrk}h3|8CT3lg?P0)|bUfk*w~s1E_?>sl&q6W&h| zlQ=VD{S;qWkvYQUNzB2gXkt{ZeEA5eX6pD>3++V3#wCT;aSI4$-PFjWYC9i6B~a(V z;&#HLk^_fLi2^L-l*NYB4KBnXr)CkwXZI-E!)b%vAzNz1mTIOPqGwYqS|Gng z&kFkp1rvRBzo}K>nEStdSPP)^IT-UvHt&;KD-I`;orby7e2{fQ_Gu5$4ygj+N}lj0 zIj5)rX|_~oQ|h_DVHGF_e84AeZKvriWZ@;O_8&Cf8-akCpz3`FHfcZ=rRIIXz()BZ z$*a9yB)?~RVF$h&PKnBojXvg1#O5FK!!>ZB>6vPGUO_5?Y?%@k5| zVlGaetzVw|(ugEG$YA{U+1TD~?uamjk=9pC%aA8$ z$t;T>#~u+q)G9lWb2+t0<3vS|fF4T!|CoCh@TjV*;XmX8;d+7)ML`LQih>#iH5k+k zWMD=TE=3d-g%*vxY87Dyv?2s25vIpctgYH=E3Iv%)fW3|4Hqv7K@vnE;0?uAytJM% zDi@UiUgrC)wa=MLg6-Sq{r=DY3+y@P?91AFueJ8tYv0y}n1W=(g;Ub`BgJmYd%K8i zfFEywEA~AuN%5O`li0rKST3g8n6CotGz6G*U6Z8iVkz&_&~%78KFORSKC+Dj_L%=L z4EmVJPs7b=;PJ2rf4dw zQ^p2Z?1sU6vBa^08rlAvAaJ>T&5WN{%)^KCZuPGH&g#wZO18k1Y`m82+V<6(p=DZNst5OF@=KEG-0F2! zAU8?TwQABUC;-EDRL#hQpw4Z}`oGBja6n{19$av($bnpy11Y9#U(#Rq7aU^CndAyQ zRmO^#Y2!ir3M?7ULmj&<5X1t6YjekI?5;kX-$B09*bgQf`vPt3KfIQcNxxhQV)gKW zi2cfIk>@!a!)S2Ya0dL+Ag zzmfq_>tAf>u?}6=_Fvkb9t*U_i)f}%SxR`qN%8d*B@HX zEE0ZNU_EnHSIB2Qb0k}p())*`=y}BOxqXzNZ~?Iti=tx-)S2W z9)H{b8LL1ZZ4cxz1@*YwQdR*aqrcMzB2elKlq`j^sy&pa6iS`jQq}<_qr-ba5(^Z} ze@d?@765Jkx)e{mpy}C&K9)Nk{GjBLT#1P;?AMM~(r(qXf+unZ2Tn+#VA&%REt?hA zR@3*s3aGqv+-jFA;C7m#oS{HoZ4cy41+r6mUgEwBl+Ni;wBHmc9~mg|LaETZ?V)_2 zP(A`mK5<)t!VQ%v>5m{aX!+bgc~qgaikwi?uy?JSLNI;k=fFXTG`T|LuhKAPRo+yQ z6HWwj_EzNFjs@KxwsnHLt=eS-#^qKeJ!|tGFQU*H{X1H@z-|zg{4uHr8NcRBZY!OGPXyuL@4?GcRRvT@(L^^c#$(sVZEDzwNqhLD{NMQ1r&;Crc!~eN#tR%KHLKTSJla*FJ)yrWCA3g@x)l z4(X~gdR<2-+71PZw#*{uCWVsLlIh3EgTPW*QRJMUuvVo? z^ti&J8|`Am{i7XWsE8663B$wha)E{Ie>4T-5rvUJN{RYdqi^}d8)}2Phsa3Z|bQ<~Cn6YEk zR3OmcunU$cmh$M-nX(N)#1d{! z2S-EG8CezX*yKyXqo&d|JR0b48W_C z99ceiwgGhmpn51Ms!0=J%|*c|>i7!D*ANOKL13%N0Q|<%63*#R!jJ)b3r4#Kr*sR!#p57xs5R-wZBsRv6zJgC193!o(C@&U5K1M*uB$VvqwsFbdHQ!gpk z3J(@u3h1}`yV4hh!_ruen^yc!co3iTAU>@Soka@jiT0qLR8UU?Dg#^H0JYi!^{fY~ z-hdjepjNjB^{j%b2UG^Ku=M2L;DKuPK)q~0IX$I<%xh#4u~|XA3@C#xw@rzX)8c`8 z%>%W^fcm9^YVr6Lklp>Sc^KQnq*fZHdIIPj56~_T(1!-l#R}-1_GQ|oW%^JiIMN{X z0+QoF`ox2jYan$~NKSi5pD3hU86KrU;#y??7apVo9;B}gq5XSfJ3q7L}0RBI2LTV4yeV;29%e9c$_ww%d!87W;5HR2?x{k>ki_ ze4U`RYF}r2S$qQmS5%#6Rb&69h}Y$aV4dqDn zA2HTpH>lq~NUkqpmyE#BMRcxGUq<4>=;bXxrWYwN~;# z)F*0@aM%|eAt@0Al9Hv!S*Vb{NCDCLU;ihrG7M=;8y0!G=k$k~mFX50S`J!A^f9)z2uYi{K+=X^xiI+&E{9o0gn9R}9LNm!E%tOW+vv?MmswG6CDqJJ2D9bLG+SlZzNLWY9& zBIgW&Bi%2$YZ8`!hk){9Jg5tLqA2Y{QQAce8>Rgg5zngbinvCDKZ4r_20)GYlL%e( zNOXA4LhV5yi)<#GFcH@FRMaMPOLXA*!y*k|d+Kk_o@nK4Nh2yWNko#XdXMa`tpKJd z_oA2oTjk!{50JEf!FGU~F^qtPsQ(}BU&x6d+2u1+R?c)0lC@epu7h*6p&6Y`A8J<~zPThGu(nYE>I z4uQ#HtPJENk?PE4E>Fnvy)wlyc`$`ZfQbxc3yzGz6PyyGg_RjbD`x?g1t~qH{ZN3F z(m*h0cQB`o1#L6UIZv1NWuua;jCn>pl1tmvx0>RzJ~>nFv`?;2a@SE&qB(M)%Yso@ z{hM$F+ZP{XQ+W04-^rev7B+>~O+J3jR~&STjsCW(w!x~2046s28{R{wS7F1ls&-rG zmf`h{X%Q0=c$FJzx*I9HQ}3GW5HD^3hemk7PCN{-qufZ(5-Eoq!*}bA2#spPO!lob z{I+Y>$G9UX_qn+C-)40#ZT_-Amh+k1KM;_$R<4HI6gqYdYDiY1uzp5=R$v=3Hu}=* z18J?z&e%uV5^mt51mZ>D8UmeRsgS6K>~Ol`#RW{d{-^gkyc)3c6NNt_*o84831f+7 zz+M`2YA>>(ct-rKU$q%q;8Nz~`1xOyw*YXayvMlZy&n*6UY}nj<=x@T!|O1m`jB8Z z<|d6PHEVrMs-0P?F{V`J{`N{)f_zIZZ4l!v&t%ushmNZhBfD9n!l7RH_++0}O?`Mz zYiFO*$j{}O+*fou*LKAU7x2&m_Y^D70n5+sh@N*KaYVBW5bqgbRm;CV$as)OQpRmk z_|BBbd~!cpUPxk?HkG$SQ|jzq-aVCMP4HDCnPFg9J}{_pT7Ie-l>dd4MkQ!s32ZsXy5mxlKsd{gKGi8L}$x@9ib-8Vaf!g_UNWw~vCO)IR3 zXSy@H+L`;#$ zGHPpS?1(AEu+G7z+|B@!ND|UEh9vojg@wq|*r?)gww(x+9+>;XK)3&M5AWS}5)}*T7ig0?~EpId>Ytynrdh$YGsBUEHFYb~eDvCze;g zo$AL5&lEsU14vq+6b+tdXqq&+>ANb;=B8^8+`hL!(LukoebH@pu)tdTUf+3hxhE21 z_}rrPQf)){Sp4$ma<`f7PAcXgYWZ{IhJz}C+8eYrdZ6wLxs*;-f5;@|_YWBTiUqYosR4A77dZ6L` z9Oqf|N&5jcJ%I$Y@7a|K`n9O9Yz4ha#2PyHQVFyFW-pc4*z0ciAV)fhXq|w=KKDjv zh5)-qf+fISx{Eg=#(Fe6{p%MR~r(^=?e1Rn?#u1ubA$ybRb zvkDTzyG_cTB7QFMq){XEkyKP5w}} z2=9jYh1}>FSR-%qKi(7tLYNVM)^wb`0ki?6QDKHp{uG8A5nxn`c zWwi{{X$K_uGp#UkD;I&PR1cp3bMK@muAO{3WM@ROP%cYjptiy3#;tXw>qAG@ih8w) z6eRpu9+tnpwZXaP1Gr;M$;#|7U4aT~!VeMN`h>8S3?NIM?*s*4^1gGsmu?B4RTX_o zm@g1nC#@D)j4c7H_Ff`+^zqSBhDUCrrJRN+Yn_mS+@eK((^)o?gn~IwWl;nQHUE4m z7(7~=RCfiz9<~NU=*E%X)ux{7*rs0b+SKK#+)v%CZE6Y+r!ysR%L`&|&~mx;?^$K= z)7+%&FO>u-SGq-iWrol`K7soF+h%z1C25A3c;D=tbA4Jf>_iE~Kh+G6BA9}z985Mt ztLAd}m8NLb$UUdY#;2|BY!1dHeMq{CVrswu0^H{45#(qo!PV1*SlVy^87_$1q@ayS zOOkdWah{|VOR0omCEGsu+v5u&o64x`9^z+3#}|aAK>Gvo5f0+LPv0)YFH0CDd^UbE zw~!SYieEqV8-yP#nS>sNAKOBC>$$%nKaAMk>|FGHaD$>KMk%y8sTS*r<@WuNr?C$I z6sz2O_xlRUeD)p|7ZEJsBOp}Y=7Dq>&WjkqMu<(`Kc=7{)HN{jacObkBjlC{bjZ;O z=V~UuiBPP4dqGy|yo$M%6w?US5&+Eukjp&u@y|8EH7!@t`xs=glUYhUO-eiy0idew zjK{p0Gy$vTZ8z)}u&jiQ zCM>F9wk_~W56(TA{k139<3o0XJ*A>;M`_Evp5SKq_MC>cy>>H0icL|CTDwVaDXAyR zxWjfU%G1=g*IG3t1b&O6_lY{lC5`sx#C_AqTXK7iXp!*+MJQ4#?4pr&Du}CL*;@mV zQO#NN`vjVDn<WIizD4_iWSDA3t1(8T~1f)&6qs)Ls94f*B`*5W)Rb#ilKq`GQ+ z2v(LnqZ-qGW9T-8^`r}HIIyBmsUnLCiYHp5$&55~G2#V_ZSlOT`HoHKWT3?l(Lu!tUnqcmDDUxE4wkaZHQSO1alk+p}`CBv(c-a{-Ols3YiJUcO z3Nr*^<4b(2r$KS2WN#wTH0Fj*w7B8>o5o<}t&_Rfy=lxGdDp3vs%Ydv!ALCc;Bg0t zE(TNCRxt14==Ia1*H3DSlmRN6e^t@P^^`(1GF$qfSl(L}k7#6>`Fbc%zn05a^r>p| zcu*cApL&wV{E7Cr_C_|t)Q}s#>}-Y#D+w7HYR+YVYF9KDIN=Gjwim911JAkog2U*fyYvWc`<_T&n++*}@`F z$iM-u?=9BJN*I&mI=gp^;IpeK_wY|e73tx;Tq)&wT)YTbCJ*(0+W4ynMNj%aZ2Z;3 zwx3M;*BF2Gu<9=1I*>EFZn ztA}j|lKx**XuZ_KwkIY1-!cB`VcWu9Cf^OlUp?HONz3zu@!uf@H{Fhj|5M|?3;*cj z4!`y{OJqKWzOex>Uq<-&JF z$db}F5ussJL7I&Fn~Wt)8i~D!ydf_4jeRD93ZDXk#K%mJ(D<&5@Bh?ozArQFfVCp7 zAC^n9il$tms=rLT#5kj3zs(S726+C6(~;sI?j(v4kp1@j%MB=UB+{Fr{x{AOx5=Bz2w{K6d3Wf8OI zPmsDxXuBX*Oc=-VHr!9oWQ}W}6F72HdMCB)MZTmzaZW;y(mabL_azCryDc;dVOdp!_1%yUeDXu4zD--EQ#0W!MTTwSYh!753gIM zDo#{GA>)Ab{HXp0zvYVG3lzVI8O3i5KnB09jVX|d-#ZQqE3Mv&=*+CBx0#ko{z`q_ z`5!s9=g#LbOjo@f%$M8y%kB4tkH3GMbZk1wILWG;)NlBwRgpt%lJ;5t4d;tSYt_p3 z#K5ej((G#M7oE!B*|a%1oK`~^p?0SwB@#JwBC8ol(td%`j~B*;5PFEb{Y+ngafmdY zzjGp-8`S4kl{U{mQLZh7P2I6MYM(k+XchxR@QPwzKNxWxs z1(Mxe4wTJ|cH(~e_(am!6M##FKJg?fF(20KJU&>~`L5$U9|EvHr{jEc|T;l!HX%hTap^Q?QtQ`*A(w26ZaO+*Nr>Pcyo|91B4In zws8enS!IxSX*E<1_3@$v48Y?w<;1!Btb+Wi(!KMB$@NK92`qhX%9Q6sfRbhT`>ZP) ztRc;Tpdo(xp*t?v+TeP+C05)Ya{pOpkCIw1{L>oJB}`lQ5_ucbz>7>`6yKEGB|ZFPRH zm%}eLy|zJ-8^iC$s4+2iX|5SDPB1xB$PHf3l%2ecu0jD!USEk$Htu4Nag66b)pJ^= z=QccPB~_lUi;A^)<3&cr$QP}m$*6=+t*L?e6BCaTs5ZmC0aG+#p`p#CTNa(-qD7RN z6sDF=GhjU2j8`yYur{maK!*gFu?a+n2tyTX(9$`YAOjgk5<+%mX(5ympV0=mN7m1n zt~~$4Y7tf2!CEMMS|8+A=;EOpL+6~obrJrxui#%bvQCg1?%|@dYGiRJ$Ey3%YcW;P zVkyrGpb=wcTCOhA?<9oWRe{fBp+|2A3%k3}YzvE_bw@2cWk>%Y76$>x8 z9aDfqwRV^Ckwu}S1Kd#)X`(-RY2hbIR6*S}r1zEF)IT)7$`@Ij`wa{h9%zrtr(4uG z!pY+bT<#+N*~Eu8li|vN=@I%0z$F(7Z-p=9#7+^ld6$YgU*zP_X@-XiJfM5bZPhWt zN@jw_lg%d?z08o^XHU$J9L%erYk@}n}IS+d0J9v#;kZ;{%?%!Qpkk}MC z*xOoq2!BqLOaC^Veop&0OwOj|xJO5zlwcIt5pT`%Qh< ztV?;`h^xhI;QJRm|AJfgLf5PnxYfArxQ}t!gb%38-_gh9_mJ=Yg9Z(d=ds5PEUMkW-2~_`5A%E)_dZVi#HIU5*h@HhN_=th?YX3~ z$cv0Wk|)&z_9u*t*&?+E6;ZYHgFe+8owNH2!5oyrgXKRbQgwyrY7s^9jdEUfB2^Gax=PG zXD+OaFYd(%lD9xS?7mgRujkFG>s%EbclG{p1=Y-t;z47{4|94huTL+w9z>VUMkS2< zOhADK9CIP8>jn%l0sS;!P+EXx0*WM{=MW9JM?vlHsdoU2$M<&k3 zfSIc3jM?#pL^ajDE7Cpqz0igQ=0hnI@QF_euh@tQZ8j2h0MH1qB&2F`ikouGzlq1 zZ%a@46O;0*ze;;IDZe76M04hwl=4nW>9#`?t-5=p@3R|+Hc*lI7fQkObusID_sE(u zZ1yJu^!EbP2hb(gj!NjH%{>CdInKb9cW^K_9_Rr;E@!f8KB3mp86gP3-K1xVH>q2)&Xs>-U$ry_^jyt_`434H z>+v@dWjU2;5QICfB`SL>nCaz3G;h=b0UsRtceLvfJHor;<%DEbLn)Q2M*KXjhWKhV z`j8-_8mljs@}{cMOaiK*2@FBC8aput?N;Odcc{i@zEjnRNFuKqccwv*YOD}D(o&5F zc+mkwYJ92rq}3j`-m3J+zn6?rPmGQ8NBHd5Xk<=- zOk_d}R`bh>TG`5-_bXwiC@Kf6wU&2qhM}|gCxT3%zWY4`RfY`lueGrx+u3dGM5u~B zB7=tbdjwI_&d#6R1TtcXON&$A2VLJ4;``Sm80prRjxb91vm*PfrxKBcb85XW`3ERgBXL zs(hud&F{r;i&gu5qE?khixLgNoDHR$=k7{t-V^8A4MVw4edBzVKy>ghwAoj>CB1o{ z{@-TY{}-C~56U_;?+Z(mQ%&=JM5G1Hs97F57g=P2jR)=VqI`+)D!g22Zy3JG*)v(b zQ+%97eE3-7C*iQnMKYIGn}>dJKdr7rCfUYksKduGDZgzSY^{(f@ipft71UG2-UqO7hP+rdNm8Zo{2&P^n1Nz| ziP(FbbS|E&c7W%H(7!q#}0X0iFMeJtBl3+FWUWE4^hFyi;LKJWw8+ znMj=nm$pzD`yu0%{grk&>(zgvJDOr=ODUQpVOAx(P|mjBNHWHo6Q#g=L^d#@ZgxI8 zTMC@xCS}0K7NR$thBwhtBaQh+B@$B<;d|r%gyHEtn7W)ex58e8A-uY6RlqqV80*1# zIE0+Ng11aY!AM=gO-|ZK?KS0*;Dt-i#y`##P(-K}We7|q#yJgnTHquU+pS?%N ztdOn1$(Bkr=^)nNAQ3v>Z5$hE9Is9gYA6o0ulitw5>3;mz;v(F?NrWR-(a=uk=f8A zexpu(iPVx&uq&Hn_#1x-BD#a#`y@!sdg{Q}s*wd8-%v)1F$&|3fMc4z7usSK{PDAT zKuQ~zkD5imqB_!6kuTvAL(|hKBpQhLLQIIH9dEYNnaZSd;E|>>63+!fdaLFXfC>l3 zrj|G#ybcTYGr5?7wcE?TG+gsgKSBE!un?II-^4b|&UEv+&V!YixveAx{BEG!V-k|v zIug44K3_6>oNv`TbhsXWSU-=m8=>4~pe8g{enucK!$&B;qv%$}=MxM23aHfDrJav# zf^DsuK|#(lP_wBFyU($U+$=Vkfae})DwFC*^7l%Kj&3P z@Dt1kzCT=Pm>4lMc@b;XrMqC(0Z-^qK95it$_H(KQO7a-V;6ujyDk0?I*@W(r<3VV z*xkA4gbFjI9JIHY^YZ~aTL$mbWbD4apRcre;ipinTDT=v)+wrK0}lpbeam#aS>pQ*r=B(qi6V<#(`=St0tKkr8IVBzB70z^7a3e=p#^tx35W|Z6 zHzM3>*N1*k6*>5AxSQzi8ra!x@I@!)L!OCR7x3_dKfy=>2P*yj4@xhvK;=sm2^F%m zr&3S!GLN5%oLQql%x@`!Ke|9>qbg^8!Pd5^07E1NX0?cd_wG0dL>)}iw`vrROK#7a zL{+TXACs7)88Sh00m+;x`?6(%WMzdkWZjc1uds%k*kG<_7occ;51t~YHte4+d6vO4o7p(D@eJ6U zTC&Vv0y5&|Mk0$(Rn&N$iI?4(K)&Ned<3ANRM8FZjhE=Ef=e57tY7Dcd!Y>b*?K>< zB)*^7{wnM8dig-h_Ln$+Z2>KjuXC*$wb^XH3}FvSlZzFeibSA4dFnjqwVs5k0{;xk zXi5PgWnAHg$hT%Bo;IF5S)~Q@KOhSjBmN|w+~sjC6Wd2t&e{;K;u|iv8?3c^j^Ci2> z*w=L~@S-!O$Fl@(=jgae@%_y3Pj2d(bp`Gk+)cRSn!9FQg}V+nA9pwI_qd-h$5DrC z#8ojGScdyM?jX*3xog&mxH8=MtzEN1JTJ$+`3m>FZQ(9T+!y$-#V^SFR$$!!QrE0k zwxdH1l=-EB1M@l$9N1-``O6R)upttKe@Q6OV_4U3|&%z^*>Sw-=9ystA zdFwym*yHBE!Q2b;F3Wg6gjaVvTET>AV{=K5<9>%KnOv)ENm z;ixuw{V-8WAd?Vkf9PD*B;VA2ypwamSbWVAr7C6$F#Sl z5xv>p2pMo!N)Sz2u|!u}#y>zB7mKv@WfWPHW~a zy+CvtK?ixfhI{98YjK&wGGVi{%sCu8(0xU;TWe%NxVsz!nNeO^mLIw-VBb4O1@QK8 zPqW61>CX)_XEc^e2g2xP0Au_Ld&w;liSsFQM0GCqtr0{D?4m^BS*LQg28gKl?8kaU zb24>sL8YTd`KKRO@9F6=wiX6r=l^`CbXrTEBnz|AP>#oN4B+0C_+Y2nx2B)whB-** z8y`FPdh5Qt3VSQNPL6WU!;9@y5}9IzPjmMbAV6n+rUG;j@SV`vX?qLZ9fcf}A+pIA z<2f8C@U1Q;D=}5hk{WyCJ`2QrSozaERROGSr4D**b~j=9I6@(f&HIdoI%BFpOXK4` z-+8D^0(CQ1Fk0S=zVtpR>ID1ZvkEF}x9i5gx=$IR)dNNJ;a~Esj7`k-Ltc7z+xN9E zisDk&smd1}&8?|*zHE8pdOTk)&wPLM@*ddD@pUJtx6cmdIy)G65>k-qyWaTrt&DxI zSfJ!r#)AC>l7lAU+vi(0`eS+doEOX;`MwB7NAIbOUVcDsyY=n^*P;jQi;rXlMmjd< z8>#}*2Z8OipNP2k4y!!z7D!JFcad&RPk~_faHSkt(oLO^AcH+#uCN=H9NPCH+kmb` z9rF3@rk}*FXOw7F;tx98IRRUVrCIoQ+Fon>pJ{n8`a`<%Ha(zh6iOQX|^ zEtBU_WUr#`hu(|`DR#y+v6b!9=(;N z1JUaX))c8vKOaPLMhuponccOtZpJg4oj!PQtdRQ(F&uKeOz>VAXNR<;k>SqMv)aHm z@>J29iS37WaaRVe0rwj2BU~F!{JVh7qj2IU?quH2#a-*VaXc?|{e<4SO6&Fb?;fi? ze&GFo-{YS~9C5>OBVBhmKMA|g4fpdDC*PiM~is%~C z3!1)F4o7bfar(&gqI7Qk5pDB0BdmKOD`L4r{IQAo&Y)5#!P4*RG7clur|ODxInskJ z$aK^7;j~js)gNj9b|&RA?^34BGoM)(311os=_VjMk_DdK3(LGpS8Ei;%^#5;;PCM#&FG_ZMS4OFIAD zk@=yU=-OOmB6L1GyhUd)nu6#If!JLNQBS)j3cns?v<9{ybMlmlJ*wy`DdCgoMkFzw zGB079x;MO!)yp>m(Z0=rgu*5}iKTm4i%Y+;?kLl7n5h@b5hfT|Qm9J%WrNQ|;mu?% zX3l5I4rha;G`tCurTs+?4qtGN(JycAzdu3ell|Iv{ZpJ#!tg9>x6uw+i=H zoJhg!?3|q3T=}1q{`H;jUXj?&5H4gMDG|2(HT72QKA;&z7tc=N8`QG_8S8Fmc!pOk ze$W3thQ?B}Bl!ZEye*IyPkJQaGiRHAX=T+MAt zDmR%>Ho29X+ycqm3N$s^BruN9UzWgm7u~LLb#MLcqrZjvd$j%@qrXS$?@{urRiEdp z7BjPN+iApJ5YZI>FdV7AfAiT4ZGjiQs19s&F^p=HkTv7ThA7_=&5*{TO%XpT;fc z{eIW4ndcVVYq+;@yKw)+iT@|KeK_$GcL4V-&V!Q+yly!0^YI*qtHe#gU51;16aQ;) z*W<)b+|9TJI1kS4yhmKW|K_9cPW<1%y@L}!aqr_CoCoJK-oJ4DWIWnW zHe8sUxib;JasnYatg&iZKxQDaMnpxHb?171hbQda_Ev9x)JPY5L~~VSQ9qv?O1z|q zNuhVyPHm>K5`_bgm1E@L-T`|;k<;y1(JQt%**p_3+OGskRanjat1D@o_yFlT*QqFs zu2U&!-xVR`jFn_knCZ~rH6TeTv{Kji2hbZKRv<)z_QzqEC7SD^1=k7c`28d|3zQ0r+<215IB5au(3m5fU(pLeZfYIbrzR?Y27h` zzTjW<0Y4JEE7vEK`9cND-SJ+&c(amQ= zlCGr&|LwmmW;OBSGy9=V2P7Ex=vCBA@hn_KSG`74oy6sbE=%)u!# zExICpJ>ttl22T^;h0M0Rx2)Q)NLUrQ^*UBhMNIQL7we)Mc$FjIWik${<3r3}oV8ZA zG>H+4V&^PmCl)7)eXGA_GCUSYRQYO~t=fo!IFJ*%-Kx8I@L92o)IWSvdt_%o(i7`M$IX(R}sLVVa(O|TEYXy z`&qoLI!eZ#=`I|i$YJOJgt1^^4Y68-9_n`f9Y~V{j_tuQ09v`8sm^ybA;7I8j&mIm zJYb?-%VER2HA8Rgyj-F+4tB|$I?E<#Hu#08pmyZskTrI4$eE_t%L|e$oif|#MqVbS z8!ayVjGLasj!Vy1|CX8RAxV|`6Zu-ClQnvHMih@6`&Le0D(}(>KZpo%sVnP^Ns`K% zkCIw6Uyq;9ks`(l$C0P=KHaLBa+(Gwam+&);G!f01e`OGb}&F-ty^=gpZnua5 zls9NAOe4@-4$SMp3Yi?%-vst{rokvd3S4{_q(&YML2Tfea~lc7L|VLGpZY8qsz6@R~|H#l3~ZC zY`n?ZLy1AE5cvfya@b;1 zhcfvp2g;22W*4kk}g$L|5Q-<-gh5J%wg)n+HgW-Kd%`KE3Sae#d{8F&F z$EFZlLiNk-SEQ=npjk6(@JCbpqvjn?8IMY(q?jC#a*NMHfD0DpEx_)~qQVNh$*f)d zp7DvS%6|sWxHecI8hVtNP7=cWgP}{Hw8^S{nHZd@&#axIlU<}of^0GRV%^b$HxH9o zcj&wl#p-}8N-3Eaj1xSx2;jTW(P;vwr>xu@uWi&LrgF_u)G`oBBto^UajgSPrTq;C zFRZ)gYBp`bp>4s^{R;;KmwcO*ReizjePAo8>Y{E8zbD2IaRA97_ z?GOJ|QJS#sx>`7I8--0(ZQ|P^BD|_OWek_R?D`%d(?6M%inp+M=f;QY4>IK|H1A3> z@bDCY&`K&KL{zS=9LjBqTb<8e&4xidD@UC&a@9s7vkOH|J%cjTvR>EK~k`Pvp;O<=-WLI)g7y{+zajY?AWlR)(Wu66Jp@e;Py} zC*{xU%1N&;hMi zJo;UNWR_%octP@L2SIWUa|I$u=7=D+Wml;vc#)Ids*@h%%QU6b>}aP z;gKbeVN8u!Nm=5hR9Uj2BC0ju;mHy!qIqY?lS|MtMV=fZ+NNnZt~?R8qS>E_^jCRu z04{Nv7no@kMF3kh=9uD`8#f=Zt%;%`U%uo`%*OobQ3Q*abTESDxG@4v1I0!i?XwJ&ruu#iOL77!Nxcf9XQ)9c6FVX=hXFJ#vsieQ*9!2s%NIjHE?8X z8W}~5hE<$)E;|srzhh^SZd_@mn4^pp9xdg)f%!J0Bc_8;1AtBe#c<6md7TPfpPi!E z83M>q8hD#9_vQ=$o|XlmO)Bi+27IK5kxbKHN&GNrVeBJbg7zs#$b)uV#(a~?W%A~r z)2tA71Q^CzH4n>2$7+P>+cm{i?Ze)K82H$$C!8bNOyejiIN34*xk4hua6A#Qr-UsZ))^h@-t(dI( zn+s+b_I?obN26d@$ns?}{xVu^ZT;fs0!{TIe2rR-w3|t_F$?J}Z0dNe7~4|ZceI01 ze1*L&+!atvs+fqiPsMydg`b>9GA)3`G;8c-AuO7;eU4$q?bgp47~VAd7$xuJv_Pm! zRW!$Mk7mB0F(@Wp)|U^h_m?*Mt#Qm{v^WizMWNFRG&N|2t#TOwP%x#d_tReg7Ydu& z?+Mszib0yH|6%ml-cw&4+nD%`%VYuO`s@abYqhnk>=YtmA0iG&2@7YXMBFYB z)r3^3Ggnp&+$oa}zz7|NU<1UwD7FJ{k@&wMepTc)IA}&Naxf7>3EH~w%C-h&qwm2+ zzaT1|0McLC$T?mas40Ad^r5Jf=?uh9;4RL!UkU>?DFb1d$1qS+>lg*!4e%A#LWsN58O(xW)-r%d|JfEfbn=r7rR@}>RIh`dY0 zl6DDH!=dLQ(@J}nJI=a~iaWn!vd-;z)*dgfiY{9B&{XRV!bAc4r-Q3WKn6ulS>GfJ z##`~E$mn-Qm6Xm=&NO?%6cUY8bATqjCnd}XNIJ03`=o&Vigdc|+UZHTf-eX^@wb=( z+JZAoPx(cumQpkw*+pI2u=vP|p)!J7+$)fSnVW`1$SDfGQpL%j z%IDvS5VnJw92M-8G_Ze=a?U*u1z3b5QwD6)8CK%V#3#+rUunaFBIvBjXzAX?eFLSR zE$kL3-Mug`P#Rw}3DX2(;VMwNHH0NKSIN1OIq7yaGggCiiO_Ims;V!rEabL`bW#O` zR9l@Tj~$j&u9E2*ooq)R$*jn1J`$}8LL{I<#HzU)@~K@p#Er2?1_4^cvx%8s zYwg~?Vp_uScFG6QF(H;^$wMDV7_QO!wh@OZu2 zbGK?ge$)qk&aLXgY(W_?oPt6&G90Z zfn*|H^scbwZiq)EiXT+ZZxbO*(TfT;AyE4H!U|6X8%N)H9Cnga1;gqh!rs-LCUKNs zRIsO0D%e<6!DvUQV6Qm$+z-1k#{C?H>+f!&b*XHd^wgGv%$oJ`;WLth0xH&uuu+GbaM2L9DVNU|Tbd%25o}eM6 z*v&NaVWQZ17PjRC9J3nDPWML{(};2?WewW2#AI0)Jbhl;VIRykcskvQ)MUKY1av9xo!8i7kj8SSLu6yf7^9BGDFWp|Aa)=LlcC)u#GcVF zGE;sbgKZrF?8OKf1^k0>+BJzokR7Yr^&%^`IqXmo(2_-o@OkDnh>S8%Y^X-WZsUx_DezLihds8DB89IWEubXr|AnU zVnTQIB~#5Gwsiwcs5dy6)NP6Hm579EdamljPmJ!y|0^9pD!hvc&xyy;_>zUt^+sQy zv}Nu|GWv++MZh3uagscwo&P0FpQD+3>-xm2wR-P^k_~a#*I2E*adkY5@1+K(zWMG6{X$fzVrNh!atQwA$H6StAc>tz(v28EE z44F2{7z)#gJ2+j}_BrcGYjrKxZV6+HfUVQks-_(2U+R51jXWB1*0&b&bV^(|PTi@x~zCh28i zGHmt>B47qy=>C4pi#>S~{bbt?QG<$yZ(;?^O6w=>1FhK@BA)_Yr1CBEJiM5mQ1OB# z(*SppX|OS7>dRSAZ)!K&+gN0Zsa4m_&e?^c&ET;R53ou9?F_(}i!2F$%?Fdd&Jz^MEjg>(E#cF}kTWML z(=9yjl7x@4lbLiIc$dnDNJo6rymR)i=d^sFQ@|=`y=@b=FOtJoi657#d2?Svdeya7 z-umw}s^hSJCo_jD#JZcnc2Tect<^(;J$YK35n=LM+Mij^b#Y=JvT9^0E^_O|Sys(r zeVfi(n77m_Z%Ds%4gbH)tE}N)#cOiGSN5gI67J~a5^kAuBXWfvq%5_BJK9^T-AAD? zF2Y)^j8~FNxI5)Ty|?jZPr3LoOSoux|HCER?(FDwTW{J5?j%ex$_nl-SVeeG=sQZy zGb#>Q!QDuRS-~BQzeGu2!CgscY6bTf?w47?{X%RRDlMEP5};NL89L}#K^D+dql57_ z6R})`F9aO-0`IbdyG3;AdeH&h_|7Pu*Q}?6zfj0;3YC-L@ngxuBeg!u*^Cl7*y;8j zP1!Oy^sUifTP^^+-SV+8gy(AcAtFa^_cvIfqe-x59?2RkY;Eol>9?soDtlU1TA^N% z1AFFmjs+}2e9?R=kazRG!RW9(ujA23|CG1)?i1zvV;+q!r`h@xEuOWfo<1Tmc@D_~wvznj-Vl%Jck~?u&xq0e@nho#RNjUd)e zp-yiVv6WBQ{r^8Y4=31D(v;rQYX<&hi@Wc`mAsoXipxD1onR<4<7vS ze0j%gW{#-{3mtduk zScUV7SLTO@MQ-bnE!)vIJ5OV*pRX+YK)B4zNMBwrtyRUjBO41~u>7nddd_L&CrKJ! z73fy2Y>GBQT^bAy z#~vPJ!IgIm)6F#jR&ARJ+oxf*aUO(;jAv(^^rxgN(65?TOjth?_JRr1s{^cBQK3m! zWWpXbUpshERH@GBUkHM%n!ePPDZJMRSlgS(tHn5CZNj&@K$6&-t1PYyHn$F$iS({V zb`m_)>@=%?n(!z|=s#@2T>?f&B`t*};crODa@Y%rcWLp=!g=Eg-7}W=W3U7cAAcUj z>4pyDFIQjEWw@1P;qG2q6f0$hquMcpcW)0BktTCR{P71ehIBf9QT~FroL_Oy+vSQA z3|Ev>438_a=)1pz@aIdkSmFNXpm0ly@Dq&pyW+j({}sXqA2fuQGw=Tq;S2g2`pL!` zFX8`)@Nf1p31wrLOL#*!p}uKDw32(l5;*+tXCZvlBYdVfLk@6K2?f+a{f4{Kcd8k+ zN$6?TBc%^6k~uS>?o2Uk{jreP{%s=h0*tCnS@w)9`KC9$m$mdC2oI~~C4QH@s5X+n znQAQ+0|S(4Z2U_(Dst-T0o~-N$ZQ^ZRKy-LGhp`;bCpf;e4-l7vX>gLY>MwE7kq9Y zitF>C@xg+z=d<1T%t`sw8=tu;ADQU1$As`OImvPhaBoS)xXbwbDCyJ6ZrX^9U{gNV zDlG(E_`vBF1tH*QH{g;(8W@=amHQ59qCQ#~GGzN?P9`x!&`H$!d_-x&_FT zZv*91R7IM#q!U;g6Xdr3nfg|xa(_h4GxS`A4izu}Vw740vuxw2y_y#;D2P5jO?;w{ zi+u|o63+1MYHV;^U_~1Fs<0EmS3jB<8;oVrmz{!7>Di+Z0|o*2Yl*?Rs%pwoVYgA$ zARDb>f>trxILW$nzjeyO!DU!*IDZseTW+0FKDc;axmA#NHlO=~)~RjyRSYiLXH7r* z7uhFdNm$P%yd>>|b0EtavQ?sP+-F_2(fRn#*;)I1)@AklOlxp9@d=frNc*f|%~hkL zJ>~=x8!JoO7QR?+4FNR2WNHne9AZTSOXZ418OBz)`*bk!yLC~8)bR9Aw1$cgI?CHv zE)&p9e#+Em*4+tIjF+8!6HAdttf`r?-i`@d7-VB4BZ`^wWR8-Pb@$i0$pYFj1rBs2 z;RO1eh#^O(_)d-B(F^_Y&Q{T>lGiNcIbq{riXck<)#7nDf*QX4+1eD}%KSGwNN&+g zu;S747F0RICh=K#F8SsIC~7TTPT4Su$?uX+)$(S|P~L~`W*ZRC(%n{VXH(9Zd@5hb zqNyHUcmDCQBGQDwD(|qZ50qcWsna2#OZ?%o&f&>TqmfjL$546kYbs-cH|-1UIqge2 z+*C{%<@41Uyl6Jj{P?4i3$4v=dUaQ#xyrh+-nyb5vmv8%UHIJO%P4>tUbyRTqLuYX zMx%{>ceK7UhuU)2B}-T%YVdeRAZkSl;ijcN%ofUT|c}YzvU}hIc-fsFX~4cE&#pf^^Tjx4PQiK7d7JoG7yoX?q75^^9+lM4^z|uX+_00Q?qkLG+9ECw?3=1^H|^Uv@4Ige||jtB{T z%kAxAqGQmt_k$qC_}icsiODbn~JKMb_-KMl2zD#SCCJ=W>}+JKk*-Iioh&f=nm7O3Ak#^D8i8i8I8eGx z_985k=><%#B$iL&MV21Z^?e1{enR!I{O_%s0`g-He(a%wXoB13sS>E&JQ8mga!RVf zeA9=A63I&-BhzIbK!mXjn)F%$@5(vk{xvG-*@a{#T>&FSPTV(>Uzwrc)B#tBgnN#O zjhNr?&uol>^=j?T$1~=m2qVybtoqFNJuBu9nZL2>Dzlw7_(VonGLu?i`}1Xq!dn(> z+gnjuZ!P^qf>?KOGYR($V!VR+lb|)OxwShV`80-rHJ1HP4S}{6TD4^^JIL7^h`d-- z<`8qDu!;XDE+q58r_tfzqdqpKqi4DGLzFLBlSki`Nx>~tX*Vnzm!;C5zTEb z)esB`+Y#~R^j3x4gGHm zm@lo&hIt}rPA(czysyCysIv?U#@ceeL#pURh;Mph#n3~QK>Ib&1TDfcoX|PPX?Ebg z#7Mmh&bspsf>ZV|UBYt%E+^J=x49R_#am}M*_$L4^*0IUSK4DLIBlkzy;yW|_vcDO zEX-_(&DPQhFtLjg+I5hY$0{-z^lf%CXf}5ac4`|_B1dS#odF&l6Iu;BWyK3gZCc06 zX8zSRKyJ*BmvQzY5S`plFD>51Lb6Q3cBzbV%y4o)*`LY?s6{zaee> z1tR*MM=8o`9qG0*44!Ew`Qe9>AWEEEKm_c{5(N<`ZC>zPRkX6$_q>b)F)7M?y1=6W z`0b5O+X2~9aDe{Gs*%}Oc*|d`^V7OGjcnbRctC0cxZXt}=CMO0a4N_%T99jRrl3}K~+ z=Tk&<-^DVjOP8jwqzrG@?&>plRv>nHcA)fa>#kCX75OULy6a4ND}6-jX5BMbK5`!D zCl!TyhW5?}+(MP4N3rwte1koYq}I|?7_z&hyoN0DHH#fGF&z0S-@0pyym?tP$VW1Z zfI)y$ot{O&=}i`pJm8VsTDlQ^JVka{r4vRv8mz?U1JUroFGSlne6V|eiVtRM1iz4b zBWuEeoJRT+>n^!wB#1!0tD6+5bg4nXH#C=kttbGift**J536ZAV$SJiswwQms)B$D zzI31G<#D%8`#TTCJf?AA4N)MAIz%kt6+z&JWwC0vae^^qp=~ihbB~Dft zuE3;Vv~#>Wxd0I)QpQhZ7=lE%?$S%Dy+XdBqZ5Vha!`(LgdPd-__G8KuMgVq!uxxw zO8v!FglW61U@V-^d5iL8RRtc0ZFZcH;4Y^sI`)7^;qlqdcJ&>@^&4XkQPw5zRl|2K z(}zz&=1}PIxz2c^*<*4mqE(F55o7t70PYbTn;&0J^kgi*0DERkE*2Ph(S4c!!hpdEUpz^9OnKTIRoqhqcT< zo=3qle+7@;%lwr*j#%cOz@ra^>ATE75fFg@g`)p0s`4c^a<^!>*qrL9z*wxboSeTM zQo2?~hYfBW?KWq)tNUt|kGWzIGeJipao>FBP@?r10&i5ET!o6rKP)>sJBh>5?-#|s zB?_qC#3$x+WE-QLxx4Dh)Z#ZnUZgc<)=-_Ndi%Tdl8NGSJ9-N(&~Ibh`8-`~+v{5= zLj-mKgod*MBZ94J`IuPl(LW!$o~*aET0d8W1WX4%a1Ah^kW<4dfS+%e~DnK@gZ z*i{h|iLCtEwU3#Mn$W!u1Z_GW5t{@?|sc&@}iA$zx zAaqO6{?-{S`Cd-Ga-^q5ZX=Uu4-+kZw|qoy%kLC2M{(m*X`0M%Wee5{tfg;?gny8U z#*%Z~iAG^?H9sXU*oleC9ANxtlIzEjrk$f zup}l^(-Kd5p<-wG9FaFBT4_V;jx?IQ$lea=SDuxUcyZ_@Tc1jcw8D+_K)XoR(rSD_ z2HjV=^-R5UE)z?&_3^8^vPb}tvs!1TL0QX|anzBiZYRBkbWUfJ;4~5_o~&BAA2*4i z1#1*L3p23umE`%n!Hy`Dt7#w1Y$=mmg&keHMNA$QNtfDmHpuIWgggxLcHU%=hdqJ# zN+292%4#OCAnC|InUbbKxrm#tNt(~bmYfDD`)4P3E?cNn~^xY3{vO4i5g50ATrZX9rDExU{i zDy$dkWrv#r%wW&GKUDUV4P5g(VDU8*C{X$clv(wylfflx;wn?}T$v(Mk&K}5R=)bP zt$2Bzz1eAq-@&E}VfL*iaxpr+wd^@Xn6Pk#)I4NT8XNpc(e*q>VDXO^J>h0h#amCS z=6Um05bDPF5mxQ5QSa>utaiTF$GW4MK!Z)x3k-hK+<$!oUK0x7EW3qB-DMx<7UwpO z+aur3Ov=!yT$?Pz-NgN(A&cG-I#V`YWVMbB#73i$+$lQJ{4U1ttU%8FuBPawbJi@- zabKV`$t95yA3{6l08=_Nmw^mS07)m#0E9^k zZP|CBpeKu7IRAHi=~`p?-;lm1v0*ul&MhMi-apbw!`oeA!L1Xs`RU>;Cm;5@{)y@Z ztrsRRoTdvZ-4+_=<~2?7VnK>aWea3M&Qd zD~s8E>YOAwF+SNTeaB{J>1&4)wTbuzCgZWWfsteKt=hBsOoMg=rEh(bf_dSEnc;T~ zBYb&U_?HkZEj_2|vf@8PQlv%Mo*88^j2XX3B+HW9@^wOD>GVt#UP*s0Rr;;24S_uDQ`I!9psT3iV-KUut{EY5X zvOAmXG`eYD292AYcb9_nr$v+{%lkwofWMt<0DM6;4g=s<0$^SSfa@~>3>#_yJau>g zR|qX0%*Z4=m+zlokXHg31bL!?A{F&a;}++G8WC1W^|QPM5yF1y;j9jrS)`%7 zRV~jywOdx#q202sM)B@4%skI@pEsXoz8g>PmUR#}>-QlRczr5S8iTm}LHSbaV?`W27p~A!G65`lL}znFK>IR(U(0-2KwNyAKuz?3@uwY2UvUg!OZI_+(J zT5FLie+GUZ@qwakj&(WcD*5q>W) zeAEuVUY-60ezCvc?ssx`>T;Nx!?0G}McH~#@MGuEU(xLBaDGK;Xz=VxZo`|kqrw`; z9rTsbZO8U{j4Y!E~61_g~9L`97T zG&L?s$0Y+3xFZvd0un1A7L8P`rC|n85eSo*OfMr?Yt{B+)vDF1Ew(BkZV6ig$m)i* zDlYBkj^lzGiwpC8Kj+*#GYQe!-|vs_H?P;^-gE9*p7WgNJm)#jdCqgbqGVA*&p0KL z%%61%qOi|;31%?)cfw0H+2_2&ct(CVo!#bvv5|e_YseHy=FZ$&@rF=Yl&pSjQ9Uvvd#uv%ge_YMdP|6`k&5)KxPwe+P@XIUzL$P z2O6zElG5(PWB<*iv?Y+UiKbx1Bv8p-+?UoTHKI*R3b{Qi>Mh@{8n&78g?NshED-nM zqQ%v-j`Fq14NTeCN@1h@w$J-XBa;lii{hPRRd3I*eDcI)rs%DPyL+qQg-Piep83ui zWKX!aBG2os$U=&=`T(-g+92Jez|PG88+C?&EfZ32g?=eGP?*sEZ!_@mw~48u`+Z;0 zPf$RiV1(VX-$G;dD{gqIxLJqqUle>) ziaOM#9o1#_C2N@Kj|^~`hwF#RC9QM$!py{h_u$ak_KyfztHd)n>K`oeMI+DLCTi}; zYEy1#mJ36oCnKEvLo#rl!&=ESb|BXe&KZmnIN9ml+xVHv!QhP^l9|m~Z*N^KMr#zO zG>zRp5=m*%b21|J4r;n$_R_C98@an$xUD+I!$0*0jScafdJZx$zj1tbf4?Do*174h z8}B~v;M)iMGQAz;UHKfs0B=*uqu>8ut;Y^iGh40 zBNE1VkhD~GF*x9Fk~a|58@!CX4fa)P?&UjZQYq392%k~s)2caPaLV(XLa10Re1VSO zDD)l&9AiNQ9B7bA07)_N68jUTL!1HtRf(grLQS>7?s`+Htk_y}4qu^?adcMNYli5o z%CvrJj@DVJLp-xSG;@@D5NWWJ!|rz_EN~2*9Y&crK$<4tl>)@T6*QeKP}16K>V@oy z2NfkS_+jiz6m!Eab^zG?n8ryf<=;9?I5~|~ZnM^02{Z!T#WRreOXM~K*R53`8Ju6z+40V0qmk(WYFov_GyY3LMLLl z)8PEZ^S#IWcKKwBi;oP7K%Xg6*J>dPhKrQWs%5s}j1w0n7;i=1 z$uhUvX1@;kq-w9vfFM=kKvg1_HEMQ5J!vozv#C@eIesnaGQ)GwO?PWXfktm=oVb85 zqMV9$ZZ_<_uzS!&y7L+xm@}%tvz1=1;CVN{5bsAgaX;g^kzX@$zv0)xPtv--Z~1ls zVI}`6|Nn@;^;-P3Mf_zR-mAplml>$R*y&F!ONqay)oSr~7|*o$d#B(w`aeVG%hMHu zgE1`^XWV!ua%;8yB!-gGBiBgj+#({mYem%j2@%{RkX>jrpTev4m=Z=sVy&~@L<#W` z2|e~J&&p2m4#sQvM6nQfim;E~?knO4V@rb}5{Rs+x#m*r0Juxj9W5(FriZJT=ACl1 zpj;$iljbN1m;&+BCGK3JB9srQ&ahuImS&l;i@3u)kR=r7jHnTN%t#_D{BFFS4C(CW zN%rTzH^T`k!|qz^3#sogLav?2CcFJ289Yj^PSxcz2K2#4Kbtbt_j253$_!X;_J0sc zXK#}1FMMzIKX=Ri`)=9ay%6m8k%1Cfo2v!`Mr}Z<1_bU>d{zvHogsB z2v($MS$^oEwY;8&?-qQ3rxX z7x}G|iNQGM{9OC562(RqpkOSOXOwPA3`9DSYB+JS(cw0ey9AR5CRa&Edf#k(G=6lC z`s7^Te)V0re|_gj6#G+BU%RevP=n97ZX-3iVgS6PXN8Z%A7>CLRM3)_WB`r3K)3j{ zT5Gl7Z4n6~-{v=`a^Yz1d6#rxx|Sm4@BClz1tgK@V+_Y__Bnx#M{qc%T095FaZzPcmBx|fvy#r~R5@W!X|}p9A)=Y$;C7`9C~sj+51y z_`fHkOz6}oHZsNbwY5+*6+*vy{^hvMeoYZbyX87V=h8C3cT~kr4>Id!`zOxKvxSbu z+)=6$QQ$DCucNoxGFeUvsCvfN{(!l4?85$DX18nAI95%mDgM3;H4ac-GB8wXisgD^ z$soe85~Wl9=+<#6XDJdJ1PwWg>e07su!jd3#`|T#oKRaSv_jV!agLQjvHkTJqPV`e zrr25Xog+wkWwR3UIWyrH+l_Zue9DejSt(SegxO4D)$1E&*E#F0w9Toz{41Qm@&-#x z*0HkktC5ADSYwvjzXlMRUR%l`kN!Vz9^#pGD8alLyvebTSqFfU4&@74um5|XMGxm5 zkqwLEjOTb=fv4>J0?$42yP&{Rz*FKHc)r4K8*w}M-eQt*BSQVqAqmg zC8aLpu&b7r?o-Amr$_#pl9$TswY*fy^9RdI$UcZuti-jv)Ew6oRVAfo%1fn0G(>L7 z?q@Xb!(hWv0%>{aE#xK9HsQbYiSF`J3*jFiFV(p6Qk0^5%1eHlqvR!-Db>7zx$eaz zjO;5i7A&S(d_OUFGzW4zgYMKZ$66cNu`_)hfFWDJ2y8H>bVXLNOu4+vxU_@F^RVI` zAoH_)$%xLE3885J_(J9u41@<%mvsLoQSMxGoA)gv@)U?I`y8{OA@c<@#!{JXa+z+F zJSV(EvV4QNrO0!wq|R*KEW)aJckS1_1DF|&NE7j@iB9=6h53<&O`#>1^K0BuOeNIe z;nRrRUOrUIYHdV*Z(mB}i)w0bU)^?E($0;{6sn!ie{Tc-q~y;}ME<1r?#z%sH`>*v z;{F~Euw+xQI{XOWB7Y)sDEafMZrLyCmOV?dzfkji*~JHB!1_e0mYdN7))!p$ptu?Q zVWWN7XpmVWRG|1S{7|H{HM;Wc@eh>PsB*upUc2W$n%sa*esyRwBkLRSC8X!NE+j*# z`#wTWf9c8th@%@_4NV&Oxkr{!{W&x^aITMU-xt z!co2uUK+Qr#`}?{;*B(vU#rPvmm`4+i04uS!5S@rVm6#>4LIlmIZEMYbwaIw2s06iQd9aOKaCzxzOw4KB8Wj0MXx23jmvF%mt}?r}!i9;0;7Au%~Ic+?PisO4Jv zytfulOL41lS(j0|vcZ@Hd-+M1$fhD(<{Q0zDv?iS@88PdG}Y>R(f)Z=d@-_Z39@a( z`__yAbJ(CIHw|Gd@^;kiyjg1-()^FeY@>AjX9~Ji4lBz43@AC-nBqlvd zr}%p+ng)f^O!4=ok;1pnLHaG`vq-;#;|KEAL-=i2{9EM6Lt*H>$-Y-yRNz@Zp};eA z9JVCP>#dfLLdUU=@QDqkwnA(g!FWO!w~E_?`k)m0-t(kK@Vr1jaClj5bBc$n3|R(2 z=1Xan{m(~apHnN990kyDS?4`TJiDCIDW;&It`{8;8&I;C8m)wye4}*}JVtGPwmeCz z0y!I#Xp@!dXBSrtTWf`tD1A?WJM6PX?V}E0d?@w#sjoJAJX+v|6>>%eg%Nw!GMUVl zQqlS}x6eLIvT?p4vNGS7Z0Br{cWvYQ@d+f*o1wD%&ygVrgadAW*7Jk2y}H3(SuMyB z`p8bv$H&lz)V}u5nlz4&%TA-*WVzd~r_s+qlHQ_~31Ti~V1C+1Ea#6Ey*ATAb|A7E zaM-2wdp~Y`Np5j$BU4-$tsBtb{fQVCJfpb}HKE^0!*}j}AlEPE-mnU zJh8xYAJ1x@@;=pxd!J{7usf*Lcpf`G(|&=WEDGFzxPy6<9?YNJmm17FFV}m|%%jv`h7-!lR~Vb#PmbuVWNzq|ik!`l z$-+CtjG-m>r_M-DN$u#AAEl;9vZ!$`?ksyQNUpXzWkF&LX%=`yVC=CTK`fhxFwTku znOiMIB*qjW{X7xU(@`RwpXW;F>1bChf57|pjG<*;TbmVMaq46JA!`p`)T8EpS#>D> z^8SMke~IssA;bzxvzS$)BmV_Nm&;8!c#(&2Hqn!C!V(ipAjDSxNPuI79df>X*sq`1nj!zv3_nsr&;<)J4cBK9VAQ4u>i6r8x|M ztPwyy5e{<&1{F_`O+llB4-i!1rr%Pf%7&ek`aE2Q6JAnulUD|GA8uTmwbm&a2D~~| z@{Fev8`DLE#`nlRBAxxn-m)8!Myg7z1G5S)`Whn;{ zIQPa+_VUf-+W}MbQ{LBJ zrr$?p#7TV5-~aIaZGJAlNv^N8wnV<_W3*llQAId&$-Ut#IiPXd-MH*(ktu^?hwW1- zNsb++eQxB0WS4YXyljcEW!Do&e-BHpX(NT zl@t3Au|WCH{h_?lNfCY|v*uY&>}B0zqfTs~TkQQ#Y(=-&r<~ZMy2ZZj#P;nLn-$iW z`t;AqS#kl$7OZsK^A`U1=ZMhhD@?Ej&KRR;--Q3XS2^PGcZemyJJ|=iKD%kqYpQh%s*4aF3b8vK$*nTOb4 zX`lEi)S!&=%G7+OcN}YF7vyj?pE*W(uQJI*>^$6r$cxzGt(IwrGOAe*%(gZvClL0J z?@i5Ua*{R7jJDApL?q&=V;AKdQf5Y@egt(>`D&Z2WK+!Zlx3dJozhx=L#w#;G5L-N znqT_iFajB$WghYE@(*|B-}^JWcBo6Gs|bBe6@t#D$PRQzoQu6ol_p6J0d zOKvCZdyf9~JTsqvzGfW!X@kFVRsMl^V5fW6%sRx^b|906*!;Ow%;=j~uSyNN`?jja zpZBO@5@Bcl%7lOV>5yF?pf_44!kW{zd2aEI_|1_P9Mz+|{wa_bXO>qY|qM8mSN=D!$f6gC1nP~3GcSG0NIcctqfptl&ywdum7k* zred9`cWW1e6o%Ny$a?GgjKaEEd^mYPNqe^N(ph6NQm2eemb@m4jPSW)=~Zc} zgo#&DUvJf4kIwjN+$`sm_5O%zoZB&2i!>}g_-6&4B)=+tH#_ggIL`?gagwIz?@8je z@%sVmjn@@_9=_oA)Ousub$Y!qg=f$8hDi54)*G-k*s8PjQEo@KK%p3mbF5AA=Zy8n z6^cKrqq;c4|1lw@2a;h77tA-B-=nNp;TdYlVc+|^6lYeJBWkU2BayMu?pi}BkpSs? z)*8QX8FR}VnxnJ^skH{e;k^JK*;mros5d|SnVTPzWoKZA(onkVjn9p_>Gej5T5Axc z7Z!S*Awk(c=u*KF3960sRFu2EcoKEvae8Z`8uqH!GtT;=K`$_Hh{XaUA%bP(E_Z>E z1<7PCFldCu;L-LHjv}MMU0`I(0^@5@Wc({GhS%ay$P>Smx0EPO{*kHt>6OB-Pl1hE zeKffr4M0j8A!~lhTq9+EEc{*83gQJ;z3I|L^OITnzX+$x{c&cw>%O<#$9fd>Kivu% zKtZzJP!JleH-Z+oG+B3~p?p!nmbg3(lU{u2Wy|`LGm4otxc4Hk`K6(W!SsY`qy5Dl zE*t-VH{9D^^KJLV$4f-Z^27$CcLKa-NvU%7QBVQh;iB>x4N=mpM}3vyyoU+p6+HV z>IJ3Y?Z#-PWvGxvOEKLp!A?`y%*issMWj<#dX*5uLtC~wZxM;3sg&bc+!0|k-^B~+ ziD|LIZ=ocQeeQ2XVJt`LOf6($ote&e4Eapsh5a(VnV96}3XNTyPXFsNkfqe!nbo|VI3<-@ z^yBIDKPA06b-xVg$2Zz*eFz&de1t|s7N zd@>zjSq+XOh!Dbd)qI>(dWug8Keys&(Nc_(yV(a2m5ic`eDYl`Cc(z*+zmg&}TiUOPThc|`s-{hjxH$?) z@mY}KKcarjrW{8cNXmLz%PX!1(k}wbCymZLKF6nKaXqR3qT&s=*w9ooCAxh+Sys*u z^_QX_I-a{9D|yuEpmD)1 zc{rcK1xJ4&UY*!`TwzF7e7|#&-b>Oz^yiwxD*d8ln0TC;*VcmoF-vrHthv zoNqo=WQN)G#rSwVPzdsUF{BroVw$ys% z#T)f{Wi`+Le!cSgDtEndqLiGuKT@1xm$IKB`yg;iRxS?DWWf>>o=HEjXt8(3gjH%r z?QD~l6?fZB90T9^PJU8 zp|FN)kD>pOSAEujKJSaOj!$As6Rq_GFu{^tG8jaz^);(6ltK^aeOoc5aRYk2q|{?# zI3%o%dPF^zUN03;1Et5BJTQ&3mGVLAP|T|FCMMohqDE| zFB+{Js!HzPhJ4kAb#D2I>oS&7KTU%=kHRPj{g}Y27iP0$>6qe_=|x$(Fxf8Fi>iBm zCH&IaF8(zEIOg3j#>`Ef8;O>AXue{YPTB^Y_Lsyt%Oa!srv%(xnT8S;y%$P^Vwrl^ zXJ`g4FkjnjdjP+|Uv?h{XY{NB&yx)4 z-uUD`z8%Fk`Tgp8{oFb`9k<7cbJJu#&$|I1F#Iy*%j&V(`LT9ufEC5{B{f_%&#fHy z(%T#&HKW%T`#1~CPU1=2?Rcv11+^F8^S%~FlymoWVn4;fKy1)b9(L93G*0wpbz-HW zTykE@ou11!;T80=8HWe0k)^W3Fu+*W5vV$=J@isTvZKMfz7dPsF{KU3l?~Ccr}~~% z6o7uRPlI=C`OMLHRASdD@8?nvcV3FN2>WN>(?vjOA9|lmMqCZq9=h3BHuhB1)h{>p zp~}t#HzBNS$Z2ngj%2T6OerC4)*7ADv4;ZO8`W+s3C6~hG$bP)n5x*dh;@N-N4dd% z{Xyl>$;OlTN8t+h7-TH(`b*`C%gr=<^8}hb;y2Q4Wwq6#?J^}uc>uIF7=3o=!@NTe z1Yh+%n?<0Z#{1=ro78%Qc4mR6_Qr$3gfCW|Wkx!1sp@^D@n4C<({|tF3ao@_5ymM)U6k*%|pipjx?; zc!NEOIwkXJ2TMjo93uo`vx?c5+J{WxuROzO`5kdwm^3>V96uur$XIrrt!{HoNXeGE zMNrE(J^ZLbB-k?TKK?ryenU#lt&%>mad@t@0uz}uAn-1hLRsub0oGW+1&T^#UA zj>0aW_DP3#F$5t7L7=hhm8P%$H6Km-ba*)tu>~IR6xnmptgC{tL0`^w7sJ`(78Nl6 zEnHyo4CJg&zQfV-JA<*&dun63TNVc_56EmwuE*3XKT!5!_~ZC&%E3K9cY6-u*3vvo z(IS>VQt3Ay?TY#;6Xi``{hJCozY5ZBnkan}J~DBr5Pa-nTO!*Y(nM>pPVu)L&lu}u z3rdFNx5k1obhR)9X#{+=A#&riK1PcOYwiUBMoUzElaT*&(0S^{$AN*!+|PVPP{o_V%pKW4w|^c+_w=XFS4 z*R{r=+bBY$8T&JFQ7LBto(B}qOaEpxZwVh1u+Go7){49AzTBa1eVXViF|pj4M1}gQ zi}n&nDN_!o|Hm*5(ZdIdsr6P+&pRGtHrTg~>xmCQIfTmDj4P2EwI{H`e z$QMzxmdA3>P*;ryW4WU(q!`()lY8h2N83+VP%`4}(eu8_%vw!WnIh$+w*%WL%z&bB zKaNkvvW4nXB%U1_EZX%JgIH{8SL`E$!awCIk5)cqx{`_yNc_7bawlM?^sVm*9YzfB`c`xLtcCE8dnu}_NA;qGi2buo~RyhiNke6o#u={sMSfy$Q-howV=!)|1uUVWR$vdhz!8g{2>Df zmLv0rd);Yx9-L9EggxP~d(CP18sdcFJ)z5qE0(wL1me`yrr}!R6iI|fN*k^}4txu< zRMaL-mDrINX?n^HTC+=phDZRW^Hv3iaMEV8qNaHMZgtNqU$Vj%o3YyjzJ|z;J)yzK z4#My8^0%Fb6nGIvS~9!8&ZQD074Ui{-QgrX!Abg8k}78Y0t^ZUJeWLk;|mWN!tP8p z|3Wp~PXsc1A#Oca^dW&iHabVD{kmLN`%}tFoJ46?XNNJlaP!U~uW~g8zp%$JHAY8X zZI7mqT_Y>2!>6Vb-mfcJO&a?IzH5g$nkV1k)UoeNK}V%5?80GPRYnQ-=@J%53IB>9 zIxrSQ+!iRg7)BxISxSJouSSj3Cwx`9_NR2-QIhx1J@Ovr~=GL*%QR@DZvPJ-Ok7=*27Y z8_kBQv5jFb%wq;!BNAQnLXfFbWrfF5yvS4ZT2{C;qAp6xnuWL8yjmcQpGi`(PQ5yT zQC|OJB{tIHjZwZor^@9z;|0j9@B{}*`aUhwyJuFuS%y!+owH7pTYAH1NZKj zEjn8Ui|#<9Wsho}+)maaXOD2lew?QnC7WlyaHD?^rCYIE>^%{U4yYPgXtbi}cfGji2qB8MTR8#41I>A#)k*`5-{Y_VWu9xfs!WbWQ&EZM^q z0>+Y^-Wx+RuCm53G4I~)?V2&MVq46Y%<067q)m=m-KS@Z*V&nfXNtw?uE!hYjFY>? zRBZFd#wP=1YXiGK6M{fQ$Hr}~rB0o5&MSqI@X5M2Pw3YAaIxTj$z;Gj8_9RxOcZ2< zX%$O?-O0CU&4$j%H;iq*COad!AX(nb&WM~5bzaMzSNl&av&?8@J7I-KdjDWVm&BP4 z;Zs`ZaJy)ZN+r1@)v2T!B&i12yC(64s3AlhLsXh<29APkT46Tv>W^WM*6R3=c{VJ* zzKQ!P`CY@08^pT*Wl7MZ|9AiL9U;hHrFK7i7TXz!pG6hT9-_OTCZlxmuOh@RDyEC=fJgdvKyQn8{a2_Njzb^)B$A?_OM z8=t1`F3Jt!#xiE&o_#M%91KE7Q=q;yT`W23iO$d_6PG$}$CQ6O zW#orb)NziPL5cMlp4Kq@$9O#8ot{7AJiqm4n?cq3&sx&8SgTI!HC?= zdjR*);(bpTp5I!_DGXVj{gh54h7IZ5p=R{Ro$*GJs=m-C12Q|r9sMu9s9aOWAu5L> z2)*FPLk<}@2YX9k4Swr0JWZDt(XPGEHiJ^pYB?KLL5{D4dchd|oS{9PP_iR4#vcXVa zLIqq?Gh=WNuPbV?4%rVkaqL%OA5LeALZ~Ehq_~FRg>TA6xx{{pMXh|2YmN|z)Ze_I zwJ+#xpE=yLVh#oGW+esFfry_v7a}&{f!u}H>Hm`Y*(ejK54QJ>-0eQ4gpuLlUv17F z-_wj{<%Xf@-=3W?F;SC`i4~p@h}|q-kS2Y`D7nt_pXbF2PYvX3H@&Z$#z^*{I6xBg ze%=UIb77c~g5gI3!|EHLdlv%PhS62aDp{~0dUrv)I17FKX!@jSwe*j3V;sg~vQXP- zZ)y{Q2`zQ1F=OL~RtL)73R{zCyT1@$-+`UJ-Ea9~!_M$|Z6hKRPhjdMGiMW*Wqu)4RDz4jjl{C#dQ+Hnd1}An z_`uXx@eS^`c5*7j^rE#eT7OMKR^qkL&`J{_Er;u6_vVC8FqQ>#s~gY`N~aFg9sV-_ zCti9L$k=sD)Nr<*WRbnO;lnMZeIj+aPW=YblcJ6zOiNpZrAvBSBr8oHlw?M8l550R zPFl2JEX1N1NqoNID{epC#_9_~S$H-G8ghMiLTMmnn$@T`>FQ#?G(h$xwbdJde}FSg z5j{S&`!QCn-^%R3>P#j?+un0;w%etqmE9m{yXqEfipsaEe9qxic z0%DR;$ExZN0e~#SPc}1vUby>YI^7h=*;iwIYxiY6PpW%KmH8DL4f{hD+f-QF^1ji0 zzW^mF3{jS_Ss3zhN?i6O%eK&&%|r?Xy^THzX}HrgMy(Pz>`{Ng9wx<>H%y~ujhT}$ z%f2?FzC8i4gTk{qz7AH%&5}UlkN#EK&0`A>+gBouyJd&GKX{F>)LYb)aTo8w=$|A$ z7+oq+P3JSZJh=(9i7zJdYvG0Jz~yvFh;V>}K)Z#XO>w8?)HRAN>*%~rK~F5NUAoe! zS()jv6tw(VzDB;vpLPk-3<53_tzb(sH>T_Ow@}8}u zec8O{IPW>U=Q{7XyyrRZdA#>=-uv+0*LlZ}LI)O9_{+Fc?$<6}?4I9Gu6I%(_ivjQ zPl4=Q#2qwazCP+)?o#usKysb2w1^AZst8mS!QxQ?P~L7`P-B>QkwK{oujw(*>3u5ojxZcy|MH{a78!Q^ zgtOax*=-kQ>GBA3Hljl%>6=Q@rwwe;V{emG<+Q zBm!&O00}em4e%VNM6E*vAEs58-%xd4erTAm7vzzT&B)omoje2rkL4}m87gY1GV}2c z7inj!y3!NgS<%ioafwc^Me?3Y4i%-1Z<QS}mnQpH)(7 zvAf@_lARKWbl|mxE%8resx49Xzzje(3kxl4s|Nd*AtkM1VZ2Jz#IM#`qTwi$6q3iZ zu=!T@5BBJEN(a89z5_n|6RTDWeD_Y$@ZH6;2Yjb~7kpQu<#21=Is=ZYIGhXOOB%#t zNz?R7rp=Qf&5h>T{QT zj^1kW=xmzeevaN+uj8kyNAzL+Sk6NzF4s&>(Fbbvs7d1!Zn+ngLVO&Xp%P0tF5&mx zaOA^MD2Mt-j81oDpGJq&N_#2q%C`o4;<;}A*r4$emis21^3Rs=``@I(!zC4oP1Tx?G2(uLylEQbM#z`ijtlqHWcEMd+$)RY-SDQ_rqx(p}Re zT|-NxYj{Z4fV}kjM05ouN_kPOT>dJLH?MbQ{Sz5iEjXDvj`S@b2Q?TclGMJu4`M{W z3b|-<V{)59xNJLZItfgd1*ban?5%tZopL&URL*DGu@$_jVbq9V{&mT zInj(=Gd<&cG)el2XI7qTwe#S~9Y!guvE#GR7cvd~JlB}8O?kBc$(H0=@u7vQu1mJ! zu50`^RzL5jbDvWHsM`5AavGojg@xbcC#1n6`pO! z2|RWG0iGQ1&YtjG3mh*QrJ`66WrK!iC(Tvv;5EH(eUe4e9?sx zIO+-l;!VxLUfyi=vA)AN#h!T}s9r_xmDII5Veq!a{o(0MKrIClA=nFx)ge(S$RW_Y zGF8yTF5{H=%mG3>WQCR|zetvRDYYA1DJ(Ic6;rrz;#osU;~Qp_?hOjru5vSlXjo$I$Iaz8UBa=wri9B!D0t@K5)Uht4`;_Qk1pFBIC{F^iKH_un2 zrI#XtLrtfMET@PmQ>2I~g%t5(w;~jQ?^lFeSyX3~o;6ezBY+h6yk-ysDE>tYeAWR3 z>m*p`iyojpj+4;1XaPi9oazk7*2GvVT8~HJX=q`l7n{-9n#a`{Cr(F$dI@GAwsGR@ z?KpJz8z)wGp}|usTivQFO6eLVWwvT8YhmTW&;(#+Y3Iz(QS za*HxhGuV6;9(jlvQ`VBa_W$kA21D;F&FE;bTEEiFQ${tVEZj%qyYqb=CQzJuE1@5^ zr$VL1Deuk9!;xU3uTcthO@bhc=F-DO!=DKsBW_|(e>5aSamgBfFTrG>fY<2ewZ#dGK^O&30%=9H z`P4oPo={W+W&Zyv&9p}6`>gfous79C?E;7`O&y;39#6;Kq7l)BZ9)emDMESilC_?H zq-$C!33^LbJSzGdH%rL~=Ut!_tkr^4xYEfl>IQ?eVeP8Hk@$Sttk{>&xI{V}Cb&f! zy z6qOePt&Z72;7j3^0M=M|IE zL&^gPmv($r#A|VnOyw#u8O|$p5+9~m{Pl&h!!Gp#_bR6jUZX{tYrwyeH(fLBP0Vx% zcoS++#{BxK-egYIe&;H|r?-e`g$cOTny-YWrp37u(aMww`)F#@p<*4nlThS^>7uC= z{|TGz%TJWVi^}CQ>!&>1bEzmPEGgCg;wSRHf&D%S%Ad3VUz=Qj6d#R2fip!r@*MZ? zp$?Lrs1nm^%2ySCYFc+`2tQzNP;Eb0O-1UH^{_mmk!kV}75Ne>5S7GT=5FRM34v`0B<~v&6R+0{yv{F#1g~zsk$ktMesiZ1Fi`;3kO8d)^#U1QFI5dBPPx@+F&{BN`$y&Z(S(5-#V_k5Xn6s7o zy??vT30r-vM-mEAS14I^lZX11C|uhD!hMFp(Z5=K*vbx$sR z>1TwLSdT9xbFH^kT52pTC6(r9zQ_w666MdS^;!4KAy*)F$K#}7Q-;lVzqQK#2krE( zGFlEKPtbBL?e)!gVw1%#)o+H*r*uCAfr~L!o&$oEu$x8=^;KO^Y22c2I*zm#*2b1d z9dat5(r=YmZ<|x6eN%%Mx ztK=p|{1BVgz^=g5wZWYBK+a0DN`q=Fl(lN)TMRj@O=!|4b)P?7|88w4yjMj!lHrdN zUcdD!2~Sb`l|E5fc5+h@9^d6Y1!HM}nOr%dtq{s-H@$1-d`!NYmTlty6+rztU&^_= ze;Nx#zp6$&C>p9zBaSB9rwBGUErdis<9%MxvQV~AzZbJ;j$0o9VZNklurF(YPz-k( zNpHFz&77^lvJNxq^b9Ig$1+aQ55zHdY|z^=r(D4j&sB_e;n4Zul2J9@rx?vS@^F+S z$4nJ|lQ<_}{mR)!u&Y&~!$@T3>aQg}YxHbiRjV2n9FW><_v7p&EABkKxzs6scB<7O z3#GXfeval+DA>{j%}|->U}LafTTEh@FM+nyx+Gju}TK zyGFzc*8smKr=w!q?oXkIcDV?bv3KdJ3U+lff~f_B;+Had+)Ln8MQE$_jXKH2rBp{v zi>hS=Rczy!*EJn`FwPh>DweDC{mMwgm(%Xsy;CecR&p6=m#^cU9K3CjuT>zl4)$Hs zzK0#;focai4d(7o{jy2R?ODvkD}6xgkFxpcGE%01H2)MJOENa?{;V^tsM`>=t!Jyv?<=}vtm2B>zrnh5mZrOSqSx1v)-CH<XO%+ULTjM`=B5%0Eh- zXmj_Wc+F{lC%65B+=8tm+6G2M!#koa7|B9+T?<*i#%0IC1hq+~!|gZPZ=S%|#}!x$ z$|E$($+>-f4&TptO0^Z}7ER-u0*YyHgIz%D^bRZi;;?f?wZhYTxi8se?PJ{ydBx(P zdDUS-E+*#cYGc_`f0VIm)s$oJ6qCVhCSg{!^=8i6+Nlo;qn62TAD7f(8MIFhr150a zVTo{!zUEz#cl&a(fy+PmM`5t^%cfui?D7pM{_G5 z{91T;mT8^U#Wk~8;lr#AIK?`j{ekR2&dY6mO^lA<&N~xc>vKMw?v|I_RMF06@myD5 zY%DD-f-|=nWWZ!(&L`w<*%jtyHo&cEd1Ee@SC0EvXUo#dqKmqJH zE*7+i#OJVT9fNLHackXVpBIcQ%p-&BS;|x-;~9I6XNS%w;7h88`6ACr`|{_M`K;&a zKwltsyP8)2muYn)mZJ9OLt$&3;Yq$um4U3n$y*eg&uW!X8q9%DxN&CLPT8JS_35tO zWh}Y?Chm}`?pb)Bay6~@Nrek0-cPYU^`iLel!nOlSEGh`-DvrMdK)57D~ms)<)12a zePfQ%vXxgvH(@%FKeXPS%@x+B9+hOstE|ee6;`YL*i_3PY3OmONs(v{GdmnQvy@SZbbl zBgY{}7DsO^NziX2i>e5*$%BjzK9(K1d)0r`T?EtjariaSDmtsEF3z{XQs#+3F(h47b?;S_=s7$(csC#L`mvnMF_xK)F<)*hm*YX09mCgGz%r+@`j6a5b>%vE|%r zvaG=K_*2|d@+`L0tmd+E_~V)RmyI#Ce9&%6)BiKm@D=Z2z7n|J`WooU5FZ3toJ5AS zqP`NW5`5*Hu;0S>l~~Bl8Wha(l?KY%G2h`*-IL_lR> z&0?sT1azl${!Yv{mfS3b)>y~;I^NGQr*3!Fn!%}i0^YZ8IzFxcFfF5&Ed^`b>w7q9 z{klCdz7JAeMXEXPi*;8g)-`LVc(0o{=RsvXtc;08_L*Y+LF7;~_FE-~ip}jNQSV%H zxU>q$z2HY0L;uu=3cvzZ3cg8`F|~`Sm8TBI6N6mSQY}xi>JgPzwW(EF;PxxbzUI#> z@r3&%)i%B0XbK8OLDMwB#B{;bY}A4Gb#t}}@a*+&e6P`z*YjZvQ?zL`;_ z0c(gnFA{Hdcr-^~lXB*Aku1-w4(z_|8T~O*$L@R0?oTaSmiQm?S>$s0?C0c#p}zYt z3}-oy5}?NV!kR$$UUnL8AM*TF6*Eq;au_zY8ZT;nEJynpi_SRwMX8KKmiP8wYFT(p zDEGb+4*HQFy=!NlXWgQf=sBCb=Lf@Qxl4EaShxkr2rj4itrYJRI5<_{L<&q8M(Y!x z07#71M|g3Xn-#{p#;8VaxrPutRii6Ia=zlEVKS;!;joC8Phj+(09%OPO-7PmQPo;3 z97b$uhLALYPJFX{jRYt+586 zC7XMa&+-*jY)f|KbnO0A){X5%3`};h0QBwt3|%Md-9X2VzSxpd0Aq(+%$}9a4Rfkl zPdS%kVLFpN`~FYT_~f9aBMxUB+a5m8j9KS$OvYUP#%W7mTkzHqBhB6KNH&08k?sX{ z&&-Yw4ia^&utWQJ_KmCSg(2Ff!LZ_w0J@7S)4D@iVzdmD|C&Dh)_M7U?>eL99h&Xv z6iuMGx`6@&>*RqLbqZzH%|&|nh7>6=!lR=r!{Z%l3LTc}iUPMQLV3>!p~@xO4E@da9S3Qu z*g!0!W|{+c)XaB6(t%O4FfrMhfX|T4c7w_gz94=VIb^?jvpv=+qtz+HAH{c?rta_w z3LQsFVV%`to3Co=td^nWyb6!;Sa+Nyv!JY^H?M82l&H0>B9(aTkW+jqp3)K@39Q%rVD#1O>^K+@p;=JwLU5Jno zwW$c){WxjEaa=kuxkW3s0Raw#YL<~%lG5`#)xW6q{nmv=qK#Vd*@4jui>&qT@y+mH zbw(|GC>4kd5?QVoWVo-fB7R_WOcCea%Y}yL4i={)GYVu;^~^|yYG1Rn9d5$9Jt7H6 zw_T-E8+Ql5X!sy80+M^O%Hc1mz-_0_Nu+csz+t}G&Hcf@|uz` zpEuY?6*5p%tc2$EQ+?Sd`h=w0HM%+%zpr0G$@n6>-)~;@dMq~!!Y)YR{VMFu@VcPhLN}w@NBaiPoN^NWq z5>~)$D{zW~E-2wH8e~RKWTQ3Ke`6u0h|$}o^VMmE19Gphn$bl{luOB-dYM3{C{JXQ zWP#ukN(Q|;`Z`FJp_})?8O}i+l!T5D3N0x|4es`Kv52Fgal)qNu*B$WRlD9`Kw{22 zKy}g?u!sD}?0S#P-TnV{>EVbM6Mn44i-Gd3iEo~JJva63tX414B~l6plEL93g~O^x zMW_s4BS*kt!6;<68#&hu4%+i$Qp^Qq6@Oa z10eXuobb`g#hgSRLv)^w&J7nV2d^H9?pM(+k6bhQ3kDZb06vrLB6?mX_Zd(&^P2+7 zXRV9GSwhwjSGLh;KAR_sqL9(qD*Y-~o5i0}v=9+S+YnXJ9L<*{APtl5=C%ZVsY-)r zJl|HW9(e_)nPwWYJsr!tgDF|v_9~t`N>&Ucg^>S_kN0spCwz&qbj%fUld3TQT`>H? z_tFkG4Ia~yzO7=I$-TmO&A^aO$|zMOaP5#9)@j|Fi7RDI7!s22ORt zjP>Z~dgpX;$duL#-|kP@A1egbF#_v3KqzSh1(If5I?d^%xj@p$4KCKm zkZe63oh~n(PzpO=5`GG%^ppgin}yX|t=fp9J%l}2B{F2AihV+On3~--S-+K;&i;d9 z5Jqzc-&usq5f=M*un?+eNG3Bxx>b)VI4mK@n)S%34r zbZo|~24FY0_lQarbUYt>%x{vu$NWarEolRhw=2I&K5f&e&YNXckT?4c;+WhV1cW&@ zaLb)Q3bO7x60uGtglRlLz||!z_al3YzX>yTvnbAG%8QPIwdDQ5AQZjXl*m|~M~CWk zXr&I-6S7AsoP}%fY#q|2^$#7W zzDa2bMwIJLB*t6{w3`lxa}EH^#Njk#i$v-qeEYk6`;u8l#1@93cxkGZb8AN@vPhPp z@~DHG1+A!1fwgkD+{q9+fB2vF@i?6mF?iM4lNIV4NZu#LJ3gyP`Y~YTN3)c8zKR&( zBi&0+w_%i0;5$ttr*S!OJ9gf z5FL7wP$WJ+baK;P(Nl$u&WP*>kW-W|f$XRGCJ ztu!9pf=@SvkjMo^`RNK#UXWh8zy)EIavMXr$=ft+o2~733k;4u!+0w9+fGU6ZPYSSpD|q;u@yl&`+&;`Wz#w7lb64xI^MO*&La z>2>>d&Z)vGkAb>Y9GyvBFB7uw@G0t2!phTiQcw7F8D&Z+0%KuWoJ+pMS`iqqk@GE= zWGoi#F|VN@vYrv5t3Ypg&z&-QtcaEvw4GQiuR(SLqB_!wv`Lbvwi=7&t=HdFq!m%w zqpeEZi{(9!;TQQ-WGwIA_avkY$fAp+cg@aLLG2i6Yo`+0fr6qV)jS!{i|~s=$kd^~ zeWXHlI`qWrDx{XV(THB-Mr4gkzTJZ5Xrx|;4*N`nrs>d_4^?Qo4*lgV6;h%$?UP6Z z9{sIjyZW|VLRO?*eQPZdusK)sruwELtw@*tR;s@}%{TFd2jxaoPF$yUCv%{WOc@=6?Jse&x*d7 zrM9+F>rvV{y_DvsNYracTo^sUE`9mQI;3$57G<9<#$hsh0cFrV!~0 zj^7Q>yEpZK=RSd>H+ZB_7oPI}1dmXH-6!kK43Y( z#w_U-iw~8T8d#{trJ>?JaN*!?`3n1*{oM+Z7#sU;U5i z{N3sM^IkGjNG878Px|5b`r?lYUwH?o@s(96_*ytr;hOo~_a5_m(`xCA^cqs}_wxDI zmw@KiLkIb-sHps`rXc(P%g&p)mTq;qjPj`NoxDd6QltDdDiXb#+c^(-b?02Wv`6RM zin!?_hiBV&jM_Gm!2>dIY%EnnRd~UnLY|rpsG*;>PwhdOBlasr4SG2r!Kjy_g5gwA z3aalf@3Wmfq3T)Qhds*sF0S;jF3F{VG(eBu-;EA?qrYpr=hY1v`B1lfE{grwoqQ*2 zJhpp5?3$)HqTpud!}}NcUH!HFlWsg9qqDyHTV^S$J!9#n5;N9RqULf=ZTN~1Z$&|9 zMv=4n_Z@(n$cT{K6%b!?(4sQ6j>Yk;)s-CdOF~ig)fx40UAtb_pYP5u8Yw5!8}6Xi zlg@X+U;Lf$|71zJjM7!#PaoSp{!jEV2W(_Ai0?0N!GA1on9Lj*Gh%P_a+WT|r8SM3 zoX0bp<&w*O`ZU++ievFz@loy6ot#jZTW@h5{U=xrEPI?zOz-dET{l;8VO+Rz9*&(s zvBMTi(NVF&jr67`$F@iBp{E($*l6^@&JAb9Oew3T1ibs^yx@y2$))3UuQ4T7%Z8pQ z(s73RFYzxIV3{BD-SvQye3r&6){O!Bjok#4?pZwcK6JrB4JHQ6$YC% zty?ve3v}&Gy7mPc+9s*Eo62av^irB>Es$n$Bw||6^z2bxp@$deD5kEbm68N2g_$_l z%W;6-kODeK1ATE}Z$L}?Vf9&BSyqN^wk}LXI~|aMPd6mGAYa3$+Eb?5V@4IUx>@P| zvTju(wjB3}%EGE?rC`LqW`oF-VwV?2HGFXAh|)@h-hQ3FVOOX(I``n@LDp?rLXQZ_ zG%lZ!VqyxhQAf>Nc&Hgw@+iHT?t7Pbcw!ajwMvpL==hk)xEIJ>Egv%fM*cg{GWqP=1rH+LYH`VzU6f^K@m&pGRh?WJEB2{kb*j>{8mKnC_AEo({S^dp2APLj zz?nai>MFs|XNTd0TGoOf>3QB|Jw;BS*T+D^99a>Vc&OW<>eZC3p+!Z#vuV7+L z0>Kdl{zh|aJhCIp?AIl+avH9kF2Q72C)*^+){34cGub+l@hdv&&~rIMSNbYPuE{xZ z3l$jSUczG+nFGd2oeAy~=!C0v%k0*Hw-cR=Is)PhtJgYI!8?s{pVKLy&Fm9BC0dc_ zt;#>n7>`Pa1esHZEu$J@E ziqcL9A4iyzga77O`Xy`m4pI4{mHTHb%1c1s)U#IVkiw}$s_L0^fAV{B=)ELY6bSJN zRZPKspHLnIWweCOg^5k$p+-nL5I3;>pWF z0Vn1FQ=}05NB&qSOvrEp8V(x!22@y5Eaxu&{f59&F3JdQrx&U$0SSsMU$_5K?$Dz{ zXlr{VG?!K|=-2ePS(4%5t2;@h=&|*zUg^;xH0tPu(9(4{Lt|sFL&K?~J3ST}OWyKD zj~wcYo}1{0t-BLAMaHmniXih&=^QYeB21TBGMKCI!|`&i0A=onBJ;^stMGf_weX1S z}%SA^|`0%-T73*=2(9tB763cJQ_3 z_T5j*GUGN``zgh=;`O@Jl!kLW+9Yc6ByTf$V9%VZ6zRV{1l_mn7(cJPY-c@DOd&?| z0#cfhh?JO{5*_6%+@+IH4rEk4;s;ippILQ&xFxf?(4l6Qs;XyA;)d>R*EpW})&YR_ z8!f*A=4ef&gM&)@F8HhU%!iDwmSp%mjH_c4P)90EfRkuMzH~zguBda(*!apcLX74C zP(AZ11pn?WxbqNm4(C3Vlg<*=9+#04)v&l5R%JlruvTL=JAA{gkz5t8JLU?2GL~^# zq@q1mSRES}leA9eoY%U611QyQ4>@J!8ZEykeX6`_`^jZAvZflL(JLpAHsD_IR+gB8 z5AhEI+>hL&R=j0JOclEI_K@MO-qFF|4~MAIg~+8DqxoYv1NAJRp2Tl?xkO%K-Du)u zphQ`@lg2W(!`K=~Z=mLNdjknZ?De2}(20%DD2?J`_q1Lp^0r`-{VU7X(yBHbfB z%RT@IQe{`$BUITpRnyQA+)Ft?-dCl&q@JYlX{r&bVyS@&dsf20>^?ehC68YjaC_7r zAi|R=fcN_jq(@_eF5(eCk*IDAM(Zok-~qzxA~X(Cs}GJ#`%%7&t|A^_D9d?N_=#}q zdd0VehnE;FcQcl(zsU$e3JKR$;55HI`m_pj50%5I7*E|G*W>3lJ+9L9u|!HyLufN= zfcPp!@UPk*RO$|VkZ{KM87F7G$dNICjFu+C3dIF-N~GEz{FIC$7UjJTqgT5@CAu@y zrP}m3TGFjZ)4t|O29kd$_wbnBk;S2rGM0AQH5$m4NqQ_z{vS1#?kGr)rI$|BJ47<) z!S?Hg_m?OHb8RXRYShgcTDSjj?+&NN-ngN4DSFQ}ntwq*(ACFNZ{lWNzWqJ@e*?g< zBd$i1cTd=-sxYHEBC~tCQ?DLRx9M@_bWeVKqN2vv>`Two-EjzoW8deF4Dr0^Qe%2J zeM+Xx{y6^$fr!?++0NEBO)rAv^q4XkQ{2td9V(}LdJd{0z)06%+8_R1YT)#c>AkTy zHLm`2h8|Z~jU}Cy=mAYF4pzW?H*(Ne$V4+vw7~4D-+|c@K}Ph(;>@vvCUpqSh#$r` z(v|g7qwY8Pka7~v=Zrf1fdr#wi9cFh9IY!-le_ZbiwGKOmaHvr7|nkpEnXeCC8u!4>Bfqkg|ZPfx+rCZF}s=%iM;C2{u=VnS1yZ8ZCY>0Dse za`8){FLqfL3F5;gZgkOc^C??=4dZq_&=9TtJrkZxsK2)l{u^ButNHyiQoD%3m2l}+ zv>)Zq10m+P3``uJQcSJ2ra`!y;Gq9-_Jc=7Yp-(3xyrugaaGP$I&G>TF;Xlirz(e> z+z&tz_C|V4)fk(RB|?C4f&$aJAeag1NkDp!Q^P&>&vXsRi*+dabhMYJC%@+)AGV;YlLd z573E>mTU@k(EdKJtn+pnt#ZXE%fxo$S5>?PV>SPWw|9Y$vbg@nH`#RXofdiW4hRduz%qUh^J)y8t z80af+6C=m zP0*IA(NMC{L8{ShXtdFcf1TFtM)O~|CIj8xW_~7Lyp7Vyj5hV9yjMmaa zc}_3Y;|1wGZY{EVyc*xoW2{$4Za42sZ+yFXziRwrvs^X4U0-_kaeKVJx9V{>w5zzK zDEKq7NM52I@)jS;K{bYqiFof6RduK7QqZAd5F3)B=TTJ5uPpd)f>{*&QmtwUJGXes zIJVPC+KJJA(iRV!$P@fm6f%=6(yBlooR1D8zG=urY!2Wc#Ctf=)imi$`+Q1yl3HgCdP>|s_qDOGPdzjT;7)v%{fCnPtdIJIE|dmZFL6-52Z>jFQ?-{4Tre| zN)WFh9OL)haE%!zvQ~^ZaM$0#EJ1Op2zDao=L_a?qfE;Xxh6=fdK)!ZHcs{GZ}LJx z1v)UkJVnCuc<)Hmd#Ajc!5xB^Fo(X>3B*JwfE$J4Y#>IG+@;WoKf;cxD9PmDY(QTL zSzpTNn4^HU`3`W+_0YEj+D!pvN1zFUx2Lhd%~m`2r1fBIvYosWYv&hMJ1-XrE!hsJ z*={@crL}YDFLr-Aome{uq4n4wPpX}YqqH+2t)0h{?eNm76QJ8~tad(uRR!K)e=s|@ z+neeDjhu-@IhLx=?8OlJrgq z0MxKGeS;S=r|)xA?K`FRk<+&%kxorIVJJ+JedAdva^wI_OVX#N;rS=vX-j(Gq?Du& z?AeZ__sYzNb3*c-_dmy!_wFEky1cK2=2PeuYR5GC+b9Wvgy zm#{0IYt;>SB4z4QCn+pN?|+V_qyj}*X@nc_&F=kBv}fzNYhXVfq2~%usK2NE874hu z)c#O%wtf?9v{{n~0ti@B+F7Vsv7!bK9l?BkDQ`}V z-G@J@e9EN3dN`3a`84YF?cZ}x3~n#j50|ph;Q6Yy?1=y;(zb|rv&sM}f*r9%(9+^o z^tf9mpTdH9DKM7g)8obHrB?l745(k4AZs?#yWNM`%(`1*s;Z*C%4r(O??MU&2qD zuQI@1n`(v{41#3)XG~%OW zD9rp6{2wd$)=-=ae{Yihr6@WM{a*oip}(w=ZSq2TChkgV9Hts8U4WQeh1bV;^~fG{OzQ!d)q|hM zW7eLE$5sKJ-A}&OZa)iDKc7b3WIsRYnCj>GIE@wl9Z7 zizh=kig9b0xz@$>J8HEN>c%mCY9ZddA=>i_+|&YTG@tw{74%cD;VB}$v4vZ2hSj4b zcr-ZLSt>?54>j+>W5ooLk7ASg(C@8j2RD}&+oaK@V^lwwcj)7QDuRYr@?-YLxMA-a zBsvS2kwjB58XyteYB3xuu^PZJHmc#%(SSAiUtz;1(e1sy1P=RY6 zG7!_*8|VS-oANZtS|E?qQtYL?l=Ao;PEs9VqMR!Rnk^qEWUt)$ToUD^y`oH&o7m*UUfma)g_&l@fO0ocHW!kYz1#&X4U+=(GC7(<4qR(>0v z1wU|oCTqz|TSuKZw%Fo}3VZaZy3mbtFlVzHcPnJ#hJt-t3ikar?4@7gk=pk3*}XIzyRO z&6C=S1kLzHG!+yWLEJ~$WS0NV5(qIiX`T-_lNgpg_L~+H}g*gI7e9eM zIe{cL*Fpg+mHdiR$(SqE2VkUCm1QD-4SrIaYKw25SYGlxb+W$g^YZW^=j6O)TpY!- zL&!Jw)F{-m@;*N5!*`gQWzJf&|DVKhKS122@eX(|J9I9p54Wo0rl|Dl9i@8QSzi5d zNF5B<7S|(cVHIvegf@1VE?{lz?>wHmGM-{8tAcFW;esx;G=N^m!UZT)y4>QkSD#KKP~lq6w*5i6lp{&(9epXi{OK#p`=Dr* zCLfWlDEkWV0}qosNJQu6lic>@N}FX>`Q#G3!)aOzsJakSTfN_c*RsvUdDIY!%t$&aFr7kInD-7z;mB* z*;;M!PrBoF;z8Q1f0L0HuQb-nX{TLh%Sop{uGPXHp}-j0EgZu3 zS`QyMSF8TM3#y%p`T84pE_YIw{qi4&adje81zAL?in)Y^eHvqN0nnjwqs@9982jpW zWt-<^rG|J0plOSrV&B*ioFc|I+A-SVcgsEQ-IH*$oE5&wmCRYFj#xNe>}0(~gAEs; z*P-(IiQ72B+TxGsE2L^No}};KIW#OrRce?4#_|_lkM`0>xdsYUjq-htgNgW!kanVk z4eP4f2N9EsG+Ud@ZSx8DpGU%l7CH*tzEsRRti805^m;aXjiIU>R^TWC7C4fJBeC5% zewr7j66Nd)b!1PN35X2%MwFJ}-AVo-=Pb!XbAo&J?-@YxVjA z%4Lf2ewLbII)gl-5+%k=pu-~AB(@&g5J6Dz|7gR1gYYLE0iQHh#P`0DrgS@5EfB20 zUxF@+cR_UkeN`QZdjizMOF)*0BXT}RyvwwQ zSF>Vrz3@~8%CKcz8ZdIc^%&E>b$KGwpVDzJ5*W5GE{66*LU)E+Pts=pf`a!nu1cR( zb80^B?OTtl(q*9)e+-+_-xj2e&6TW*zVs)(Euza&DZs=%ipfp2uc5x#qbu{JN3jH` z*A`Zs&yIkF&5-!(ZL8MWRa0Y<8t{0yZS}{J)j6M~p^DauVmD&mMW{hWzi!7H87g<+ zR>Oq?ziNSWh)Eg*5MdUK39)+B0?nhwk&sEAnCcG~Z# zRIBLJFmLswUb5yi_hS}m&?!p1>J$V)IrLPg{)_+t-S8Ed_kMI3m$#cZ)Q*Wl7~2T$ zE6}RzP(NVY`)C@AJ^{9u$uioxns7b1-SFp!4kTCEqk)IVxc4buY0W2$GA405s;pvY$Z0+|30JcT{dDOL?1PzdXj}dx`nA1yO z-3QmkUfZ~ZVAJh2zLU{|(^U_?&**_5j^38t$-V>(@1ww4*3!}ivoMMOp##KUtGW^R zP-lgI$O(4$8XFN6(SM3W`DE=m3rB0sZ;=z2q%ge8ptg#?`wj_?*d{VndY5?-j)Vw@ z+luqtv#HCpS%VMpa%0TU^9dMvsdnX>&!a8G!#&E&wW(F^V^QdSx@aDxsE22Ecksl2 zqxr@ADhg)>1m9;2>mHkma^awo9qn__GN96igKmOow;h6>K*1h@2LPPpB>iD-?g0DD zYs)`xXYx;5;y*W6l8~0&2_8y~0BKG>0>>cz9~$9$8r@Q~e+If#@y^Uv;hpCWw&9&A zkioWyk40S@@m;XM(|8Bh2PE_Dwc(#1j?X_IMMVNq*o#&o+OcI2+qN3^2RyU+PZm$V z#rvXRGqf7|n63c+gpifCklttuY2Ta_q?9VbT$&E))^;G>)fQ5Rc5wpFr$aia9Y|*b z5{yW3jopx@o?=-(;4x@^Y0k*X1>rltWj_TUjJFSUC(pURzGlx<6imt{a zZ2Qj=!A$>ISCqB&pEaiZgWKu3DFRX=<2L2Rjg!uN$sQ+}uP3ll{*Y{70>xDX>}Ug{ zJ>;un%=J^lX&fLiurIvpFj7l&hfi!Kjx8W}L!>K(v1JIX0+%CnN;KzI5AKfPXJV>fxkc$=Mf9?Y01s3F~s^V1&@{a*I{$dL0-JeTKFY%50?Ht);+N7sd#Y@@CZdS#A{aeWKN=C)|RmGV***FBB@s<$U2W3-Vp6Vu@6|uE-ZX^A-#k zCJaFHY2F>?!lFZIqdy3RNYlfEW2jqrMiW3?2T+`Rs=nW@2Cq=T+)mz0_J6ISYz!Y} zH>>e~eXIJPQStuqLecTk|HD@QRmEyl1UrYYJ^ zI^TkNuc~;7g4%MYv|9_P@r7vRcG4kQxOOK(G#`ehN_AzUs`&~^Ouq%|90lt$7;kvD z-`xP>$Cp2#YHa-nyb|JmNAMwf61d!-h!s5#H8?`!{l;o!L_2kn~ke$%EltPlh28uvp>IL%Sp4qTP@$_JMOGaP z#nLBuVo`+`W3*X3#=irRzN!A?OAAw67=fAo=xFqXOO53Gj+9WD-8lpG@vv=ga`0Fo ziL)Nt%)-oW{P|%pPxNN18=cMO$D|wGU}_eLTkvUi!xz1!NX0x8CEUK`CS` z*ny8^f;FDYK^*ttynM%O{JY(i?}+1Hr%w5fi}AS)&;EqZ%RA;f0-f_6bzSlu`CaoJ zBk^x*zWO&4W&gmx=kbhcraP{IS4n}9>=mpO!&R=hLvd zC%t~~u%u98!lbae#)2n?ByY5R@dYwTTlZ|h_UNRX(;tOFRjy#u)>lh8zhdRq8`D2B zTVtO>9F-eDZ}Td;3lJebo?-Z7c&at6y`!DqE^XE&B3Vf5E?N{!t zM)PIC1`cA&$3q4{_FSwoyeiTl7RPg+ z@dj-*T<7D94!jhXA!Hi~pZl=#qWawlZPs6;7Ls3XFfZ#sS(ifw2*l^XfkB*==1UE< zT4pq;^BaD5gXC83h2r=`Ut}5EC~a=Y3g-KwLy(O>%m>J4FS2t9XfTGn&+{!~%ug#* zdUFI)jRWl)qA9eYEFxFP=?F{(o6OCqZTBeN6DVCf4&rAWZHgA2^bw@+q83UaPs|Qi z$0#5qrI1IQpc~CBCz26USLAlSpVi@y5i15hfvS@e}9tm?*{(bzXxTvpD@`YM3A`0cNQ z@hM-n^T`3Ec^Uqm%JuN{aYfqfC-Iz1>}#o87UGBB_{48CD|y0tJI|br)5S=8 z==4Qz#lgdwh>C!-<_r61uD1A1IZcX#WVnw8fc0jt6_*81wt4zYZdoBj2dkie0J=D! zma6q9mfb>CD5gyTp2^0#X`|U4zM9wp2#pVy?GYgsi&sq5;c~r*6~Dm{#5SWMdhH$8 z?_=Hs$og=byR_Mi%>(*fE`BHtPe_!PN)bRX6r?7Kgn;GwhZ=0udW_0|oacl5JOtxE5Gw3jDA&KO%Yb8)C z>o}FN3CVSwN`tWStAjbS5?h2O(shr5SRuvy#7^-c9LGUOGmdK~Z-{m~$5T>|Ac*xR z(lGZ=aA5`^h8krk>2Z>QlYK_n#Z7srVt$A@=v<)94q0^G0&8Kp15$+M3O~mWeOY2A z2rVT4ER*CpMy@N&i4w`X3uE!9uoHX3HR~C+#_9Q!*@;7x7q%nI`rTq#FI|GVWu= z+|%%>C>_hBwCiY;PRh4M@4O}G#!QRgoyg*3@P~340aFnf)S9CAacXj86upmKF^%5G zt~e;iqIbb@=sl+`y^jsorniVu=&1C52D&%)EBvvvjCRXbrC>&b@okmEvDk6&9BT~T z&m4oJDwuNmGll+}C+8q_H}y+h8~u_<(=W%YW$Tw?RZ7zQSe5?2>X&1|RJ6{}FZ;Rh z<-}lZHc6GId1YIw*_u{`XmbbT($+Z5&qcl+US-5gp!emo#Ho8w_F!6wkh2{ z!dp@Y-M-Bdw&OLQp;|VGet&@MdlVg$`yFQ1$riO;+il(Qbta)jx3o`a+rCcYZ=*hr zOKid4U1a`bz86fOxl}ueH2nfDI(AK4zZ|b(8p)3Xu^s)QXm0Csi{?+XrTMYpw$U#j zdI&3$yk#J(BYxJ=NPloYT--ZoIXRjRNU~UE%-M@l+tO1O=Kr2O{EJZ19$pTFmDvXC z?r8S#FTUl9<9PP){~o^I29x;8MzXBBj$*qn0*#N4D=Ccg(#X)mE0}Q2(s-8@6)~Xz z+9z>sATkDClvp4#p~++H4n(Hzz;)BO7#9bp*D}?|g;SUKguPiAX?=W}$JC9T8tzTB z6CV8#KP{Q?s8@rP@8|#$83Df*^JfdPcocKruU*03YQBa59iH6N=l*`uX{glfb2c+w z&X4VSO(E{E<_3#j-@RjESG?Vde>?ongx~ooSB0g_Ti~PXWU9o^`I&bLbtk)gTfXsaiO2VH z(J&7P`y`|^ zVd3}IU?t&k*9Om7GQ|FR>XO&sjxF~%YX!#S4l;M~&aTRX&mewNd%QM1yVJYxrnT3# zU+q%rI-h&X|Dy(O@wZjSecU?H;!V~@eMy}fJ6a9~` z$69nU&i-IGXC{m!aW=v^!DIWkqh|a)x&r?sM_1$>tZ2^+7#fP3-jvnsjf8NSg1{}e zq+?pr_;D?}fIYzNvrkJ;rgRV8s8VmhS^EaA`3U2-31+TdLU>8U4z4>3)|qC0^d&sG z+u*~neaU5Sm=8Zdr>yslrCi@ff7%?sWEpw~SK!D-k5Lbh?)uOx$@-1vsj7bCQp6_1 z$K!p&=ls+cDck9bjBdp31VNmk8{H`U7y!#hM}B3Yk$9?9NP?Q~y3pl>h-SYcp&4yk zw%Gj71i@r6f}3{YaO>(|na}xQd3gF8=?e^UE*L=bf;x@IuTOR=`oMTK8aQH2JC-L6dl9Y)NKkI%VPj!y8AK0CE!H zhQYFBX0BDoyNsNGI5QMl0G6310(22&K<0>F3SPqXL*52nZ-7@D%sng}hA08=zgYus zb;0u$=2kq%!xeI%AbR7*=mS}v=mXmrXizP2fCId^b(YLpKEV5`R?TQeh+ix?6My#v zAN1om)r|2t9lSS$i&h%VS+$1~@vbP_8@h?VCw|KPtj+v78x91pnLAZ^WUBI6tl>>n z-h)60RL+yYqxc2lwTl;t2N#DcUyb*$_)!YfW4Q20QQW9#e)95R+$HM@U2WA0U8aZs zQxGcX*Nj1Y6*n8sUlU&Aj8DMRlR|lVG+5jkAB!I+>&ACWxc#en_Qh|KcTR=t=GCbF zgJ_{#-TiLpN@IWg3V9RPp_IM)Rtt1hRBtJ-UK#3%qB965bTY>H)o^Q4%7l;YXi|Px4(N9oI3DwHJbN)!(A`6zx@uH*WKTRMxb&xRQ4GovB2Dfcgmo( z%@=UF5=suf#2#j8b1PxD2nSb9!8epNNlCU=eI)CtOT#)(K9$w5^l{2b+JeoyBqgBoQ8r5DR6}t%Efmlpul1? zV^gTu9K$0jxVBt-wb2(okORM56jupD=D1{cXuq$G_c8}&)N##(cn|I@budPV3HVgTOsI^#e5csNTv87Ifp00nlGmy1;$0F z-(BkC5}6e|b?pdYI$lvE-?{<@p8*Cd1qMuS2u&y-5PCKAE6{NTd36GK6_VMFegEz~ zq1)eH0o}S|(#E4Z{z8_OIR!^REv{ADS=fli>6%hju;}Cd5KuyQm@fm4%-OM(a2^8s z?G^}6v@{zR14?iOUgyN;I9>xg7p6B5>`O#%P>A-t8HiqwCh%wpssTM}K?)X-HN8(} zIdFT9F}jiOoQ8KqONU+!M5Z^CM?x{E%>uj-Ge7>7sMCNky}_tEuL49wI=xdSUWg#m zIA$K|+_?D@RSDWP;{67%UWTXNn5B3czYq{p70Xmb>S1*8->Ay$H2*d)$8$KfN%ezY zC&>!(oS`O~%l{@*^`BQl@FF`gxy*u!McCR-PIijsKDT$LRDKSf`I#-y&u=$V zZZ*U7$Kh3dC0nrzVEpd7U=K`Eeq)_^Zjf{i^D$myBR*#Xwp-*u39eLhf{m>>FF_Q9|NGGnF<%y@hs>56^N5^NadT#A?;yE$#>VING5UT`e>3|#uN z)|@}-2xP4Hfs+$a<`!BlfTVFxi0HakPD9404W@~BII!Z`SR2f&Od<>dA_FHab)t@p z&DcEt>RoKlX|Go9AZA&W($xzq2~1w&{!TRa!4DaQSSidA&Apq7HBvcMc%-sMeLT&N zXfE^v%PQ2vdFo?1X?s+v=~qfg{62n*Y;BcmB~F=!xVgfqRxD8`{6|NCkf>7^^G-s?jNSz8ZcHv^KiTtK7he?{?k|TeZYyB z+#iU+qrE_{vdCg~-5*&Y<6GT4W0==?lnf6hzX`xojlKr~H)noKX^LNx>fsM~43rkJ z^hThN2{HcnBzKfbW?^#2aB>Id=%oC$*(rlm38$19X27TiQLa?ldNicIKM4EB4f5n96H>4;YC|N@- zvZhVdH?68OQ&k~{Fq3*<@NxPptHuRhNYqv*X72SHa}`ITm*}nWJ|m~NYZu;=6&%k$ z*M<*bAEFqr+#iK{S4=&e2%QT!6$fTaI=!L}H+k0J`%G<-F9Cyeb&c<^Tz0w~w8A}O z=nRfdX>%*^tMU;4&KS4GQR%6fihZWq>~MWW3|oz=&ci5O4#L|Nf7zzuM!O>2tpeYI zSZ-Hzt|mYn`ARGWx{f{@YOw88>#6CFzj1(r#@dIk%UNhW9o9}w_u&rxzLqY|L@izO z{)_LQm#it+J6FeXAZ#Ci@~41gk2wBax%WOk_D>8YI2hp>7KzvTBWg%X)(Nlrv*wB{ zSYaBeivfQ=S{C{NVd3Ws$Kv$|84fE{i<0*48fpH#Yxk%Z!J~=RU2huFUx`Ih`TdoNX+&>i0ES zzpA(bRPq@}6Texw|7wf-Q}M>&{{h0>b(ZT2vs5Pk4*>r+s45o!qe{E{&%r-7|3k5m z|JSFOTKIoQJN$1|eLhu{{Qq$}|8KyMR)3ty|EkMJ6@d!?&VBI2MBp4Sz7m1cC;|yC zanQrc1c{m{0u2?hf0MIWrv{};1XRT&XH!;CaeYQbikJm)e3}TL-XClcDDBgjE(3SA zD+4zQXSb<3uw5ZIKUMWuQa~e!te`!*147_8o>V%<764z#`Xui^At6Tr%dzHjj)2uu z0%nw(D0~sC80<*D8`=HQ%K_4I*WvaDUXeVU{?<`e%#(x~Ju3?~H6w&qP0;1aWY{wR zD|giSaIi7gJhav_*fCAuULX7Zh7ZNPYkrMVm?M-phDz{u8(eu{-NT5vE|_Qbfli9& znvcIi3&)U})^&8MvhoYse_>U8*m87>V>&nmR>gR>hkF{;uLhQPQhBVX2H+4mY%S(YR`c3hM1~V?*H)29dzX z_n>xBKpWJENj(=e%!Q34jk>#9L5-f$Wao{mr&;|BQrpDpHUS~qSDFvY!e1fIwWc{a(%Ah4-^<1NY#H*_YH8Gqn> z!ASq{0q0kY4I5KtJTw)}dn8ayW`iqT@NJ2|5Err-E!FEncUtyH_)z}zGQayj6Ez0R zjs&P>43&uw&=%zxP>2mUY&1w))UEfn-TB|LauF-%sY>1KN~s$4u9h_k1absBBsOf> z8($DU(P4A+3tl@Y8MsQ$BtB1{I(U*&k5zs`waeTy6~r5H%89HIG!W22!m z;NGu=Z|DGL*7Z5Mvr&(9MVxRBUO^XhcT9^u1_ zJE|`Y?918h^~DuDmwm}a@K$J?-H-dMe%SOrvOf>y9=$(xKpbI))jz@9;~g-gRjUr* z8zSgp9?n__4x6YO*B4ao68+Orw-itwzEA^sai<#~K=Wk{JPUv@^nIafa9FX6>4vI- zUld~1qk#(rrEQ{xx58yW%caP?5o(4P_mu{qYapLb6fYnhUC3ZS7ZhU962YP)`|}dG z#~ZnZBV!Fq71v*0+y#jbG<~3sZf{Ixeq*Z#QDJ|9d&p|XQ#>5wIOF6pTud@nFS+kO z2%gTtlbL&`-xPoW=3Xy*#yjaBS)s_pcmzo5ud za?tBMU{#1;H{)7?nE_!Isv%Nd(<2?&gN(9rl<6vNlx1*Q5G9FylyKpfCHO%cw;T1u zO-R`-bgL@nBGaZH2yQuq#59SOhbZm%*mhDqRFdt*}Mlnzi)4%OJxd zBE#GKRwew#>^3QWvzXYT9Q08YLpZ(0EQ|3SfNL@S`(*srV7SOT$;U zEotyamh+oGtD2Lr%;&N10Kf*AVn66MVZS(Zo5ggGkgV0Uw3n=iTX-@GuEf|yb5G)j z=3NQ(_Op6EDGV>S2lYW%{HiGm0wmnxa5V9V*l%d!ku<)>%Wqu)-mzM;6lLx!cxE-x zLY;~GYLZQyYBv$TP>6Wmvr>J#{8%UX{UOn!6q6J?;d?Jq((5 z>?`}#6SA+i?4^YT4-M@$3+~;73ti#JwA*aBWyVh@7;9*%d5u&2;rbk0rKMHfAu|B( zNuZd5Hsl7-YBdOC*=rW`%Sn}X?KO)kVy}@ZN7`#P3SzH4|BwI5USp1Mv2!M-+iN;! zk#GR&FMK*KNf%RXlO8E^_`|D}t=6o&_h`{+c)NU_Wv!*tsaWNru?8%YVT1HRa zfAjd(+NnuvZG_zmT5GzI)`L-K=cqlP6PVT+FJAEu2*Eo0IljT|8Kb>M>+D{8)<3qD z7O||fTYubUiW-Cm))X}f$|Yr`tzKelvzL%6BLJhqmu{Ff2hU+Q(hO&e#vF{kHxiO@ z01w$S4>B_&N{mX{2jlD>0=7&&nX52Sd5j7oXgUyuWzBIAR!&-{%qw&6;e2&3EVZvK zOYLTQJ#9;EwHO#HF<M0uer}*!DY#pA{)9F zz^Q8r-1X6%?10kf6pG8^ z+>DoIyqA0_z4j#3_BwGF)z4t>t}I!t8+$y?eIDn@u{$v<1Ig8xM#F#qF3|_$s8zWk zxS3-68344u$og-@)*qeMbgb1?v05n}fam-tSTor&i%=h20AjDN+7s4HZFvQe{lC_h zMD~bft+pte!#OZdtDcQ8#pTb=Z_BGpA*fw(Bs~$&3P4cLy!I8 zcuq;3=oK`|u39QvFS#qnTXITjOzCaFaL$r;H0MX|y6NsrlPU-Vj$u;K z=cQHs2nf)uvUw%O?F%puOe*Eg08%zC#!Wo%2@we%u@I=`4rb?a!&(n-jnL#4*4;^~Vdvbxm?Cz*oysS%|?iW__O%4ow;`InqZ%$MN19C-C$P-9LJwlD!m1QAD2rHRbYUse_e)k{z;8DvNN% zq^ip@ss`A2$k?%E25q_x`ix&V6Eu5-F;5^w!z^FwKljSue=Rf>Le&ap!g0Dy{ z5es0B7wA9QL;sO&*O@c->M(+$^8rv?N2@K@5iPrMx-rDI>?RJ=0mxcWcS7#GVp&qV z_)V>;AC)1D7M5R-T2s#{mc0(#@rZ|%D)B(ZxHn;QL0TJ=p4E+7dXbdj7yA&*qRnN< za9SlTJPF#&o0RS(hT5!4A*!*F)O8k#bkN#%q5|h9k~lwM;cOe|Z=K)9Kz{)bEVlnG z&N%teOVyLYUW~vJKk5PG*0e@MsM}0aIE79a7jOg5G`k!FL1I^Bp-1+hz4vl*&|r~s z&?bJ7K4^GhMj`B3j@z9X<2L=KBL*z9{Tnjd&%o^xl!+<6&&DuzH@tk>++T|OFRd53 zs0m@|V2?@$7!wYobYY2|kJnSG#`eI#$0!~cuOS4F1*H+o7o#5Ck$U7Y!~+DKcgA^S zC1|13@df*9wXvb?!aq{6i%$nH?kdJ;MGLp`!)Cv9l^N?G03pZ!HP1W@m>D|zUeySd zbvcw{8qa+5SDR;6BmPu)hDs7^xgl-Va!(pUAb!zP#E7V^dg7K*P%-c*4uMDUcKFn$z^7JKoOCI^EnodmnJK5@Ga$>6 z{B{ICc+~_+UMgI3E?FYCfgfNAnf58q*3^d4b8!BN77q9eoMpv}EN5B#(quakzwP<^ zDX@Itc%DDF%1+$#cUyh=Jjc*{$3*5nJ5cWwlY5?{d7xC^!qpm*O|@Z}2_CZR=8h%TyOVhiR!wILqf*Hig>SoQ7FkRxyojwlM<&V#9qf>j}0i={V^?Gn%%KV)6KPZrCc-HIO&II$)92-t+4~E$jVsWLr&SZ-x ztw#*zO50d*$2Ds^Q+#4Dr%p!;bdo_Xpc}TDAN`X$R@#y6%=i)8nQ?nNb5zEr&XL=h zGyu}tPT$V_5+g60I)|(Z_I4(uHf=+c`OKkj&rWXTq?P>Y9iNLfS-(&P&0NeW}Oq`j&5hR;f_N+licy$ z!gTKV`JZg=7{S9g*nC0%#Yjs8Z>AwT9u5My8uw3hb4yCB^W=_bx8#oK9EpsI(W9N* zowA-WfqZHRE$^uX33F-Hhv=;rvzIc8yKHWdVG7-!>U=CNS+7!QD?BL{vd`8)iP$o!aY!JqEPTT1)kew)jb@*vXK1wf) zL3q;`N#G^dKpa+Kpb^F7AWYk|JRmHX5`&ymjO5sLYvIE^;2F0-b;j!Q@1n9u6k)Y6U!h z(47gDiWs?8hm?-D}n!WelL~$C7S+8Nk+`q3xxNbo4R8P!2xqwuvb5bgA$dIY<=uW!|YbZPr*CS3R=#OVm$H(--b<_!Obi4f<@y0 zK|2EzTJ?=UNJsV_MWB@^4}GC1l^nGtdqL0uAA0NsWN&xAVhT7YqSUZt)}( z2F@#Lcc;1H4)lB&+lI2P2L_Cxg^o!Rx;HPNqM(Q6eIWUZa6& z2;McggYHpx|SxfXe9aEZ7lRIi&6@EF_l@b0|eV3FGO+je`6I!kJM zaI`I{U2jS4I*&HA4p)&Ch}eo9P_hyaFAh+NfF=x+jGtR8l|h^(!PdQfHRZtSKGtHU;@A-#$hs(zx#>L-s`x42uhS-6PA;odn>FWJcp zlDs-HF^0py9(`^QhA7ShbM;w^)oz{XgfMq2+PVjv*1R&y*dDye^cUk;MbG~6kw!yF zeYn**WqHZY=wN5KwZoJ*z*;U@1SV{KlagmipYVoLNvBG*`G_5nYwNkbAC2G29L zL(}9wi4;I3xQ}k5`3TS@j2yr~$*qs$w01A4G#p>8O24!!?L_0Kv}QgP72Yn{ZeDK{ ztwIr!>&APgVdyk_<|ycYmeOV~2poPK-+|>OAXl*qa%MVZmz+fXP&Yo%7Ht4gFDe4P zzc1a2(^Bu2R(y#xhvvR>VFl!x2hL$<2lhoh1iN4qpgzXny=^9>x@9v`oadRVRn<*W zwP#<{qF&vI0G(iGb0G?yJ7U>bFqki+2EI4LwWPEZPEb=RK^5JjjyH@?>Z8&6ZEd3I z)8hS$Qt|ZRnb6E-I5@NqR*G+coQIs&&3x<{YR(WY7`hFHg;)|WNa&W*77g)HhpI!F z2|10~Fhuln!w^x+@{S;=UbM{*r5`h`wz_@^1IJAt!vDj|!&C3e*5=olmtBP83&ss& ze32Wb`XYl%eFGkv5IhZ`eTv#rLA7D9LR<_tfRTd&`Lw|LZ8f_LKvH8Ee!+e?Le55-`Y=e?|S|$ zhjvMBIX)!I?Gmi<9NLh&s4o%E>9?+5ZA1(_K`kP-UxS3mqLw3#u1WF;eUxdd(##rq zsTUS4%ruyF$TDi3f!L31s2#O1O@{LDgX3|Mdp(Uh?CD)R>)Ep$p_5_QSK^EL^84Q- zD|1mcZjFi-KF=q=#S1Hj^{xn~;D-&GVKCt&Rqz_^GY^ED3>q#$RYVD&0$ zD8s!7K99R@@<^-#XuojdzvKY4h|##s%-AgN+#2~^9uLTGt$nqjhtPSSst3;M_aMrL-nwnT=FXF}{a#yO*e z2Nq~~j3)$SaPuN zabbP&b}UAo|YGx$ILA$}IOQUNRI3s~iO38fuwH zSaJ{;%cyezqc7Jwx6k8g#Mw1yABco{rKozQ8nOEx#fbTzg*Tx%5LwK6BI@z(DpSS( zK$lqWn7vSoPQisYAYSE&;HDv|VS;@+SLm-_~Ji$wil^63Ic(4aj(+0bRTh9r3 z5Gv5qZ@8>ekM;No$8zc?GNK{HiVIhR3o`Y9K>ILw$;C?!3!v7VV2(d=2mDj|C{*;> z6#*zG9gv}SPy4A5ROdAjv)B(R;>&GN*>_Rlkek6ko3@7YGq5l_0CFN_5n zVIJzEEgs(8SQ*}ZHcZW2FhE)s4{s9#gEqcPapEkcA|GeuB?FqsT)6jGYe{$=G>pehN9txW>B_8n(M>3VM1PutoD2Bn_G- zh~aE6x(y2+RKgo}Ana09Y(KR1d8$utX+Vem&%WJn%cuw3s1_VVQMo!pRQl*f*?7On>TAV91kRHh*);3y#J#mvT*HZz= z4s+Fj1%m;7K4752+}U_C!abz{s7u;w9@#7LI%hgN$QA8l;fv-;5k|W5guM^pu0$t^ z#XP{Xv8aN|v&VzF64+o*@YwhaKRP}DfY{z-Q0zzOV|zid5fU@U3W?>3d4w7PQHjfA zIM^KB4vPIT7R?Nbh5x;6RP5iuSI3Qt9R&^oACg+F_0h&xFxsv3Qw7h`CS4D2H@_e!sDYu4C_#~+>)_?`tjG^#Q(*9s*A-A1r z#lZQ{WdK_68r7r-;uy@+m#4*ufd|3*3=~VAPhCIxb}%W<`^0eG2XUd({jvdFmlhC; zL$Y2gAQTGh@)SbU1?fenqsWdHyEN_=#W15Zqe=?~T}6ypIwTG9#}tGH@FzoX>u}s0 zId&j2u)#gRruqUv4U13ZKmH&303MOf16AqNp8p;@SisPT7(A{zxJr%YGh9F0yZ5j{6&?;u+}=%e84z1 z<3vHo_85oCr|NkEweSSb-o+9dp-P?J~}(W$yLb!*lU|I@|1-KJ_?kgSCu} zPFuG53`I${Nh&K2JM1cgi6^2Q4=MC@mV>G!&Ozh08RUh8ZPI} zPos7?!YrVi(j|6)Y&!vqc9W+in@sAg-27C_BiM4Zu#An08kv-A>NGT^nDHG1a@Z%? zth^;BZr~m%X)};)*y>-ja9gFtF(AWE;Z)V-_#C^-j|w3mjuHpJT%9bUJ$iw@_Tm2J*ff@F+KB?vT2WhjL8hrF-Lsn;BmVhL(JezB~aFzF!>r3`T> z1VtG3nQWgrlkH18lT9}s)?-+mG4!GW(0mBJ;PTBri=ABKmCtLMn(ruk5b>AO@*TVJ zZ^HC^$K)CLjs-K1{I>(oGxtBcXL|bEi_bthWIG?uf@&GlNClRhFG9HC*cyi15i`7L z@sIEy6(BOgimSjDiTTKG=1~o9Z4)yw_#CXJQ-KmQ*Qgb@Y!5)PERUw_YNW59)AtL+ z?~&}HtRJg#<7hWToce)zxM zK~eq;UGDD&|9?H5LieFL@>Xf-+?2=XcZ!(r;={b<5%J~FDN(<40S4NA1mQ2L06P=8 z6ZT4hJVEvpRe+RHxp_FRL5~)mgakIt^ zs##HJxW%Ns4v_g009f~V?6bp@X4Z>wzx?-|WHvb*am zuvmk9Ts-q3a>z@YNq6Hv)?Sgl54CGD^HCga|LMgd4s!4zND}o^YX8ZCVyP;BqBfwi z?_#&&4enOx#)xW1YWL}~j9smv3hH@npl0el*>Z}M1^nS}K%#+|kZYCy$+iPaedOU_3F#aC$O6{t8*?HcUaf{Fccs#Bh{+uSc%n;n0=9$M~lNm0^P- z+>|Gy;CKF0FIkIBVPbQ_`58QUNdh&)Yg)H96(J(IUU%*@4%dC-L^_|*MgwA*5l%Mw z$Lf4=bA4VgA4@1y19?OHd}AAZbup(=*Rmrzu%UdOFLDYl^>s1F*LTSN+AS~^VMrwA zC0AvErMmPa{$r7Yc}MumJe=J*OWHOzZEG!Z#!o^ZwYG@SZQWd3_cU)UIz@N>2%CKH z4PY^EbrCk6ba8SH`?y^Ch>()HxDz3ROW=ugpob-O?tR+Bv|6zle3IS2ZLKc$&$-|3 z-mS^*U1^>7wEBlM`A6wrgOhfX-N$|CV;A)Cb@12*^M(PKO6<;|vzJUoC~R}E`w|BT z%s#rD@qA;A)jt<{cOTqUYg`NmWo9F7*2PfL;{Om;s=r z)6gG@Hal8>ReUMq&5r2sS0~uvw)Sqiwn*-{GzFqpe-^@e!T1&vf)^TDH>Tspo>F-8 zwKzF#lPb6Ut9cg@jd+F-aq*kYkOHQ*^m9@O$ZujwfC1{1aC0EIh_hmt16b| zyeMwn(%k*~K_t>62W(L8{Zn4kjc$uQC7XJ^FTuL`2N8W1y2etvwnmi(=2{KZQ=_Sw zp_G}D)6Ld?2~TvGOV?IZ72gLuJSF?|%EQvL==ri@Ib5pE*@Zs($0D|?6)93{uVpY9 zdU~0sEIQDGFZXAkNOv6;HkYTcIic=iegDfKs9&=W-sxw0D5`D(&d2Ta zkQ|IHvOcok>|nIBbS!{Q-4l>r{nVno(#P!#WoHg$u{0VSZ8dlz{d%*#VJvNL7#q6F z#K=g2i`zEPb};qGbQLP##gwcR8YWt(HqN^+nv%Dfs64H(zMi2W8>tkt7H3yUwTyiE zGPSDON1WG7?oF;o=sx21TbAx1G{o)0?PaeEOD98bMhh?fHO$R9)5UtLTty2XApq)v z#*95j&a~J%97k&kk#@AEM$wMK={js2z96!qQvXK_r{Db@j>-ImF&t`qJjNY9$=OA( zLMiSDlf2e3aGWZq){m~lPXyKWm#o#bI-}Q6xpG%6aMG&ir3uGMwJQ3E@FjQ=;$F4t znRu)l--N%={75I4Sc9Bc5-re-TBWWMOklCwq)Gz<3^Dn0Be}$=npM-akHcx=9lVKm z@Fq8jUFwy1M?@X2u5HSxfx+-qo*qshuBH%R2034Ti*Mp3K{*T0;t%TvfFm0hf;+PX z_|y{x&KI+-7yAM$^`e5#D+W?MY9BSAm&gvzAX31Zk(7Akw~*$`IY&s z5nwTn+>|C#m!n}1!d0S$Z$P-rE2LeBckg=J5Js+Rc^@K#V9OxS+hiOS5##qD(#*5_ zonA)*??&^`C0W>Ec!whFH&*$LS7?4C)WBFo0rRyWya5MtaGih^>vQKs5$sYRW4`eq zyB>QQJ?ET?a0Fa*LCm&jxh{L`=9|63$4`}ay`4O;Qx2FTF>uV>EhCSp@to6FLY2gE;qq|XyGMNIl zvv5HmxIK6=gG0{ZA1#b4`_6Zr#2b|ob@86sqLsBx*{-ZOtRj5N!8ezD>rj&glFaETe2&ic)$MX2j=)#<8322oFu{G% z!8r(*(&jL21?JEmK6itrl3PbdB1WJwVAPw}cZEMBygJ9%P>U69!dFu7bH;tneR0%o znf7ya=L$#b99DFG<11+ilzbI%VsLPrXf6c9ACZ9*PVh(6*r|9(>@jd6fU_&}+ynUf zcd&2bdHC|zUvm3puEpWw@Yot~b2H+lDZ|0NoX1n|u z&E=(rm~n=4;y}I_ieSe4gI`ahOuAE_TJL{bKtGa7$PV!)MWI)rBi5REcQb3aT_ipz zyXarPN*0+-@;xJexOf=)=Su2u>7jKWBD#qwR02eCsZSYhMU&GX0e3@?*Fc6>jgo6s zN7ozCXNd{sHKmF`Y))W4PGF^sL6eObqnhqo#0j}dwz#*?80&0|$a}DN4M$=<9$kda zguazNQ;*ogroeJxU7FS?JN_Q-YcHbx@9X4?-jslI(r{qK7<`+6V)1|Y#;*4}-whbM zN+9%gm<+3c0V$692KcpOS+q2v*SL5cNG{*`qM@2y;eR+3DGH#Zn(E49%xB-qjDJu) z1dQi4nmy%7&z1WYd{t{pt6mEz(;#c-9!SZ?N z8(9s3fRznJ1$b}CW>K1r<{vuo#O`w}4H(r6@ZqnlZ#tX(L%;mt){fe&Nibe4^no-` z&EJ80?v6k_yr#t;Eo~v{0tg3v1ifv0mI@ZVw%`)SEm{?BM1(Jpcp^;UmkmA`IxPQW=|aI>f#I|r3~Mm3+o*o9Wzo#S(E4!B#jSue6EcOL?e z_%l2oKg%NUh)d-F+M31fAiKt9q_)9N^y~V3y=GWGpbc`BCvd}QWQfb}-aaYED(U18 zHx!h)4^19|8M^}Q%JrER%@VcY*3LLFgY;tijI|bP2>)+u!WBkip+|S24^`R-<|SR zEDWe+#xA|2HQv!%lT!?`B^t?&U!lN4ICd|zliwIgXZG#~5Gp`az+X%7q3lZl228E$ zbvz+9z~Em-BP1`foYDmOMEg;H0!C;*EX<&o+NV2xj-LPTvf!$Ru|uHDQhq7ouXB}7Ex0};^- zr0O{eFRQOtXY}>{`;o^B){6Oa-134x97LpvHQ$tu{0W!n8Txo%nm%5Wu8(oYPFsBp zODj_!^DGEBnTkEHs@3s_{v0+;i)m1BejqYcQE70!r0&24K0$U@OY_@o!P>ouK=6PrA^?~j`HGiWI_ z3&04Vc8c+uN=teAjVuqK*_F|GQv`_uwRbU zuee?t`c+ixKC0HvqFOhR>v*u(LNPWgrCMj-1MP;OWYMcs)l{TwrhIQ~q9XkV#lyA_ zGW99tG5#~?xjzvCt=W6<1^V&gyN}S1+0c8?ErVcWr}X3dsF%`@Ex&?(T#t0hOohjx z{C}$-MSLSld?U}*0=}&uL7G2h=*KhBjTBzD11}hrMdmg4NFQdPu5FL={0F1pTqA#y zer~xmX}#`aP5^`>Rox1a2dlNBT}bErCiPiOyU=4iw+|o2{Lkgb-~PoP%EDVtZG-xM znx#JfQGrjy=gU$Ni{So9Ux5lhqc=jyiadB!3^QwUs7zLbb19L=rf@^+w$F6uVePHB z%V;#}x0!kkTqAYigln3HLZhC?anv)fw&*mk^HYDKL7-yMr6*PkFkOjv9v;EuqB21x zm>=s=fvH=l9z8}YQ0QCNl-sXPuluUA$9VwMx#;Q(d!hG8^Tc6|&fES8B25NuhLYBe zoVEVwWjNg55IP0@{7DXDQHl|ERurSaRM$?udI?`HSy{bRVhJ?QO5fPcwtZ28%hYg% zcSPW8ew>I+!VA8JOopE_Ot$~zs~Cz>fwr+;36#{B7>huphE}%uVUF@&GH#MS4c21H zncihag!R(Mmw#LFMaLtbpbz??FOchUPXveXabX?@NCw9fxdwR&4r@57aSwaxb+4Ln znvQEJ-$wgvOyBmoo_II5jA$TH`W%`zdUSrl1(@PdU$2DV&UDP^p&J|O4!Gco&SM6X znQ`oPu70NFK)e$^>zZ88=q-l`-(772z|6ZC`*B~Mw9p`r@YJ#GGYmeN0=%Jkz}xR@ zumSFCm(i^gl-uJHLEZS&1G(s}zfC=^zeDRi-XS8;nXZIm9YFdL@`bFHS8%au4Fvhd z6A@PTM1=h#!v2wH6RKOrjBr0_C{lt?kpg@wDTvfi3Pi2)W@OtGz)Gz&>2|g5{j+Re}P6v;v*ObacgY^|PAO zfvc}X`Y5FLMV^$^DnzC)!z!&%A*`9(9)83i&{x$a%8BQTcaUyiWdznV;(B6IHuaDz ze(|TkTYzJ1VY%%zn~?y0my_|PP4yYGN%9KhHo2#{G%G7u?h7w_4KN)c>1BfFShkW6GEZxAS5I{mf9ysQ%b zlW*uh3G?}q!$77y5+{h=R#)Z;=J5Eb!2gZ81U7G>%tC0V4Y0l-Sl=fr_#V>1DyNM+I6l^Iob0JNd* zc7!@4Ja^I5rd)u53`wv zr`T7=FS4z|QMf|}&=y7cBtIyBX*!ZPr;20e)gOm$UFrg+=Au!INt(TxtrQ}AkupPwE>#RfLih%}!9uN?$#s@;9d3H0 z#jw1C<`8vfH}?nC+!<`{N77t;%v`?E^m~7@bTGXw$1C{o0Q2QXldRnzL?^ zI4+Jf35MgSb`PeG6@oo;2YPT14$&!sB~unajMb1GIa=?g-{;7IIa4(v1A|7=;^J-v zbO@V=jpV6D0PoiNe(QXZ8X>C{gBGdbh=3jfBvK;?r-J1w=dm=Jd&=$79SKWApc3NE zIG04iqAQ}gFTy0lui@m7Xzn6LwOLV3Rwz|6jtW=vuxym7`3cNX{2H%*eJWQ%syM1> zZV_X%j}o=^`5q}-g7?hc|FM}|dYH-IMkPD6^qgKmEVmQ`(@?q=(=`tE)-{xF<~L(Y zL+K8FX((+{AIM$JU;ETYt9(F|&?1sHg=4MDnE zK}AX!r_8jrrlUvkA~_mTAJK1wE0 z5AxK5+T?@g5mIAq^1&DC!RF+H_tb+O$p`i7K~wU<>*|4-eDH#LurK*wo_f%ld@xfz zaAezv-KQS7k`G4XLB)!v@!J6>FLV#2>i5EUQHe7&-~RY}Y&A*+${UIwEkLxG>gU-C zT>s>QuIjY=UlZ4tVUtR zEB}YMcY%+xxZcM%*-Z!}_y#35sA!a6g8_-+1qkRaY+x4?z$*a}XwlS5tq2=HMM&7h zWPMqPqE%bldTFaIt5UflUo}-;#lpNOOe)?cJN=O7!9HsVun$ca z)lk9tG8i!d3>mPM2~_4nW4>9HU3*!LFNf1knddZHIoV;Bpu{ZFTpZPiRxU ztO|FvFRw4CSmW!;{e=$4>ak4#nahfUO`)rQX!2*ePUx;{so?QJVV1`~^~z*$;rRsD?#C0l`+jZbKbQJGcWc z5_v9tz3wNm6xv%0bN3W+-)j}PsM&v_gp(~3;8^+4jAFlWa2jd>St7hm5j^*=VjcI2 znu)aW=(vx^njL5Eq^k7Te=7fy9Mq#HTB~DxfGx|cgV3uW606LQx-}P;CKW#kx=3ze&emez!JJbRe{LV1?-m9JvWZ?(ocTNFRuN29_RH=tHD1M&)teX*YB>KQaezG2MlE#oL#w7fD< z0#)@SDFpO|Kt!|lg*equYK10e{M^xJOQh-vFc)3^9{g7`dI8$>T$7PL6VFJeyxW$MHdH-EwiFxbC!>cy zDxpEU4K?2~=A`rhEeopz6e-t>`XR0EaM@ejg0Yn*8S636mc3OYMS;CTsYTOQ4EG5% zZpoo8I;%9D+qsh=nse)dE^E zFVJ7=iT(-0QP@ikykODn?)wTG=yR6zd+Tw$ly-FY`zw*9Jwi7ah~}i?JIAa4DIQIQ zbOKbpfN}0>fuJ`!tKTX>b4mgN$fdnnMMMW4AvD0b6C=@gfmZj(biBY#-vmB#vG+Ul zOl$!rdGgcpd?WPAE08+yh@4BU>?`j#F`<=8cjS2jk1#LFB}k~IJV=JXN%+DV`xU}3 z47^f?2T}2h9EFOxsGHR`|7d))wHJ`)p_;^)R=FNESIk9URtP{4Ao}a`$zE{NR4Bi3 za@U}vU%*c`lfOc%zNhc!-M_g~Re1+% z;b-35*8J8fYq23>F3G=-^XHkl|A5?qWvml)o&6SYwudKDnLds43Pmhc5xE*@thBDpbB!M#bwJdX|6V#yIK?ai`lSFu`ZoNR z<0oEAqMQD;L^Oi0Q#Izrs=Es&P7mq})^q7ta>h-@xJThaQ0m^9(kr-)~3Hv{B^<6-th^H`jBf+TaIC@EUouR7 z4@u4#4kV!t?<0zJ$P!;#-`uKdwu%{~gb6I6x24|(JrVwDm5lJq2>;0_d?pw8uM{cx z51R0u0{_n@{M)1Oe{nMScf{a7P54(v;WN3wA8x`wN5L0~siOXYb5KKnF%qGcL(Ret zR!bA%<1A&$&!DREr*j|&Gp;q`w;>)2tSsgdp%${4^4_%#T0wg6qI7gpg^kQtB!aA4 zEWu2xD<^00>V{Ugk5*2|`W}yHF1MwCaZuvqSqv0NMuN4cy4hRp*XlYslDm2lS&ro+ z2-fskMF^Dc=jCpnBeOoA%qo9=G5(fnjeceVpS87Y!5@#F%8AoM-J{2N5EhPDrASESMTYenwB6q^aPfbNw`FVJWx0TO7i!VXhRyb zI{0d9G%{L_!WErL0+Xl&$y1WsXhJQ?J*ZXg!vZ}jB03c}624?ghvQa4Ec`@?0nxvt zH*39GE*OVLEt1g1z*C<{jiMiC^)icowxTUUKX37c^h3G#l=QPnur2hH2hzpH`E5hFzDQzFn znFxv&x4y<5(4EYIt*nq z!8hOoUeWt(v4;-sMH`!7V5Ggexg;>3GXYN17##8(`c7Hwk)28pX?63-1%P>^({-}G zfKF)%rcUV-!jdLuJ~J^p(aDNm1dahD_7*n3FKY@zc6YDUx~T~Ov@~6ad6<%1L(`W@@-TA zJ6llgLR*L!Bp?PL8SBKEn$Jr7%lKiV|NC{uHPAv5%k)VBUQfPR))(%^f5UHBXt@(! zWNH)ZXbn@8UaBR<>2_pDKfgsA`xH66|7>X!i%-P^%||}4Wj93_;_xY zw=UJDks!(-nR*%dA4X_)u0mKVm#XoK7z%$U+T*s*J~e}zFYbxeu>>qM;K4cT8G;^+k>y3aS%izF|`=i&&BJZpFn9G)NWr79BKS7{n%g(}I zd_0GTSASC$VE*NIsuT-QH_-0mGT4JOwT9^Q>ny=LMP8aY>vM%fk= z_5tKs=!4mN6R8jWp#@9M=ggcv;&Yy&@IW0oN6VivpLq3u5@99&H&xRCYlCr<35ydB zR*r3&|CdIxj8&kR#)mCGmBPR$$kVb617Lju}b`3C00Nr z)9T)3HEuf-l}rXCOMXX6mo}T{hL?EJ<;IL_sE}!u*OxX4NXDo!nxohyRs;lNcRD{HXTRc(4EFsc@?wIu>fE z$mDmY{yKq94l7Xu1Q+mUB3$=VnhN;O!+V3D+%>^);dCY`aV;hZQs(A%>U$}^|CP{J z0BMhO1y#oRCsFn50RYEBW?5gh90H+$WHUh_Eq4jDjmC@ph1fn(QN0#+wY3aKRH!l4 z_7D8dU!7`mG^N_6G^E<5<2`>>s%;m(ZMJr{gmx$XOKfL%v`cE&F8R2BZBr(%hyAOm z0Tp#4HMLIOmZNVpuE#a?;Qqa}IxK;;+DFK!FxgGZsi-eK$D_+kf>zuOu@MtW*aI>? zR$vK3<7uLbwGIv{;K%|v+L^&o#|TyLXeoU1+`(zdFw`&>_ahIJZSPBCa4&gP2HJeW z{i}itIU5eUc;18>VU*ww(O!aBvEyQ)l%?agwf?7_M2&(gLSZ}XxeMe<-TsQ zU4-h9Qs&=S=Cf`S!#UXdu^44?^?VKqik%+SgIM~FMAe9VIqR5Z_|p`%{u33^>TvFj zdKNYJw5Co;DX6G#;hha7xKRg!%i;xp|NGw$?!p0O*XFO_IBIHclTXsXQ?U(cOS>R9 zM-EK!_K48_A}ZN3P$0xhjA?t-taBA&Oo__1oH8fmDkT<3YEud`t5kL<#n+h})rMRk zu`0se1zJawKuQ{K;j{M4$+ zetFx9%!Tm|sQ(SCB6VLYv|H#_8jg}klUWaQaa(#u^_*PtR8s{4otKi2uMv1!#hsvG z3ubM4T;ohQCVZc_q%u-^6?_)W?0SKz$0uxq3sZIHt!*=8>y*G*o z2xaSxO1K&#al9%*nF#J}39xO&OWOefoPkOrje_9W6cnw_YG=*}YCK~%5#IPz4nPZDFMgAc9Z=lFYhy&I#5jw!OSSg$~(5L4Ua$$w%KvuYLG zG(1+1AY9Zn<1ltY;^HrI}4Eg(}e#F_G1ZxR5{j^~13ICnD4Fp;b^F{XO)>tXc&Z zoIjbqyvTf7`U>9D1(Nnty<^lx&2%8=dx^^;DXvu%>Bjcgegu8ZMoGi;Igw^mRLO{u zOApb{K*R9BYZ8jZg)Ccyyg*d0>WXU>(=myQr>7SqI~a!;kjPQ#Qxcc$<2JltOHvQqdyK}55@76&Jj^olOjsKOu-vjIM2173EPV8^Sr>2(M8 zRb|V?)NR2qzKhbW%6?3rdQ;jkCzF!=cQyZD)XEY%lssdJ9xFdrQ$U;`c?wy^1WPwQ zp_-`Z;y3fty+%}Y;rwCEWl>oumfsgDI|O~(bW9z`6vDvjE;02x{{$dRzZM>`pd=m> zumc8^Kr&GgyOIJ5Rc45;kOUMWoLIAVnJj&DlLgaXukaX1%QS}o%Pwh)0i znMA3Xpd`ORoBgImbJVdwVt^r&L$n~%1w~@dU-hF*d@QBMmoGGl9o`I}I*C6f71cvLmHUJ(A%DEPS z^J4(maaa!l2c^^7E&=*CO)0@<7);EvVj^$|*-_NruLhJNKxyz(F2Z@~v7&f%j>kG$ zn(KpB!;+ibs;5htDHEBZ=u;~apze4el=hXpZ`rGh$QYb$!+`Ya+x@L)YE@2@j24~U z?Hg=p%qbi2A9&Nnj$dRKG~L|S!A7igolP7mB2v2jq>*LISrgiZErjX`d*WK{Ja%qL z06GvVJ?05r1X6^?+dySf8lWI$aGq!rk->ASloPC!ocsy;lqtCy6_`(-E@d$iprXfD zO{=S-dLG!YZUKs`H=LRPA?X6z8m*ql&XSsz4^wTeAEeqc@Jt3~yT$$PLD-Y{EypiD z{ABN!BaP}!>pVcA{usr7)t7GGyZ4@S=XzEm*m3BE-@x8|PI=AFRM?QNL3heMKeO4R zEqCLO`eYxrkkY^^`AEQgn&PT{l)Z&lC*EhPzB2c6Yt2vpAm-$D7H$jTGWKk|Vl#K@ zMWCfiK%&^qG}Q)2`hZ}kU2d`(>{di`?_vi`UKt%`X{Gb=E zG9lH6TWXQYENTH>Srj!MUt9%=WIiC06fB4|^i>emd2fLyBoc)ezDt1len~*o!!!U; z%TP?KfJI_auzZ7JaIE!=SwA797`!e(7mi8KCi#TZFbDDWrP(AI7w^ejXWVfZr;FI$ zZ!!3O#QjOS@`~$?ypRdd(3k%lUD^mbdKbSd@IEu{cfm)gwny>XhF^U6$=*Lhev3b( zlYc`v0(X;39i36_UrX7tr_l)P#4bHN}tnDhk03DUn^(kJ;Pp?|0PdS^fC7VsPL<);}hz9ykK z1BU!U!aR|JIfv7eR#}c(m&rmsL3_l9j|Ttqh)+OMUuL@MMYOg=@;!j0RhHp{>Prrs zK3kOPKGM`E29QvU;C9ut)p*!wEr1DvW2(;Jct_Wegg3X^h`eNP4J&6FCheF;Y}B-bimBPN3e4d8g8@CXH`Y! zwg=|tA;Nf672KD3;k*jMQWZ|9Wy0y12Un~p+kRbI$Y3}iZ1Mz#rRaVEq>8{{HkB?e zMLKS0$?Ug?sis~UTQ9kE%ue;N_*a(xs_uafNSxx%7nqYjP?o2t0P1paGy|~+QI#$8 zs0?Ph{QAl7tHeL2|63UL-jHG*DL_%k!uF%itth~T*U3AM?`xbPKDZ~ah!(4rTLM$k z8vLY-1l$uF?3`eBcwoL0(K-a!SL<;YKzkLJ?cp>P!^F1c;NHqDPVLDCI{?v~HGC-u zN>oL!iq6*)SX6-?Xz-KrKoqf@0YB4QLj=sG+T0kT$qLSJ@Q|gVNq2seFDphB=@fQ? z8Q1rQcmxT>XzmF)XCkC4(lIjDW6Znr*OqoQo6t{Rg^5z6!PVzW+C^W5G4BLcx$v{@Pl^GFbVN%;PFXcBajk`6}iK zc|86k9@r4~)v!cr9^m9+o$DA}frkbMJA2`hc}{v3;0~&ubLMZE#Y~2HiR0c1toIy@ ze+uz%TMGyZ5XDv^H+2QoMb9=NV zftv)?a}tT5L6|JrDO#{uP|CY(GVl&EJ{bvvJAw4VAP~jnduQfjz zOXQlL!L%ZZ6oJ&D!1<9f;XV8D?a|*NyDD+_6Jsc4x^w|#Aj(x(uS2g>MRi30OM0=5 z0waS0MG_bGdx`oGt@7_kr_URScixm($J4jrKt2H?kCt}7kmZr}iZul(K zb_lX8f}|7eDVAcN{nh%*UV4UfDw?+Yc^=2==S)vGvfB=Wx7*b6K9@gr%CY zo#IxUb>Z+*mGMPpyc8MPP^!()Hte_Z))NANA~0du(THma@Ck4i6zHLbs$w7}VJT5u z(pbewJrM%gI-__479#;U@dnBHk_$y}bdnzhlb%(Vqlok#OggrP^15}(dxHA9lUz8M z^zT&?N9h7ds@3CZ1?3S1rC5Enu9uXQu#xXU1%<*lzQ#66Tp7QPzo}&53W;0HINiL# zMXj@gN!iK`M2*Y{<|QswnP?(lZpU^vtEA$d<|9y*rQ)7NU3hN`c(@=E>6k!~kf7A+ zS@q<_fDlE$%)yO@*!p|h*aX*mVAJiS2Xe6TFU;<{bR>}OT09AeHWrNj)+9*LteN^Z zj?Ja00XAzw>BhZ)VHV@Ac5~@8e&{MbI2NvOHVl>L|<-NXo+4J8e(H8(gR0=oIsU{6*ds# zj(E`hZ1&5EFbE9lWq37SH;zQY=`Sbv&bC74uRRiJlyrz^hZ=l{|AXQ&XE0z-G@zZA z0qcy&S!9@-JdNV1MCG$Ia4k2y!Yg@L-z@l4q*W6(AH>5g54X!r2YThF$i&kL>1s*B zg-D)joY;!NyoGZo$kpb5b0>jo73=WVyg%O8&d7pK{P5ZO^*-HIm@6)`ainrcv*Cd& z885az#J?3aGyMEu~USyuu`6Z6NXgG z7!#RQ*V7r1pi6vU8NUFh7Y|b8V8v#7o7{xOR%}Qd>V+Zk&G{S>EmX}4uWK2JH#wHy zClYv*XrSpm_@=r=0hKI6m?!Xh4Ilb^mL&ILQ>hkbPw35m+Y<~jEpGI2>ECEW4#Ok4 z47z~$e{*Sr4g_9*8VQU^3y(x{CC~(ju9M>c1fDBt^o@nNd(k1h@cgLnK1`u~ar}MO zGdu%d!BPYn7`1LR(QGi-!r5q|*kSON@k!H(eyqSn>uW zk8MJ$I5Xx^T z>hoBpy27z+DDr|NySepw=19u`37Pl-VqU!jhhdk4$h#Q$V2jze^~cuf#017aFtrnxPEKpa6o*{~SsLa+Z&d zN6rwSL?LG^q+vl$w{v97{@awJtVjI(B>P>E77kQ#`bnVsEl#D4RYV8dj$NiQyrN6k z$x9_DkbqCp9uC21gPH?R3AJW49sz5_+|p+ay7GyT9x^v&Pgb6PIm=7*neM(~pC zRB51ag(u{y)yX0@|?XoC}q!nsZ&d;%C^ft9l=Vos_i5pxLsbZ3i?&te; zL416#N8`*!oT~nZ4u~ueCm>8-5np}fsSW&j8>*nZzNy;7t1oVT3VKEun_;`&wi$Pi ziYKan&9s{F1=dzVR2zSG>SiRKv>EUW+6>y!SM;_`cMfqGe9>5e~bq_(HBIyC~b>}}E(dIlw2#3>fy8>Pm;uC$NPrxcH^^7+@ z7Nib{(MHBC@ko6Z#i^0H0!v{*>I26Yj=5OPM{9iPM*g*6s*N(^pm1{`7Humyg5{6t zV?cH-!EOy(bq9bOSpcjCrL2a9Bc6ay%BL^AO2nL6K1GGH!1tB3`Seqk)G3Z$0Hxa#}{0SQ>Y!5|tdP83&hV9yZdXg6}sJ9*1D2PE)QM@wP2I zK1Q+&` z=MTqVz|l}N@iW|AbMOdlm2gtId#pu`sA++|L1blApgJ2!`{WE9r_Vj;X>?~#07P6{ z11HSapdMcRNSr($PXs(qf$WEDAc8rw{~<)Mmb)l^l76AS0iEt=r@M5>R+#(IdPBdE zAXg0wru~J*h+AFc;Mh1tj`zB-n6ztKf=K`Uz&B>7q~SZPq5)HtZoF`o8RrEIj=WP8 zclcar7cct$G(*m3P2ks|kqVOu!-7|oc@8GhOn{Eg3**2!&DhHqzRnc@gdlEY zVHq%qeqm^|)t7P_?)fax>PFlSvX~wt1fX@_Md+2=I+4)AZ&^w1Kv%`6eG`-Pmn3oE zYJPS!)y7}vxZfFge=U+~+m7GU_)WsE0Kc>Fi)RoR|8l^}8vS0bg?EEV#&`U1(tWU_ zEwW$CNPPA*(~QI;ZT`WI@t08_jJJ8r(dqLx+*0&%fYq;IsS zK}cbPBE)}ROhRk~A-+jMguiuN4zr&k`QQu5iPEye-I0#G{uJrL-3WF)NL)x`MDU84 zUi&tSGz#^d9+HL^lAhTla5s22DMJ+$BiwA{H~7ZHP%{iT0cyHk2-FPMh#DH_0wF{V zC<){Qg)jRbC(LeLiKYrMIzGck1b7x z|BXu%A6B)pv@)5qTKXvF>|aKfWSjOkA@r7CP->2@VEm|atRX!vz?UqnN1-+{_0I&; zX~{(%tJamV9H@0~)_M%mKsK@32OF24C8Wu(GoIG(47`($0m#+UC4#h8cm1U<91ru| zi@$c?_4u2B>!JOI!}l{>ubEzYdx`(BeKEF7vAt9PrxZ;q5#aD8<8MOgP}dR&`Cwfk zgzipUe3V9wmCdEST}v?cnc>mYU6f*7rH+Qm<)#1-H^4;xXzQAO(mpLc=_Yg+E+f-= z;B>Lp1G*)*)`BV*lZJRu+C6Xg2fh{kM&IIFTA3Fd5bC$Fj8V5`wqoRpNPIq-&A>EW;f6d z@D+-Lh%tRdWCa>Hx*m;cLL<`r`5R~KEI&r)D-RcVCgPY!Pk&7ezoQ$C9xH$`WPyMC zdmWL6ecG6MWGpzMGR=S`*FU7nR$X-ekqc1iU{NA5x_2W?;e$6i@ZPZ~<3b3l3xFSd zb^VB6SYDC^*s_=dc90j8p*6PsTDr3p<)EWh?9+RFFXxC^44i6ku>#W(Dq24cTEek>;hx zpvrVI0{HUOw-w^bAYKJIhm$~2aQu-sfhn6e6i)O8ec29gWaaQ++8>A?@5Fjfkk?Q* z!H)YkThOsvV3dQ>-G0Y@ZM4H5EQqknn$gL?;TGU;Gx`)%{rMKRHY5b}4fzH@yc3&T z!I25Ej5tYpLaujIuAwWK>%j53f(6Jv+HtasW^pQG>+u;+n#-*XUE%VtaNs69mUh_d z4+BLVg}=6?vZDM=54!+USu#b@5NnG6_@=PoxFE1(Xuwg3OD6ze#_~d5AfRs}q3-N@ zK4!PI=!%jWg2U+ed<_OfJVb5WT15hDfYGL@*_J*JH%P!6y-KU6NDm+#(@gsmHjkaq zIbMG#(S@B7Cp^VJr*A9LSEEDLsxlhema#6rj4ZL&oVY2{h&!*D?j-R0Mpk%XJym`f zYZ}{(m-Gr@Q_pwQOKAn09M@QQ#HM z@)+MqO^H(vR!6=s?dUkZdj<9U355BXAfxc&)=*}<4~MioC$c0C9bGadt* zjLDJ$$vsGZ2R{1XqQbXWdY^i{uzWmNCLXLU9;_=KtSK*3SO|Dp4rhoQnIUpyhRDGT zf$4El)FDOu6$_^R#M1w@IXkbv7gP3G{ntj_*LyY8eXVGKsQboQ>ONB=)#S?)bsx8d zL>Zg)yhsaoKmbrmQPK55xr_-j@CcW3{zyXUA1E|)7Y4Emq)eO+MdhJ#i0SqUyHISf z^znC}ZHWzenWoq<6dpz(6)(oTs`gLIr95Ty>

+Ls5D;>lBz>jdxGJeE1-6TH1nd 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%0DW=iFLbA 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 $9l$cdqBfQZ4*6 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�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 GO1DTwUK&{Q=BnkLquJs?X}GKZZf> z|H6X4U!bZ@ByiF513x%W{Yduk&mi=!LikUgaT;=4QS1WbwsojIb^kC}l%A#-KnZbe zuY`fZj^cvGnH#xS?dFeisTwz^ja*fNWG3k>*fs2yuSgh_d?&_SJMLF}OCX&UjZK_Dv08)Zagew4KjNcH2*n-7B%NdabsBNGs6QUASARsXBf9-uHnV~`J zeV^z3z5K|W{r$1_T5GSp_S$fORi=Bby#HO+W7)UDE%{Qu;owlz*rl@FNkK zyQOCki(Et^2b}xycY{<1H|t*ZHTI!zj5C)Na|W*Lr(yx1@I#GGn9>ES>$p+ zlQ9f)&hj2Lj;t6N%VSrt7*mT!J)V|~=e07PdNBXp9n9LA$h8dOg5p`G8cl9?x19E% zTmy#!M@F?wZF5?YC1~s#PB7F&ih}X-^VNuM$`()Y1%h)+Jty=-f@caUa?xK1NbcK6_7ifgVbj$N zuMF*MDv-h#{gq^@Bx! zB}<8cw#5;JLC&V-dG22bzf&e7K2Jtm(WY2Z8g=ifmj_*f z-p?#0L+=l==nFbK6;TIEx69DiTFxdRX9ioHm%1T8g@8l(LczCWLA~-Op{Np-z{fbv zrJr^5pQnt~Q*S?G3$_Z~SyB=u1JV8OT?D|dq ztJzoyIlGzmjQgTMsiu_u7p%Ad4)k)O+6glKzGg-4%2x9EL?`=#IaS8((?6RnpS;gP z1%ghu$EqEWvTl>vvRBsYI02Q+QzC(@sY!T(7-WA3#8igaYR)52&3Wy{hIVHM@9nkh zO=KhzTqxJF4+UM~Lgj1ercf@?VXh90-%cI)(3y2q+oR-3N~84_7ZBcb^{Vjq5^0{| z?`)mz79~>l((9Q=#8l45L?YZk_Rt3OZP~2<^@O5skd{U1qGJ%-2^?zC)-Qugh7&Zt zp_7YvnQp-HrglMO-#$1qVAo-lqRpi$ zcYTznnrG5BFcT9%S@4~ZC1hwglU`TT>q^TiO)2~MrZj&&ttpD2bbDS?K$@=F184*x zd?o|U+pHn>=Spc(5?*k`(7D;t8fg%mF^gAMb&D!#l2-xd)zl_+2`}GNUCM3pG9M3+ zxj^Ue*G_BFf3H0d@c)_i+%`mea%<|l6uInxT$F&oB?7`wib6;xmPiad>pF9HFmi2w zFmeZ+<1Qp5S3an83eIIL!N{x&6`fQlGL&zFh0g51e#i66Yan`CxVJz8Wp|BGrP1~a0QLi=G;xs zDt=HSDp>fzPv{^hKlbQ(XssgGolt#)H-t)eYlh&@pg$J`bcaUiiW0&XvK3!&pmZ(e zX{Mmtg#-X0$qa)8LuZh+V~Wb@4KHZMJRNRdXnVl3W3c&?>};Mq<^kI83p!~^SMB^S z+9|lob|c}^;%ZuqG#7$?>iabzY5EB`*`HCI>h_VEizuVgz-NTNXPd&pQX5R&0?E@` zyqnd5+hTe1vt3%Om=(OK+S56}o_18*AxaJ(%v`)uV4SPkoi>H}WjEXh2Y}8M(ao0T z-&@3vfZ_uXF|@CH0IscuFDqw8rG}dQIpoBae>-Gjl@rEjEU(#odXI-`Mt0hMYGE!3r_3eYR zzX|f+9#{4jYG~$I&bB}#h@h}3=rFq_`7y?qEI+;_FVjNBTtbA%i&AaV8d0dNnPa?# zczA*Vy5s#^qG9B3AuZi03wW78)JncrcB3m9qmHIuv0Kr24yG0XBvWUnEAXz2|2E2c zo8i+Fyv*dH>6ZP9Luxl+$7Ku~_Tca9eFyEkMEjoBzNy-`QTy)DzTawJRiDcDOYLjb zzW>m^quRGd`_9w#{Y3k&*QGpqsj5BFuS)ru_FbTNL>|_@pKIU0Y2O$1-pMNMdrbT8 z)xPgxSj7HFv-X{*cT)aU`*vzyqxOAU@1)$WeP7XSnX7$=wEg^S?R)XCD)R>I%hCHd z*J$5tv3Dl$^WjzeocMuk1Kz2Xz3?RT>#^=^56=w;ls;M=%Qed&F3viz z=YqCMPTcZ??o(C>-#Dw|1hJXu-u*)S*h>(Jl>UvgHbv!kPoD(O^2#q-^Jtk;^ggQ8 zI!~?DT5}#FX3_`E(naoM`!~Y@{(ss2(sdu-ewikOU-&h@I0ncr`SSY(GFu1_uz05$ zMsa4oA$%r_Oke$9=b#ZG2g;<_u^izUd(`rgxGR4samMX?g}*esh7(?*SjY^;KjZ=Q zLH<#YHL%;H_y;^eZKS=$dRZ8R$e(JT?X71Cz#|vomV5OMlyHov(m2KoF2@MRoByae zhPotYU_AY48)R^d9=$*ItxFW%eop(Y(7qZ?3uoceSR8U*pK*sott5e-)z|{)OC0AW{00N>RRH3SAGVNgq-&+r$>&^SZV0*o~v?FNW-Ng>56&cgw?mt=e zo={{(@fuQ3jue!!=qZWk4pVfqN`+c(thv!k8pz~9^_U7!Whp1ilJ^9{;uhY#*Fykv z>H)Sn@7Rauz$-9nodt(3Qg-l?@||ToBU4^hBCyJ*wlv?vax+^*0Hd`|$y|SQZMGjN z?xz8k^Rg8Q75n1j`(&_IY0!;-HooZdhtY-nUReXm&5X)Auw}D?`i(b!JIPaAv4?$8 zB}j~a&2rwCwN2@v$la{iKu4YI2$)j z+z`MP%P#!0WCMs@F9L7&OWO`c_YgnF`UtzCn1U-|XXrc$ zii^*m^mU7`PWf1d$QBO|#N!f8`)rI@W&aD8$fTUCZ;1Vdtrdn=?KLviXkV+1TMskv zd&IGiWWg58rKgp6YLvgO#(7Q;VEcYv{U4A~s9Az(Mw$)N1o2g{U(w(s0x& zheyX%;fD*$+*XzA@7UF6Nh?l`o~7bX75Y?TKOuSKlzbrDsf`H&p~FA$7wEkx%-eN_hQ&D#`+E2S1Izo4SmL9CYYP~vIAFb z+=k42cP&zvREv_s+k0X((F( zqBg(tEj$b4aL~dxWX{T!GF~ShRmy^wq`~h{7AAkVUXldtqR<98gRoex6&Hr7?z$3K z-UjErS>Dh*_7a)qZX^oG9v=N$Rqx@#pU9UD7HQQT-O{wtU)D`4G<4Irgv6LH>o74j zxpSW!bD2de=gU(x3(&tWh)Em#J~<{>%h`#N+Bj4)SCK5lQ3RfvK7R6PNT+z}_z}Ab zG4oq^$z7@zQ8c{Ut_^;BK%IqsB(kGWGAcW)WoJvymNm-1;CP zTwM7sUGKs0t;rUqOnKduu`gMUPlYYuw$G*qgvGcmYpK(2X_u7qR%$s>T@F2;jh5GK zk1hxLqCF|)bf=etprYGDxs)w5IU96eASll897d0M3W?_U2SD{@u`|{6pV~~=Uc&gw zpvl<*8PYqtF{fRgr4!voLl^L;11n`+iyd?^nxBdw6$NQwI0ELnl(Y@)knn zF1$^Da~A7w;d3K32|uJs`NC!Dd*_=jV^JJNxC)n{CK-w*O~Pg$K+fnuf|NaQQAD2X z!9Du>s))sa@+4rDhTkTQ=TDUK5D9mitXFA-Ob%c86XiY$1dowkQ2?~cfE4;v%&7}= z)fdE9IB%Q;8}ED*&w{ObsOG-kpT^aP7V_ zv5@;+=TYCyefYuMn`MkoF&apgw;m!+SRysdW~W9@Qr^noEC45NBi{m8|H&&~&66>| zZ6EOm@y98+c-p?QpXYv>H@gpR3`?YnD4U{4F`6nq| zE&>)5Rd?Wt=2-N?jD>m-Qua0fn)5lt$h zX;z)uaZsxnSTVT8Z(cE6K`m^sgsef;wc_k7gh6HsuZ6kGitVsZCB7U1-bdgO4Y4dJ z09ZHdz|n-`)DFHKSYUcY{5PH^=yuv$$Df?tZHOw|&lCcH*~_nA{np8EOEVQH$C{)g znsjt09U1UUmByEJ_>+#hq@y|MSd(-_la6j2JwK-~HA5c(o(=8NiFVo@4M%fhY;-)da%`(5LHqwcp`zQA4g zG((R9#Uvg6q@ynBXihrTBpuPDqdV!yz${6FF6r4+vB-8g#6X&K1S zSf&vn6$w5Le!aQSNX}!~>d4ps*N~K|kMAu|BatD%kP&gee)n7Few*Fz8uuG@zuoRP zL!cq~-LK#M*16wi_q)dZM%`~WUqwXO!@<3$LAld0ObEbBEymN8!VzFv7*na^@eSM6 zu-Rog_6&Jzbu0{PsJsn2mKkfPdROb%oT2ls)3L*b&fBSDhYy{%PscL+L)GgAD)e{6 z(0R*rEI2k)-dY_yYUsQTIyP_UysLHW=%Mqj)3Ij_owrlR8bjypBUZ6aOOmZ037aw2 zS0;p*i{_Me7|*~FWkSU4P1$_PSjiO#j4=^J%8V+~+rKDr+4LIgCud3t$;_XW0Zq(g z-a7rqGt`p7^Jy|PkRkh1WM~m>1$lBlO`dfsPi2C9!~Vgpw}>);^us?*J$*V)?x)G) zg$Gj4h)ew^!NMbk1q}=*ClX7z2Q;ssG3+1RyIvSFW z)k(*?q@y$G=u0}hFkM|v(ovgqG$b9Xla6&sM`zN}hXdx_IGi#TW@wpZFHeqao>7oph{AIy#e%J{*IKb_*hGeSIZ|2Yc|Tv$-TZDKYCSPw3A_`okn} zHZIwv^z7n%VaoXrV|}~Xmcgq^nfzt(=i#k;wm~q2f74h$F~PpRvHmL7cekGfVKcN} z-E+JkLrr$dwslbaXL4hblY0}JTC-`Y%Dw)olLP!<=%mGiNl$!2(!gNSk3J#kEhJ?f zb`5GdSms0=*rteR&E;F-el7PqmoH$Sc+yyZ%_$sL zo!~El35Pe-IOGm>q_;#u>enf$X`^GMFY#!Qo7PkTzlI2B<^M5XD8ro@DZsfy%H zV;eck^l)xDYhFwjwtyI__Ry89&{1ygfP*QE9O;W_Rt^GkF_e`4bm3q0Dt(fGriU8H zt9!qwi$DQEQ){gXT(k!!+4PWCdtRlirbrncs<~11jPYK$i5?30c1oX5vg={q&{0{}WiL#UiyQU6{Fe5`;1%~1mQ6C`VTY`Us#b4(gFM9aGoothrHoJ4J{ zlGNnBa`GM*c=;u&Q34f2+gim6&b14EXN@OqKC;?-*gh+Fk}6VCj?*&Stc+d=*Evol(j3~*80DsfYxSyWxzb!B&=P9 zt>HH^Dbuq_g7&GPs039}h6?KzpF(hrux+hj6_QoSm@wpwc3bN`1cC4pW?>Nk1`F1= zwf;NdZLKZ*5;K$3qAXJ}n^ert`K9(qc2zRR-&A-^!mBWCz_g69ukvhDnf4N_Fpxe< zpRbY*!u+tV475e|OKe-@ZOLn9;(7}gfM|=niDOrscD1#xkl0E(7bSeF3U6zDly6(> zz5FVw^~8wV=EiMSasQ#>vTHptGZGXGHzRpgTWhNXd$y<1I;7hc*&?|jzfgG}Q@<lX8my>KU-=Oqva` znoH5hupcJ6qRbi&4_o1Q=Hf%W-(=a6EC`xt>I_G-WBndiGxCY~nd+Lbx@gJBksj@s zvzoKgVv?t4jQ4w1(Zrh8*BXPgTUJP7y6aYl^5|o$T0vI&cUpVThm>+AeOQp8N>PSa zsr`}IW4j7co0Qg|VC4H=no5(56}KP*n8wqvhtn3F^nptup00x4{yxU^NfcB*M3i5m zhAhvllc>L!H>pagmLyi>O#qZKUJ|iqfPW~M^pUz}qJsZWs5S`XA@OYxszc(O zMAxe342gFV-QY$KfqN3Y+KnCp`6POs8$AT}NpzG3rVN3k^|9fXyIIq$wFy;ooy6VXyu( zvseF_*{lD|?A1R6iVw0^{}32H$X@+JAow7A^$&sH#A@~m$}QFGl^gtoyZS{3*fb)^ z7(R}@7AgAS2_BU#nd3~Xq})v{?3IgXTpiJR~(Pd4O`?7jHA zp|~vy_eJcM9r;?Z(qli~&v~6bwI|O$7>lfnuvMd%@-*wh(Np1;Eaf^0p3a`VaqMMW zV~X{~%-j|N$QRBc`FGe0m%Z(StP+nMl+d~|jAIshxhUYU9D!ZlXfmzx8J=r5Z zzrT7sRzM4Pm=2$pfD*6KD+`C0-oedAJg-n{Q;5Alu3P1)6@!F)0jBcSiIooC`J|NF z#IgP{jRTULYUcH-G!1T=gKrZYrrdU!oaQ0{S|if_pl+%K-J40C_p!{*r>Gf}}mUoMNy-1)e*(sSEINv)-nv zNcQJOar5Hly6ffs#aTif{AqlyRf9B(qoUl$ugrwL!#z7o)g8GQwbDK?=U}%c2^k;1 zU$7jDG;nHwJY4&^@5mu`o?1 zpD%;sr%rHdK7}4Ayq)x7IUxru4~jA6F=!ot`2^jmSq?HKN0A`8^`&7Gg9WN5$K$g@ z3y%BNYCLal|G zC(&5|a_r?#%bP5O=zInr_1Z$q3s<6)BxeEuj8ZC3`tMWEfeW*GWNhF~hT=iga~f+p z_O?4d!ku7Xvp>pDC=0X@bJs4Az6-;yh5l|d zhw=h>C<~YDEHC8S1sj)xxT3c{%nZ?szwTvH6O%Y#-6RpY6fg1a(kzGMz5roQt?3Vnsqwqq11QkEi2NTfv8T|3aC=6 zu1g(dX37u<9%i~)=wHK6C~FPTbX-c5&I^!x`AS!l-5aP?(y89bW{J@{-aX3?%`Dua z4SnTCq9(Fyl`bt^^lC0YZ{&%xylK1o?eWCGp+Sps!5^9;{C6ZJbtznu4(Pkhx;j86 z;!K|l!pS(&a08RIG~8f5Svc7*-6SCpOtwD>#R2G9ZEOn z9_4#vu&b(zlyT|<{tlB~snIC2n|h%iMQ&OuCBx$6}3(5b%&BLgv-1pUY)Mwh1{#cQcZ@#-K_phq=f@A72Q z=lPRoj>U#|Hq@*R2Fw;4P#LA!%s~1$06bdV*+L6?=na;<#7fhN=y97a&6K7|Yno{0 zqOLp~prr(;rg1o5A!tnf(jq-2QQioc86P>8g`p!qKVJj5_`-qe82UQUzDMeNi7=6A zB(SFwSjj_nm9$0z6zjl5v+gZgA_m7|5U#UIsya6tZByCqX;wp`a!T7_j7_#1Mt!H0 z1$MVe(<30cXN_{Js=JeALgOx4n;jR2KV^JpcOX?M zvra69ncl@PpZj*y4PDCInT;wu&?N8C;W&mEARZ9-*hjRQ#TIX~sW))N&i5E-a!l-B znN)5TgnxmF7-CU&y%5yA6NCYkTfrQ$iJc9>+$!(0EZi(oRk>Kh()ZiCNe1pLAj@qO zwNNcZ8bErGos$D{p%_=>D-&HgcOe^S+zvqr5(r=7$OkEK2-jR7C&Gm_+!j|lu>~;X zW1C2DTRZ2Ix>VRPu=OxCy$4IAjKj2>_m&aaqEe7t^8Q{F?|YoB!TuHRVa&CGGD#0A z>sW$Vftto~PUnc7ELGEie~=nr+RC0*&ZBNury?&t!f~)j&j0wc@~zUov2QEiceU?= zZsl8|eV^C&V2;$jdVR|D!^5hS#UHAaf6=}TyOgg^r@W|B`6g@M-8+@!xJ6=sqs3A2|Q^#A)Z>4t%K2zln(nx8W;jrkr~l;2+vP zgz4ndoqv-Z^Z)kwx35d)GoOEJdFOE&E!?2iH=tGFYMPX55}~z)Io>x4*uuR?zZZxj z?aoBGDbYtDJ>ypnzAe0zzq=sI^0AP4`PhF*kpj<1S*|e8z69$~i%U4ZQlY@Tg`aWo z%eWa{cDf3sORXU5SaHZ&Qy#CE<0UuC)qn@ONlpdx4yZH@ZkqBDtbiAOwH=cu;^VmC zVtR!yk3Sxedka~p0D;1%Rhse<2n-9aj46*|kKBq+^w|5wYD%v(H@nLf5f#eacZlU^ zS9u2fTHia%^xX^UF6X-D<=1(~@8%^LCM05}2QR+zLBqEaDC&yj>BEn~EB zGf6-qTmTJ$kz6kjBxml*Gvpj=uuQ{_3>gR!`T@OfsR9J7y}+SfvNbZhzp{ftUVdGf zR+AVHwMVkgHb-p=MII>@Y*+95@pCuNvhhr)dc2Px_bpId^=<0qP2_pz`-K;ck1Cu| z$`nf}Q=~0p-%w|Oq_r-tzu5^e0eAV>qbh?RVhE|Z>1|P~SV9~H>VVLTpp1H@O*9`b z9a5=lK~7ogQNWv8X;Mdbl*&V{WK<}9Gs8uefHD6?m8Svcfx^aD!Cv0K8UdL|dWacu zaUOyK&!p^^NaIwWq{ngR+Y+x(n%7(o5D9EEAr`7QP3v-1N>3+ zSBev*X-r&&6^b^In1JDQ#b(f`35((9QUN(DSa^+OPg6(!olYc$97LNV=$6W6{`&-R z;KFxa5m3W!7>WV?hvrEQ!g;8T@dH{{cO}`4R*EHg4)5K}k|-G z`1d3f8a?)bkdIdeteof_jH`N;3dN$V1x2(~C&7TtF)&%32t)2v>sV%Yd3!>Re~Io_ z9sL3rO1u?ORG9d@!vu&x+f9H-xgzr4st`mZTR8H<#KBH;?-2UR(PrX^jscG^ZY zZq-`C<*s-_DQ*GscllT;{5D)N7KfQi7ElR73FU$XBG#6Vl^A62Q*v3ZiaJd5Pmx4U zhc4VKKO#oOp}& zjn?;_T%~;%XsNMW`*vw*bGG(ft$iVUsa1%5tNSdDd5tMD3|G13{6~o^F9x_Kul^g# z8tPxUrfFNKo`>ERm4qUfFR$@DUo$^8YO*ut`6^?5K{>ZDaczD965iQXr0@&BMW!qT zCpVnk>yhh)>aWgj-F;VKC^GiEl6a!Z*s!9iZ{@g*9uIP8(3z488;}d~8jwjzbNI_~ zZX-AV0*dle?irEm5ah(SbHGjt_JOvZTy6S3y0z>bF05$h6eDv236QKzA5eA*>c`SNSIn$PTlX;_S zrshI~JI?LN0yBUBK-2`;{#DsPXdG_*DQZ_{Z`xLwjl7#k9c)kve0oB}U^^$PN8!^) z`i6~n;uT&zB@Og>C5AzPXOQy4ro^M%FYU$^pq5BdBd&5w#1ZNNw)l53G%mHKHS2Z(z2@n zqN>Y<+Krp+D#{)3B_~Sv>)M+mS*i6z_^!PEpaUSexa8Hv;6i8oIux5Ub({bwfwPc=#P)mU(y4z!=dzUf6L5iu%gNM^i$Q)vEnhpSf`aeHp(yP^w@UA0}hy?A%tB zCw+|nNbY2zS5nw%_Zw2^w#-u`vd!FWW*+Q_0W;w!rq4D@_^1P|t&f3a18z1#@ z{$R1}0W+%LTF@K+$wlv?o{t*&9+sJ2{;*{ntoAhcSk4{vevegp2Z(b_E;Dg<#^p72 z(2Wow`&1~*1Y%q)0%lF`6%-pTZp-#qp68uOj0yl_beu^gc2$W6q%F{uVidx=`_(?j zB=M`^=x|Im1$}-902q_YHJ+s1$Kp&W;?20WOe+B<#7c9+Rk{5NPu|*AB?hDlg9dx3 zdY)dz9d%&qI>bEOt0)Q?B!X9oJuq%rkv&60(R9&llik{WwfC`^9 zkbyO5UwSv2BA1_Ql}_y-yV{@HVRZ%uW=wk@G zlOv|f4>%*RTi`-OXOC&Dl(#}AnG7+#dx%z4Ovd{0jIh#72=L<3tW*&@1?l5A?^4gg^ zR`Gi-KpU!pzsH|vgnPqc6R_C*4DQu3ZFAAlC6`k2>VU(G938ukwVrAmP5(2ivbjc1 zQrn}X<70Q#XD6!i!guHKMof&_OKeXQh`cjCo(AkXxcC{FTp?QFkLe??JA4}bJKRkA zs*`Uzea;RlO*D?um6q;`Om?d*POFmZo9yRU5UtP7P1gJb8}H=&Tp%(LEBBpujXe6- zNWnjccVzZ@_{NVb=9kV%T;TJO_6$BN=%d}WT>FPAjVI&E6=c*aH#PNr!TKKT4MWZr z#id?I?2LE5{b3^LIc0^n`dVLG{?_2zGtzy(bpP)kl<{AE%}jGT{IVp#gH{bZS7y~O zEnY%}Qcqn?{h{jCH=Ayfnrltxoe5f={YQ~wk_T+?`Zi#49zSVpIT{ZU7%wBvWqO|s9Abq&Y=D+ za&@=ju{-03-qMAr>zww3yCvogH=Xvp+q2=jvNN7s4n`r#<^1)rf{cwVc#Nr?meaBX zOlzx!O}8`*xaPX9CtKWq#7dZv4G|=)KDm`Aqb!L{QC+O_1KwfKrgnkl zzPOi3oHE7*BUgD7+dw1K;G2lw^^uA`#BAV37ZEC9mh)1455a;yWeUIL88%RRsobpI zSll4kG*{5Q4*aM!zs-HnGX%lS8SZL?WkoPM zKyiuqL(UQaHM4|k)t%*l<|d@`wK3DP86a5oKq!WP(zu}KdtMbN5HKAT>p5n5c+F~R zZYd!#ZnO&+A+ETcnnzYHY%T2waIc)8fm!jKFxVPrVlGK~cJ&i3qmJMjfZ8}CQ=O>- zn+c4E=)EMhoELa4TY`eTMik(pHOWI;$4T3BaoYhvJa!=Y&cWnB^9;$~lLcSvyT*#G zSTgXm6tus1w9K-PQBF?_NFJD=A+-35LFZl}sIC6Qa-2d@u2aZIoW0d1l26e2p#&W5 z1T=8TOWP{B3mcF*Ka?!V;0c4lQfM;xJc4VSd!+y?a!sP9{-tVXZ#7RTUR+au6Gd;Y zcHT<2w=mXc@yK0eTQ&kxELgE)>3hL?j5dyWmz^^uQs7-Jr=Hzd30-S@Elv~G_sDpM&9fSO6p!|GQ{&UIlbC(sV`z%?Z1um8vB%T^_m%dA>(kFTE(=B<- zV994LPuhENvb_VP9puSFZ_xg=oB*k@?``8VFeHV-^LGA>*(kqS{=7Z1ya?7$Dyf!B zuKTQdjd7OK$-{A9rfUI*TR8ogs|@g44x3q#?`F1TUnK3<@Y|u`7n1hC+$$4qtP8(K z6zWk0H36>|tP5pY-OdSdju$V%>s2CcT9mK$eP4l`2Ybz~<^q5jj{F)Pw+Rjl&_D@DtLZjK+$9 z^MK$=b?ffsxlW59WA8cK@m;EiW^MbA&7;RXDm>T{6^wN{p|YN5zH;L9Rkc;GjCn$l z(Z4N-Gw(9tZCGVC{~8sPXGhSfUBdOTb#0ZLnKo~3tK+40q0s~`JmTyD$5cb6Ecm+ETLiN0U<+p zglV*K%-&A=zS3r92A#H~cWRrNmEv94W_kv_E%#Gj8$#4T`j)jSBqt^01r;(ZCFGzA z8J-ei(3Ccl?Te z$Uzli5F+eIKyq%Iz(6>X_%2YsWZc&^fRd5_ti8$DnHpZn*qgLB8T&mAzGUoj?R8^Y zel!40H$lt)90*CK*`Pw?a7xQFINesZnJVNJ9U^Jl%wdw|uc>KN$kEg^G6u=IWP)rn z327FdLxiA!vEFaAnF#{hbfA>wRg8pa zo~joL?vl?|glaz^yiE`oqy>L>ZNm$%pT>3B<`sz!)=)h96#8Ox3J0?-5kAAwh9FvA z+bn09Zmc!S;q}(TK~KwE7(c=OAgdScv~bqpB-ykwc~>`*$3?@FQ3gZ6Ei#7$?R#|h zTbi{``rY#zZXZWKq(~+dF>l_cIDxc_28L{NiL@1J1y;3u&T2EK@fqD_ev40Dn|U># zQEldQJ|o-A8GJ^xnb+{iZ8K-`0i3h=3~Mv5<&)E9UdJc9&AgtEr_H>9Pga}xZ9bW8 z=8XtSZRSmQ5^ZK3q$>^PCVVcp09pA|&gRPn7nSvVJ$!HBo6Yw-d~^8D;X91)zwjN- zcP`&tzVrBw;Cn0Ik$mU#9mRJ6-#osz@g2?gcD`rvU1+SIW|(c?YG7#KE#`!*W#ftR z5_Lz=QGi4S$v4|3-#O?#8}Fh)?`L|YggcD&JNVqm-y-50gHEO8b!KgQNWQiRPQf$Dzj@m9ccl%g8@>uQ<-Pl*)ZnHvas(&YLS#t z#?#)kJY&2!yf5!ky$m1dfyBr5_cv2w(*$FKVQiS` zgJ10O%=E_&w^@P2N3@2>{Ov9@Vo7KK=x25!R(&uh_Ff7w zd~;flq&DH}AK!#l459-&0D#YQc4%mr0trK)AYl~On055kUB`lnt!-1#K5xkiv`s-R z7jF)YKjitqU5p_c@$+Wv>*TNhrtCW`4<;8nCB^9F@{uDeRM&Tw+S>skQb>VW0$zB;aCu>U4XhuuuZ> z2pDHion@~SCQ86r1pJdd^#*&Tuu%fM1eDoR>+F?lbimmJTxL(b#a{WS4k#eta(n7r zd!?{bvYbP}*X*ea?3Kb$3E=q9%yN5bgS}E%DgmFZ#{9&d`3-w&qrFo2Dq&*?xWb;g z#9k?!m4NdJ_@+H|sl8HoD;Ht3UH~@$vMZzbt0Q^i1D@ySKYu>I{EzjFnq%MJPR#u0 zuh1T0yYrvFPJ6a0&-vQZfydY|b!5P^eSYi;82%i4r92WvSe^>IPKQ0K!_G<#dtQgJ z>phsaQ-^U^6=81P-8!rwHSEti?3~oFmvvZCYFL*J`z(bKtlP3jhmA=MdtHT1IzKQ! zdL48=s&`>XLx-DQ#^aQJdY%VsMtYu??^e$)>7oagH}fpz_Ih@ZPPc#N*(#_&MW3VG zMV=kNTQ_IsXTiv+V?4aW%DwdVN~v7Ff8i^1h3ZbI1-dE{y7CztJ=Dy7L3(dQqDTiv$()?+Ksi_P^$%WXBkThYL&TM~xF7|E_3m1I}|HHY4m` zO9D)EgU$=_%2CpdkW}`HY2RBXSqmTQI5#8Aps<^SjC@w(7gUN+B}AA`>k**PyXPD|T#u7oB6(+i1aZQw_ z90@wtFzUmCVroKrjI}SZS|CAZ(7wjk`flSetKw?kGE{R@NwziQd|)|UK)onvPeQ9W zwJ5PA7~Y%}KFOQ0o7tz59h&lB#T&+o2WVr^+42OI!k|ZUvozU@D(-(MSH8d5@J?B6 zx~vL~LoxYnu<7mztPp*o|fiYdAJ;vdUAg=1V`yga!3V~3|+cb` zq9(NFb-W0;<`~PXJ1u*0oZ9+=&U5x3%A}{;s=FmNzD>?LMD7nsnEmb5B#N?Ad}v)k zM(^+djISI-t#1{~v7BXV*sv%QqBS;*Vg0kq@_a;zmc8up_(Aq?gHDYv1 zk;bYiYP)=KoE`x8Z+A|O6psXJ*jMZeIg7i4o>v3Tp9K4Yp5uX0)LP@|qx^Nj*qgZ_ z&v*JjK(?NmUB1vE-K`CI_JUtsg1{krad*I01%&MH^o1(wd`4s%9GP@iSWeAGZj%ES zuBd2HcgkB=6HMwCtu!Kppf$?bY2JDT(=0dCh;#m+S#DtBGFwN>BQ!Xq)^;3fw z5`uw*V^+|vCR&Ld$}VOyzJHUpUm;_t@aiN6oO zxck(LQNNPyO*KzC5owJu#P4j-3^6L)rDe0QwxJo~-|@qicewFb2EK91PU=N?6LloydrHNI1E=bLN+P7A%19_2oPN%c-j)|NtT#T66pY zI&Y}rrKO{s9|*8|L`lnbv-H-AtWwQY5Q>B?5&xL4{7>Sb35Z`IqRON(<@QsOdqBFt z6e~D@j!MD+>6C;4(kTf8q*D?GNT(zWK{}Bzf*_z@+y$8Wn<+0+Yc^4beRQI8!J{z>?#S#cKot&a{%C^E&*TmB{ErM6-k% zXFe_X4lgeYd2aKCB2U&)l3)w-`t;&i4j8Id6=IXrV9n#=PNF^i#s&|wJMY4kFlBH! z@c17Ad3c+jZDZ8t?`1CjixqjWxLJw@H`nk@6h2QHk#((_$jWX)B&L~fFfyYAdL`EB zkL@p-@CQpExZ*8I0#9E4H^B(jJk=t3KPTi|3&7yu@6|Z_t;i2oNWzw_kIRQP&$S|^ zm2R&P5@XywqJ%O3Bw3Xh6L3bMaJK>;M)W}!LLp40>bF3YIU!FJf!+j{ zh}7nbUvU;e!;r{in>_o)?gZvxu%A)=bE@sH*F={4f?|L5GnqE(FcbqKm|uZHG>$3T zZ?w*b(=kSYUm&dg3;nX-H*08Es5EXxey^Ot@D_&dm&$EAe^DJuu3xawVX^yNU(h4p zuhk%D3ErQ45)kghvcUghcX(6QsD9K>{_scMr7uXW1HE*?o+$h_=>@V4R^$;E01Jwj zJR=AJqs%MTausq|D1xPe=lMk87oU=0-sG=|+)_-hc%t}a`sf#=Ru~9U_pJk|TQ&=d zrXcgcRujiXF%a?_&krE@%prEKh%;a1PxJKP5<&(Ky+v|3NbjW$lK& z(F-CIkOgC%upp4L^3UW9cvk&DVHNX-U&dZE#w8%04-(CYUzvxfn6IQ;*bydGiNfzc zfiS{cCK;5q-g8b@qVPjPvCjlI>SR8CX)T}$Z(bsBNwbnToxbPNR>1PokpcRyl@K){ zMlLx8)+kfdr3e%te2MwALTcGBlEH|K&ch^6SujH3SFm;eMz!;{g<3u2+{$e8ub}4^ zFO=<64y`lrjXyF#-{sIZ)cIL@lBDlo_#L5ddPRY^h?w74ToP>Atkzu8w-pX1BqRa@~mr$QLW$T^90`m`cHkU6Wy*&OtUnPZ~xvW-CQ1wl1Xd0W<~zHlOU zX_q#(l>DM!@ekV5Y^cddMb-&H4-1FyQihaZMQ+Ou3Qy{az3mlC%2f~};ABLqeyxyI z;C)791!H9j^#uTK5#aWoX6!b%8u{cIkzLe62}~*12HRy|tcd8W5cgqmiLU6pfRl;o zL9yqG%*N5x&cT5FM|EPl7lXk}^G~#bW#KPX5cbO@B(+#oBBRPuz_PR`WjPP#`bCtY zEw$K=HJ*j}K!|0ea5aB#j^L_aiDTGs87n?i*uE$?6uD%^hx<`B+=78-;tP_hbn2@{pa}%uW#pfUz`V#H(u<<_jIjWugpL;j_Ru*K9>9O^e zXik1#+(EG^;0G7W-Oj(cc!WTpwO0n496#i>bx$dwfz>`!2d9dbDR zw&9mE#quKLnV%bQYRl0FDotRa+5&DDSct+;s{%(%GS)wG=@htvXaXgoy0ks12^@jh z)q|IcHbf}`H;M5RpY+%~@Zr1!=qmUpyoy-9BJAxJLeC-MvHGej0wqWa79}hYE!ikYf zqq6#A-Fb@;&MH+&$g>Y!Of$e60HS~nwm*+OJ{h!H;U-pP+b@v}NLBH+5&5|!uK>%8 z`{nS2TL28_qeJ_#MZQM1*nBn47J%rQuQ)qHa@2(hmDx0&E%xe;R2o1IC<7Qpq6gR+ z7!?;Q%(D0gufr*xQKW>@L5-uV!9oa!!N?EQ+KYkwsgek$unhbVkh2!!kPAmX6sGll zRz?9;A?K4A5V?0hH~vQs;{}{}_>aX=>PEI`;n#A6C@%C%)18E>EBJJ>YQg<4uK^7# z%w{#z_y10j#Hug*WE>;Qf&CH%d(#E}^FZB1q^)?~i8Bb#V*qOkP5jR36!iN#txkhA z4J{jND4Gawz{zE=4t(3|iN`T;H%Dy=GR?b+Q>Ko&Lvty=GQPzixh(vIA5M_Xj?mH( zoH_|ObH~U@zIQ|QH~VT@-!$&~cbOPj2h?J0RNc3qm6e!>M}F*Qj75u6XKq{$aAfvi z(SVY+I#PSY`B5GckK=SeNuFJIWsl$8J3M@RxhWRk_3dISl-mugknw#0uys2rqP-(H zIv|!zQ&HW5zbnkTwJOOMNaFm+OMxF(lqWjJ_BcN(7&4hIZk-fYmF4`XC@s-qs@#2A zv%2Y$^P@3o>5|R2B9640O|XbgD_+3I;5*%X0#1K?Hemth z4a~a(#@aWkjkR3By7t}b`7aKy<_+c8vEh*df9zyV?D#O=rnr7mBzrkwvRUkjnz2Nd z?YvI;=rX(b*gxo29_LN<`N4*P|V_Um{lT>BF$z0@Lpw=}6vc~7cXsaL$l1~tOq&WQK+Cp4;T3wKHs|Aep2 z+Y|?rVtca$Z*1q!L(9PIuAh40XCiu$9b*%x6Rz3QV|5j*w;-WA1&IucrQJ zsN$$`-&dtMV80cL{P@G+;zlqJpqGpMC&s3X=nHCo7{8l6L2htp8fQA!pRgkLo|lr1}R`YHlW2tA4E2TJ?ioU#Wi3>nqidKdMzfth$xzM^@ctx8b!|fd}2y zx8bD_7W3%!)wwG4`uV00e;NKV!;4-&-}K|J#m_9@ufu++4sL}3a?2JqDs)JXPff+k z#;Sg`AO}23XK7Zbv6^K>J_`t)iI*E|CzgfkJ1}v+Y|d&~9K&{kiS3n6LB~~*><*{h zm0X;>6|ucJ<9CGj){Wm`+POe=IZWdPyU7QmG$K3ceR5eDxmPVdJ<(9Ykht&j(98vQM7&)S*z&N=KzaPIJe=YHV#sZ9!>qNRVTCbtK zA{Bc@vh4YHCF}b{(%%GDJlOLH09C6WcRxRUzpp_s)5+O)U_j)rQz6(#Pe-7vf3R4n zEEIX7V}<~%Jy(28(6dZ6bMdlKG2AU!e~5)EIm$rBZ%KRubMJ6gCal?IiY;p0Ep$@H zUcPv9jR&J5ajpii0S7aVHwIRs_M^qkgesv@0;8@6t=)=ZVK!#uhGMo8{8=!+AIlOd zQjo<#<-Q&mg9uHWk<0E=r>L{9!h+P|*f}!=$Ky5{6jf8v{k`#~gJrzPW1Md$8}mq3 z2lI&WOx`48?RK+b$MVr;qQgoc+5CCgo?Z^Ab%j_Lc2j%g?#%E<28)w9WL_$nYd#8k zkbmAlfSW7Fv)Px6*Ej_)gzN{^Wh1Re7LQ|t8=9!4g@E-fP`}c13fiiW025`dXp|ZM#^P~u-@)cA7U?KvHhC*qwj(JR z_cbU!&XlTdLr82=Ygxopg`65EtqPRi#(i_tgsjOPjv*p?k=pr^ElKKPS<4K&_zRrw zmi>6U>TJ8}vvcgK^NsvTS(ZKNY_VpTVBH5Jb;z0GpTV_^e zNIe4w;@0z{d(7q~7&{q(&cLY7Id;JW7(@MAFe9qS6zXDn!Z^=(reGoiPl75cTlT2= z1jUIFKeskACMi93%JuVdU~1BFkD06w^*tj>38byk^dexT9gaBE1P zbKNKsdCE?zUFi$imxb&*bNOS@awi)|zZGqEV8W%12<^%gxEEXamje^-$Zq6}vO22K z>rr~8AdBZO;;Y8L_%-z|b+!_B%x9njl=igXlhfif0tyhzf^-78GyE<98Y*Tp&WftN{ ztEh*UR6FlExy^e$&BxGn?p!=Zuf$OFS8=5Z%doHZsAX8s@5m*R*W9@0MUerK{MhsT z`oD3e>VjtCpcSR0lNFi+|G3+WZR@ct*{d_wURBOq!V(X{XEw=%0p>9ev#RzSvN#UN zS~^j9!++3cy}AuXW?D+0i#EyANu`LJsDO6Hm-HsrqU81_m!a`HxciUB{MQ3|_wP;! zPoz?mJn&puuc_`(!0GF?@^_>wfPzJvXt|e|_DUJm-p_>-nbpo#cv_8EuKY9#tc{RasNwVII&d;z)DYu>J(`-FdM70~5^b#^E4`j5i$2 zXC*G2{@A(d;(?U(bBPuF7);+hn0}m_-f}iyjqQWL{(ZwccI<&s%&$z z-3ijx^@Z%YZ00s}hwLTH#CLK1Py|1hb-P5l^)Mxdm()U) zw>OM=-?*`GABjFN-ahiaaqS2Azq%Vg?yvsq4+=6GEt0ilBgT*-N^H)v#Lh9klCy%? z?~atF{o6`3<`%BewS*DZ@x5=nZ`=^0jGWsE!QItcLVS*;&<=Nn6;Y} zuSiKngcv0|jgt2Gl>huNF&;C}l8zeZXdp6Yd39@|X#w{jiRL%*R4!uY`vHo)|5stg#ebczM<9%aXtTlR9wzIW&xLL88mFZ@C zxYe>vsi$R+;1ASFElyY}QF{{vz|rL%BEQ^7RBMMbfJms~@Unjj&fBUoMjS~k+U<^D z>C2q&b5t5^ts}NBnf|Jx#fulVr-w>D+ih zYwt7&tMljqX9us+iy{04ymNW%#IoT}u=$gfB(b8ID%Qw4JtrZ|qw(1B9JiG4 z@k7goKgsSl$(4Xt(J9&i`*)%_0EpSN*#4a?=Vkx+{sLCJvTQg1^v@J+JF+y#)ZZ6~ zT;4oqwKFOEG^lZ#gVG`tOo|=Iis!Mya}3(N6}bj<{_)Xch#bpYFmD0OTWpNnQsDe6 z%NgZ_Wf>>zX08w@JF>UP8T>yg>Ci%5DN?YkNbBsXf(dt&_@PKtMuNkcTzBD^$VPf^ zhRY`O{Ris4QMO!KHaC;%`kqDXULxbm+=_WX(q5OvtG=X3ZtL>1mBB6MO!3bMA4w+O`vsO_@mKFI}+Q%iP1}c zqn5)Whb8xmo&rXvm!C^eC^FGIScimAEc(zIj&w;~)Nmd(NORoeMd`^Una)up$)zEQ z!nYq8Y}D|jKafTZH&)4NPNawiqeNXH3mjmQ0?}sbh27PvZ4ou8y70qLbAV>6P8>7XPZ*rykBW}v%OZtDuPhiV%R|e z!9JseJD9%G@m&uDjAMt>F2RsB2K5u8sZl!vk;$1vjv!0Gn8=M`DcQKKBdgk&7z?*! z-W@9nANMa^Q*C>KTv8${0$1bFay$bF8mnfzP=K-0JGO?h!b^M^#(fvjTw}xcD?tP+ zGWM7E!JF2qNB7Jpg+M~}*A-!j8gTBB4)cIk_?X`a#n7w-*E6fFz3bAw8`HhfbZ<_mG13M_r}w`ed*r*bg#@3DP71-_j=R4Md@B& zy0;|VTbAxEPxlHMrPOPsdu!9Zv(mkF>0XiKQi>8mFvZK#C)L}W?rlr=u1@zpobFwd z?tMJnyDr_kG2I(Y_jaUvJJY>g>E7;iZ(O{Zi&`zmy}80Z>ybx#e(ldZ?F5^D#x>kN zq9@rpv2$T|WgS*#s+karH1rBA=YyEC$lglOHDhrVJfZsEdqtoM)j#SL_G&suj{fCI zQ6eLUmu{_qW7ZtE!hfP#SQ1jLkcY8iD(qb^b{3B`k3_vj>y?CHY6uUgVfMd4w9!A6 zOtK?e8^mHiwtqytn=2ieC$lfG>bJ^vD~%8edf&*;z93k!)wus%a#UkS@A>em$Q4N4 z7|ft?lRDW;$0`MNP8kX)A<95x+}A|OS00&|2={-}Sm}^A=9OLs8`RnO2zVW#SGDd85=G&Jv>Ur2A^pU)B1fPt4?v>C_2DVXxA!3T*CNxW@8zu z8zj-~M|T~GWj2l?)hbm)FS<2#U+JCSrhJ|T+Az}Cusy(ocXIA7x~qS2J8xcJ77TC7 zW)l%@SXNENUz>hnCAI*pZ%UrBt!*-5;gcR?RjG(&7-`MQB*hp~7_GSk$?(*L zB86jK6vGJ&SX_Hh+3`GEblbs5o4_;Z*@AI~Vxug{(2VvIF|LqDy9W}cr^qWN!S7QO zSnR%}rwJ8v*Tm)`OUxhc!(xZc>d`GXNaImQWU3)FTEC@`XsPG{xqVXFTO`XGpP&<5 zP;A2qD;E^=o7g(hDAg8mUECbIU1pCkhsB>AZsSXh{c=)T8YBIgIM+4-y!)hl=6A*e-vk;@Ir#w zQo^PsZEi{SBAfY2s_}d>y)wD%U8vGPbz|)Ui1^d?%0>#BBYZ9BlQhVYFb)(vb zAjW)RQ1>%+*()3W`o7oyhq<=_kE%Qq{*%lEMhTojLC}Jv8rw*)Ai)9--OUMS;0(+_ zRFI$`X=7Qeb)}Lht_dV2QKnB0(3Y;cYqwnecURrIuXJA*(fTn-fQ0Xa_`ye&Xsb>f ztN|4QLgxM5&zXea$GY$Ty7qdP>mqZ`bDr~@=i`3v=l;I$oI=dkf{+{Y^_H^0;TslUJeNe2*Sot@tcy~c85(-a@@f?n=P zes{SA5$okI2&afAT`j=6o}**mYH~q znZ02>3vLRRVwZ9V&LpCC&2_xDhCMMH;zM_~jI%wnvJrNSR^lSnlf35w5Lo=GMOBzVm4cKbBuMn}fjg8Vw zEpH$?otbPx_50s_hN~L2H&|dBvK^YXALYcUeJJZ$^j2+gxMPbIYFc}T7V+0Ls|-Z^U)l{%Lo~xoHrh3fUcBhbU-^oz z6vJj)fm^-C+I3p1BG3+wg)~6aV}ckeFa45LaF*vr$34k_|4sYO5g&i;1nnAQVCB<6u?%-?tlc%EzC3I%dz5gs6{J_`F^ZGtoXthO<2i(}Zp zOS!%H6G!n81QX*MVohkiNPV#89cLqX@7ir2a;`?4CF%X-SJYpDWPbA?2xu(ivaU46 zvF`wP`G@iv@(w+Qq4#Ir{L?~TpEmOv9&1Q?RagG;yyHYR3+27m(Bnl4kYPeLcy^p@ z5XX=*qv6z;>bKLmtZqok_e+~N;4_-7TA3qmo11HEtGIISwsRLt-N|PfH25$XH~{lV zYDqX_jKa4PIDQT*X z>}6a&EM&SUr|bvB=qJ}3ueX@ELQ_EOe@O||LtcZ!B<(mt4lzj%kT}YA9AVVoM=yE$ z7gI^Vc0%i~IKW#vHH*ISx;Lxhfo6=|z$bwwBhth!z?)+X@4BiqSsby4IQXDMNXN{a zdqn0dP*~?a5DSv_V-x4*=OT;>^MuX;!ePExwh3eBJe^a8UTRBKHX5rx{uI4jUWak@ zvpLJTH?Dp$r-WZ5_O&@hT(E~8+mYHsbp>Ojpstl4Q+0!cp%yrY@t=ltA$m5qgwjp} zskf%L1KxQ4dSr z&~RyoXviki#a0eH9x=vlP2d>3HKcaiZJoqsu?Mvr4;y0}jt7n67+Qvfna|YWQ(c!d zYHvh#N2GzZv*b5vtS#i%nbGsT9%=vKN!$TTfDv|mWs&pbpBSDF8=)=bO_jACHR<~N z7>+R5dUy^X01Tj;n6upq?6g#ug#I!jq>4s8ihOZrB=G7zc-g*Xto>WgAM8dz6~a>y z7_#ofDjNkU;IyBJvjRzPi2{WC78~D7riELw)4fMln7?gEHgFX~;EHzSHbkq%h^dD{ zjKq9_y%leXTVpm%NvQNKu~{j7r@8i5GTHJky5T?MvL8Ni*J4E9yce(QT^~r%)LK}& zjQPjN9M4fkuz0Zr9jnZfPLK-vy&bewt2@Cb`g+iE?}Z#p5@vIE#alB}ctZgW>Z<~> z5WI&Vwb^}@j}U&^Lf#;zEo)CR1F#{PMtu`k5gEbx{Gv?4Huvk}_uhMnjANU8iIr#dhjPO-=t{Qk zVqYb@eSanyrNMD+yA&R)~YWM zYlsB^+1Q!jD8B1cX!Fc2C7k~MP9eq0W6(l>C;VEeJ{vUF)F8ELuz6d z60Ey`z=bidwA8N^v6$}P3Yyc@XQ{}hl>g_x5f-@Y?Tb7J1$G!~$LsmqyL$S$`Rg4Y zz{cPJPA+yPNp=68z#d~b_Yu*J^1t|i9oW07nJ1rdFph5~ly7pIk^32jAp?y1QHb@z zoSTAZL;(kS24m{^Zeem+uEF0t0_S`FyvxSKJo_y6hovs|pkgnq74y+?u{G8x3zc{lS;}6_3f_dZk9)DoPU|Z9&jJyg{|KqkX zZWkdU?Wj+0*hCI1=s^?J*)B1LYZ@{jZ91FfI@yqH?0ktUEO(Tn&qPk;=?}Q4aupK~ zD+>#|!j{vyOHStwIh|X3x!Ofb&WWT77KGJ}K6NTmx8KlIRzwy0LZyZNh%*Yi*_cuL zJ6W3)htji(rQ<~Rn^jXX$`_fc*sGczJDF7NB9%p#v@fr%=Cp71NJ7b0UTikJP4xMl zI5;so6MV^r#J8N8-GSCsqX@!3u=0}B^FqgK*pEt;kyPY6)X(&e~YhjgT-NEhS$in0Al zn`j}DSA*;pGogL3ph1J}%teqqb7W9`YDee#!_m7T;jb2hP1zRswyf=j!Lg%{YcZqv zkI0@7dtBE_iqkc$MiLC_R}`mBSCcMNuQz;rLA5Qg zjqVxYmSEsm(3neTY@v;k4Jhr5bx+fTIQ7K%MeiFaZ8P&;w@Xi%I#9}7XVfo1eziQ5 z$3pp6zb&6J@w+(XwbW@#y=P2sz%I>4NRL$m)p6_)D|2XF45=GMSVy^u0fsmY%=sj+ z2Sw$!aNvzqzweu;)IcnVX_)|73kH$uQ<&LorBr;44)7~+wrXGFBCKX+Z%5ve!H6e` z0p&zMw9Kalno|q>PNI z;!@yC5Dt!MXPwkcR)qzWpPAW_Xl^jN%pWQ(@`n`iTJ|&2EN`2cEbs#s#@g)ER1<14 z1WWJuxyOFPRKtF4Cz~+kE54)gr6;btyge>P^CEGK4qHRbiZ?sorAw}lo2iZwgGk4` zn68FhFYq=?Ue)z2w*j*~UO07FRrv@8J|*1(0;l0A8qT?1B!N>B-=VlbAi&b4L$4=iKzxXf=eU0706V^kXxWib{k8c$e&v#hce_|&K$i*2IV z3J83QMV_cbYF2w$TfKGM{e%hCHVhVX(#kG$H{U$Oqo&%1d4}v>BVRo@V|inMf@+}|MK|ZKQqy^Py)BXKQvZ+gPAvKFM?`!ruVqufim2DK{lbR1eXuhk9raL$dP>4vG1!nm0jthK0sSnWhP^==;<}x16KVU0gdH3V&&~K zYfcYXRiz@erh0Sg;wn?0eWnpS0Qwvd4gac&trS_)|E9kG&HDZ~8~Wco+W+S9{x=)@ z-~6`!&6E9ap6-9MssGKh{cpDPzj?9$4Q$%EA#Ck`)6)NDcmJE#{x`4ozd3J0{@DLX zNB^5Y_rHnvzd73frmO$WC;e}_``?^7cM~p65L^D%urnXu-Z#Teq$)ot^be9(wGTWo z7Gq|o3SFlf%0io%jBSWPse}T1D&FR<>_Y66&FDoT;hP{$Lp6!?@+RoRNkL~iNKL1w zKo%wrxa|AoXfY|BVyt~#@8h~Oez1HLjcKvF4|?@iU~ebumuzmZcsOU7rAFbG`ZjqNQXH}0`ojk)1b5>zxb3k<& zGrNPvjJJ>m%mDd^OS{;VYY$Ub#@%~9ikLvPrrx}7pp|F+M_M9NeyZ3~#u~wHh06QQ zNNMYI*`bw!+Dq{8#Dv|8ED3{pRAs|vnSsXgJPVnmCx-k=@AM!}6ITVW_^(94+(-jR z0BWaC&Dv1*hr~e3C~OUScDgmqz^Tg7=lY-)=|1pNMH`i*mB5&mx#6hM4Qs8Yo!lM@ zoG|JGf-mVtv6!FB{4?{+=z828SC0vjT}GV@sv`;Lco9{K9W-@Qb#y~P^|9ITrz}qU zK}TfylwK@=06mx$y;Li;^}5-NWw}v53+_}FUfQ6|5|%mst(T7SBDgoAw#uOqCR+zM zSnwi}JHgXjWyi-$CdO3UDM;R;<=W+2Q2jYu?px2%wxYDrbdRS0fDYeHH>b!yqTLX> z>6zmkOtSpKhhGULBxj8spMsMrAbnx#upwoRBmj{EOvpX=+;RyNk-}C{u5G5p8)w;9 z(SG`H5o!<%`jn5GrU2E&AoPlyE2IYzMvjt>Q~PsAzagi74n&=`23bpDs2uM?3R!D@ zoRiI#KxMWFx|L&nWQr8ZP7FE!A-gnQ1<~qKLBw6^C2TmUHBF=5*U?NTX)4s!vIsG| z+-B%8hRE^6-UyW*#r`>OtL=<>$_#8LN5>gVzPeP#R8Lu^sXk3yf_*d$c5--o8TzW! zyW}Lp*Jl&0Sb>g8>V25Vwe#Z2`xNxXQ|_xDCWiFB`Y5leIE1gf5%{#?CTQD=Ibk(d zXuoXEVh95v{;rVB%$oQ!{Up9*g#SeE!>QwQ7GM!6H6h<_@Cl%0&x&R>nn}~&Ie{lS zWM7o_Q_bdPFva7Ra;A^%-zwD1zPMH;U^@%BWpbcKoH8XB1IXx zG@v{w;E7O&6*(?-D4^4yZq|b=Wm3KhIE0k0< zq03Pf!coog3B@J_Oajh(emnZ3Y&&|jO(eOpzVl(pNW1QEIc)tvhbX?i^zH43A-hQ4 z#hxh@UH~5$P23Xn&*cT|C}m4%atTf5k?<*8I)jP2neNOcLSTm{{dS|B0~GW@QR7`}m!@k5ps#B?4oTNqh5Ej* zW;Tg=XyMi-x08jslep-Rc~HFKqkeJUA!}#!Cc2p+IahFq(=X`hl=%35m#Px5CeVQC z3kO=tGfAl=Mjj*fD9-z1n!Zdf3CLq4gL)W7Z3E?pN=ZiRDhix&4OqD(d=d2*?G!H}arTX<8U$*Csz)y6#FpQUsb4`t zav$T@#>A_YU)F7q6`g>@z4QAZRngOR>)t$@6XREicuood2ef^4`&TXtDRMN6f27(Q zf9yJWqxNW(G$@4rPVkGnMl$M_cy1wII8g@3f?)B1lX~PZ;Gw4_{*OVCLOfk0FaC@d zliN|+*@2H%{WB*f`vr{%JH@EYmqxWI7CtcV-HSs<9tsj{nye|;8g)YdD4aHTT6b(0 zE)}HR5cjFSpsVZ9;;@DfM{?Z*^C?KYiY^o;YoGTa`Nk)tFzMZ>-w)-kkj>ZIy&vQ(1Aq$OFq zri9NV#uP>;RrApo+>d6+NBPvh@~MB7PZ7M{kA@d(G%L3ph$t2@hR56{2lNsxf_ht6*P{J4-YV(}DHl!|yIH4}(2|*8% z=FIyu9mGFQhb<;xf-IgX)A9E*9i1m2w$5#XFgrklyq*(XAK=(ghENZXse1>cPJAjE z(0GyE5`+(CwEhzrPkhB+0hEW!1|Ylax_5w)+hs<_APfck0w-4;bZHuSb1E$q)>J%O zlvXyvc3k0=UAl{iGvv5yiPsnQBxm)uIhUOv#tYl==wF3*n7d`fnuD`OHj=n<$i@; zH}m&DVw0#-Vf7#DD9GP2HL}`LZ{rvBq@_By6j4TC)`wy0k3=Jnyqqg9!QU^4g*+!5 z`vrnyzJeHGXz+>nmTRSI@Yi~C7Xr&Fa<}$gh|d3oIxU-XC`iMF7qp9Yr;OTn05i1@ z!^*N%^5-_u(AN#*RZ|_&_N&G-ix)7B@uy!EaY672-S!7G6IMT5VmrYn)O<1^Ak@I> zDuQYZBudbseNf{M>yAS>MHfF4--B06qCnoEvaVN#xk)=U+KB9n-&Y_6yqlGe!{4ag#vH(#1f9Fntto->86>Gz z5#0YG`+BJ|E&fH8H+|}`YQt)&+p%(_wdStp$SWO<`~lkOuII6(ea?=062a-wVbzo; zreWH<)CxS1v0~!6{fYeVMR*@tr%G?*S^^l{2gQeVWCpGf6$jX-zEI#T@vPLegD<3x z;Ifv;>OU^&d);gpw6LmVW|<2;Jo~SEAP@kz#p_h%FH-O-Q(TtGT$OzT^VVO(ED+5s ze$7;ww#cvJ&t5Mu-X;Ds;j>5B#Cz{GiJYmIXAB0mx$y^KuJob8OjB)W+1Vq7(TbNI z7A5!V@n^->xnC(uST-U*mc)7Tqx9(Fb>V1bvk~n9gCs5lh8|(Ut!S=Vyg#ci?f||;|xzwnaT}nCeS)Z^C>z4xO^5OsikpvF4x)X}iAh?8RAUN0HHb<$vMvSHw z*7Fq=nJYVGf^3^yVN$c%M)3pr>1j|j5Z94k<9I~$+*c%%`rDIJbGeL3Mf2x3n8ucS z2QkmWCH!17r!PtKsc$*M_VI!EWAEX4OUH%=1MilzzPevEQ_{*VCfEd$kdJ)eYa=?4 zbxz>gG&fg1_6fU@J`8LQKEisihHQCAgR}o8jB@1HM`mLr=Q0_@SwT2IIG#=%@vq`A`bbtGXH9R^%+e%olx9+7 zr8bg6tQ2mI4(+q1Q&H$1)iZc&Xr~}6bg{<3R2$0J+^ro4CFv0#TsM=4S z!mWzKmta2)L9*0~l=E_ta$YKGDLno!x*Z8=N_%Dbe92goV|H6;uddMAt5H&o=crpQ zz!u3F{7$L3Ct1Fc)HI#xZhAG>e^BPU2>-(>Rwhk^F)nLM>SpBMPf`ZDZI)+DZ_20= zmIiCMs5+VPr*k&)IYN!B77RbmnUwLu8pI0?Jp*gD z`;f^!DlK%=(GG3GWhsvOkN8LPh) zD&1ycPj-fOnA3E3a(f3;>}I#Ttx2D(BDN`bo=971@wt0MO~m;UD<>u-#SE&ia<6Xg z1#PlMw~H`WNh8(_rz}m_ap%XMKt9bt@_kniQo*SMj13Jq>^Te41hRgSE7I zy0RYfO;__C@&>S;+Rz|0!N1W};Jfah`E};P`5Yo9Yn=?BP)(XB8n!vkOpiHr(nIBg z(6lu%DF|0Ts{TymGWULm2n<)~u31h^dKXlmB(pqy=O@YPCb=~=9`=0p2dSO#0zuQT zvxEBo`_8soL(Z_;6u*4OuDgnFCEmh~UX%fO4aia&I)|9byDnOI#*9u|hYM&^vixBF zj>J`WG)h&B`lsJ9>>+7}s4ER0NaaVSN4>Swek9o(IBV34{e7>(r<6GIsZrfwP4r3& zg?D64)UUS?o`uOITNiCSTp0CU5g+{2QC4I_P8HK&I*aivh=oe`;1Od*tu<%#uNYR< zj)H#D^tI@SoUC6_Jq^1K;BZQkC`Qw+)q+n;C2#>!?_oSfPzO+nmG|SE971Lw*kE}G z3$u~;5ci{ljUi_)qo&ESb4>=CduK??5yU5S?lCjDTXla=7Q0*k606hZpc?mZfI(F(GOxcLyqJ6!r7d}%s&3w0Cjnk6LH+~_O$~;( z)VOMCv-0WQKFFHj3kCN`0=3#`B(g7nLpP087 z{ngs?zp5s!0bTYZizJmiL0MS#KZDLNvo3ZPjFutpyS$|kAH4d|NFn*eI=$PlRS&U>Bn zjduwLt00Fo8OJ1M&NvE?;p?Pu4sT%)(eHuIC9p!CP0WvJ z7dUCh=4dB|P0X0vU{hPmho&@(E*&62BH}HGpDYJlteiy{?@DxtYX;&rBp27cjFXOB z4F527an-A-i_uM~i_9OqFbpy@v$7Ccbake&;Bewc*ua-xL4(EIA-F;)1-ZCzJ2pOJ z56IPD=H6bj7tvL(Xe%8OgZBfTV~4irCE5j}hvPWzh1%_ZH|9F;ENVOp^|^(dyu< zWkk|Vqqvp%()GhUEhfmu!puM2Do=}BdY=?<)28jy7G}P$pV1gbX~o#XEgbx=Tbp)^ z+og$1_%rkpTa6GPz!MbCRsvb^lN^3<5iwA6CCWze5GZQUi&P$BJUrOPveY~ch^Ur^ zPJc}|mb6t2F7U9Fm9Hccim^FHc46p0U-fA@m&;3g8csCylrI7}E-hrfF(PHX8H~(Ll%Ambec{;+WfV9$-D2 z2@c%+@P1YfXEl*8ax&$!;Mcudtf54kZ||Z2!$#R{ZwVkA;llmT&B0EQN3s0UNZDVr zgsc-|{o?XJBJC%K|7js>x%hL-oE*MYif8cp<)3?GJL}vReN&}jNCl&}0uyX{{fcsMDAx1G}i*m4h z)fmTEIJ!cYEgbx;{_Qhd&Cv*lSzefVkNf02gmW;};=OK*F2W(mhmPAbc)8nVW|912 ze?NGM+r+_Ms5r!E@qp-uV*V9L6OhoJf&>r_kdQ;QE?M!DT)6+aIi_*#)|-c=bw1`U zy}b1`OHYHz;qe7uy7W7w_^Xy)zxagI_}ZnPdiVe9rI$nKck^ZKi3T;cj6khlw)-=; zP=%Ep9Ft#w@0iSUFTCi5XR;S&-mj~jzw?i|$V4yr!p!?p4Xt)-cG1qU-ZefhH>@#o zP>P0r*LZk4tHm0>Dr;Qb?Bj=RD|cmuvirGU`ypr0yEm6ZM0R44CP8!tyQ^#ArTD75&Mn+Q6_S_gV4W-PsH+|w!H{A|6k26%-gp!;G7;AOC-Z8k!TfRZ*8n`Gk`D=@vbe z{-4M6RN@@41ZRZByNz4|J~aX`OJYXu+fuPbS6uuWqoJrl9yJ)bA5eKOMJ-0|G1^7i z^WV{~7E1m%bQebQzoEM|vFs4GC`R2c&==y~QCSjF-o3)J$`ID1W_nTsOMT(9licE)Z7&pzpd@;Je!G=%TG0BkVfySQ-}-v{9GDSwVOVW6_>-wPiSzZ0lFMmD>BM zxx;e25Atm9x!Ug77Qr=~-!=l^DhzB*p{z|d*=KPn>5TkX93aw6Xz@g zQ&l!a1EE^b&eYXvArjyj#vRdlf_a>+vQU-(kLx<3*Cipg4Bf0>$RQ_Q?Zpy9q(p~H zlt7ddy;wicMKd%>XlLRiiu=A9Xu3 z>0Kj*ghZeQY*(UuTDl~DF7RfGzzJa{HK~+Xj9Gk92BG}Kykh{?9SaivsGJ)it2W0gZ?Z?g~kgqJO=`ARrvDWN^T3hRoShF8^WhaY*Di%^U4Ga zUYMxt_@z4BY-%>@J_7^mkR&*9Wrx(Axj1r72&o5%OY$ezzM)sNr%z?cr!XI}o(u%Z z++Fp3MpY$poT@t@3{I)~oFbk}+}qlm0EIVyz%}X+{;EEwm?{(@^5>Zp4Zq_l>@tk2AJ17%2}HwT z(ZqD?7Ji!(=U0r%V)~aHO#D(AEt(XJ!2oP)(x;S7CvEO>+jzx#yaa(# z`5>{2e7vOd5Rbx2Z0T2q)S_+7B^j`B_h^qFS_X|?ClV)ZBM{I6DUoj%U?&h&@&G3q z->m4QuH=QvZ~(|aw^8>)8mu8|cl{zRY_$M#Oxyo7*i*|Ic^;%Vxg%;&r}Bf&$=rpM zwN3LL6J*$RLMf8>jKio~NKGWprm+AU3lXSTMsby~o#ak~TAmUg%0R@5J6n%KOX$^u(*1xQosinU*W{_yVn(C#Kt1>*f6ZvM{3J5< z%T!xL9D?yZ#zX(WdYd)ROU-2YwX>D=X%9{<78n(pis7cNbb z4u-qL5^VA2s_?sMv!hg%Db(@IWgfN3chc88ndPIHqzXib3w-O5n#=r^U(h>uf004j zGMXZmHfuS5yd_Jc-dR$fn}R(B&S;ipsXq!H2j{uK#DxoIT(~gEMGACsU04#my1RF^>SB&^C|30KhMERe9Rl2~;b zmiMJC@tRGduK>-6X^f!R`%`=GN!g_;A%uJhsmzE<5aEfKg%w-QeMF;z0|~2y4sdI! zBs_hu=2P_l0I3ACnl>=4Y__wC^ZPA{XIvl#TGE&G`ng>*?Lb-?Dbn_V@Zl0Hj0GJK ze@ML+|HtDTO3e^;cHqql^ct@DFwO`y%|0x_B;BGIcZz1Z{O1x|00R!dnK;hI+FvqZ zq0$-H5!dUl5qc<6`W;)1YM7;_;d8r768T{~@$DZnD|(;0TUN`9*{y>9q?gfk0;R-T zn5DAfWQ2#IsTRoBoexKc0f4S*FX_XcCr9mc3X_4Z@^6ZDBmSt&02=M7^J3lQL!4Pj z&|QvdlYQKY{z7+Dj8sC3jI-kVf$nx&+0BJ2JQ26ZJ!Rp*_A*G|GK-z$pW$0tXpFZe z`tBVkk!>eZbh(t@>=(vYTkA~pQ!sRnALE-*6U78)-b6gE;mjIGCcbSZ_k~KE#k6~h zaD}|--AfhkL}?_v*Dv+M6a7H~d({7giN}S6%nXM>>(fK(H2pIJZFNf`MbfOe7PJ(kPcCJ_;* z2GdrJb_4I*qyiX#2?~x+vSH5GC!x1+LOvOOG zcN|;yqVP-tA2|3W?UV0mPyR-`EpB@n3GUGlznu7a0L*GTuM1a^lP49$CyxbMgUVY= z@MWWLCukt3vg!r8?6|@rk>jMB4iw!>SmrL&$@9uC4XOcHhW5>X?x}M(?Fu%qnWm4K zYQY{IbPk{pbheB~i{zZQn6yagU%6p0#Uw+pbexKEOq2+WA?^dTHF_-dB!|DXhTuM> z9`U@)!zIaXIF%93LtR+Jo00^nPJ*Y$|9zI^kO%|c*pyEI<#6YLgN_KamR}_&Uv@~%_oeJJScIC2 z#_lw1Kz5kXh)yAv2&$uEVp7N|JLOQ~X9`u;WHYd@>;i&flIeZ|YDR4vP^hfQAfaY- zW9n5+gJx>G5MpqO+5S{y3;0fNPwwF~C`#@<52Z}*k5VT4JGax-8PREzu^mlh@#2sf z(Fz*J1#pW%8$nv}4IhFP$7HOmR6}7jJlQLb0(0$0XE~!LhY*bE^v06>FH2-(n)rZ< z`FBCZ;b)J%C>6E)Le9~Nx~R+C zz+-8NqRSqqR*kQ{`7&ypF*mSB$p}nR@&4|s00a%B+Rw?fL$pNA5sS~aH*oX5D9+N2jn~(FC zJ5h&nC*m3IL_5Y^m3t=&leF@CDHrj3TKSJLYm~SSk*L?39O44K6^NIQ7O2P4WWLaQ z;i(q%-i6S6F0_9bf>e|@u(SaMS%FUKcT+#4>BAQ4@09uwu>&cu{E!%3P_Osd>aSnm zqi#GLwN6M{TTO0<D-EB3#bCA#kf z19v0-{Edb^PK1>E0;*olN(rUE__oD;Hti}s@4Nu$1vklxLlOZ{95*t4`PDx1F#Ap1wv(80}BJLJYF?nv;ar~E={W&SUU5*NwU z2D$Rd)q`A}YiRH{9vhaXRTmT3<=Wsu8e{JG%T+NF-6gk+7#Xc1s!X(rqF2V{jpw6p zqb*l8IJ{I}#(0K)oWBUT7iJEjkl(?V>)&Eg>AI?kv0!spkuNiYGM2@!n2;4<;D zvdgtKLHq<<4f`nUtkYU9RL4L!yiAP9a=GyXJbfWoV9|ZRA)6e2XFvkD$}Zq7*~0lT zeH6661H&mMJHd24=YAk!!u7o64ps8j+o^yTiNC`*VqM3*82> z@UVzw<2Uj)wFDzbnFwD~I_^G;h?4j_!6W`6k~1iM2Y zZqY3jYr_#FyT!t6tdp}t_t-1 zN2Z6LFHBG1wTkD37}Z92kd3ecn&)s4CTSXb_mZB!nxi(zasK^%$dP!&EO`9NA|MNw zU$L55&N;DqxTw2;t|_vwKfPA(Yr9GGu~S?$1x`WxmMwVXU%u<&JBk)&9+Vp*$@RUw z<=o3I{u}(isG{-T;0hTLapMxK5o~=_1>rjj?hh;%#_&EIXKa_Ahey$=aE>V8ohM6tH z{Cc11%*#n?vd&qOZ13>2dJeRI(4I&P)F?xurySC$S|$F&UVyRggtOo*F@Nk*F(75n zq(E`62F3WVU8W0;@c{6MqrH%uoqPJA5{KzGLZ~un%#41c{T)l~p-J1B)@96jt-4VI zCUOgLG9kWiSZzD!e-l#EfltgLYnp*iHq!eYp=d=K@F|+nM+81Yp3}f*nhT$^1wIe2 znv0Yy1)tRGg-;+;05tlPz^5I3N{|ab?)H7k-M&wK5k6n9cwWy2UeIYwCP^vHmkabJ zYIyNdjABe~pb&U0_P1BZ*$f=c*UiTET`XrRkjdk?j+l)v3@gs}!3 zulrLzmQOkyEakUUUXSY|PgV)2UiS*m_|5zqGWEDFk*mA_XBXFW&%NfYiK}%fl#skC z=Fp(-VyuAU+o9lv^2w&$b~dCsTdO-utOsDUfa>6H$R7(%4xtqctoAwEgN%&Abt2=2wm^5Um|AQZ&DB0JF z2X7_+*2fmP$>RSGBQ0{i&zR%h*0Y7VxC7U%ehtQ-B3+(T+)qV?H0ND&sbIY3Dn4b$ zs811bca{5C>azQK63f+D(!)x)tlPxXe%ZPD;Kw)F4>0ivwLWFmU?KgQ*ESYlCLq4y z@%VmCWN-<38vsM;I<#8qq!vtu0!J#g2%cR|c!AUi&=O3#PdmFFGwQ`QS}W6f_n(#; z%Lojl#xlCZaAd$27|#JeJxf3SU2iM08VT9iK=*Ryjjg_F7V3r%+3SbPCIGp2BS#3S zY1>nR%-iIU(t=C^xF?gY;j3Y_Mjz1_Db+dc0RESX%`Y*(biu_GGJvA^p8LdKjEG|K zCaxrE?;52b4$6fvoQ1+aL{Qa47GQmI!&$xPu2#a2eJ|`!LNSmhE(J}E4 z_kqX!K2d{a1DFN=rM9sO;#Dk(G^W!?|Ie%uF}fy9hO61^tKCt44a!aCe4P;gTr%hD zm~+F}T!hN=XOuAG+FZ1=f>%k}Sw2kJ$gT!fH^}*5m$oIn>l3Byo`MXlqGe`Q3@kKW z9yUEOoV3iQ@lvY@vfGgecBGrmF!r`#m+nv2{!9?OeZKDVrZ1{W^)x=LrxB7S8`@H% zf^56Lp7UD9E}ETe8Drg*z?YD4C3*wv9l;W~M0h`vrjH({OYlGtdaj#6id)fKQTsb} zJ6x8CZl}1J^B9*mkYJ}66!EoyHPI{w7$yE9k6?IGj7f?ip;9j+(-Z#(U89Q{u9c`> zgnl(n##d5<0%{2PE^Jqd(Goq~cFls#r;03CZa2h`%qiSuaku8A$n$W`h_uh~XApcR z@f+fSo+EDEOnYBoS+qTt=2xOW6G&6XT{tb9uEA5LZvwEYc4{!){{=8TAPj7Dj3%a2 zunKaTBD(=!Lb=S}0Ry9jmv&UMSNymXkml03YvH@mhcyG^T3PCs-9`Ky|I(X3FBTYU-k%}#VmIF2DQeLUd{%)j3X(=3+jeO> zW<-?tOI-h0U>V;c9c^k#{Lrrd3Q9-_N&r)qfGI~pj=6YYtcw@aIlMr0Mm6X>yrAvd z6BXx>g6Hdy!pyHk3WL59DSV0jL_gg6)kt9!qd$ifzNL|Zj1p9!WnNmeDViaz7&<@E z$ug1uA7Em%K=ZdcGK;HqDuo$)9V$6gda(U{Q71|*@*=p#gb*nOvz>9{Mb%jxaVCuy z{v$gANvR1=wI{xLq5zgx8=X;(r<%sjC@}ZN|AA+avRh~|e+NRoRxX6Pd0$J3AJ+;A zf%++$UKInOyLggpA?0Chsjh>(UmEqiF3ruBPjNyQr~y%rveur7TIvk#%Q>BF5$*~3 zo3VB>Z-&&Tc*uM0yiY?YRP&HsZzq{ej3oB34XAA80I|b)ACk|ZPhS*NGtZEzK#fT0 z56Jr19yd0(q8F0iSYB)34a0ezkE!O92k<{#E9xNBR5hovD~J`j#0zHYM~_KbceTI$ z1CINhrfP5hfL|+bhZWdoIO}=SVwh_m=ECF*Kx>m-u_ve&P4?#RaP1%TJG|W3*Ge#t zL>&7nZ|2QaH>5s%P-evD%e-rNWyALFx3B(w$$2D7=@DNUcQ3JGtMwa=+T%5ce}nGFhC6o+eKtZirIl zK;i;R9WhTHwyr#&wu4Own`53lNZp`n=vUo!#l12XXe=-`6A_ISvW%IHs?P=a0Y565dEwZLcyZieLY69~%aIU+_ldQT{liJ{CRK9N8V4RxhJ zItAk5NEVY13PiKE^?4!$tU-qhI!h(n=@U+a@;`^~&$k~d2$%lEr%tP%ph7sM?kLip zl?bZgPVWWM1j`6hRohD?D&OHAlUGhC z&;RjJS6-rz?|vi>3$>Ez!`x1k;7!Em`eP(IJ3B}o;$AG*>o{M1RB(*MR1Q=EnjkN%k3!$2lwX5rY$Q6*?bCwOy@RX(}dNi+2&2|ON{G%LVAeg@MBjp`TZX2RMQDx zZyll^(>B{jAEH?16R!G1`A7n!$akLRWnps#R6DQau)+=#ig@_brSB(0o>!@5CO0&8 zyfXe=t+P}mv*1suF;_j_RI+tEV1#TQlN7`GgoksS97zx8Fht&Jz%cv_r`{}Q(p17? z*?FC!`&<^v`-rIMQ)J%H@AR~o`caydzr%_SN!)6wA*xx|-tR!HNG2%eRo1tD9*0@# z4bgW(zPKAi)I4E=LAx8u-9KyvqrP3M*j-#0Q6HpmKniyWl!D^G1Qy3(0q373v2Fhv zl-#F7r<)rYPp@uW6t+TRp<5R;+Zz(Z7JqqcYJ1ZrI!~^o5loS6Fs8%;Gp=4K-tq!U+v+7@2st>&WV=aU!S{j9LxiA%0+?bvHxRo_ zEEqP=%mBswzh(DbwM@{8p%NCIDNGG2bX{CRn_ zp9B3Yp0*5wt2goIYUBSw)6-*mj>I#+Euz~&Za$jYei6 z^6FmqMR~BrQ+VdfpSbVOs>D5y1pLYg>#oTrY>=eajUY&-3wB> zwA{;1%>`MF#}R(U5q=L?gw!@>^whj0z=~n#Nwu$XK&a-7w`{OTMQeI|M*R(JX^Fmr z3BitXi7+!*kU-#v>y7$vY0`E6qib%-STieK09}?8J)3ih>%J$u3kmNERFAn29AGi0 zxA1577XI8sGQHeeALUQ!nqC`tg8!3e>`UYS`@j=y*KYdBjwEcSdr_YwK#wMH_Tt_> zDdCXWlU2H$uz&xyjH@8wf7Gv5%1cmOfXp&7h1^-UoPvRp5tUG*biYKN^Kg+1gq%Gk z`THBXeWdLX4O=mfiqHWBHOv|7QYG*Y8@VWFdHe@C!e0ifFwfGvNs>fENkWL* z;yn7sC^<~qWx7q#|@^zg&Vg`DQb-w@=>G98W#(g(6UxMbB%N!JN3=mt1S`vzqh1-xooUSFjEG`h`F1Khf1P(-v zAaEhFnPmlQkRdvHzp!TyUgYjs*t0cL4^r|Fh8S718Pc^SZ;O8LjV zPWi{L-mOLMMSV_zd$A#Bf_w3JPPTjT+Z;a^Y~%+QrZzIni7tT?xe~$$$r^f2N`ewL z2ikxWmE3s3;18qsD&u`A^Eopw? z%Ejjvfov}4N$&gck}(J-knu2rS>aNN_z!$0W16J*ATMz(C}AHN9f|RTi4<8FwN{2m zQ|=5~3kR|$KA2`i%e+k5N?atiwBg>D#h{#g5a{ukCu8k*1k8DVf`W0V*H-Ds9dbcP z^HeiDoitDWEoahNk$G%nNQr?<*XuX(V@@PJuuCv|MB(0+Vzh;q7e<$!hdg^&D9OOO zo)_sh@)zl|@R2Lye{;FZ{j$#KtFEm%n_e+)Dv9DNzXi9DO(Ee=HPI~be(Uu_)9W&N zmK`7GbNN(i!8mJ6Y*b0Ts$zFMgpVr^Sa^SjU|bzniHsTeg_{4ngg68j=#XJUxzsO6 z9j{>MWQ*p&$t}}6CdR>=gXPUb!$+ib-U(n3t?Cim$$V%2`^m!Oh7RH3I&Tty0d!mG z7SFcxOh!Wsa(C5q?e#rRRzGK$s=cBpS}e@?wgoBi^a#rG;gLy|eQgVePKQ z==w~^(;V`=CJ@%adtt|AFa+uk$bH_aNFHemtGE_(_hAq*1BDMxCMJg*?+7)Di1?KG zXhyEDAodw!ct{fJvc{>8%Zepib*D-8fk^^0tQozZ(-N`L-N_bf@@fhg+qC44Kxf%~ zsEk(tMUxQdc9-2D@(5MYeC(7uY^3{by`n(|>{O zYwBhDn*OiZzHe9msXyCyIa4@{aI$_`XTb`l3X*WrOThYY&OAhCOqwhQM4rq-2bX#_ zgIIhEvlpgNmOUJJ+o+$qV8O;-J7;@biUg zL#+S^!2k$sj~v%bdLPnP$Y)#hg%7vOwL&jYAcAGNW7_$BC=E?ggd8u=+a5R6o?YX5 zb)>^C7Hh=OyV;Gpp+Y%wc68An5z9=m)u(trh4N0|<)k%K+TJ9$Ri6+dLtM>gu!98~ z<$rA4(m@d{!6(V#$)Wlnx2v0^TReg>Dn4c-L@a*=;)AoDh}XZ>DBL~K8{~Ei-%Z`( z4{@(Yl!Z)v3&jz&T}U31y2_--v&ZiFN(`8SXRd`jx3GG5pchF|umf3!Ke>Rjt$M4>fh#Ru($5ZD6Ic8Z ze!?&MtC6Aw%I+hzEY)eLgG5bJhak7#hJKNtm&8gliR@3>IWX17#L9%`QM(?ankBlC ztrkg?^Y$B?+w#zwNV!i($lZJjNtD_}E=NjuikddB(b&A}F)$d?;JgMaztN(leL6EY z@vX@T6AK2Yw=HOd+k!a%5Nxxdb0jqZ#tDxRjycXp^HIfY%|nI6_juX;oalh_(JAfJ z#b{6Vr9R_+M5q6j(Dg;Uvp4lEGteo6F~Xf@02VS#<9ti)m61tU@U0{(KjeN!%4Aeu z_{`qVjfU9#{fA=)4$|;JGeEeh@B!Ml^7tkbg3@{$uO6`S4_W#nR^B`MfsgOg+pt2?AZn(59T)Gq4C24>+$_WdMEE5=6ZYsD?{Pj$=(ko~Iy~l5Js(@}F zvJ6*EG+KgMx64VARBa9K_y@IlS`qWU&J!)N6il0c+!ZmNtC9bP`!N4>$oUaEqO+(i zFVbJe$^&Xm%W;JuDhN5nd>NsWnDL%GAbQvdwudAFfI5kWct;L-vK4IO>U@54h8mSe zd{IkzBsJBvG1BL9Q#HAr=HmQbqvka8+uet5?^q@Z&#$GLsbS`~GAy?eAgJ0IAY|~81c;8OHv(fyl)CY%fqmq1KjdzI7Xh5pNxtyn>nwua>I;4{f zJ*5v~`elKaYt4{w#x_c!V%D#qH(yH4(cIv~KbydnSmGWd=5)sDC6Z9H`aQlc(p!Gg zT(PlP{l1i`MwdXyJBc*dtlq9Wni2;$%196gJJs@t45e@rwAs4m8h6(pR1tn8Kmy+Nc{jnN&PdP8ET4rR0KDppYS1N zC4Vyk(6c0aGqy(EJQE2^uY6URUM>DWAc;7$@Qf!NAtScs3)>-4QnB`8$~>c`B3~@; z_J|<#OI|>P**VNZ{MnjDkz{`U&HhCpCXaR1w5CcCA^$PGNKz<>>+sKav#tEx`eo`()Q+iA*uh5htNq@EdPbo3oe3UK( zDEW|ZC7#cavu|ntNXwfhL@RM14R(d2KlDczLpa@aH2#V|m6(2loWGj1i2shV;Kbxo zJZcw#E;%ftm7C;l9-m#qp0=X%pVjFqHZtuJ$ywOeXwWCN6$FWo21gptQCs9*fML+L zbbbE*=zPKx8EY5thKjt3;s^y{lj-)qoy>EH)tap6V*J#1N6TT+Be2@R7lTgL$Y5Y^ zkkr1y{4tGJN0%W@DG=^grkw{l>LR{y*#iz8tkxC2f~c^f_QF@ zp(||TY1Mk$`eY=F%!ZHrGP*TZ&SIqJU37xasMk}YB@fxnddNQj(nlh1n%k4tZ9f|F zGz6J*g~iOMY8mPx8EOfHvD_5P&2rHJ5o_4hD9jUbtN^(lM-rZtD!7FotU=`^u5#sS zxm;z(FCw&sZj$B^@9(BBQN(?HO$XPzEeC%tFZDKDC(Cz!+q~p9?WS%ei(ch}aW6?4 zjLq|MZbn7N+Y0K#%9&rigCj7B3(=sKHBcPlOC*S+WzGEGFlVGMAzLAdCSSumScb=h zZ$#tpB1>>K3d;M73bvYggok@39#)IHf}T$Ut)bGrkYv&F1IF9~EM_+jl?n%hYsq8s zA8cbtR3=Z9L2o3MI|Dv+>BOwwK4lMwWq}b`mn) zZ*1N{==%xa&Sb5lw-9zGVhtbj^6iQz^+-G?LY}i>?4XE8Zq$9BsaEr2qyuS@*wZ0L|#ReY2Oan|L*8Xg37 z-r?JwJ2^O8M1lo*DV*Goal46oy4yc;tz(|f8OeL?A8HSIF_LM77%6FpkMXqT?L@pO z?%bo%k_l?j0hUVlZAlxHhPQFg$G_`5!-vEz_}QFpI_gU3Y@|Z#DUWX(1m-&-FKUmR z(rppd<03NlA^?IcWVujpD+NBVyTL_FKM z2^~@5_RVvOj8aU;N<3ZaZxyIolykfE4S!>I#Hl_;+&<#{E*(<4&h@UKfA4Tf5dxJu zx&6DC9slb;3KTJIvf6;rE1v;I)msHD`oQOW_I5XjXjPMz@4n1XV8@F4?dYhSQ0ak?L!Q5yKXs9?o2~w_ad$zN zS<^&Oqo12_dKZ6(p>rxgnc0KO$ZC6&REp_`t(3J=RwTCta;Ixhbaw&FEU$O;mUY;H z_KJP?Qq5`EuQziS2 z8byhasv|?C$3o6@f(Y!iYu@V$<>5a80&Gvo2W3=UHOa3^M7I@3eV-U*zS!Th{c@hhRoKzqW6m*Vm?jmc`0naYjiwKG#H zlGmgstBM}WeEB`T!e|y!h18rK?LTL>+6sPQ)@+Oo4uqYn@;uN-SFeOLL;JYQFBvbF zk5p&F(dF5;Iv$R$jGHfufK2@Tqs6{3Jf`waRzo1E%RF&sRQmVi=?WhzB)_*d;ZrTi z;bW4Qq#>1xc|OC}TD-W<)p(p5oI7WG+#2#+gn48tN-zHx*=Gg9%dC_!!@R)QRiD*w zUoP!Wdphw=@XlV(sp?a@6d40wtxr6w_9TZtMVnft1tVIW)Xy(e&3*ks@AZCD&Zvy6A48Q2P(B$N5>o%Tg zL5$qi4VAsaRN;%go>^YXRC8Om5Zn}FU=zL=uestj&n%y=p3ak4TQ_!`lma|%l`PM! zEcq~1V6Efcyv;9+QtV z1Ib3dB$R`0QQns~@M}-Kq2HsX<~QK8RU6<6Jg!(|ytGp?P-JfY>|$)7PucBpnMNG) zfYM@bm2pce-bP^ed#=`s6WVC+NVZ(rcxP;ce5Ik zfF|g>`3IkV9qBmC^TpzWxmQov!WQEe415-~;+J*t)Cc@4JkbaIsC#uvk&_}$w7;>V z=56w9_IQk6#|qQE>CXccX?0LnO|}svTUCz-b}eMg-4XJ{)G!otTTLT{Q zWw6(sI&ZLgoL@7{egix=K1QQQM^Cp?Y8!L+xFhqtF1MhT;;=FIT`gLvgC-&wbi@e0 zrH#{PJKk&&aZNF!!#pHUPMrIN0)Spx2 z4LXEC1B8P>X%N7?Qed+mU|NB_##-^y)=(LC?$-j$-1Vj!ANa_q6-Af^#4Z5w_Wpo4 zy&oX<9(Of~%VlvMJ$VT)p;V^Z7Tq?rcev@?h#lE~1s=7^rr&a%gU74;;IXkEJhEy# zL!NE@;1T&SkZR0D0%2|us8nZJ;T9?(2L>FqfxeE-2QcFKI;0O6rLtaKGf#$Gd=41D ze89tHz)zgGBsEAzeB!frVFD!pB$m&BK`&HhoP)}dnjTSK292Gcel0X=dUqs5Nd6AhrfK^l%oDV|&v@`P zuAuEB&cZVhXH<=*@4XL_jQhR|B7s9jjj-#QQZ}xhl!Jxn@SnYOaT>M#T#pVy1%^~3 zmskA*#r$4#5k>r7cNuYW;R)aexogG z0h!6T-VIfl`Qvx*@~Y5gINn4&)RNXWir*Ed3r*W&3hTE-X~%E&Y>?Tb&g#$hw+%KY z*!kD);zrj0XrBPtAnHhxhGw*uwRy)W5+BELtnIdqz(GQ`GuaM|hdBOtIHq$^p#!Gx zK!*C7Ttfc5=?IuMh%?(8gQ%#&Y~f1m061#hJqB?LZ61WJp8(&C)22c=z^Ec`(fl|{6? zU1$x-U8*Kg;ZpIR16~;d8&iH2@reA$Y+mUh}-4Mk`><)F6(*ze({%1~Q~`|4YShI|Bt>79pJE5~nU+kG_1m3!eI z6b{OWf6x4}@Xv%rf76aPrH9>8veBVSNJF1zp3~9Y0uxo3;wkG_rl%( zJ^MGld0p5vPdIASJ-xbCH_e;tY5Gx98k-*3RL16tzi9mL!s{xmXe@yw!cpoudG1?b zlw){ci6<|(v+I5^F2I-=WX4?Y2@K3UbjZK9>(i`I1&5-x|9Wc4dWL{ zMn!5o8*3P}%0Y_0u#1m1^|3D`zZ5ul=|_rdiUnHZ;woe18=R)!k^p~p_K2;LktgOo zDOFxf5-%2>>sotZ!=g>Qdt#w2s2AD?*|SQ^7nOQifhkDhxL|Us+t^#m;kgO%u%gzP z-Ufro`{~HT`?)Z3|5o@sSj(;#*Z`Wm!s_TzF=ge|wU1eC@2Q55D%Grf?4Y$c%XDfq zR~t{WZ0XI7g|HxB@3;5`zr|Qv zSo5TfCIry(`E(=k-yoGeyZ;-`W*wI2{(y(G_y=sI;9nsR{|W`M#Jth5#N95==alKuMPBRxX79v`z1Riv z&y~o%i~`KV<=!LeJz`{G0ro@g&%4~za`a}D&n8aa&e1~~K|bd29zK1Ow2F{E+9PdoGpqL< zt!=U0B?z4SAmbX{dHlz6^<@`oRbgSV`1@>3u+ksY+r?ZUuy}oaVU>$y+lIGvoSt!> zwe!xL&k4OeT~4vr_7za_V@V0j}%!Y zOz$kdTX-OOc^)793?8>*$*!wa2) z=yGRdY&kCYRyZTWD~LZv{4wIq#G8q4BEE@uC-F|=J;d1y$H?JdyYAq#H*rTL-~2DB zp95IF$zfSaqhN0I{i~`q5Q;mCm#Blu`|}uo+Vfc(h94<5Xe4gh#YjA(jB=M+LH`cdYIkUy|hVT|6*tIssBrx^t<;_s4rbSH@xsk)t^;AlG|}Pt76D#;>(P{$;Tq2 zwXbDxjp3L2yBGe4TERqKg<@_}UOiUULM>5uQ~#(e)$k2lP-O51pn$Dg52i*|EOZLM zEF-}%1z?tuV3-0h%SbRx0hnbZ7^VQsG7=0^0A?8phAD{k5cjc*zuY}HNek_Qc|K$A zJ)_AcEwW=;b7u#wxzSp~`2Lr)$5xxh!~$xI!FZD%$F${*9kk`zKXMxc{XV!mi>>uchMjYs zi6$Kp=iRVv1;=YJD<2yyjx}}m)<&GV+zEf{rSF#ddrXtJPl%{fhp4j$HTWL(2J6tt zo9Y`a`eC%|`=wP!liq>)yK57**EJI%Q`aVHX)J6~T{ku9`-5ttmax--_FPr|p6Z;g zt*T{eQvpW8c`=SrEUQLP;?LQR)so%ZQ0uF(n*aaMr_uFj4pV>z*!wrIZ$!kV2`5-poCZhR2o zkRhAX%+xhTii?zrSdy*eW0M%e*}OXTb+9;Ee(<|Pqxf2E`XMMTTE1T~#NqoTZj`?( z;ds5%q?`Wa*W)pR3eWA4c~=ltCa|n{p%=i50a1+j_`O9A3ddrK%P%4n-wzfWTnSvx z7>TCG5F$D*;$Cgvm=0?!ka9t9=>ZP%Cc(pV6W_~PTn3$ z+h?+0J?=+XuWFwf*xJJV%5$3A4>)t$02$tdoh=N+oZZ^JIr~dAV{rPM&Fun1hPh+Z z$!el=D*}JnS!}M{`WnUApD871XP{7GU{PWqQexmzl7^lV&pulYLskGzau_0ji*Y?t zO)APc#pF_=(FA98mF(YN=Z?9LqgpzF*?|ncp34E8RafOKdX>f5A8zU5+QU^_ot2w; z$&J1%*P};ZDLbo9MXeAC$sxvOxPXmZ=c3bCEqjKuPsZL@Xan13RH2i4!?#8fh4-G z%CjrFbbHHPI+n8^$I75IF57@r6Lyyg2o^b@_kSh?K%M(+c>zu4+Kk=3T9#9IcR>Qz z{~R~F{x$C|Bq81W<)BOt0KWq`%gAGwuq{Y?mr${{l$@^Zq_wI*d^uRQl_JWX$%<8B z9SgS$^X1J8{z3Sb5B9MDv})$Hlf92*FB0@34W8E``PO_VhC-{vQx|3I^}jsTx8E2<%DlU$>{Wzs-zL4J@KOA+ z_QhJ>3}SFn6*!7prD!tTV<#4j9>Gqdof^kk|D67($FIkt>?GnP{Txm%7&4wCydy6I zRK8OX4tyoLq`zTQ%zgU8((ilJW|FfkRK&fO4U8#MExsS;dPN$ zf*KI-kcIm8ki6BU#~W^>7)3;pZi0DKp=Fqg5Ks(kOg+Ngv8mpyJt9fTmoYToHOjf#Q0ouV)cF^yfEm|Qv7VW{!-NJi@^lxa|faR}_ zqqpMFB#m#lUUhcxETQ=}1tVtxw`G@X_6(!+lGt`==mNI<%PtuV>SdPAdX zdr#3|djz)?jcwssSWH)KGHva%3-*={{h%E*s=z}!u8OK;U%P+F`n%4F$-%R`t|}RP(&YCg&CcQ<1DN5avaI>}vLb6r z1@SELz1J(K}tM$BPGm&YWx;0qtZz7d)WrB(eiEe!zwQf zet&+jzoqL!md<>;^=(MkSxtwAEEvOu3-ZxZh_a)f8$OpumU7W-MSm>x{QUPg)1%^8 zEd;;MZB9`xW_m2_az*QUd2SxxF}|aAd7PVWOC~M6_`Iz7XW><)K5x>(1?Tl=%`cqf z1|P7q{GnDeF<;0y!Bqw44d*v-CoSoiKLG*KZQh&;2Udp<_Hb`y*qMm8QIecWZjjPC zAL(ukwe>gaGR(pUID30%H{VWPew5Fbx8L)bNpAiFO)WW-0`Uie`pMT%Ud!H`u2X2) zJ^4!K#9bt?z3cO=Rt(x{?`f9@#yp_5-0AT7@mtaj;ONBaSUozbA z&hrbpI4p`|3Bl6brrvC4nf51qeou2dv8i|XonKy?bMhrF33r~lc4BtpxepM8B;`=x zo*jF2f%3TFODAH+-m*~SId=8W`Tblu~&`SsPV1GgxX-A4Z|cU+XOt{)LunnR`b zzQ2tc7jT9#aOdaO=3tA6|3UlAkUK{-rA}I#9ncp$yS_Lsur#~tELA*szhh8M_JwXv z4og@cxwGjTDUn()E_a0gx=UUE04I&ep-8!#~&$19AmcoBPR z_^kgvD*9N>rEG1Df7|X8(GLj`dc48PlAuov}ul4CI-bivdntAMaqr(+G+wE|I0mOP9n~~iAHGD%% zidXg$FE228BeXHRb#LuuiTr6X9L_>B?>Cn$8ePueeRYj@oU>Q)MQfUQ=sX_&Q*d#> za%Dc?!DwQ50>i}ykgiMJ?uJ>%bE9!LHZAIYPcjkXhcGicTu@u-%xH$KB{riOe7a;e zRe~>M1-I-k2t$d^Zh7ex<`&tw?%cHmz4gIiG8~t+AYT)@2JpM4hzyci-fM=Z+N#(F z#bD9qZ7xzs!p3{ho)?fu=4~Rw3z(wGV(kTOL6YwU$>9hg^R|%K1=DsreBG@bwa&IN zrAcs0d2_>3zG*!8Y?g<7V=d(3Djv(-!u!MS+9*94dkrV`uDCoJ1VN%M5}fE1;b*sypMC z+ZcdKToGvewrcp+>t~AwuuVUkys^6!s25{fU6q`RaiF=yz)9R#*t*bW)pYjVs%b#q zB4KOl`91!S5}9zm_}MFa^!uf%r8l8DBszM5qualpS zBMRBnrj(E=*72I6D$DFUT{K-qovzoJ)+0CO(QZz96E4X!oc&( zJn+l3#LQZ@~S6gG9QYQf1#DZ&w7S+FYYU|H_H1RUaRR`8@PtRI-0Ia+sVni%Eq zOkx_+(9F?7is)DtDlaRM6=*Aw6&ZEE!7`l7GQ6$Yjg3a?n+$NwX^++Pa@E3OxfcgU zraS_tAt1Z9kl3`P0=4aevW^U>2^iC$Hr+t&F5JRj$7qeMc#5> zQlLmHKZX)|4D0}$dG9LJaTHKmEj>l#Wa&6w*ry^wECyuHQB~Koyk`+8Q~YGXYL`@m zw?9wLTh|lXmOq;FdqOMDgFPPnjVoq$88L&m3Y%$w5nh%cmJ0k%<&Kk@^&*qWMGU+^ zQ9yB3GWcKw-Y4{qj{GhRn-5IEVVZt~U3jCy66`VrkA=YEOM=4C2H+6?jL)%C55~ef z1G<2#T7kpUU^>E_91!EtDp=HK_Kx72mF~5LKnO?PBrl)~MJohsI5XNk-19eNWPr~e zx`m@@F5+_Cxt}67WCx^g zLoUkx-bQlH1^>qY1!Wg9mnOzr_GG=CBGO)MD;$kMi;#E|9~P@Msmg6VZn!e^mchD@ zL1Kw+^N=}yXoSo+EX6-aBHz=4tXt47R53?NkcIS`+uur1gkZJws;FXSak5A~d+)d# zt`CVmYmmN5g@92Fb3uopd!8!v{Wexrqpp-Kh~w3&=^%x|p-Cm*8>8yH zqSaf&0hLKBBBpOb%d0v+AhC z>K_vRwS1-Xwn423(u#R=Jo;_zs0hP-)DNKpJ94_>s04)c*}mZ za7RwqoCMZ7Yc^-o@DsK5eG!Aq_wM|WX9;6%<)EN7dhe&cdUWt*uFMa7OElufO2#)g zeJ?MFB1+V=6lD+tFgKr}uXLVj5g`T4>Mr@x^AJyG&hON<*(uE`M{ zK8ifkxYv22trk@Ml%0qkq}tZ%d5wvB5dmJC1h2u?ya?u$rIqG(I`0kx7w@5L^;X!n z3~aDw(AUmsA3*>vYfdYH8L&gQzpQrNI|Cs}P+lrTRK)m2IVQa!)$x_1$G=X~B0VuO z8H#9*eZ-8_@Z`zd{~@M6ksJ47W-pV-{fZa6R2D0V+#+J>HItF=()M)eiv#di#Cm|& z-;tH!^-Fo9TUh0(pA7|3%0~#A-U9loLmnAR0gLk;ah{IPQ(BlvU&pXlN5BnVO zXiZO*yryhR{j9{hKej~r7%2t*NtGrhmq;j>%+a=|d7vU=`L4tDP%=MEydoMxbv8Mg z+PzL3vXnUdHyP@WHk0yV9>H(_7j~ISJ*fN|d)W5Nu0Ks%9yzjRZ@xjrHFi4IH)e3#%wadELW`Mg=WdX^7KY z+bYXS>qqrZnua~xUBlc~KoU#4cpGO{-t#siOILn z{+W^Fn2K=A2b^oK=*O6|=0G^qf&Ro(XE8dfSt{}5^?g|FHRgfeYw8wj90dGI?t5zn0m?;wy2UdM;C%2zk!BAabK?8ilcPU7-H z-bgn+ft+H^l9f*xI3!><-K`v$eTu*5`P;=`H-G*7IsBcO>cq*8ATy7mP4}FNBf>Yt zxw+q5Ep|YHFAjY+R+fL@B%hYJ;a0wc;>x{_`%o%(x!+tT|1_QCiq_2Mo4@hA$tHeo z4qD^xpB>c2Zq1~}-8+UzGyy`XasI2(MCB9F#C0o$pK#}d7jSe~ziaq9UX%J!O2*y! zE2~0XRUu$9YZ3zRd6Sd*fm;0g!FA-|wtfpNMeW2u;aKO1*4l8WqOUfQ%}h?|Lpihn z*Moe)y>6u%slG(rDooWb{z{d*uPRwwkGtEr6Zx}lyn5bsN|^g)BIUhY&r!2F8rY;p zRhIWU%l?u9M?)pkMzlXMs&k@T6CFL-J{1l%qcE;Q`9*)L91L4OgZv$it&=?<4GkKQ z;FBaC!rGN@hT7tx^;H27sq8cCX5&!sWPNeam%@qoNWR74%$@P_o%hU)yOnD3H<>nu z|2q7+e-I0OP{r0rsI4m0#(+*kcNOC(v%H@q3;#UB-_f5t=}#=DHUKbP)5icuhW6El zCh|EpLs#N{l8%MFk8Rex-OR_H08ywr%-t8!6&I9Wcji4`DZlPB4d*dH*}g+=j*5ky zr-GLSTK|zfA#S$7S6A1FmfkbZ))qjni=YXG(EZ$2?Fq1UYp z_pkdE*|P+k%bqmdtp{JaWUZM5>C1a~>h_zIJv~?z2P(*BM&3+am6g5)Y|$F6R&K1o zxHc0O{SjB$$-1g_eg_XTrzHmp3Vm#7W<#e1rzNXMIc_HyMiQ4Ijo~8wROqLgA2U|a za|IvLv)O-k`cEN1y)W{g!ZwOm`_F~`bA|tG_Me?R)7a-32z*^`8@2^pRho4I?$O8WYI!PDoO_` z(t+x9U|~A2A{}T>2RaF?Hh8kpN$eu-Ll#SB;ZsDpO^VP@GoeNc8Qdx1W}<>WFWaS= zY-eUdHg;Bt4W5N;^t_7ciIuHr^d2{Rk4wGBncky60Hh1R3j%Fy>;88gNv%$;&xS$k zv!M;?0H2!vvb0kN$5?4BM}ETuBnJNpuH3)c*2^Q9N?2Ct&GG4iXGTrHtidy2_5&vZ zLIcHq8WGsk@)pg2WuD#q;bsi*>mT(!{PTF9vnoSB24N9lvluCeEtxnIr%j)d&sK`J1y|SSD6P%B3eN60RWS<`b5wCZ+L2 zWjvFvRf~Sg7@w$QVg(7#Dw~rNmT&gbHCZPt-|40Id+E)`0Ee(`7E6ixwW3Z~zQ{}0 z+B@O*E4=iZKdOASm)`hM05?Yu(0jPH-}d^Ag&!TDd+Zz1s+ zh@&$)Yn@qppl|!4Y|9kUkK0>^;5(K2VW^U9akBMZ(>gg>7^6wkE)Jf z`BljY7wHRMyee5-Zfz(-HLO99?yv4$`{spe2-5Zpe2-uMJ7v$IiaQSTGfTS0x|fu# zu$*8!U!V1^QrGKUK5NzQ<%OAsmuXn-y>fijny&JERSoyYqLfPNPzW##jK|CR>KD`` zwD0~eoz<;s@P?t!yr(-hKNlFI)OTs@o{FLB(3XK4;au{ zduyFLw1FT~uXcu@5tTx%)BXzSjfmvv_M}yw^_Hq_)=Qjw_*v`TBreroJKB4zK&EM` zq^pyZy0agAMEaO^=^EF9y`ED!?K#x#CyVq!n#!H;>a{eMXb}0)=0bb3eo&N9d&Jqv zMDN_MG;1Uvu=Bli1t=e>z-fO;$zW4vk&-AH+n=}6&dX@$C~W#N>a1F3GVU=*kq=Rcly@|S>KPl^NOsT%wS{ueP@{lM%}X)E%tC?Quj8Bb+X$s7 zypIh2A4w3UU1*Tx(L_hn0Mb+W#dxltzb`ZKXwkfGYwS2nSOIDo9 z_pMcZ8kueqs)2x+46ralHBFzX^})POXXb7bbTAOpNxSW(<&5WhnC%B*-GMFs6-fQ#A}cZ07EPyDIt>@aVVc-u*%h?oL;KhsfjCLyBNB+l zhkFoiH;s?(PU+DVh@HAvjaxHHCgVN2 zKH=?!jMDqr`GVfrg~Rk4bUb7YTK8%0afH?ijD_48$~qcwkSVZ7S6C#oKTlykJv&GqNQlag_FE)y2INmbMl$r(Xoi6i za4-YZ%4Q#=g)hv~!T@wJ?yd%VK933~D|&l73-yk@d<8V`?@?B3k8*m4XaFuWE8@xg zg_Pcpreujh9kd7^!P?)O(~(t$|3k{{7XGZ(LP`cJs#s!`PW5Y1_XE}RS}b%}nO{Q% zyr4L5mGm;PkbQ11y5Fa*Qu4ozifWh&yd4j`t^#iZf2o*@_U3Rb^p*-2L__b!+(X{k zZ(i$NS=7b3m<55;!_kAgq6tp%j@7zc$3b6d=PJ~)u@Bo5=e;O}rxusQxza4OH4czW zk);gw0WYz!ugjXzP(QCM)2c!nm5bE8xR+Fa_nq2E=YK8CrUn`iS>|QY}^bXBk;fv z3B?%8JQEGYiv?+&R_ZK+7H9TQzOql5jr%M7oPmxYbDRo}v3kmQ*>0uA88ivTiY=oU zKmgEZd;rb&)1djDefNukls@|?wFRxV3i~qALV>QeZw#&B3u$Nt0I3Idkj_(BjD+|a zeFfeo1H0l4efWim5kGeayucu)N35OG4lK8?vt1?I$=s>oV%Xbvsck}@3^{Ct&~7_~ zmT`v>wDD~rYrV+IPECwuFyyRBu!2xWKu2lw6gB(>W4&0mHA~z zmxzzP)eS+dyCCAF(f^J!+FQv7r4qQ;jXK9t=59r0YlP|L?Ud0Xr5@I00ZfFoUHoO; zTcj~M+O5~BPmyoeCZoOkXlFgu^JE*{0k+T5Xz@uk#WYI#Aa;w!sZ`|;waeXDw-HD~7P zszADSeVW>_tQCb1dpCDE`@~ghguBUCO-HKf_)O}q0|cgb@_ZgRqa&i$Ga-x9StGZZ z6YoLxH3;{gLsJbod)Xs~?;!A;>V3l_Yz?P-=_21y!*^oblw(cs=(E$1;CLH`-OfXYuy`|qXZzQpV*eSE3Elkn zIZ&_Ti01F1mz^L@XoTd`=_a4ziy0^uu&zQgUSgn@lJTcr<-Hbbn}F=X+|{l zNU|C=yYL*Z_Ce_AqXbhEMkRhR(eKg#{t&Qeoe8SGjC%f6$&1fd%f3*R44!Z8FBLq1 z0cOA%A&{zL=cRj+#kxO6G}XY37e0}&ozG(M#8O_9!5>e9&ym)$ybed_8@iSi4AQb925i3FG|ML>5$)TVz6G@RnJ%JQ4v{ZxIOrPE)VASt* z`VRuI+M6^oCERa9VeO+=#N0JQpgbp?4EHbLUuG!l%aC z1kjAU`FkbNqW=bxXaS@0zaxpJ?Zc0g-w;TVCzqMIHTQ5VXY?9Qi)%+>o(LL7#z=n~ z2FarmN23{W)RSiir&InqUtaYE(tXr9SRjSdl^HAosTSzR6G%VpiIiy(*QDQt#>DeI z$CFkEIF+1{=AZZkuU289Q>t%dA zFFlGFKTkpRHlmPqQsq5bY6BPf+Cc7dO})@FC^$oK(xAym^w2ZHKs}F&?aa0 zt;%lSQErW)_bpYU4y8wPunyct6EdWZOCXZ0Bg=0MBdw6M0}EpGM?(7@kUxZW21@xP zVMuQZoiqKGkvY)<&ag8&fRhA}cGP@bl0R*@L~xN?0EiKf-RsdH(a&bVJX!R)of<)y zb}H8B$WquOr#ijw76U~qOhqS_2qMJWo{ai)FEzAxI;)_zMq9eyRz(tW>%r_@*e|Zj zF$sy9Rn(hi5$SeHc0+eN&UpNnYMEprN8%7yTF^vUB#>Vt#mAkLL;{{30c5ZjSV;^7KhlUgJWu|&g zwz+$tV4lPzo-HLBctlIGQ-=q-$PVsp7Qj5vz!hb!R4~TV?F2`$Era86N9JS)ZO}e`JBif|q#MH2n zgPL?4z2eG}B5s~;+BXIGpWesLWS>YDcPEQvQSl`k8|-|5Pq)&#(3&1}ps~R3pgx7g z7&iG@(1GnoPv-Lk8$=JJ4NpihBqk&$)K<6egjln6<3UKR$hrRYfv zQY#4**+?^eR>#?U9ur7*cd^c2$W~^i=VeNIXv?sR&{^sgAEinC(cVeMZrV`)2Gy9d zq{T-JPO1%r;HiE}4+r6! z5A%m49)nMg=MN)3ih@7%bu#ES@%W(Aj5DJ;t}G{YcWKk2Ldd5S-jAIke%XlQx3Cyv z>nUOHq-kb7&4mA(GdgouB5a^Yq8Y5uX)`U#e_$4x#ex~U_rNgJjhcBk2kB}!Xtb&= zetXXlvd|i1SOOnV zM~3oxhrP~|#x8F#PRS;tXI)@v1y;t83sw!P(_W9J1!s}uAv=A*UKgdm9Hh>{7)Ofe z!Hn_@788szvj$-h*3lLue6nGmJ6Ka_k35tyOY29vU9EXEs?IEO-tmD@4ex}vAb0J? zkkJ?&sWcwKbSDsgDM(U$Ot{9>8Jy8GB;&lSgIlb2kcfDPc3~^HFy7H5Z~ek+rUrDf z$|^TX#`0JM#0M_nEeLWDBH;yJgB2n`V-0CkD2pIDao5x=e z2q~Y2P2@;+bXocp2bt?Sf`-M$g2hZv%i@%7AMC&u4e&MUjqiXJ9?@`VSB(h=JL{g! z2^_V@m+|Ik2r5|j25-jYfu@=X3%oQh4 zcka)589k_KkoI|T!OwUB=-SB+wp6n;EhJ!2$hN1fBQPm6q;BkchQE%otDn04>Z!zdnvtIWOCBdO4f3qIDr13Lk zA+w|oQs%zM9@;!S0WvU7LGrE5(mr?{O(~f` z9T}`4JhD&7RMTllLslSZ%)wl$>)ox)Wr5}r|2bQnhhF8lKt|Ni{AnqsBwn=fGxlB8=0+=8tn5*m>qsizQ|0!?AyNqIpc_VtlvOX&7aALRb%QpaaV1qjq_>{1_r>l z`DCzoag;V6W!P`!63fOMPSznXeBA64i^zZJC&*tx{+mBR{%Z0!e*FCRE)>u|{(y{5 zKS8M#Ua6-(S*d2Plnhiq!M8fSQZifp1f{a1Jb(OwGwtzlXXoA`uhgZVtdxuZ_}0yz ztW>q1osx|NKOVTY}#gYy*2M>HivM|7~{R$ew_vl`FD;J;#E{hc5ml0*ecg~y|peyps}YARIz zn=_sGh*}5f1pM}^-8A2{5r44#+p<4q`?r1k_HV0D`=d8oCw_nXw^dXtYvaesYUe)4 zxKwNZV-;B8Wn8Ld|FH@*r!(p^TK0dS^$R=6lR?lrPt2%~)yNm{^NrCaA`zOKXUB-4 zu%1uHy4)3a8hvK33xYf1?}%}Ft-hGN;UakKlmaCLdK4%n(565c0dZZs`4a(p9iTW0 zr*sGshtiN2Fe0+xIRwf-B)$qdc~p$Ba*B{0-KofW0#FGN&!bQCr`)jiV&{({j2}|{ z&`37K%*tVU4`FDH)Es6_15@^Gcx0(O^aV*15(8urJPS&C2j#GbagJURn=2mcjy`Xoi|T_f16*Uu3ayn*^KHB&dII6f-C?gZjSBCNhE-{W4RXS<-0JHRPifPE&GYh*frqo7$^UqaWpq)v}a1 z%Ea8-%nNu8yh50#f?GSRc8+*Z(Kc1IO%-kPYH#2rpX5g``Q*UiY}f=~ieIE>ozqS; zi#*{M!kv)(|09RX?E4K@YgAkLgPAtHBW63s26p7W^KE0liO<`SjT)334MX`ewW8@e zV}o#;y2W6JJN*MXI$z1~9CJP>qc53LAcwP$u{J+ykBp)DQncnU3v$Y%Sj_SCcgy@U z4x~@`D!XN{va!%=l4s$ABeazO1{VBc+6QCZPqqR~G{vQk8OG+AIx4Q(Y2Qe(12DnC z^I!w(3iD8D0!xj!oh29VxrW39Yk;=BPkG6eUuujtm5GUjZM6*ucAtPgfvjiT#d0@I zF6+@YL)v}q9>stq-|Wk*0c8Jgl9ATDctAtp9@*sHP4HO#z_(7c@# z0G_rZ2+%TbCx>da4`j#-{WBx;26?n^;n}9;SrfEf1oOoh>+QBna zyVlXJ4pKa;gSW_{jlpVq^ZFSL`Y6^1NRMW908V^;)NOicr!J0Oa;_JqxS6XT?IM95 z9L+8C5|~)CEs!nxfNcSjVL6$;xv!IwF@`sT_L{xOCY^%6{PQLA8_Zw7<@VO2+Re}y ztVN`_eIbjE3ib&TiA;1eDQ{l4HI>LiN(L^|dUr(Su?eMgZ-K zvRyok#oB@?t(^g9U5y!L0y#P4FogOq+4pA#5wknBtglK2Z=_Sz8s+Kez#7Mh^v_NS zo_oY;$f8(j`oZ>Ci9LGxJH6D8T#xXJyOH#M8O>;mCLwNi3Pu=W9bQ5YT*e~*hB~2E zK=$ew{JOEiMq?y}w?pmOn)NMwZPnW%0zeG02*|PLWnFs1Ve64kNppiCDvO&6ME13% zE)3Gn@?*)8#g@MI{AA!tWneM6MWVLBhOA~XYN`UjpVd!6NWXpC_J;Lss)YlgJVcc5 zd1kDZ1ssCuY}$;KvMgn@W##E9hWc5cXE-_@L@FTPt$R`h@}OU;rN%m$HP{wzir3o4 z-DT}J6I%fwq}qqkfQrq|QuYJ6IH%ZCNW( zO~JRNVCZL9Sa-fL>M?7_bOdbTu>H?er__mT*Ao&5HqcJ#5i)8{=syPom@gbez$JG z^@cyPytK1-kM?4wau;Ouc>5G+c{xkPr@Gwg>MgM|tl!ZuDTI!biI}yC81sR;sUaxldrTgdE}s#<%(4{>QNTt+rBI|^e7b%MaYfY- zEF4ZwpVODgfJ9{@_Ktm8JNsUNz!Eb&zCXO&L_!SA;F=&b@!S zVA1Rl+l7%tgS9$fPu8nV5Gf4yS%XrO%EAEK5To;ipg8arKvgFz=G<2vrY7j_LDif4 zkYb)j?PZ9JT<`mc$_TwtQJEVKFa$u3L5WzDV-0@tMwt$zL7q+S~mJUZ%XFAQoqnp^3G zS$o<>ox6wW_Q*Msl|b?6QBqciZ(q&R5`?3TnoIT)6M6Kgp^dq(4iP-k>i0oO6N+&K zOUw7GUCk;w{9t=P0Uds;v7>C{+cx1e7_R6e;e$FBQ%A4n?ab3_9YgKjMe9@AteHtK zH5gcP5Cg-JXdBMx?|IP;(!qI}a$^hvhd6JCDk&^eK50&MU*9pu;`Tj*w|XVua>d(w zFvMgyjQW^!lI8zSb@u3oos)UnRcpT0`abWrji&~+m*7|Vl(O@JTnd-z^_bK3ro*y~ zxky~jC%{*RSYSDXwQk0CC4;XP0&^_19L(x?aK#NIVb&&LFotPEhHdchRP@OzcPj|W zx3aTUe2RX@z&A-gZ{J92HG15!LktGo>M?SGW?F@4K$kqgHC+4|GVG)m$n5}-2(1z4E!NJ_ zT6uhFh%)UUz;Q1=W+g#L6kv^kdW4_KDEg-QWi8XNP^lpzaE*9=ZS5I}-U;~n$k5aU zTK}?DCb!oX4+Gjad3(V#H+gHaO{-p9_a;le*4Vq-#L)~cwFiTtggD-~sND}sGCl53ecA+zK(#5mtGIS>=NK_@R zT;EHfa!7wu2q!I0WL}yS;Tde(K0v+ogQYacn9JiD&a=m;@THU6kHYuRnMSzUo$s^{!?QkFURo zmCYlnLb$T~IiU^%nSF3!-L|bZhh+*8M26Rb4VJOiwagbXK*r)5gKlg%KN2^zatD?- z>o&lLRGQ!r@*p{ANuTbEDd{DC5lNGqZFTzoLfG%1G5Q0TO;b<@Y3T$6=5^%omXT{X zhZpp|TR07x)=lnC0H%vLyL!&NSF)Mn+0Frqx zleb|;_0lUQakIwKD{2NQRPbnb+CI;}UA_6Yb9F;vBDZj!#lE@9Vtsd7tXnrgCUR3= zZ1*!3+v3G)4p{6rUhIcYTkP+>*sYw2{fA?tU-Uq?b^l?pH@w*WIAABO(~HF(x7ZFZ*5$=s@M3?> z6(HpNx)(ds>%$Z;_OADZE4*01%Nh4#Kg69K%3S6u|ZQQb&~W+-$3EdewwMN z;5=nZ_XM{)vB3shY^>$-Se~ysPql@IiwO1t92o84!ZkY?oCuWd4nu*#lApuMuSGiM zD=wwLrj`_-DU&+koq0zn)sfqGJA>Yg1NqnI|3W5Dz5@WtuGFdvv5yD5`et<(kS z)J0mpyh;4To?Z>+wS||9e&fH?N6Z11a=tt`XQxGGFFGZ&ETBPe$JN%=j<_H=x z{w6W6;x1axuYA+KBIoh!OtZvP_5gb4!ug_jOgj3p|!WCg^Mo=e*Cwwi; zogWQf!6+%5Z0uj|JRYdRb89?+m$u2-T+@u-_GoC^IXQS=#JlciQy~T_8raE&CfW0G zOOLaQs5?t{l|)R*0~Ob+g>2LJV&5NkcL-Fk?+{VSYI?P|;XBr9obYoF zuLtLN(a`>uRDhF=vCvko;&t(};#qU0^##Ct{xE*RD1;lP4wLQ_@D??Zece&pVd(WD zhah>klF$nbZ=3q5LuM}fl<$*YXOADLs%ha~v3sV*@N~LKBsMI{37{#wePI+$H4AmPT#hHN|#HSwTpxQ{w?Zy z5fo9be7O$gkgl5nvCrOwr(M%G&W85QfK!>VxoJREjh8@JI_#e!O2Ux>RJx= z)-z&UvE1M6Zc0wD(Gt%ii-Wr76p9S(e-giz;tj`oBU268IMm5-K~rx<&^rQoH#6$i z<+gUo#oKv@SeM6SVIaF&WppfKmTmYZ#QPcfb__8;1_^EUM{CyVAUDuZBv-{Z#FjK)=-E!WUt)<8~`>p0W=CsG#rLFL7Unm1mHEH2q5|+ z1f*-8cNiw($R_Lpw-sjL<(oHK%H)LgiFnQSSk2~m`Hp+estV!uD0m8MbUE`G&+5-n z7qOeH;4Tf0OrKnExxjE;wtlX*-`KlV<}|x^lir2x(zU5Wf#%*eb6GyDGb#|} zDzSByq1H(GOHOh(BZH6c3g_OJ2qiCvv|^ls)DmVr;ncONWE{CBr$;kzH*o?VbW9yo^Gn(3ZVuAHh zAU?EOmPKeS!`k9^)0#OkEf?N?nXl6+*t~k<@bV2mJu!v+_3Fa}Mh*s!p)1Xh(XzIgjU^ z6YXcV0-4#`m)3o0J^1q#b$5V~#&5x!gH0FCJ(#W=m=!#xa^KTix$)$+1t2@KQzHEMUWqnC38DxUSWlv5{$f-(BV4_mG>hO0?lL$*yU?a14y8rTBr|DrjA z(DW2CzUL`JGq34UW)7{d@u41Q4osu%aR91}1T*f86PO{n+mY*FZKi7_@2o9IkCY!=RtA55A&o!bI5^||Sy&D+ z9^7wpJG$L8%G~pZQ6>bo#A7oc1M`PMA4>Ke|eBGu>LXg~R!Y5ATs{N8w9B0TX%z{-ZJO*aCGt$bJq#(Of;s zr7FpsG;G`DaiE|wm~b#gZ?tBIfV)D#T?Ae@^NQrS09a_qmB|U88368oXF_6u9b`Dw zUPj9gI8C~>;5gu>uk;9%Y8?T(>B}JKj)e{!(;pAM>CS0A>e*=?bRS_?CJo*6=|X_p z@22(Kx_BWNN?o=s`nsvZ4MjN`hx7<=A;@0~u8m176I>SwCSVtti)hUTD2kBPm*BqW z)@gDMd@Q~aeCHfTUb-}^J`fsrDLmo%TMvJo8y@h(fC~or%}V~utMy98$nJQ!_x~c) zbji1VHcB_Nih{y=2D$N(yFX$uS%6)1-D=!aLy>lBuT9&&vm?Wfco&k+jvZlepowMY z(aEy&pqaB{y^IqoE3OPxPI%9<3hc1^_6*LYMDO(uT`~L5q`wTkg=6(@QH1UDA`ss` zA`Kl?H64}i<`|f%{1qoD*GW!oy1OGBR9H${#NELin35G*+{3)Pi+ApR_pOL~IKuPc;)T3O zhL0}6{5XaO-hlYKat?D`xt`o}1|_zW*uNp{wsJ$rm7AkA%ZjIw>a1)@JZxWzJ_2J( zGJdAl#PRYtg;c#u$(49DkxJI>L!Zu-5ymfUi&HjrV}E12_wZe4M;Ck7nO^@kVegnH zYEqewKWyqiZDA1kN%0D%kO*v03y%)@$;!j}0$*tAa@Y(ser^}$aLK5Seb5{=mdvk3 zYZe#JB&%SB)^lE)OUb81wv!$wro4+(s`3|{hvws9ioU4Dx&-UqpDS?5`#-gXruzwz7-pa6!g8_&yl6M_i0){F823Vq zy)meAU*+Nm=14OL!$D`KzyiV>Mw25Z&=J<&7#h7O<~GMd=)}x^h65~-q9fclktYUY zI_yTQs497j4y0(6>NrgCdkSlf!Ty$2yn+6%kG+?&iZu%Lcx%s(v3|W=mKCj9A2$jx z81}0*T2?VArNUAwbc!ZYMA6I_6|MkxlvS|K`?{=Yok}0n3a9UgGFT%RZ?AHTF-pfY zf>we+27TRXwye~rZ;<2FX!%sGc6;zG#2ei#SwIPSq>?MainxoF9%$V9LOiB9djjA| zkN1_y{Bz{+Q-Kit`sMiRn6uX8txs0=<#I zesj3+FY>9b#V1FBT9InJ+BPi?nt{60HxE()+tGH?DbQkTR*w1FGwZl%7RR2_3)$e- zSyBZz;gonw8QADM$_B8vicsbDtu=#;ISM{+JHyqC9=m~_&bJS)tFKo>Egh})1Nuu?itCqtY`3aUsmp7qHqYk~&QM2Uw#G9}vrR+Ypu)VbuhofAOL zuUS?_4Xp1H|42DiS)%3L6zEai+6rvI%%j9ZL7B4c0o&d*s$==BCBV2}cc;p+iCyAh zD^+EQmba4`QhF!p9-fK>dNflyTIOz*|N8<$5f_nnTa>%MMiZ-IW}TJjkhmG)c_JH; z6FN`gHh^K#@;2w*)r?N^;_q{BC~2!fn=NnVm}-dIpl{!CG4~i@g4Pywq7s%a#~I#a z*t9&mfo#c^yN2wKI_I=@je<>U+LImKoQe)_)vMuBl+5U@;#Z$9=QzE2z}3;9&X{eFP>3P=ixv zzq9h$a9~p;8MF#0&6Um`Mhk3%M~VcvpM2#3_xVU*Pb6?lage+8B2eLAKxZ~rK1-W5 zeu1_6Zh-l>yP*Q@WFw)B*}5qlz+!A=GmTnLp$Yn+v+@JTa9)J?GP$Z635BU^jB>MR|+!U=n=l28$~>v+AsT27PVVeIZV3@gSWY?yA*_Ox~N7HB5QA+HJkJz+1Gyk6nk}0)IZH-1yU6 z)IxDk5Em4(=D8s|50{cL4&x5O6~ncDH)xG_eg1fSky+MVd0NST_dj)r_$S2+Y4zZv zhbKN#D0!1honHU(C>Zonf3HV*YyA~0)tvWDVE*^(OzeKo6T<)1i(Tezo;{@4k}dUx zPd`xNRI(oM+n6Y2iZ;Jenc*OZDXW4q`pa57Jh$NY|#ha zfd2zc*DNsLZn(h4Tq7O}H6K6Xu_WF6xFdcAw>~#%$lYu5HPVY(HSl&Xq{bYby>5ui z;OAkPF$a?#i=s0_zFH$*`hTC2(J9z9SMm=!8tBWrRyXAiU`!)5Eiktp@dMTot}DmC zZFj{>fIto`rR+F&_0~?8^Q7Fje&y5X`5+xH=6xN|!~MU$YZ0v`TbYZe(caW; zyu)!{!H7+?V->PrKZ~W8i?+;Z7kwqMPG>Lq})T9m`=tCj#40prpCf=EhL9}4MGcsO$ zS8Ca5K#hyBnRkg-1;xWpQZ|d)Q)hlbiIkuj^|&3M0HpO*m7GRT=6>PrJ~Coy zwlOvNbLlco&E}nVX0$v~eAj%mtgP|WztEI)mGfKas_QxS;wx;OKtIA7Gz%jAdfAk)USCTP5vN{%vCP8=%|9f_w$Y> zZwZ}KI$upasJt}#vd@54ZYmyErLBaAP2P)0%6vZcFBH+Zjw=*j$ST$6;S;NQ0vI00 zquCsFP8}PJm5ET?{qbmk9KuMt$Jr?TjFU;%yj>2$o2DU{625KIZ~x(f&u)E-F|65e z*@eNSPGkcN!kFYDbsH;|m^UI!SYg}#u=9;AUDsO4%M!t*NF`D3Dq;`A3ymg2!NbpM zkO)mHT<5*cvkW${uoH#a5NTHW!|SpbIaRt9X`x^kYuCA9z0CvpVE@0o;X5O0of}$7 z9m&>eBH#;%5x2ML1NH;nIN3(Pmq*hwsxP)?^j8`y$yffURMqSfXIve1vkqMD6h!{& zNTqW_^JQ-FBVqUD^tgr>z1GiNb1hx@O}{ZYG>an9%iQ22B4s5FSABQ{*|0_m89az* zWd>0rRu**^YT+=F`8JXpx^5UWlIUXw4W{UR8DncBx~wfdqWR6B6<&KI>Q^@{A5!0{ z0bSOd9?*?wnhSz|rI&5=j-hP%&Y9|*fQKP%A$?@pIDcgqx1!IQKrp z#FX!J7Jq=$ih@CF&fS`7-P_lHNmfo));*^otR_c%pS^MCseCiyftER|)_09Wx9I$~ zH5u*SdKea!?e?g9eSx>0fij;MRTRtNTH%~ds+{jc9Y(U}%`zG%O51B$(Z;BpPtXAU?c z^OuLUE#ux_ME2T5{**x_GsQ~$Vv*%Rl{QjvMfQ|0d3Tl*=nL{sDFEa$$b&>3~* z)h_oYJBBVhu-=Vq;2zgCPV%owl(K6Y^P>;*)!+uSEE92{PNsY^@$Fu&ZC!I&63vXL z&%XzR=^+E(4Tj6#bCN$J9(L>Us@(66mWpr)kSN6QRp-ln&b{|hGa#G1o#&#)y!Uu4 zxRy)j;`p9TI~6zmiQiRCb%FEcbvD%(7dTI_rQ;1=IJCaDpJP6W{H%VokFB^CY0fF% zxnS*Hhf1UFk7q980TY8vJ`pAC{fh6^9q6RZ@zX~5X^MB<_3I*1V{Tij`Q)p$Qs?iF zx=u84#b~6$dU)civ8gzG<-K=)o^X^= zBK+M`>AXfWmbiR$|5bVM#8ZlO2|P8B1FvmZhlUe3=S9k2UvPSr+eg*Tl1(t@d+*K$ z#1pp$_ufgs2L*sAf5F#dHESxl{V=JGThGlrtk~!Rk4mu}|EYA4$vzCce$s(_@xFd3Df9nuOp_!rLd9 zguVYn){laxpJ(9dr~jUTr-x3|yGRC}{!{(y`cm!kG%yU0TsYl_hJ7Ce4OMRA=y3VV zPIB46&@cE_8X7+Y@HQUDj{nD9k9=jp(|gZ8cKBxw8vgW0eeh>CE@BBV6+$laheh2X z0?oqO<*WxMX^KIAI`B{DupZP$e@%$}lBH`jF=h1cotOt~Vv<+vPM!2W(-Y$?nG5nw zH|IlRa2))7qW*W`1c~ytSe?a_`3wuzNnT1oi}rOEv%gFw+E>K-pN^nPEQy!bjdt#x z${t}v+f#cVhGDZ%gsU5cq2ZDCF5_j>g5u(=`jL_3{62{W#g&1B5pCFUDQ|x`uqIr- z)_L$26_(r(cHggbyDQ848o!oixuR}C?ebX7vu@;ppxd+P4dba&`KqFP^?b|_DBd znisWTj2Ae?=-{9#VFlpUsz9Gl_)Um|>0oatC0(q*8nf<#$a3Q?jh|`igPmE<*kUpM zrAqfj{Nsr*C-dQ9WIBUtAj81K#lVcm#KK}14C5{ezW%>>KflH!MGxN;pL;9`x)-!BfsFP z<3Mx}fPR#KaDoNrF(if5J7~py>myfOni0wKNz%!-{*1}^y==%oY5|H3`F$(#;S3wn z_>bxFcb42Ow%~YysDkEZ*5fDb?y>yGHEI6ivJ>$iQq}*O(XlA2G%E0@^W@z)XI?a=KOqsLz7ZikjEik4GI5VUgPvAdS9^&CuwxL z0%Cm-(U55-riBeQ;4;Dn;f$~mO@t+EL=z90uyF+gV)!ld+Jueq{y0^->p)#YBcX6U z%tk@*5l;k%@5q0oR`P)_G@u|u$F_k+I7{LT2z`xmr*`bszm%|v$FIpp&bH?VEuPv?huT|k{Z&r zc;(BfrR3+_{F7St=A%r<&+{|3DVCbKt*^gw$=eMVF6pShfZfrrMBI&O{V{4%EJcDS zrJ@;is8m!q4%iY&1pgv^zx*$XSMZs=OZib%H%xL1AB@0ON5hz;1F02}+ghbe4R1}E zE)e(n;R_3!!cL?Ojq2$p9Mi~>>{=lH9GW*yZ7b`5lL3F}_zt|o#@rNkX6{DD4)x4~zobrVwb|*e zbaQmJCLCzP@->M48GUYHvnJNml|6q?Q!lDojhc4kD&oltZY)P_IF_Zq=#W(7^JK{`#+o-n;pK^WluQl961^PRVoootxNP85w^CjIugf zzH7mAGP=W0uZa?@}z%AT)B#R7wIKD(Nn@puK%`;BDK$+tk3@5~~6J(eG8_ zYE(efl4ugvWMqqcO!1NX{~FE2Ur3`8PyVVzHM{Rt)pSOaf2omuQo>=RytC4Mp^9@e z$t#N@&Q+V@$$zskOfHI&r>bWEcr;PBp`{udP5h$zZS+o3a6TOt%o)L|xY*Z*Sg zZQ!G-&cy#oW�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 xSB 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�%XQCicQKlL-cBrE90S?s+nSnDh zBSAq?!AH?ZTT}`OP)#73@E8xHcx|ut)?U4>t^9A>i*2pot4ZLwaEK4cuz3< z7L-{?R-C{iUq;n3L@AjG@>GsiFn0O(NNP!0TT`E<)o-8=jL`ICi!rfQJpI?Q#OPD0 zrs(s2#SZ|aKR^QWSm@C_8$HSq9O`V9#YkYD_EED-SvL!j!1AmOb&Ip17A;er`STZ! z1drMtLxZ1D;+Kcwg*X;;^c1xm|5Rpa*tlmK?T;Ahyq-@-0U;HnpXb_gg)N`-uH8{< zAUM%aE%c}WWp3x?5mk$|`)=U^6wx#!w&S>zer6tjLf41i3wX6M#pr4APymFShEnic0OF0h2zFve$?%lcmCr z{YkEyQS5Q3ggKYcaP)ZFUYe{=ZD51T5EITa5laEj|8vD|^?WPORng-pQZz8QHO3c9 zeV9G6;G$z!1z15L1AicrZSiIh6ByUX=0DD`idkwAxe_9usEFJo^i?|2dsJqV5@dM6 z{=PzA2zz~tuy2I6*X;gFt4uo+d?jx{@J(~ZNuyh((P&ONVX%wVRJq@?rWxzZ+u*XO zB<)5_DsEFuUda1HGLve|;v4Gz4eH8?IZ$`3RjZeJs#Rv;Rj24vTUh~LQe*q$8z+ExBqEH?)F)V*6;SQ>e0@(sKLR*Dq_3}r6+fyw-tm_DE81GE@n7+a<*Kwx<@M?Do(#VdFd%wo$wS$(?ilWVVRIu0OO)yYESv|HhwX>PZB< zY1#q-PKtYdfNzLrh3Ql?=NxrM&72Fo6r}t$z@LH4Zlo61Bv>cY@Uw)rNTP!a{H#IX zX9Cl$|6InTS~0B|!@+E7##|4S3Oym)PnON0;|12$l8V(CiH}B)tXk71>!xb){dpEm zAL3hjqCetXmh$46u@uka4Tmq zLQSm}BLsFl;zQmN>EKWFfyli5KlNf~1m5h+ukE{xfwXa|Yn zqQ;P~iU5%lWxFXe$ik1cox~-*q#~4Hq_~J)N_1w7uVhFdn_&7X(yZct-3CB>l6fEy zF_A_d>EnQO0*ia=$q*QGwLxAFKuprXx0ae`UTM|%*W5tRxV{5BG zpkX-yCDVz}Y10!bFSwF1F1FC~cC`7JRCam7uPU_#wbG!qmDR9pE5;>UE;DB{blOi*gDi`r=_GQ( z6wiCrTIIZ}g1m+>HZi<9k)!<-8D5H<5GjuEX*Helo? zbae|=#_|%0sVm!FEbRR0xBJRe{_Zh3EI>#ZxdXWnc!Z2l+h12q%u)X*HG^%`0B|uY z(rD0fNNd}^OEg`qMO>`T|7Ejsg+roAFTkN-isDToz;1%PiG@4znvi%#;$EC85 z``6VFbyJ}e+FT@p-W@WSvWKY%oOupDtniy7t=4^*YsFi9`58561v!$Z@L`2EKCIlq zaozaMbD!?yen&cYA{*4)h-z+=lkcu?p6>uB-$ChoL4wqP1o={eZxZXkw?=JTQn;`+ zU2tKuRgw%`SfUL|$T6}_>?4;VGm9W1cqoB}?UHK+wfZK|u-ha{a~Amt>rX*(UQoFi zQLlsI8urbzK2~L2n95qf4Z?M64SkrSZSdiEBELzJ#XTbS6v;L z5SSRaDsZ(PU-sXK2Yaqaz&VH}f8-*K2YbvOW2 (6S7^Mx|2=}QF+v+;=v?P%e_ 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 cj<7d=ON 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�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

8DF~vD_iWH-h9#i$J`81Q)C;jSM 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